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

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

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

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

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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

解決済

学習済み画像分類モデルを使用して、任意の画像を分類する

ykykykk69
ykykykk69

総合スコア2

Keras

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

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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

1回答

0評価

1クリップ

631閲覧

投稿2021/09/16 04:00

編集2021/09/22 06:54

下記のようなコードで画像分類器を作成したいと考えています。
しかし、エラーが発生してしまい実行できません。
コードは同じ本から採用しています。
解決方法がありましたら、教えていただけますでしょうか。
よろしくお願い致します。

model_and_weight.h5と1.jpgというファイルは、同階層に保存済みです。

python

from PIL import Image import os, glob from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras.optimizers import RMSprop from keras.utils import np_utils import keras import numpy as np import sys, os from keras.models import load_model imsize = (150, 150) keras_param = "model_and_weight.h5" testpic = "1.jpg" def load_image(path): img = Image.open(path) img = img.convert('RGB') img = img.resize(imsize) img = np.asarray(img) img = img / 255.0 return img model = load_model(keras_param) img = load_image(testpic) prd = model.predict(np.array([img])) print(prd) prelabel = np.argmax(prd, axis=1) if prelabel == 0: print(">>> 犬") elif prelabel == 1: print(">>> 猫")

下記に記載したのがエラー内容

python

WARNING:tensorflow:Model was constructed with shape (None, 4, 4, 512) for input KerasTensor(type_spec=TensorSpec(shape=(None, 4, 4, 512), dtype=tf.float32, name='flatten_input'), name='flatten_input', description="created by layer 'flatten_input'"), but it was called on an input with incompatible shape (None, 150, 150, 3). --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-12-baa28c867e4e> in <module> 35 model = load_model(keras_param) 36 img = load_image(testpic) ---> 37 prd = model.predict(np.array([img])) 38 # print(prd) # 精度の表示 39 prelabel = np.argmax(prd, axis=1)

学習済みファイルの作成コード

python

from keras.applications.vgg16 import VGG16 from keras.preprocessing.image import ImageDataGenerator from keras.layers import Input import numpy as np import os num_train =2000 num_validation=800 img_h,img_w=150,150 channels=3 batch_size=32 train_data_dir='data/train' validation_data_dir='data/validation' result_dir='results' if not os.path.exists(result_dir): os.mkdir(result_dir) def save_VGG16_outputs(): model=VGG16( include_top=False, weights='imagenet', input_shape=(img_h,img_w,channels)) model.summary() datagen=ImageDataGenerator(rescale=1.0/255) train_generator=datagen.flow_from_directory( train_data_dir, target_size=(img_w,img_h), batch_size=batch_size, class_mode=None, shuffle=False) print('train-label:',train_generator.class_indices) vgg16_train=model.predict_generator( train_generator, verbose=1) np.save(os.path.join(result_dir,'vgg16_train.npy'),vgg16_train) validation_generator=datagen.flow_from_directory( validation_data_dir, target_size=(img_w,img_h), batch_size=batch_size, class_mode=None, shuffle=False) print('test-label:',validation_generator.class_indices) vgg16_test=model.predict( validation_generator, verbose=1) np.save(os.path.join(result_dir,'vgg16_test.npy'),vgg16_test) save_VGG16_outputs() import os import numpy as np from keras.models import Sequential from keras import optimizers from keras.layers import Activation,Dropout,Flatten,Dense def train_FClayer(): train_data=np.load( os.path.join(result_dir,'vgg16_train.npy')) print(train_data.shape) train_labels=np.array( [0]*int(num_train/2)+[1]*int(num_train/2)) validation_data=np.load( os.path.join(result_dir,'vgg16_test.npy')) print(validation_data.shape) validation_labels=np.array( [0]*int(num_validation/2)+[1]*int(num_validation/2)) model=Sequential() model.add(Flatten(input_shape=train_data.shape[1:])) model.add(Dense(256,activation='relu')) model.add(Dense(1,activation='sigmoid')) model.compile( loss='binary_crossentropy', metrics=['accuracy'], optimizer=optimizers.SGD(lr=1e-4,momentum=0.9),) epoch=60 batch_size=32 history=model.fit(train_data, train_labels, epochs=epoch, batch_size=batch_size, verbose=1, validation_data=(validation_data,validation_labels)) with open('model.json','w') as json_file: json_file.write(model.to_json()) model.save('model_and_weight.h5') return history history=train_FClayer()

画像の処理コード

python

