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

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

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

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

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

Q&A

解決済

2回答

1370閲覧

【python】kerasで学習したデータを保存し、別のソースコードでデータを読み込んで判定させたが、学習前のような結果が出る。学習データを反映させたい

mitokisan

総合スコア5

Keras

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

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

0グッド

0クリップ

投稿2020/03/31 11:52

前提・実現したいこと

pythonでkerasを使いCNNで矢印が上下左右どの方向を向いているのかを判別するプログラムを作っています
学習が完了したモデルを保存し、別のコードで読み込み、画像の判定をさせたいと考えています

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

学習結果がうまく反映されません
出力で
print(model.predict_classes(ya_1)) #[1]
print(model.predict(ya_1)) #[[0. 1. 0. 0.]]
と、学習させたモデルとは思えない結果が出ます。
(ya_1は画像データ)

該当のソースコード

python

1# 学習データ 2from tensorflow import keras 3import cv2 4import numpy as np 5 6batch_size = 200 7num_class = 4 8epochs = 10 9 10# set X 11file_name = [] 12 13for im in range(0,13073): 14 file_temp = "./ya_resize/re_ya_" + str(im) + ".bmp" 15 file_name.append(file_temp) 16 17cnt = -1 18img = [] 19for i in file_name: 20 21 cnt += 1 22 img_t = cv2.imread(i) 23 img_t = img_t / 255.0 24 25 img_t = img_t.tolist() 26 img.append(img_t) 27 28print(img[0]) 29 30img = np.array(img) 31for i in range(0,13073): 32 img[i] = np.array(img[i]) 33img = np.array(img) 34 35img = img.reshape(13073,45,45,3) 36 37print(img) 38 39print(img[i].shape) 40 41# set y 42 43y = [] 44f = open("label") 45label = f.read() 46f.close() 47 48for i in label: 49 label_temp = i.rstrip() 50 if not label_temp == "": 51 label_temp = int(label_temp) 52 y.append(label_temp) 53 54y = np.array(y) 55 56x_train = img[:13030] 57y_train = y[:13030] 58x_test = img[13031:] 59y_test = y[13031:] 60 61print(x_train.shape,x_test.shape) 62 63model = keras.models.Sequential([ 64 65 keras.layers.Conv2D(64,kernel_size=(5,5), 66 activation="relu", 67 input_shape=(45,45,3)), 68 keras.layers.Conv2D(32,(5,5),activation="relu"), 69 keras.layers.MaxPooling2D(pool_size=(2,2)), 70 keras.layers.Dropout(0.25), 71 keras.layers.Flatten(), 72 keras.layers.Dense(16,activation="relu"), 73 keras.layers.Dropout(0.5), 74 keras.layers.Dense(num_class,activation="softmax") 75 76]) 77 78model.compile(optimizer="RMSprop", loss="sparse_categorical_crossentropy", metrics=["accuracy"]) 79model.fit(x_train, y_train, epochs=epochs) 80 81a = model.evaluate(x_test,y_test) 82b = model.predict(x_test) 83print(a) 84print(b) 85print(model.summary()) 86print(model.predict_classes(x_test)) 87 88open("and.json","w").write(model.to_json()) 89model.save("ya_model.hdf5",save_format="h5")

python

1# 学習済みモデルを使って判別 2from tensorflow import keras 3import cv2 4import numpy as np 5import h5py 6 7kernel = np.ones((3,3), dtype=np.uint8) 8 9 10img = cv2.imread("./ya_cut/re_ya_1.bmp") 11 12ya_1 = img.reshape(1,45,45,3) 13 14h5file = h5py.File("ya_model.hdf5", 'r') 15 16model = keras.models.load_model(h5file) 17 18print(model.summary()) 19 20print(model.predict_classes(ya_1)) # [1] と出力 21print(model.predict(ya_1)) # [[0. 1. 0. 0.]] と出力 22

試したこと

テストデータを使って試しても[1]と出力
PC再起動

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

実行環境:pycharm
tensorflow 2.1.0
keras 2.3.1
ここで詰まっている方がいないみたいで有効な情報は見つけられませんでした。
どのように解決したらよろしいでしょうか。よろしくおねがいいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

学習させたモデルとは思えない結果が出ます。

学習したときに画像にやっていた値を [0, 1] にする正規化を推論するときにやっていないからではないでしょうか。

python

1img = cv2.imread("./ya_cut/re_ya_1.bmp") 2img = img / 255.0 # 追加

学習したときに前処理を行った場合、推論する際も全く同じ処理を行うようにしてみてください。

投稿2020/03/31 12:01

編集2020/03/31 12:03
tiitoi

総合スコア21956

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

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

mitokisan

2020/03/31 12:09

ちゃんと推論できました!ほんとうにありがとうございます。めっちゃ助かりました。 次からは忘れないようにします。
guest

0

DNNでの学習結果(ネットワークの重み)はネットワークのモデル(この場合ではya_model.hdf5)とは別に保存/読み込みする必要があります。
model.save_weights()model.load_weights()を追加する必要があると思います。
https://qiita.com/supersaiakujin/items/b9c9da9497c2163d5a74

投稿2020/03/31 12:01

ShintaroNomiya

総合スコア94

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

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

mitokisan

2020/03/31 12:10

回答ありがとうございます! 正規化してなくて、それをしたら解決しました。 しかし今度また同じような問題が起こったら、重みとモデルを別にしたやり方も試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問