🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

Q&A

解決済

1回答

851閲覧

KerasのGenerator(fit_generator)のdimensionエラーについて

yamayamak

総合スコア131

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

0グッド

0クリップ

投稿2019/12/15 11:34

編集2019/12/15 21:14

TensorFlowで10万個あるデータを1000個づつmodelにfit_generatorしてくために独自Classを作成していますが
実行時に以下のエラーが発生してしまいます。

Python

1# プログラムで表示 21 2019-12-15 23:17:43.918748 3Epoch 1/10 4# エラー内容 5--------------------------------------------------------------------------- 6ValueError Traceback (most recent call last) 7<ipython-input-56-5381014b3057> in <module>() 8 131 steps_per_epoch=int(np.ceil(srcdlen / batch_size)), 9 132 epochs=epochs, 10--> 133 verbose=1) 11 134 #validation_data=test_datagen.flow_from_datafile(n_classes, batch_size, tstdlen), 12 135 #validation_steps=int(np.ceil(tstdlen / batch_size))) 13 14/home/user/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs) 15 86 warnings.warn('Update your `' + object_name + 16 87 '` call to the Keras 2 API: ' + signature, stacklevel=2) 17---> 88 return func(*args, **kwargs) 18 89 wrapper._legacy_support_signature = inspect.getargspec(func) 19 90 return wrapper 20 21/home/user/.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) 22 1122 workers=workers, 23 1123 pickle_safe=pickle_safe, 24-> 1124 initial_epoch=initial_epoch) 25 1125 26 1126 @interfaces.legacy_generator_methods_support 27 28/home/user/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs) 29 86 warnings.warn('Update your `' + object_name + 30 87 '` call to the Keras 2 API: ' + signature, stacklevel=2) 31---> 88 return func(*args, **kwargs) 32 89 wrapper._legacy_support_signature = inspect.getargspec(func) 33 90 return wrapper 34 35/home/user/.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) 36 1900 outs = self.train_on_batch(x, y, 37 1901 sample_weight=sample_weight, 38-> 1902 class_weight=class_weight) 39 1903 40 1904 if not isinstance(outs, list): 41 42/home/user/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py in train_on_batch(self, x, y, sample_weight, class_weight) 43 1634 sample_weight=sample_weight, 44 1635 class_weight=class_weight, 45-> 1636 check_batch_axis=True) 46 1637 if self.uses_learning_phase and not isinstance(K.learning_phase(), int): 47 1638 ins = x + y + sample_weights + [1.] 48 49/home/user/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size) 50 1309 self._feed_input_shapes, 51 1310 check_batch_axis=False, 52-> 1311 exception_prefix='input') 53 1312 y = _standardize_input_data(y, self._feed_output_names, 54 1313 output_shapes, 55 56/home/user/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py in _standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 57 125 ' to have ' + str(len(shapes[i])) + 58 126 ' dimensions, but got array with shape ' + 59--> 127 str(array.shape)) 60 128 for j, (dim, ref_dim) in enumerate(zip(array.shape, shapes[i])): 61 129 if not j and not check_batch_axis: 62 63ValueError: Error when checking input: expected conv2d_71_input to have 4 dimensions, but got array with shape (1000, 160, 16)

dimension(shape)が間違っているエラーのようですが、どのように修正すれば良いかご教授ください

よろしくお願いします。

以下は該当と思われる部分のプログラムになります。

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, 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, 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 len(self.ylabels) == datalen ): 30 #yield self.xdatas, self.ylabels 31 inputs = np.asarray(self.xdatas, int) 32 targets = np.asarray(self.ylabels, int) 33 self.reset() 34 yield inputs, targets 35 36 37# パラメータ 38n = 160 #16の10倍 39batch_size = 1000 # 1000データ単位に学習 40epochs = 10 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)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Append時に3次元配列で追加していたのが問題でした。
Channel(通常、白黒1、Color3)を含み4次元で返す必要がありました。
以下のように修正して直りました。

python

1self.xdatas = np.append(self.xdatas, self.xparam.reshape(1, 1, self.l_n, 4*4), axis=0)

投稿2019/12/16 02:17

yamayamak

総合スコア131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問