###問題点
kerasによる画像認識を拝見し,Inception v3のfine tuning(4クラス分類)をやりたいと思っています.
しかし,最終層の設定において出力を4つに設定し,モデルのサマリを見ても
dense_1 (Dense) (None, 4) 8196 global_average_pooling2d_1[0][0]
となっているにも関わらず,以下のエラーが出ます
ValueError: Error when checking target: expected dense_1 to have shape (None, 1) but got array with shape (32, 4)
何が原因かが未だ分からないので助言をお願いしたいと思います.
以下ソースコードです.
###該当のソースコード
Python
import os from keras.applications.inception_v3 import InceptionV3 from keras.applications.inception_v3 import preprocess_input from keras.models import Sequential, Model from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Convolution2D, MaxPooling2D, ZeroPadding2D, GlobalAveragePooling2D, AveragePooling2D from keras.regularizers import l2 from keras.utils import np_utils from keras.utils import plot_model from keras.preprocessing.image import ImageDataGenerator from keras.callbacks import ModelCheckpoint import matplotlib.pyplot as plt import keras.backend as K epoch = 2 result_dir = 'D:/result' if not os.path.exists(result): os.mkdir(result_dir) def plot_history(history): # 精度の履歴をプロット plt.plot(history.history['acc'], "o-", label="accuracy") plt.plot(history.history['val_acc'], "o-", label="val_acc") plt.title('model accuracy') plt.xlabel('epoch') plt.ylabel('accuracy') plt.legend(loc="lower right") plt.show() # 損失の履歴をプロット plt.plot(history.history['loss'], "o-", label="loss", ) plt.plot(history.history['val_loss'], "o-", label="val_loss") plt.title('model loss') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(loc='lower right') plt.show() def save_history(history, result_file): loss = history.history['loss'] acc = history.history['acc'] val_loss = history.history['val_loss'] val_acc = history.history['val_acc'] nb_epoch = len(acc) with open(result_file, "w") as fp: fp.write("epoch\tloss\tacc\tval_loss\tval_acc\n") for i in range(nb_epoch): fp.write("%d\t%f\t%f\t%f\t%f\n" % (i, loss[i], acc[i], val_loss[i], val_acc[i])) if __name__ == '__main__': classes = ['m', 'n', 'o', 'k'] batch_size = 32 nb_classes = len(classes) img_rows, img_cols = 299, 299 samples_per_epoch = 600 nb_val_samples = 99 # CNNを構築 # Inception v3モデルの読み込み,最終層は読み込まない base_model = InceptionV3(weights='imagenet', include_top=False) # 最終層の設定 x = base_model.output x = GlobalAveragePooling2D()(x) predictions = Dense(nb_classes, kernel_initializer="glorot_uniform", activation="softmax", kernel_regularizer=l2(.0005))(x) # モデルのサマリを表示 model = Model(inputs=base_model.input, outputs=predictions) plot_model(model, show_shapes=True, to_file=os.path.join(result_dir, 'model.png')) model.summary() # base_modelはweightsを更新しない for layer in base_model.layers: layer.trainable = False model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # ディレクトリの画像を使ったジェネレータ train_datagen = ImageDataGenerator( rescale=1.0 // 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1.0 // 255) train_generator = train_datagen.flow_from_directory( directory='D:/s_dir/train_images', target_size=(img_rows, img_cols), color_mode='rgb', classes=classes, class_mode='categorical', batch_size=batch_size, shuffle=True) # 確認 print(train_generator.class_indices) test_generator = test_datagen.flow_from_directory( directory='D:/s_dir/test_images', target_size=(img_rows, img_cols), color_mode='rgb', classes=classes, class_mode='categorical', batch_size=batch_size, shuffle=True) checkpointer = ModelCheckpoint(filepath='D:/result/model.{epoch:02d}-{val_loss:.2f}.hdf5', verbose=1, save_best_only=True) history = model.fit_generator( train_generator, steps_per_epoch=samples_per_epoch, epochs=epoch, validation_data=test_generator, validation_steps=nb_val_samples, callbacks=[checkpointer]) save_history(history, os.path.join(result, 'history.txt')) # modelに学習させた時の変化の様子をplot plot_history(history) loss, acc = model.evaluate_generator(test_generator, steps=400) print('Test loss:', loss) print('Test acc:', acc) K.clear_session()
まだ回答がついていません
会員登録して回答してみよう