お世話になっております。chainerでの人口知能解析を試みています。チュートリアルのmnistでうまく動いたので自分のデータに変えて動かしたのですが、Keyerrorというのがでてしまってうまく行きません。どこが悪いでしょうか?
●実行したコード
import numpy as np
import pandas as pd
import chainer
from chainer import cuda, Function, gradient_check, report, training, utils, Variable
from chainer import datasets, iterators, optimizers, serializers
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions
from sklearn.model_selection import train_test_split
csvファイルの読み込み
data_f = pd.read_csv('svmdattotal.csv', header=0)
関係ありそうなT,lohg(A/T),Workのみを使う
data_f = data_f[["T", "log(A/T)", "Work"]]
data_f_train, data_f_test = train_test_split(data_f, test_size=0.3)
from chainer import iterators
batchsize = 128
train_iter = iterators.SerialIterator(data_f_train, batchsize)
test_iter = iterators.SerialIterator(
data_f_test, batchsize, repeat=False, shuffle=False)
import chainer.links as L
import chainer.functions as F
import random
import numpy
random.seed(0)
numpy.random.seed(0)
import chainer
if chainer.cuda.available:
chainer.cuda.cupy.random.seed(0)
import chainer
import chainer.links as L
import chainer.functions as F
class MLP(chainer.Chain):
def __init__(self, n_mid_units=100, n_out=10): super(MLP, self).__init__() # パラメータを持つ層の登録 with self.init_scope(): self.l1 = L.Linear(None, n_mid_units) self.l2 = L.Linear(n_mid_units, n_mid_units) self.l3 = L.Linear(n_mid_units, n_out) def __call__(self, x): # データを受け取った際のforward計算を書く h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) return self.l3(h2)
gpu_id = 0 # CPUを用いる場合は、この値を-1にしてください
net = MLP()
if gpu_id >= 0:
net.to_gpu(gpu_id)
from chainer import optimizers
optimizer = optimizers.SGD(lr=0.01)
optimizer.setup(net)
import numpy as np
from chainer.dataset import concat_examples
from chainer.cuda import to_cpu
max_epoch = 10
while train_iter.epoch < max_epoch:
# ---------- 学習の1イテレーション ---------- train_batch = train_iter.next() x, t = concat_examples(train_batch, gpu_id) # 予測値の計算 y = net(x) # ロスの計算 loss = F.softmax_cross_entropy(y, t) # 勾配の計算 net.cleargrads() loss.backward() # パラメータの更新 optimizer.update() # --------------- ここまで ---------------- # 1エポック終了ごとにValidationデータに対する予測精度を測って、 # モデルの汎化性能が向上していることをチェックしよう if train_iter.is_new_epoch: # 1 epochが終わったら # ロスの表示 print('epoch:{:02d} train_loss:{:.04f} '.format( train_iter.epoch, float(to_cpu(loss.data))), end='') test_losses = [] test_accuracies = [] while True: test_batch = test_iter.next() x_test, t_test = concat_examples(test_batch, gpu_id) # テストデータをforward y_test = net(x_test) # ロスを計算 loss_test = F.softmax_cross_entropy(y_test, t_test) test_losses.append(to_cpu(loss_test.data)) # 精度を計算 accuracy = F.accuracy(y_test, t_test) accuracy.to_cpu() test_accuracies.append(accuracy.data) if test_iter.is_new_epoch: test_iter.epoch = 0 test_iter.current_position = 0 test_iter.is_new_epoch = False test_iter._pushed_position = None break print('val_loss:{:.04f} val_accuracy:{:.04f}'.format( np.mean(test_losses), np.mean(test_accuracies)))
from chainer import serializers
serializers.save_npz('my_mnist.model', net)
ちゃんと保存されていることを確認
%ls -la my_mnist.model
●KeyErrorの内容
KeyError Traceback (most recent call last)
~\Anaconda3\envs\chainenv\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
2524 try:
-> 2525 return self._engine.get_loc(key)
2526 except KeyError:
pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 519
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
<ipython-input-1-465e50b1bed3> in <module>()
72
73 # ---------- 学習の1イテレーション ----------
---> 74 train_batch = train_iter.next()
75 x, t = concat_examples(train_batch, gpu_id)
76
~\Anaconda3\envs\chainenv\lib\site-packages\chainer\iterators\serial_iterator.py in next(self)
55 batch = self.dataset[i:i_end]
56 else:
---> 57 batch = [self.dataset[index] for index in self._order[i:i_end]]
58
59 if i_end >= N:
~\Anaconda3\envs\chainenv\lib\site-packages\chainer\iterators\serial_iterator.py in <listcomp>(.0)
55 batch = self.dataset[i:i_end]
56 else:
---> 57 batch = [self.dataset[index] for index in self._order[i:i_end]]
58
59 if i_end >= N:
~\Anaconda3\envs\chainenv\lib\site-packages\pandas\core\frame.py in getitem(self, key)
2137 return self._getitem_multilevel(key)
2138 else:
-> 2139 return self._getitem_column(key)
2140
2141 def _getitem_column(self, key):
~\Anaconda3\envs\chainenv\lib\site-packages\pandas\core\frame.py in _getitem_column(self, key)
2144 # get column
2145 if self.columns.is_unique:
-> 2146 return self._get_item_cache(key)
2147
2148 # duplicate columns & possible reduce dimensionality
~\Anaconda3\envs\chainenv\lib\site-packages\pandas\core\generic.py in _get_item_cache(self, item)
1840 res = cache.get(item)
1841 if res is None:
-> 1842 values = self._data.get(item)
1843 res = self._box_item_values(item, values)
1844 cache[item] = res
~\Anaconda3\envs\chainenv\lib\site-packages\pandas\core\internals.py in get(self, item, fastpath)
3841
3842 if not isna(item):
-> 3843 loc = self.items.get_loc(item)
3844 else:
3845 indexer = np.arange(len(self.items))[isna(self.items)]
~\Anaconda3\envs\chainenv\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
2525 return self._engine.get_loc(key)
2526 except KeyError:
-> 2527 return self._engine.get_loc(self._maybe_cast_indexer(key))
2528
2529 indexer = self.get_indexer([key], method=method, tolerance=tolerance)
pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 519
●以上です。ご教授願えますと幸いです。
あなたの回答
tips
プレビュー