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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1125閲覧

機械学習における学習済みネットワーク呼び出しを行い、予測させるプログラム

ixajin

総合スコア12

Keras

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/12/21 08:27

編集2018/12/21 09:12

前提・実現したいこと

Python3.6.7でKerasを用いて機械学習を行っています
画像を学習させて判定させるシステムです

発生している問題・エラーメッセージ

実行した際に以下のようなエラーが出ます
ValueError: Error when checking input: expected conv2d_1_input to have shape (50, 50, 3) but got array with shape (224, 224, 3)

該当のソースコード

Python

1import numpy as np 2import matplotlib.pyplot as plt 3import os 4from keras.applications.vgg16 import VGG16 5from keras.applications.vgg16 import preprocess_input, decode_predictions 6import keras.preprocessing.image as Image 7from keras.models import Model, model_from_json 8 9model = model_from_json(open('model.json').read()) 10 11model.load_weights('weights.h5') 12 13img_path='unExample/a6.jpg' 14img = Image.load_img(img_path, target_size=(224,224)) 15x = Image.img_to_array(img) 16x = np.expand_dims(x, axis=0) 17features = model.predict(preprocess_input(x)) 18results = decode_predictions(features, top=3)[0] 19for result in results: 20 print(result) 21

Python

1#coding:utf-8 2 3import keras 4from keras.utils import np_utils 5from keras.models import Sequential 6from keras.layers.convolutional import Conv2D, MaxPooling2D 7from keras.layers.core import Dense, Dropout, Activation, Flatten 8import numpy as np 9from sklearn.model_selection import train_test_split 10from PIL import Image 11import glob 12folder = ["Not_Skill","with_Skill"] 13image_size = 50 14 15X = [] 16Y = [] 17for index, name in enumerate(folder): 18 dir = "./" + name 19 files = glob.glob(dir + "/*.jpg") 20 for i, file in enumerate(files): 21 image = Image.open(file) 22 image = image.convert("RGB") 23 image = image.resize((image_size, image_size)) 24 data = np.asarray(image) 25 X.append(data) 26 Y.append(index) 27 28X = np.array(X) 29Y = np.array(Y) 30X = X.astype('float32') 31X = X / 255.0 32Y = np_utils.to_categorical(Y, 4) 33X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20) 34model = Sequential() 35 36model.add(Conv2D(32, (3, 3), padding='same',input_shape=X_train.shape[1:])) 37model.add(Activation('relu')) 38model.add(Conv2D(32, (3, 3))) 39model.add(Activation('relu')) 40model.add(MaxPooling2D(pool_size=(2, 2))) 41model.add(Dropout(0.25)) 42 43model.add(Conv2D(64, (3, 3), padding='same')) 44model.add(Activation('relu')) 45model.add(Conv2D(64, (3, 3))) 46model.add(Activation('relu')) 47model.add(MaxPooling2D(pool_size=(2, 2))) 48model.add(Dropout(0.25)) 49 50model.add(Flatten()) 51model.add(Dense(512)) 52model.add(Activation('relu')) 53model.add(Dropout(0.5)) 54model.add(Dense(4)) 55model.add(Activation('softmax')) 56 57# コンパイル 58model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy']) 59 60from keras.callbacks import TensorBoard 61tbcb = TensorBoard(log_dir='./graph',histogram_freq=0,write_graph=True) 62 63history = model.fit(X_train, y_train,batch_size=32,epochs=1000, verbose=1,validation_data=(X_test,y_test),callbacks=[tbcb]) 64 65from keras.utils import plot_model 66model_json = model.to_json() 67with open('model.json', mode='w') as f: 68 f.write(model_json) 69 70model.save_weights('weights.h5') 71 72import pickle 73with open("history.pickle", mode='wb') as f: 74 pickle.dump(history.history, f) 75print(model.evaluate(X_test, y_test)) 76

試したこと

target_sizeを(50,50)にした

補足情報(FW/ツールのバージョンなど)

OS: ubuntu14.04.5LTS
コンソール上での実行

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

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

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

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

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

guest

回答1

0

ベストアンサー

ImageNet の学習済みモデルを利用して画像分類を行う。 通りで動きました。
画像を用意して試してみてください。

import numpy as np from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions from keras.preprocessing import image # VGG16 を構築する。 model = VGG16() # 画像を読み込み、モデルの入力サイズでリサイズする。 img_path = 'sample.jpg' img = image.load_img(img_path, target_size=model.input_shape[1:3]) # PIL.Image オブジェクトを np.float32 型の numpy 配列に変換する。 x = image.img_to_array(img) print('x.shape: {}, x.dtype: {}'.format(x.shape, x.dtype)) # x.shape: (224, 224, 3), x.dtype: float32 # 配列の形状を (Height, Width, Channels) から (1, Height, Width, Channels) に変更する。 x = np.expand_dims(x, axis=0) print('x.shape: {}'.format(x.shape)) # x.shape: (1, 224, 224, 3) # VGG16 用の前処理を行う。 x = preprocess_input(x) # 推論する。 preds = model.predict(x) # 推論結果をデコードする。 result = decode_predictions(preds, top=3)[0] for _, name, score in result: print('{}: {:.2%}'.format(name, score))

