前提・実現したいこと
Google Coloboratory上で顔コレデータセットに対して4クラス分類を行っています。
Google Drive上のデータセットをImageDataGeneratorなどを用いて取り込み、学習をしようとしています。
発生している問題・エラーメッセージ
訓練データに対する学習はうまくいっているように思えるのですが、evaluate_generatorで評価した際のlossとグラフから見るlossのグラフの値が明らかに異なるという問題に直面しました。
どのような原因が考えられるでしょうか。また、そのためにはどのような操作が有効でしょうか?
closed accuracy: 0.4878048896789551
open accuracy: 0.47438329458236694
closed loss: 2.028860092163086
open loss: 0.26708337664604187
該当のソースコード
python source code
#データ読み込み部↓↓ from keras.preprocessing.image import ImageDataGenerator from keras.applications.resnet50 import preprocess_input, decode_predictions from keras.applications.resnet50 import ResNet50 from keras.preprocessing import image batch_size = 32 train_datagen = ImageDataGenerator(rotation_range=20,preprocessing_function=preprocess_input, rescale=1.0 / 255) test_datagen = ImageDataGenerator(rescale=1.0 / 255,preprocessing_function=preprocess_input,) train_generator = train_datagen.flow_from_directory( '#自分のドライブのフォルダパス', # kaokore target_size=(224, 224), batch_size=batch_size, class_mode='categorical') test_generator = test_datagen.flow_from_directory( '#自分のドライブのフォルダパス', target_size=(224, 224), batch_size=1, class_mode='categorical') #モデルの作成部 from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense,Conv2D from keras.preprocessing.image import ImageDataGenerator from keras.applications.vgg16 import VGG16 from keras.applications.resnet50 import ResNet50 num_output_channels=32 size_kernel=(2,2) batch_size = 32 epochs = 15 num_classes = 4 #base_model = VGG16(weights='imagenet') #ResNet50の定義 base_model=ResNet50(weights='imagenet',include_top=False,input_shape=(224,224,3)) #上記の層に自作の層を追加 model = Sequential([base_model, Conv2D(num_output_channels, kernel_size = size_kernel,padding='same',activation='relu' ,input_shape=(7,7,2048)), MaxPooling2D(pool_size=(2,2)), Flatten(), Dense(num_classes), Activation('softmax')]) #ResNet50のパラメータのスイッチ用 #base_model.trainable = True base_model.trainable = False #確認用 #base_model.summary() #model.summary() #modelのコンパイル model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) #学習フェーズ %time history = model.fit_generator(train_generator, epochs=epochs,validation_data=test_generator) #modelのセーブ&ロード with open('model.json', 'w') as f: f.write(model.to_json()) model.save_weights('weights.h5') with open('model.json') as f: model = model_from_json(f.read()) model.load_weights('weights.h5') #ロードしたものをもう一度コンパイルする用 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) #評価部 result = model.evaluate_generator(train_generator) print("closed test") print('loss:',result[0]) print('accuracy:',result[1]) result = model.evaluate_generator(test_generator) print("open test") print('loss:',result[0]) print('accuracy:',result[1]) #学習時の様子を可視化 import matplotlib.pyplot as plt plt.plot(history.history['accuracy'],label="training") plt.plot(history.history['val_accuracy'],label="test") plt.title('Model accuracy') plt.ylabel('Accuracy') plt.xlabel('Epoch') plt.legend(['Train','test'], loc='upper left') #plt.ylim(0.2,0.6) #plt.xlim(0,5) plt.show() plt.plot(history.history['loss'],label="training") plt.plot(history.history['val_loss'],label="test") plt.title('Model loss') plt.ylabel('Loss') plt.xlabel('Epoch') plt.legend(['Train','test'], loc='upper left') plt.show()
試したこと
kerasのモデルにはtraining modeとtesting dataが存在し、そのせいで学習時のモデルと評価時のモデルの振る舞いが異なっていることが原因だと考えました。
そのためモデルを保存⇒再ロード⇒評価としてみたのですが、変化なしです。
補足情報(FW/ツールのバージョンなど)
あなたの回答
tips
プレビュー