2017-09-06 8 views
1

誰でも私を助けてくれます。私はKerasを使用してCNNにイメージのビルドバイナリ分類モデルを成功し、model.predict_classes()を使用して予測を行い、ここに私のコードでいますケラでCNNを使用した画像のバイナリ分類で正しく予測された合計

import numpy as np 
import os,sys 
from keras.models import load_model 
import PIL 
from PIL import Image 
import numpy as np 
import matplotlib.pyplot as plt 

%matplotlib inline 


model = load_model('./potholes16_2.h5') 

model.compile (loss = 'binary_crossentropy', 
       optimizer = 'adam', 
       metric = ['accuracy']) 

path= os.path.abspath("./potholes14/test/positive") 



extensions = 'JPG' 

if __name__ == "__main__": 
    for f in os.listdir(path): 
     if os.path.isfile(os.path.join(path,f)): 
      f_text, f_ext= os.path.splitext(f) 
      f_ext= f_ext[1:].upper() 
      if f_ext in extensions: 
       print (f)`enter code here` 
       img = Image.open(os.path.join(path,f)) 

       new_width = 200 
       new_height = 200 
       img = img.resize((new_width, new_height), Image.ANTIALIAS) 

       #width, height= image.size 

       img = np.reshape(img,[1,new_width,new_height,3]) 
       classes = model.predict_classes(img) 
       print (classes) 

今、私は正確に予測画像の合計をカウントしたい、例えばどのように多くのクラスはクラス0またはクラス1に属していますか?

ありがとうございます。あなたはmodel.evaluate機能を呼び出すために必要

+0

実行推論をチェックする別の方法形状(number_of_sample,1)


あるassums最後の行を、書くことでした。各バッチに対して、出力を配列/リストに挿入します。最終的な配列の混乱行列を計算してください – Nain

+0

答えをありがとう、私は本当にそれを感謝し、私はそれを試してみます。 – Vosco

答えて

0

。そして、あなたはy_testにグランドトゥルースラベルとx_test内のデータを評価したいと仮定:

score = model.evaluate(x_test, y_test, verbose=0) 

score[0]はあなたの損失(あなたのケースでは、バイナリのクロスエントロピー)を与える、score[1]が必要なバイナリ精度が含まれていながら、 。

は、詳細(evaluateを探してスクロールダウン)のためdocsを参照してください。

+0

速やかに対応してくれてありがとう、ドキュメントを読んだことがありますが、まだ少し混乱しています。申し訳ありませんが、Kerasフレームワークで新しく終了しました。クラス0またはクラス1に属する正確に予測された画像の合計を数えたいだけです。しかし、とにかく試してみます。 – Vosco

+0

ターゲットデータ(ラベル)はワンホットエンコードされているのか、それとも単純に数字(0/1)ですか? – desertnaut

+0

私のターゲットデータは単に数字(0と1)です。さらに、私が予測しようとしているイメージは、真実の真理値のラベルのない実際のイメージです。 – Vosco

0

あなたが正しいに予測されているデータのサンプル配列を持っている必要がありますか?あなたはそのデータを読み込むこともできます。そこには、かつてclasses

np.where(np.round(classes,0)==class_validation)[0].shape[0] 
を丸め等しいどこそれからちょうど見つける

classes = model.predict_classes(img) 

利回り

array([[ 0.94981687],[ 0.57888238],[ 0.58651019],[ 0.30058956],[ 0.21879381]]) 

とあなたのクラスのデータは、この

class_validation = np.array([[1],[0],[0],[0],[1]]) 

のように見える、あなたが持っているコードをキープ

注:多くがありますが、あなたのnumpyの配列がバッチでテストデータ上の

totalCorrect = class_validation[((np.round(classes,0) - class_validation)==0)] 
print('Correct in Class 1 = ',np.count_nonzero(totalCorrect),'Correct in Class 0 = ',abs(len(totalCorrect)-np.count_nonzero(totalCorrect))) 
+0

おかげで私の質問に従ってください。あなたが上で述べたことを正確にたどった後、それは私に全部の画像がクラス0に属していただけです。私は手動で数えたときに6枚の画像がありました。ところで、私は[このリファレンス](https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data)に従います。html)を使ってモデルを構築します。 – Vosco

+0

Ok @ Vosco、私は別の方法で更新しました。 – DJK

+0

お返事ありがとうございました。ここで私の予測コードの結果をより明確にする方法です。 4.jpeg 1/1 [===============] - 0s [0] 1。 jpeg 1/1 [=============] - 0s [[1]] 2.jpeg 1/1 [======================= 0- [[1]] 3.jpeg 1/1 [========================= 0 -[[1]] 数値結果 クラス1で正しい= 2クラス0 = 0の正解 予測結果の基底には3つの画像がクラス1に属し、1の画像はクラス0に属します。 – Vosco