🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Keras

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

機械学習

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

Q&A

解決済

1回答

1312閲覧

Kerasで画像分類した結果が1項目しか出てきません.

daisuke_factex

総合スコア42

Keras

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

機械学習

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

0グッド

0クリップ

投稿2019/09/27 06:48

こんにちは, 現在Kerasを使用して画像の分類(2クラス)に取り組んでいます.
皆様のおかげで, 学習段階, モデル保存はエラーなく実行できました.

しかし, いざ保存したモデルを利用して画像を分類させると,
本来ならば, [クラス1の確率, クラス2の確率]となるはずなのですが,
今回[確率]のみとなってしまい, 困っています.

本環境について

Win 10
jupyter notebook
-python 3.6
-Keras 2.x 
以上の環境で実行しております.

使用画像について

使用画像は, 240*160の画像となります.

イメージ説明

こちらをtrain 400枚ずつ, validation 100枚ずつ, test10枚ずつ用意しました.
(サンプル少ないのは承知の上です)

ソースコードについて

学習段階までは, こちらを,
モデル利用からはこちらのページのコードを使用しております.

Keras

1import numpy as np 2from keras.models import model_from_json 3from keras.preprocessing.image import load_img, img_to_array 4from keras import layers 5from keras import models 6 7model = models.Sequential() 8model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3))) 9model.add(layers.MaxPooling2D((2,2))) 10 11model.add(layers.Conv2D(64,(3,3),activation="relu")) 12model.add(layers.MaxPooling2D((2,2))) 13 14model.add(layers.Conv2D(128,(3,3),activation="relu")) 15model.add(layers.MaxPooling2D((2,2))) 16 17model.add(layers.Conv2D(128,(3,3),activation="relu")) 18model.add(layers.MaxPooling2D((2,2))) 19 20model.add(layers.Flatten()) 21 22model.add(layers.Dense(512,activation="relu")) 23model.add(layers.Dense(1,activation="sigmoid")) 24 25model.summary() 26 27from keras import optimizers 28 29model.compile(loss="binary_crossentropy", 30 optimizer=optimizers.RMSprop(lr=1e-4), 31 metrics=["acc"]) 32 33##正規化 34from keras.preprocessing.image import ImageDataGenerator 35train_dir = "/~~/train" 36validation_dir = "/~~/validation" 37 38train_datagen = ImageDataGenerator(rescale=1./255) 39validation_datagen = ImageDataGenerator(rescale=1./255) 40 41train_generator = train_datagen.flow_from_directory( 42 train_dir, 43 target_size=(150,150), 44 batch_size=20, 45 class_mode="binary" 46) 47validation_generator = validation_datagen.flow_from_directory( 48 validation_dir, 49 target_size=(150,150), 50 batch_size=20, 51 class_mode="binary" 52) 53 54##学習 55history = model.fit_generator(train_generator, 56 steps_per_epoch=100, 57 epochs=30, 58 validation_data=validation_generator, 59 validation_steps=50) 60##モデルの保存 61json_string=model.to_json() 62open("/~~/train.json","w").write(json_string) 63model.save_weights("/~~/train.hdf5") 64 65 66##未知の画像を分類 67import cv2 68for i in range(1, 21): 69 img = cv2.imread("/~~/test ({0:d}).jpg".format(i)) 70 71 # 入力画像サイズ - 訓練時の画像サイズと合わせる 72 INPUT_IMAGE_SIZE = 150 73 74 # GrayScaleのときに1、COLORのときに3にする - 訓練時のカラーチャンネル数と合わせる 75 COLOR_CHANNEL = 3 76 77 # 確認したい画像へのフルパス 78 TEST_PATH = "/~~/test ({0:d}).jpg".format(i) 79 80 # 今回利用するアーキテクチャと重みのファイルへのパス 81 MODEL_ARC_PATH = '/~~/train.json' 82 WEIGHTS_PATH = '/~~/train.hdf5' 83 84 # 今回は1枚の画像だが複数画像対応も可能 85 test_images = [] 86 87 # テスト画像の入力部分 88 if COLOR_CHANNEL == 1: 89 img = load_img(TEST_PATH, color_mode = "grayscale", target_size=(INPUT_IMAGE_SIZE, INPUT_IMAGE_SIZE)) 90 elif COLOR_CHANNEL == 3: 91 img = load_img(TEST_PATH, color_mode = "rgb", target_size=(INPUT_IMAGE_SIZE, INPUT_IMAGE_SIZE)) 92 array = img_to_array(img) 93 test_images.append(array) 94 95 test_images = np.array(test_images) 96 97 # imageの画素値をint型からfloat型にする 98 test_images = test_images.astype('float32') 99 # 画素値を[0~255]⇒[0~1]とする 100 test_images = test_images / 255.0 101 102 # ------------------------------------------------------------------------------------- 103 # モデル読み込み部分 104 # ------------------------------------------------------------------------------------- 105 106 # JSONファイルからモデルのアーキテクチャを得る 107 model_arc_str = open(MODEL_ARC_PATH).read() 108 model = model_from_json(model_arc_str) 109 110 # モデル構成の確認 111 model.summary() 112 113 # モデルの重みを得る 114 model.load_weights(WEIGHTS_PATH) 115 116 # ------------------------------------------------------------------------------------- 117 #    テスト実行部 118 # ------------------------------------------------------------------------------------- 119 120 # テストの実行 121 result = model.predict(test_images, batch_size=1) 122 123 # 結果の表示 124 print('result : ', result) 125 max_index = np.argmax(result) 126 print('max_index : ', max_index) 127

