tensorflowのチュートリアルを見ながら、自分と妹の顔のモデルを作成しました。(classifire.py)
モデルをperson.h5と名前で保存し、このモデルを利用して入力された画像が自分なのか妹なのか数値に起こしたいをおもいプログラムを作成しました。(test.py)
Tensorflowのfashionモデルの作成チュートリアルこのサイトを参考にしmodel.predict()を利用すると予測した出力されるということはわかりましたが、いざ使ってみるとエラーがでて詰まってしまいました。
エラー文で検索したりpredictで検索したりと結構調べたのですが、結局わからなかったため質問させていただきました。
知識が乏しいためご教授いただければ幸いです。
よろしくお願いいたします。
試したこと
入力画像をnumpy配列にし255で割って正規化を行った
それで以下のようなエラー出た
fashionのチュートリアルでmodel_predict(test_images)という文のtest_imagesのtypeと内容を確認した
numpy配列で、01の値が含まれていた1の値になっている
test.pyで与えた画像もnumpy配列で、0
from tensorflow import keras from PIL import Image import numpy as np model = tf.keras.models.load_model('person.h5') model.summary() image = Image.open('C:/GraduationResearch/annotation/3000/train/me/img_0_9309.jpg') img_resize = image.resize((150,150)) im = np.array(img_resize) im = im/255 predictions = model.predict([im]) print(predictions)
ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 150, 3)
ソースコード
Classifier
1import tensorflow as tf 2from tensorflow.keras.models import Sequential 3from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D 4from tensorflow.keras.preprocessing.image import ImageDataGenerator 5 6import os 7import numpy as np 8import matplotlib.pyplot as plt 9 10PATH = 'C:/GraduationResearch/annotation/data' 11 12train_dir = os.path.join(PATH, 'train') 13validation_dir = os.path.join(PATH, 'validation') 14 15train_me_dir = os.path.join(train_dir, 'me') 16train_sister2_dir = os.path.join(train_dir, 'sister2') 17# train_father_dir = os.path.join(train_dir, 'father') 18 19validation_me_dir = os.path.join(validation_dir, 'me') 20validation_sister2_dir = os.path.join(validation_dir, 'sister2') 21# validation_father_dir = os.path.join(validation_dir, 'father') 22 23num_me_tr = len(os.listdir(train_me_dir)) 24num_sister2_tr = len(os.listdir(train_sister2_dir)) 25# num_father_tr = len(os.listdir(train_father_dir)) 26 27num_me_val = len(os.listdir(validation_me_dir)) 28num_sister2_val = len(os.listdir(validation_sister2_dir)) 29# num_father_val = len(os.listdir(validation_father_dir)) 30 31# total_train = num_me_tr + num_sister2_tr + num_father_tr 32# total_val = num_me_val + num_sister2_val + num_father_val 33 34total_train = num_me_tr + num_sister2_tr 35total_val = num_me_val + num_sister2_val 36 37print(total_train) 38print(total_val) 39print("-------------------------------") 40 41batch_size = 128 42epochs = 10 43IMG_HEIGHT = 150 44IMG_WIDTH = 150 45 46train_image_generator = ImageDataGenerator(rescale=1./255) 47validation_image_generator = ImageDataGenerator(rescale=1./255) 48 49 50print(train_image_generator) 51print(validation_image_generator) 52print("-------------------------------") 53 54 55train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size, 56 directory=train_dir, 57 shuffle=True, 58 target_size=(IMG_HEIGHT, IMG_WIDTH), 59 class_mode='binary') 60 61val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size, 62 directory=validation_dir, 63 target_size=(IMG_HEIGHT, IMG_WIDTH), 64 class_mode='binary') 65 66sample_training_images, _ = next(train_data_gen) 67 68def plotImages(images_arr): 69 fig, axes = plt.subplots(1, 5, figsize=(20,20)) 70 axes = axes.flatten() 71 for img, ax in zip( images_arr, axes): 72 ax.imshow(img) 73 ax.axis('off') 74 plt.tight_layout() 75 plt.show() 76 77model = Sequential([ 78 Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)), 79 MaxPooling2D(), 80 Conv2D(32, 3, padding='same', activation='relu'), 81 MaxPooling2D(), 82 Conv2D(64, 3, padding='same', activation='relu'), 83 MaxPooling2D(), 84 Flatten(), 85 Dense(512, activation='relu'), 86 Dense(1, activation='sigmoid') 87]) 88 89model.compile(optimizer='adam', 90 loss='binary_crossentropy', 91 metrics=['accuracy']) 92 93history = model.fit_generator( 94 train_data_gen, 95 steps_per_epoch=total_train // batch_size, 96 epochs=epochs, 97 validation_data=val_data_gen, 98 validation_steps=total_val // batch_size 99) 100 101acc = history.history['accuracy'] 102val_acc = history.history['val_accuracy'] 103 104loss = history.history['loss'] 105val_loss = history.history['val_loss'] 106 107epochs_range = range(epochs) 108 109plt.figure(figsize=(8, 8)) 110plt.subplot(1, 2, 1) 111plt.plot(epochs_range, acc, label='Training Accuracy') 112plt.plot(epochs_range, val_acc, label='Validation Accuracy') 113plt.legend(loc='lower right') 114plt.title('Training and Validation Accuracy') 115 116plt.subplot(1, 2, 2) 117plt.plot(epochs_range, loss, label='Training Loss') 118plt.plot(epochs_range, val_loss, label='Validation Loss') 119plt.legend(loc='upper right') 120plt.title('Training and Validation Loss') 121plt.show() 122 123images, labels = next(train_data_gen) 124print(labels) 125 126model.save('person.h5')
test
1import tensorflow as tf 2from tensorflow import keras 3from PIL import Image 4import numpy as np 5 6model = tf.keras.models.load_model('person.h5') 7model.summary() 8 9im = np.array(Image.open('C:/GraduationResearch/annotation/3000/train/me/img_0_9309.jpg')) 10im = im/255 11predictions = model.predict(im) 12print(predictions)
エラー
ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 200, 3)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/20 10:37
2021/02/20 10:53 編集
2021/02/20 10:54
2021/02/20 11:27
2021/02/20 12:11