kerasを使用して、CNNによる数値分類のコードを作成しています。
以下実行環境です。
OS:Windows 10
Anaconda Navigator: Ver 1.9.7
keras:Ver.2.1.3
Python:Ver.3.6
tensorflow-gpu:Ver.1.4.0
CUDA:Ver.8.0
cudnn:Ver.6.0
Anaconda上で、以下のコードを実行しました。
Python
1import keras 2from keras.datasets import mnist 3from keras.models import Sequential 4from keras.layers import Conv2D, MaxPooling2D 5from keras.layers.core import Dropout, Dense 6from keras.optimizers import Adam 7from keras.utils import np_utils 8 9# mnistのデータをロードする 10(x_train, y_train), (x_test, y_test) = mnist.load_data() 11 12TRAIN_NUM = 60000 13TEST_NUM = 10000 14GASO_NUM = 28 * 28 15LABEL_NUM = 10 16 17x_train = x_train.reshape(TRAIN_NUM, GASO_NUM).astype("float32") 18x_test = x_test.reshape(TEST_NUM, GASO_NUM).astype("float32") 19x_train = x_train / 255.0 20x_test = x_test / 255.0 21 22# ラベルは0~9の数字なので0,1の列数10個のデータに変換 23y_train = np_utils.to_categorical(y_train, LABEL_NUM) 24y_test = np_utils.to_categorical(y_test, LABEL_NUM) 25 26# 各レイヤーを作成する 27model = Sequential() 28 29# 出力ニューロンの数 30OUT_NUM = 512 31# ドロップアウト率 32DROP_RATE = 0.2 33 34# 畳み込み層 35model.add(Conv2D(filters=512, kernel_size=(5, 5), strides=(1, 1), padding="same", activation="relu", input_shape=(28, 28, 1))) 36# MaxPooling層 37model.add(MaxPooling2D(pool_size=(2, 2), strides=(1, 1), padding="same")) 38# 畳み込み層 39model.add(Conv2D(filters=512, kernel_size=(5, 5), strides=(1, 1), padding="same", activation="relu")) 40# MaxPooling層 41model.add(MaxPooling2D(pool_size=(2, 2), strides=(1, 1), padding="same")) 42 43# 全結合層 44model.add(Dense(OUT_NUM, activation="relu")) 45model.add(Dropout(DROP_RATE)) 46 47# ラベルの読み出し層 48model.add(Dense(LABEL_NUM, activation="softmax")) 49 50model.compile(optimizer=Adam(), loss="categorical_crossentropy", metrics=["accuracy"]) 51 52# 学習の処理を行う 53model.fit(x_train, y_train, batch_size=100, epochs=10) 54 55# 誤差と精度の表示を行う 56accuracy = model.evaluate(x_test, y_test, batch_size=100, verbose=1) 57print("誤差率:", accuracy[0]) 58print("正解率:", accuracy[1]) 59
上記コードを実行すると、「model.fit(x_train, y_train, batch_size=100, epochs=10)」のところで、下記のエラーが発生します。
ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (60000, 784)
エラーメッセージを読む限り、Conv2Dは4つの引数を要求しているが、60000、784の2つしか入っていない、と表示されているようです。
しかし、実際Conv2Dには(28, 28, 1)の3つの引数しか渡していないので、何故4つとみなされるのか分かりません。
(28, 28, 1)にした理由としては、読み込む画像の縦と横の大きさが28×28で、チャンネル数が1チャンネルのためです。
エラーメッセージの内容、及び正しい引数の指定方法が分かる方がおられましたら、宜しくお願い致します。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/29 14:58