そして出ている結果の一部が以下の通りです.

Keras

1_________________________________________________________________ 2Layer (type) Output Shape Param # 3================================================================= 4conv2d_1 (Conv2D) (None, 148, 148, 32) 896 5_________________________________________________________________ 6max_pooling2d_1 (MaxPooling2 (None, 74, 74, 32) 0 7_________________________________________________________________ 8conv2d_2 (Conv2D) (None, 72, 72, 64) 18496 9_________________________________________________________________ 10max_pooling2d_2 (MaxPooling2 (None, 36, 36, 64) 0 11_________________________________________________________________ 12conv2d_3 (Conv2D) (None, 34, 34, 128) 73856 13_________________________________________________________________ 14max_pooling2d_3 (MaxPooling2 (None, 17, 17, 128) 0 15_________________________________________________________________ 16conv2d_4 (Conv2D) (None, 15, 15, 128) 147584 17_________________________________________________________________ 18max_pooling2d_4 (MaxPooling2 (None, 7, 7, 128) 0 19_________________________________________________________________ 20flatten_1 (Flatten) (None, 6272) 0 21_________________________________________________________________ 22dense_1 (Dense) (None, 512) 3211776 23_________________________________________________________________ 24dense_2 (Dense) (None, 1) 513 25================================================================= 26Total params: 3,453,121 27Trainable params: 3,453,121 28Non-trainable params: 0 29_________________________________________________________________ 30result : [[0.01599144]] 31max_index : 0 32 33_________________________________________________________________ 34Layer (type) Output Shape Param # 35================================================================= 36conv2d_1 (Conv2D) (None, 148, 148, 32) 896 37_________________________________________________________________ 38max_pooling2d_1 (MaxPooling2 (None, 74, 74, 32) 0 39_________________________________________________________________ 40conv2d_2 (Conv2D) (None, 72, 72, 64) 18496 41_________________________________________________________________ 42max_pooling2d_2 (MaxPooling2 (None, 36, 36, 64) 0 43_________________________________________________________________ 44conv2d_3 (Conv2D) (None, 34, 34, 128) 73856 45_________________________________________________________________ 46max_pooling2d_3 (MaxPooling2 (None, 17, 17, 128) 0 47_________________________________________________________________ 48conv2d_4 (Conv2D) (None, 15, 15, 128) 147584 49_________________________________________________________________ 50max_pooling2d_4 (MaxPooling2 (None, 7, 7, 128) 0 51_________________________________________________________________ 52flatten_1 (Flatten) (None, 6272) 0 53_________________________________________________________________ 54dense_1 (Dense) (None, 512) 3211776 55_________________________________________________________________ 56dense_2 (Dense) (None, 1) 513 57================================================================= 58Total params: 3,453,121 59Trainable params: 3,453,121 60Non-trainable params: 0 61_________________________________________________________________ 62result : [[0.03004535]] 63max_index : 0 64 65(中略) 66

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

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

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

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

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

Q71

2019/09/27 13:27

出力層「layers.Dense(1,activation="sigmoid")」の意図はなんですか? ImageDataGenerator.flow_from_directory の引数 class_mode="binary" の意図はなんですか? これらを使用する意図が、出力したいものを得ることに一致していますか?
daisuke_factex

2019/09/30 04:10

コメントありがとうございます. ①出力層「layers.Dense(1,activation="sigmoid")」の意図はなんですか? →reluと重複していました, 今見たところ, 必要ない気もしました. ②ImageDataGenerator.flow_from_directory の引数 class_mode="binary" の意図はなんですか? →2クラス問題なのでこちらを使用しております.
Q71

2019/09/30 12:14

①あ、いえ、Dense(1,...)の「1」はなんですか。 出力が1つしかないですよね(binary, 2クラス問題だから)。ということは、回答にあるとおり、「1クラスの確率がn%。他のクラスの確率は100-n%」です。 という意図と、「[クラス1の確率, クラス2の確率]となるはず」という、得たいものの意図が合っていますか。
daisuke_factex

2019/10/01 07:08

ありがとうございます. 2クラス分類の場合は, 下記のベストアンサーのように, Aである確率のみを提示するために, 引数を「1」にしているのかなという見解です.
guest

回答1

0

ベストアンサー

2クラス分類では、ある画像がクラスAである確率というのは、クラスBではない確率と同義です。
すなわち、確率は1つで問題ないはずです。

投稿2019/09/27 06:52

qax

総合スコア622

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問