TensorFlowで1万個(9700個程度)あるデータを1000個づつmodelにfit_generatorしてくために独自Classを作成していますが実行時に以下のエラーが発生してしまいます。Generatorの戻り値がタプルである必要があるというエラーですが、1/10から8/10までは正常に動作できているようですが9/10でエラーになっています。最後の残りデータ処理もしくはデータが終了した時にエラーが発生しているように見えてます。
(データを変えて見ると「for i in range( ( len(srcd) - inMin ) ):」文の最後でエラーが発生しているように見えます。)
いろいろ試しましたがエラーがなくならないので修正できる方、応募のほどよろしくお願いします。
エラー内容【データの最後で残り分?で発生しているようです。】
Epoch 1/7 1/10 [==>...........................] - ETA: 1129s - loss: 13.3297 - acc: 0.1730 (省略) 9/10 [==========================>...] - ETA: 103s - loss: 13.3959 - acc: 0.1689 Exception in thread Thread-32: Traceback (most recent call last): File "/home/user1/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/threading.py", line 916, in _bootstrap_inner self.run() File "/home/user1/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/threading.py", line 864, in run self._target(*self._args, **self._kwargs) File "/home/user1/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py", line 612, in data_generator_task generator_output = next(self._generator) StopIteration --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-63-b808c7db4ce9> in <module>() 138 steps_per_epoch=int(np.ceil(srcdlen / batch_size)), 139 epochs=epochs, --> 140 verbose=1) 141 #validation_data=test_datagen.flow_from_datafile(n_classes, batch_size, tstdlen), 142 #validation_steps=int(np.ceil(tstdlen / batch_size))) /home/user1/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs) 86 warnings.warn('Update your `' + object_name + 87 '` call to the Keras 2 API: ' + signature, stacklevel=2) ---> 88 return func(*args, **kwargs) 89 wrapper._legacy_support_signature = inspect.getargspec(func) 90 return wrapper /home/user1/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/models.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_q_size, workers, pickle_safe, initial_epoch) 1122 workers=workers, 1123 pickle_safe=pickle_safe, -> 1124 initial_epoch=initial_epoch) 1125 1126 @interfaces.legacy_generator_methods_support /home/user1/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs) 86 warnings.warn('Update your `' + object_name + 87 '` call to the Keras 2 API: ' + signature, stacklevel=2) ---> 88 return func(*args, **kwargs) 89 wrapper._legacy_support_signature = inspect.getargspec(func) 90 return wrapper /home/user1/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_q_size, workers, pickle_safe, initial_epoch) 1875 'a tuple `(x, y, sample_weight)` ' 1876 'or `(x, y)`. Found: ' + -> 1877 str(generator_output)) 1878 if len(generator_output) == 2: 1879 x, y = generator_output ValueError: output of generator should be a tuple `(x, y, sample_weight)` or `(x, y)`. Found: None
プログラムの関連と思われる部分が以下となります。
Python
1class xDataGenerator(object): 2 def __init__(self, datafile, l_n): 3 self.l_n = l_n # 160が入る 4 self.reset() 5 self.xparam = np.zeros(l_n*4*4) 6 with open(datafile) as f: 7 self.srcd = f.readlines() 8 9 def reset(self): 10 self.xdatas = np.empty((0, 1, self.l_n, 4*4), int) 11 self.ylabels = np.array([], int) 12 13 def flow_from_datafile(self, classes, batch_size, datalen): 14 # 読み込んだファイルの行数 15 for i in range( ( len(srcd) - inMin ) ): 16 # xparam末尾に新しいデータをいれる(160行の最新データにする) 17 self.srcd[i] = self.srcd[i].strip() 18 spltDataArr = self.srcd[i].split(",") 19 # 1行は16個のデータ(160行分をxparamに順次格納) 20 self.xparam = np.append(self.xparam[16:], spltDataArr) 21 22 # l_n個以上になるとAIに学習させる(160個分で学習させる) 23 if ( i >= self.lo_n ): 24 curClass = 1 # 初期値は中間 25 # データの格納 26 self.xdatas = np.append(self.xdatas, self.xparam.reshape(1, 1, self.l_n, 4*4), axis=0) 27 self.ylabels = np.append(self.ylabels, curClass) 28 # batch_sizeに達すれば一度学習する 29 if ( len(self.ylabels) == batch_size or i == (datalen - inMin - 1) ): 30 y_keras = np.asarray(keras.utils.to_categorical(self.ylabels, 3)) 31 # データ返答 32 inputs = np.asarray(self.xdatas) 33 self.reset() 34 yield inputs, y_keras 35 36 37# パラメータ 38n = 160 #16の10倍 39batch_size = 1000 # 1000データ単位に学習 40epochs = 7 41 42input_shape = (1,n,4*4) 43 44# 畳み込みニューラルネットワークを定義 45model = Sequential() 46model.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu', input_shape=input_shape)) 47model.add(Conv2D(filters=64, kernel_size=(3,3), activation='relu')) 48model.add(MaxPooling2D(pool_size=(2, 2))) 49model.add(Dropout(0.25)) 50model.add(Flatten()) 51model.add(Dense(units=128, activation='relu')) 52model.add(Dropout(0.5)) 53model.add(Dense(units=n_classes, activation='softmax')) 54 55# モデルのコンパイル 56model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) 57 58# steps_per_epochはその名のとおり、1epochのstep数で、基本はデータ数 / バッチサイズ = int(srcdlen / batchsize) 59history = model.fit_generator( 60 generator=train_datagen.flow_from_datafile(n_classes, batch_size, srcdlen), 61 steps_per_epoch=int(np.ceil(srcdlen / batch_size)), 62 epochs=epochs, 63 verbose=1)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。