from keras.applications.vgg16 import VGG16 from keras.preprocessing.image import ImageDataGenerator from keras.layers import Input import numpy as np import os num_eva =1 img_h,img_w=150,150 channels=3 batch_size=32 eva_data_dir='data/evaluation' result_dir='results' if not os.path.exists(result_dir): os.mkdir(result_dir) def save_VGG16_outputs(): model=VGG16( include_top=False, weights='imagenet', input_shape=(img_h,img_w,channels)) model.summary() datagen=ImageDataGenerator(rescale=1.0/255) eva_generator=datagen.flow_from_directory( eva_data_dir, target_size=(img_w,img_h), batch_size=batch_size, class_mode=None, shuffle=False) print('eva-label:',eva_generator.class_indices) vgg16_eva=model.predict_generator( eva_generator, verbose=1) np.save(os.path.join(result_dir,'vgg16_eva.npy'),vgg16_eva) print(vgg16_eva.shape) save_VGG16_outputs() Model: "vgg16" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_2 (InputLayer) [(None, 150, 150, 3)] 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 150, 150, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 150, 150, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 75, 75, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 75, 75, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 75, 75, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 37, 37, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 37, 37, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 37, 37, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 37, 37, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 18, 18, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 18, 18, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 18, 18, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 18, 18, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 9, 9, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 9, 9, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 9, 9, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 9, 9, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 4, 4, 512) 0 ================================================================= Total params: 14,714,688 Trainable params: 14,714,688 Non-trainable params: 0 _________________________________________________________________ Found 1 images belonging to 1 classes. eva-label: {'1': 0} 1/1 [==============================] - 2s 2s/step (1, 4, 4, 512)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

jbpb0

2021/09/19 23:34 編集

「model_and_weight.h5」は、どのようなものでしょうか? 質問者さんが、質問のとは別のコードを実行して作成したものですか? それとも、ネットのどこかからダウンロードしたとか、誰かからもらったとか、そういうものですか?
ykykykk69

2021/09/21 01:52 編集

本に書かれているものを使って作成したものです。 学習済みファイルの作成も今回の任意の画像を分類するものも、同じ本のものを採用しています。
jbpb0

2021/09/21 02:56 編集

差し支えなければ、その本の題名と、コードが乗ってるページを教えてください あるいは、 > 学習済みファイルの作成も今回の任意の画像を分類するものも、同じ本のものを採用 の、「学習済みファイルの作成」のコードを質問に書いてくださるのでもいいです
ykykykk69

2021/09/22 02:25

学習済みファイルの作成コードを本文中に記載させていただきました。
jbpb0

2021/09/22 06:14 編集

学習コードを見ると、「model_and_weight.h5」は「train_FClayer()」内の「model」の学習結果です その学習時の入力は「train_data」でしたので、「model_and_weight.h5」を使って推論する場合の入力データのshapeは「train_data」と同じである必要があります 「train_FClayer()」の先頭の近くにある print(train_data.shape) の実行結果は、 (画像ファイル数, 4, 4, 512) となってるはずです 「model_and_weight.h5」を使って推論する場合の入力データのshapeは、上記のようになってる必要がありますが、そうではない (画像ファイル数, 150, 150, 3) というshapeのデータを入力してるので、質問に書かれてるエラーになります 「train_FClayer()」の「train_data」は「vgg16_train.npy」を読み込んだもので、「vgg16_train.npy」は「save_VGG16_outputs()」内で「vgg16_train」を保存したもので、「vgg16_train」は「model.predict_generator()」の実行結果です したがって、「model_and_weight.h5」を使って推論する場合の入力は、画像データをそのまま使うのではなく、画像データを「save_VGG16_outputs()」の「model.predict_generator()」と同様な処理を行った結果を使う必要があります
ykykykk69

2021/09/22 06:19

丁寧な説明ありがとうございます。 ご指摘の通り画像サイズの部分を変更しました。 しかし、チャンネル数の変更の方法が分からず下記のようなエラーが出てしまいました。 変更方法がもしわかりましたら、教えていただけると幸いです。 WARNING:tensorflow:Model was constructed with shape (None, 4, 4, 512) for input KerasTensor(type_spec=TensorSpec(shape=(None, 4, 4, 512), dtype=tf.float32, name='flatten_input'), name='flatten_input', description="created by layer 'flatten_input'"), but it was called on an input with incompatible shape (None, 4, 4, 3).
jbpb0

2021/09/22 06:34

違いますよ 画像データを「model.predict_generator()」と同様な処理を行った結果を使うのです 「save_VGG16_outputs()」の内容をよく見てください そこでの「model」は「VGG16()」ですよね したがって、「model.predict_generator()」は、「VGG16()」に画像を入力して処理するということです 画像データを「VGG16()」に入力した時の出力のshapeが (画像ファイル数, 4, 4, 512) なのです それが「model_and_weight.h5」の入力です
ykykykk69

2021/09/22 06:52

勘違いしておりました。申し訳ありません。 上記の質問欄に記載させていただいたとおり、画像データを「model.predict_generator()」で処理を行いました。 この結果を用いればよろしいのでしょうか? また、どのように用いればよろしいのでしょうか?
jbpb0

2021/09/22 07:21 編集

参考にしてる本の題名を教えてください Kaggleで学んでハイスコアをたたき出す! Python機械学習&データ分析 か 必要な数学だけでわかる ディープラーニングの理論と実装 ですか?
ykykykk69

2021/09/22 07:25

「必要な数学だけでわかる ディープラーニングの理論と実装」、チーム・カルポ著、秀和システム、2019年1月1日 p178~です。
ykykykk69

2021/09/22 07:37

確認してみたところ、画像分類を行うコードが違ったみたいなので、修正して実行してみます。
ykykykk69

2021/09/22 07:50

ダウンロードして実行してみたところ完成しました。 教えていただきありがとうございました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Keras

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

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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