転移学習した後のモデルで、特定の画像を予測するには?(TensorFlow)
で質問した者です。恥ずかしながら、また分からなくなってしまい、質問させて頂きました。
公式サイト「Transfer learning with a pretrained ConvNet」を実装確認したところです。
こちらのサイトを使って、未知の画像を予測してみたいのですが方法が分かりません。出力して確認したいのは、以下の4点です。
・予測する画像の表示
・予測した確率
・予測ラベル
・正解ラベル(画像のラベル)
予測しようと思って書いみたプログラムは以下(全文)です。
最後に#case1, #case2と書いた「predict」のところです。 arrayがうまいこと配列になっていない?気がしています。(当然、np.argmaxも)
上記4点がうまいこと確認できません。勉強不足でお恥ずかしい限りです。ですが、頑張りたいと思います。
基本的なことで申し訳ないですが、どなたかアドバイスをお願いしてもよろしいでしょうか。
import os import keras from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential, Model from keras.layers import Input, Dense, Dropout, Activation, Flatten,MaxPooling2D,Conv2D from keras import optimizers import tensorflow as tf import numpy as np from keras.preprocessing.image import load_img, img_to_array from keras.applications.vgg16 import preprocess_input # 分類クラス classes = ['cat1','cat2','cat3'] nb_classes = len(classes) batch_size_for_data_generator = 20 base_dir = "XXX" train_dir = os.path.join(base_dir, 'train') validation_dir = os.path.join(base_dir, 'validation') test_dir = os.path.join(base_dir, 'test') train_1_dir = os.path.join(train_dir, '1') train_2_dir = os.path.join(train_dir, '2') train_3_dir = os.path.join(train_dir, '3') validation_1_dir = os.path.join(validation_dir, '1') validation_2_dir = os.path.join(validation_dir, '2') validation_3_dir = os.path.join(validation_dir, '3') test_1_dir = os.path.join(test_dir, '1') test_2_dir = os.path.join(test_dir, '2') test_3_dir = os.path.join(test_dir, '3') # 画像サイズ img_rows, img_cols = 200, 200 train_datagen = ImageDataGenerator(rescale=1.0 / 255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True) train_generator = train_datagen.flow_from_directory(directory=train_dir,target_size=(img_rows, img_cols),color_mode='rgb',batch_size=batch_size_for_data_generator,shuffle=True) test_datagen = ImageDataGenerator(rescale=1.0 / 255) validation_generator = test_datagen.flow_from_directory(directory=validation_dir,target_size=(img_rows, img_cols),color_mode='rgb',batch_size=batch_size_for_data_generator,shuffle=True) IMG_SHAPE = (224, 224, 3) base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE, include_top=False, weights='imagenet') base_model.trainable = False maxpool_layer = tf.keras.layers.GlobalMaxPooling2D() prediction_layer = tf.keras.layers.Dense(1) learning_rate = 0.0001 model = tf.keras.Sequential([ base_model, maxpool_layer, prediction_layer ]) base_learning_rate = 0.0001 model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=base_learning_rate), loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy']) model.summary() initial_epochs = 10 validation_steps=20 loss0,accuracy0 = model.evaluate(validation_generator, steps = validation_steps) history = model.fit(train_generator, epochs=initial_epochs, validation_data=validation_generator) base_model.trainable = True for layer in base_model.layers[:100]: layer.trainable = False print("Number of layers in the base model: ", len(base_model.layers)) model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), optimizer = tf.keras.optimizers.RMSprop(lr=base_learning_rate/10), metrics=['accuracy']) model.summary() fine_tune_epochs = 10 total_epochs = initial_epochs + fine_tune_epochs history_fine = model.fit(train_generator, epochs=total_epochs, initial_epoch = history.epoch[-1], validation_data=validation_generator) #case1 filename = os.path.join('XXX/', 'XXX.png') filename img = load_img(filename, target_size=(224, 224)) x = img_to_array(img) x = np.expand_dims(x, axis=0) predict = model.predict(preprocess_input(x)) predict #array([[4.345547]], dtype=float32) #case2 print(model.predict(validation_generator)[0]) #[-2.2691705]