追記

python

1import keras.preprocessing.image as Image 2import numpy as np 3from keras.models import model_from_json 4 5model = model_from_json(open('model.json').read()) 6model.load_weights('weights.h5') 7 8img_path = 'unExample/a6.jpg' 9img = Image.load_img(img_path, target_size=(50, 50)) 10x = Image.img_to_array(img) 11x = np.expand_dims(x, axis=0) 12 13# 一番スコアが高いクラスだけほしい場合 14pred = model.predict_classes(x)[0] 15print(pred) # 予測したクラス 16 17# 各スコアを表示したい場合 18pred = model.predict(x)[0] 19for class_id, socre in enumerate(pred): 20 print('class: {}, score: {:.2%}'.format(class_id, socre))

投稿2018/12/21 08:32

編集2018/12/21 09:32
tiitoi

総合スコア21956

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

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

ixajin

2018/12/21 08:34

50,50にした場合以下のようなエラーが出てきます ValueError: `decode_predictions` expects a batch of predictions (i.e. a 2D array of shape (samples, 1000)). Found array with shape: (1, 4)
ixajin

2018/12/21 08:43

このページも参考にして作っています モデルが問題なのでしょうか?
tiitoi

2018/12/21 08:49

上記の記事通りで動きました。 動かしたコードを回答欄に記載したので、試してみてください。 画像ファイル名だけ適宜変えてください。
tiitoi

2018/12/21 08:51

よく見たら、以下はなんなのでしょうか? model = model_from_json(open('model.json').read()) model.load_weights('weights.h5') VGG16, preprocess_input, decode_predictions は、Keras で予め用意された VGG16用のものなので、自作のモデルであれば、これらを使うことはないはずです。
ixajin

2018/12/21 08:53

自作モデルを用いて行う場合のコードが分からず検索をかけたところ上の記事などがひっかかりました VGG16で行うと正確な評価が得られないためでしたが、そもそもが間違っていましたか
tiitoi

2018/12/21 08:56

上記の記事は VGG16 というモデルで、ImageNet という1000クラス分類タスクを学習した重みを使用して、与えた画像を分類するやり方について書かれています。 自作のモデルとはどのようなものなのでしょうか? preprocess_input: モデルに流す前の前処理 decode_predictions: モデルの出力の解釈 を行う関数なので、自作のモデルであれば、これらに相当する処理も自分で実装する必要があります。
ixajin

2018/12/21 08:59

自作のモデルはコード内にもあるようにmodel.jsonとweights.h5(重み)にあたり、これは視線軌跡の画像をCNNで学習させたものに当たります なのでImageNetにないであろう画像なのでどうすればよいのかわからずにコードを書いたという感じになります
tiitoi

2018/12/21 09:02 編集

そのモデルのコードが質問にないので、回答できないです。
ixajin

2018/12/21 09:12

モデルについてのコードを記載しました、よろしくおねがいします
tiitoi

2018/12/21 09:17 編集

出力層が4のsoftmax なので4クラス分類問題でしょうか? keras の Sequentical モデルでは、model.predict_classes(x) で推定したクラスが得られます。
ixajin

2018/12/21 09:24

つまり上のコードにおいて画像取得を行う部分はそのままでVGG16を用いる部分だけmodel.predict_classes(x)にすれば良いということでしょうか
tiitoi

2018/12/21 09:32

質問のコードを直すなら回答欄に追記したようになると思います。実行はしてないので動くかはわかりません。
ixajin

2018/12/21 09:41

追記して頂いたものは1番高いスコアの表示は動作(?)しました 0,とだけ帰ってきたのですがこれは正解なのでしょうか..?
tiitoi

2018/12/21 09:43 編集

一番高いスコアではなく、一番スコアが高い"クラス"です。 4クラスなので、0 ~ 3 の値が返ってくると思います。 predict_classes() で0と返ってきたということは、一番確率が高かったクラスが0だったということです。
ixajin

2018/12/21 09:51

間違えました、すみません 結果については理解しました、ありがとうございます ただ各クラスの結果のほうがほしいのですが、そちらだと以下のエラーがでました File "learn.py", line 17, in <module> for class_id, score in enumerate(pred): TypeError: 'numpy.int64' object is not iterable 調べたところ意味はわかったのですが、どこを直せばいいのかはわかりません、よろしくおねがいします
tiitoi

2018/12/21 09:54 編集

スコアのほうは predict_class() ではなく、predict() ですが、そうしましたか? pred = model.predict(x)[0] for class_id, socre in enumerate(pred): print('class: {}, score: {:.2%}'.format(class_id, socre)) エラーになる場合は print(model.predict(x)) の結果を教えてください。
ixajin

2018/12/21 09:59

すみません、predict_classesにしていました 長々とありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問