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

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

詳細はこちら
Keras

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

深層学習

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

6578閲覧

Python-kerasを用いたNNでのinput_dataの次元数が合わない

dbrow

総合スコア18

Keras

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

深層学習

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/12/07 02:16

前提・実現したいこと

kerasを用いて画像データの全結合型ニューラルネットワークの学習プロセス構築中に以下のエラーメッセージが発生しました。

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

プログラムが期待している入力の次元数(※1)と実際に渡している入力(※2)のnumpy配列の次元数が合わない
それぞれの次元数に関しての認識は以下の通りです。
※1:2次元
※2:4次元(2000行×1チャンネル×28ピクセル×28ピクセル)

エラーメッセージ --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-185-bd4ddb1d111d> in <module> 1 # 訓練の実行 2 # (x_train, y_trainはNumpy行列の学習データ) ----> 3 model.fit(X_train, y_train, epochs=2) //anaconda3/lib/python3.7/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs) 950 sample_weight=sample_weight, 951 class_weight=class_weight, --> 952 batch_size=batch_size) 953 # Prepare validation data. 954 do_validation = False //anaconda3/lib/python3.7/site-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 749 feed_input_shapes, 750 check_batch_axis=False, # Don't enforce the batch size. --> 751 exception_prefix='input') 752 753 if y is not None: //anaconda3/lib/python3.7/site-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 126 ': expected ' + names[i] + ' to have ' + 127 str(len(shape)) + ' dimensions, but got array ' --> 128 'with shape ' + str(data_shape)) 129 if not check_batch_axis: 130 data_shape = data_shape[1:] ValueError: Error when checking input: expected dense_41_input to have 2 dimensions, but got array with shape (2000, 1, 28, 28) ### 該当のソースコード train_data = np.load("train_data.npy") train_label = np.load("train_label.npy") print(train_data.shape) print(train_label.shape) train_sample = train_data[8].reshape(28,28) print(train_sample) X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train = (X_train - X_train.min()) / X_train.max() model = Sequential([Dense(32, input_shape = None)]) model.add(Dense(units=64, activation='relu', input_dim=784)) model.add(Dense(units=10, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) model.fit(X_train, y_train, epochs=2) ```ここに言語名を入力 python ### 試したこと ・学習データのshapeを(2000, 784)に変えてみる →以下の同様なエラーメッセージが表示される。 ValueError: Error when checking input: expected dense_47_input to have shape (10,) but got array with shape (784,) ### 補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

ベストアンサー

プログラムが期待している入力の次元数はSequentialに加えるlayerのinput_shape引数で宣言します。(ただし、バッチサイズは省略する)
なので、実際に渡している入力のnumpy配列の次元数である(batch_size, 1, 28, 28)を以下のようにinput_shapeにわたせばいいです。

python

1model = Sequential() 2model.add(Dense(32, input_shape = (1, 28, 28))) 3# 注: 2番目以降のinput_shape, input_dimは無視されます 4model.add(Dense(units=64, activation='relu', input_dim=784)) 5model.add(Dense(units=10, activation='softmax')) 6model.summary() 7""" 8Model: "sequential_18" 9_________________________________________________________________ 10Layer (type) Output Shape Param # 11================================================================= 12dense_28 (Dense) (None, 1, 28, 32) 928 13_________________________________________________________________ 14dense_29 (Dense) (None, 1, 28, 64) 2112 15_________________________________________________________________ 16dense_30 (Dense) (None, 1, 28, 10) 650 17================================================================= 18... 19"""

補足:

質問に素直に答えると上記のようなコードになりますが、kerasのDenseは一番うしろの次元にしか処理がかからないです。このような使い方は通常されないので少し補足させてください。
2回目のinput_dimを784にしているのは画像の次元を1次元(784)に変換してからDenseに入力したいように見えました。もしそうであれば以下のようにFlatten()を使えばバッチサイズを除いて1次元にできます。

python

1from keras.layers import Flatten 2 3model = Sequential( 4 # [Dense(32, input_shape = None] 5) 6model.add(Flatten(input_shape=(1, 28, 28))) 7model.add(Dense(units=64, activation='relu')) 8model.add(Dense(units=10, activation='softmax')) 9model.summary() 10""" 11Model: "sequential_16" 12_________________________________________________________________ 13Layer (type) Output Shape Param # 14================================================================= 15flatten_7 (Flatten) (None, 784) 0 16_________________________________________________________________ 17dense_23 (Dense) (None, 64) 50240 18_________________________________________________________________ 19dense_24 (Dense) (None, 10) 650 20================================================================= 21... 22"""

投稿2019/12/15 10:08

T.Tom

総合スコア58

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

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

dbrow

2019/12/19 10:50

ありがとうございます。解決できました。 補足もありがとうございます。 全結合型NNとCNNをごっちゃにしていましたが、どちらでもモデル構築できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問