質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1728閲覧

入力した画像の予測方法が分からない

nyanryou

総合スコア20

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/20 08:37

編集2021/02/20 10:49

tensorflowのチュートリアルを見ながら、自分と妹の顔のモデルを作成しました。(classifire.py)
モデルをperson.h5と名前で保存し、このモデルを利用して入力された画像が自分なのか妹なのか数値に起こしたいをおもいプログラムを作成しました。(test.py)
Tensorflowのfashionモデルの作成チュートリアルこのサイトを参考にしmodel.predict()を利用すると予測した出力されるということはわかりましたが、いざ使ってみるとエラーがでて詰まってしまいました。

エラー文で検索したりpredictで検索したりと結構調べたのですが、結局わからなかったため質問させていただきました。

知識が乏しいためご教授いただければ幸いです。
よろしくお願いいたします。

試したこと

入力画像をnumpy配列にし255で割って正規化を行った
それで以下のようなエラー出た

fashionのチュートリアルでmodel_predict(test_images)という文のtest_imagesのtypeと内容を確認した
numpy配列で、01の値が含まれていた
test.pyで与えた画像もnumpy配列で、0
1の値になっている

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

作成したモデルは、複数の画像を同時に推論できるようになっています。画像の枚数は不定なのでNoneで表すのが通常です。要するに、モデルとしては(None, 200, 200, 3)の4次元の入力を期待しています。

一方、質問者様のpredictでは1枚の画像しか入力していません。(200, 200, 3)ですね。この先頭の次元の大きさ200が画像の枚数であると解釈されると(None, 200, 3)となります。よって、モデルとしては4次元を入力として期待しているのに3次元が入力されたのでエラーですよ、ちなみに入力は(None, 200, 3)でしたよ、という意味のエラーメッセージになったわけです。

そのため、1枚だけの画像の配列として、以下のように書き換える必要があります。

predictions = model.predict(im.reshape(-1, 150, 150, 3))

ただし、これだけだと新たなエラーが出るでしょう。
質問者様のモデルでは画像を150×150に圧縮していますので、入力としては(None, 150, 150, 3)を期待しています。よって、画像サイズの違いにより、新たなエラーが出ると思います。そのため、画像を圧縮する必要があります。PILの機能で圧縮してもよいですし、flow_from_directoryを使って推論用のデータのジェネレータを作る方法もあります。

参考: Python, Pillowで画像を一括リサイズ(拡大・縮小)

投稿2021/02/20 09:26

編集2021/02/20 11:26
toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyanryou

2021/02/20 10:37

また、回答していただきありがとうございます…。 なんどもなんどもすみません。 いくつが質問がございます。 ①4 次元の入力とありますが、(画像の枚数,横のサイズ,縦のサイズ,kernel_size??)という意味なのでしょうか?画像が一枚だったため三次元になってしまったていう理解で大丈夫ですか? ②なぜmodel.predict()の引数が[im]だけなのでしょうか? ③モデルでは画像を150×150に圧縮してあるとありますが、それはclassifier.pyのIMG_HEIGHT,IMG_WIDTHで150と指定したから150×150に圧縮された問理解で大丈夫ですか? また、一枚の画像を150にリサイズしてからtest.pyを実行したのですが、ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 150, 3)このようにエラーがでます… いろいろ調べてみて、複数枚でも試してみたのですが結局うまくいかないままでした。 お手数ですがよろしくお願いいたします。
toast-uz

2021/02/20 10:53 編集

①(画像の枚数,横のサイズ,縦のサイズ,カラー) です。 ②画像の枚数=1枚を明示的に示すためです。 ③モデル定義のinput_shape=(IMG_HEIGHT, IMG_WIDTH ,3)で150*150*3になっています。 predictions = model.predict(im)をpredictions = model.predict([im])に変えても、エラーは変わらなかったでしょうか?それをお知らせください。
nyanryou

2021/02/20 10:54

返信ありがとうございます。 predictions = model.predict(im)もpredictions = model.predict([im])両方試してみましたが、どちらもvalueErrorと同じエラーがでます。
toast-uz

2021/02/20 11:27

すみません。numpyとしてちゃんとreshapeする必要があったようです。回答を修正しましたので、確認ください。
nyanryou

2021/02/20 12:11

動きました!! 本当にありがとうございます。 1人では絶対あきらめてました… 自分の写真だと0に近づき、妹の写真だと1に近づくような数値が出ました! 次は多クラス分類に挑戦してみます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問