質問するログイン新規登録

Q&A

解決済

1回答

1802閲覧

Python機械学習 MNISTを用いて学習モデルを作成したい。

mia_flower

総合スコア67

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2021/11/18 14:56

編集2021/11/19 06:48

1

0

前提・実現したいこと

『Pythonで始めるOpenCV4プログラミング』という書籍の第10章”MNISTを用いた学習モデルの作成”(p.216)のサンプルコードをそのまま実行したのですが、以下のようなエラーメッセージが出てしまいました。エラーを解消したいのですがなぜKeyErrorが出てしまうのかわからずとても困っております。
例外処理をする必要があるということでしょうか、もしそうであるならば具体的にどの部分を書き換えれば良いのでしょうか?

初学者で何もわからず申し訳ないですが、どなたか解決方法がわかる方がいらっしゃいましたら
教えていただきたいです。

発生している問題・エラーメッセージ

Python 3.8.8 (default, Apr 13 2021, 12:59:45) Type "copyright", "credits" or "license" for more information. IPython 7.22.0 -- An enhanced Interactive Python. runfile('/Users/miaflower/make_model.py', wdir='/Users/miaflower') Start epoch 0 Traceback (most recent call last): File "/Users/miaflower/make_model.py", line 47, in <module> x = Variable(x_all[indexs[i : i + BATCHSIZE]]) File "/opt/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py", line 3030, in __getitem__ indexer = self.loc._get_listlike_indexer(key, axis=1, raise_missing=True)[1] File "/opt/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py", line 1266, in _get_listlike_indexer self._validate_read_indexer(keyarr, indexer, axis, raise_missing=raise_missing) File "/opt/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py", line 1308, in _validate_read_indexer raise KeyError(f"None of [{key}] are in the [{axis_name}]") KeyError: "None of [Int64Index([ 8363, 44943, 6962, 40302, 64698, 58902, 9962, 68144, 68545,\n 37871, 49060, 36529, 11171, 46401, 21564, 59294, 12095, 2954,\n 54450, 14691, 35618, 16016, 53500, 48268, 50841, 13789, 12789,\n 53963, 611, 68550, 69846, 12360, 48802, 65886, 61789, 52416,\n 60490, 51389, 55589, 39022, 49837, 43100, 15836, 36418, 46460,\n 54358, 44632, 2409, 16902, 52151, 18362, 47333, 18249, 17864,\n 28831, 33707, 33689, 57039, 55866, 3042, 33362, 26184, 61385,\n 46469, 62669, 14920, 20764, 24117, 25784, 23875, 53789, 56604,\n 4463, 64751, 38053, 67550, 40583, 68994, 9136, 21743, 9412,\n 39266, 46382, 467, 9231, 41938, 4457, 52492, 69380, 33762,\n 69215, 63896, 11640, 39437, 4268, 65423, 55650, 13733, 65032,\n 21953],\n dtype='int64')] are in the [columns]"

該当のソースコード(前半を省略しています)

print('Start') mnist_X, mnist_y = fetch_openml('mnist_784', version=1, data_home=".", return_X_y=True) x_all = mnist_X.astype(np.float32) / 255 y_all = mnist_y.astype(np.int32) model = MyMLP() optimizer = optimizers.SGD() optimizer.setup(model) BATCHSIZE = 100 DATASIZE = 70000 for epoch in range(20): print('epoch %d' % epoch) indexs = np.random.permutation(DATASIZE) for i in range(0, DATASIZE, BATCHSIZE): x = Variable(x_all[indexs[i : i + BATCHSIZE]]) t = Variable(y_all[indexs[i : i + BATCHSIZE]]) model.zerograds() y = model(x) loss = F.softmax_cross_entropy(y, t) loss.backward() optimizer.update() serializers.save_npz('mymodel.npz', model) print('Finish')

環境

Python 3.8.8
Mac OS

ni_0603👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答1

0

ベストアンサー

データフレームに対して.ilocを使わないと提示エラーが発生します。
すなわちx = Variable(x_all[indexs[~]])x = Variable(x_all.iloc[indexs[~]])と修正すべきです。
t = ~も同様です。
(以前のPandasでは動いていたなのかな?)

Python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame({'x':list(range(10))}) 5indexs = np.random.permutation(10) 6 7#print(df[indexs[0:1]]) # KeyError: "None of [Int64Index([1], dtype='int64')] are in the [columns]" 8print(df.iloc[indexs[0:1]]) 9# x 10#6 6

投稿2021/11/19 07:35

can110

総合スコア0

mia_flower

2021/11/19 09:20

詳しくご回答いただきましてありがとうございます。 can110さんに教えて頂いたように書き換えてみたところ、KeyErrorが解消されました。(pandasを動かした経験がなく、全く気付きませんでした...。勉強します。) 新しくTypeError:が表示されてしまったのですが、こちらは何か適切ではない方法で値を使用しようとしているということなのでしょうか? [書き換えたコード] ``` import numpy as np from chainer import Variable, optimizers, serializers from chainer import Chain import chainer.functions as F import chainer.links as L from sklearn.datasets import fetch_openml class MyMLP(Chain): def __init__(self, n_in=784, n_units=100, n_out=10): super(MyMLP, self).__init__( l1=L.Linear(n_in, n_units), l2=L.Linear(n_units, n_units), l3=L.Linear(n_units, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) y = self.l3(h2) return y print('Start') mnist_X, mnist_y = fetch_openml('mnist_784', version=1, data_home=".", return_X_y=True) x_all = mnist_X.astype(np.float32) / 255 y_all = mnist_y.astype(np.int32) model = MyMLP() optimizer = optimizers.SGD() optimizer.setup(model) BATCHSIZE = 100 DATASIZE = 70000 for epoch in range(20): print('epoch %d' % epoch) indexs = np.random.permutation(DATASIZE) for i in range(0, DATASIZE, BATCHSIZE): x = Variable(x_all.iloc[indexs[i : i + BATCHSIZE]]) t = Variable(y_all.iloc[indexs[i : i + BATCHSIZE]]) model.zerograds() y = model(x) loss = F.softmax_cross_entropy(y, t) loss.backward() optimizer.update() serializers.save_npz('mymodel.npz', model) print('Finish') ``` [エラー文] ``` runfile('/Users/mia_flower/make_model.py', wdir='/Users/mia_flower') Start epoch 0 Traceback (most recent call last): File "/Users/mia_flower/make_model.py", line 47, in <module> x = Variable(x_all.iloc[indexs[i : i + BATCHSIZE]]) File "/opt/anaconda3/lib/python3.8/site-packages/chainer/variable.py", line 596, in __init__ raise TypeError(msg) TypeError: or <class 'numpy.ndarray'> are expected. Actual: <class 'pandas.core.frame.DataFrame'> ```
can110

2021/11/19 09:27

元コードの動作が不明なので推測ですが、numpyを渡すことを期待されているようなので 「~x_all.iloc[indexs[i : i + BATCHSIZE]].values」~ のように.valuesをつければいけるかもしれません。
mia_flower

2021/11/20 11:12

.valueをつけてみたところ、無事に値を取得することができました。 ご丁寧に回答いただだきまして、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問