2017-10-09 10 views
0

CNNモデルを作成して、画像が犬か猫のどちらかであるかどうかを予測しようとしましたが、出力で予測されたことがわかりません。以下を参照してください:予測は何を表していますか? CNN Keras

import pandas as pd 
from keras.models import Sequential 
from keras.preprocessing.image import ImageDataGenerator 
from keras.layers import Dense, Flatten, Conv2D, Dropout, MaxPooling2D 
from scipy import misc 
import numpy as np 

def build_classifier(): 
    #Model based on 'https://www.researchgate.net/profile/Le_Lu/publication/277335071/figure/fig8/AS:[email protected]/Figure-8-The-proposed-CNN-model-architecture-is-composed-of-five-convolutional-layers.png' 
    #It's smarter to add layer without creating variables because of the processing, but as a small dataset it doesn't matter a lot. 
    classifier = Sequential() 

    conv1 = Conv2D(filters=64, kernel_size=(2,2), activation='relu', input_shape=(64,64,3)) 
    conv2 = Conv2D(filters=192, kernel_size=(2,2), activation='relu') 
    conv3 = Conv2D(filters=384, kernel_size=(2,2), activation='relu') 
    conv4 = Conv2D(filters=256, kernel_size=(2,2), activation='relu') 
    conv5 = Conv2D(filters=256, kernel_size=(2,2), activation='relu') 
    pooling1 = MaxPooling2D(pool_size=(2,2)) 
    pooling2 = MaxPooling2D(pool_size=(2,2)) 
    pooling3 = MaxPooling2D(pool_size=(2,2)) 
    fcl1 = Dense(1024, activation='relu') 
    fcl2 = Dense(1024, activation='relu') 
    fcl3 = Dense(2, activation='softmax') 
    dropout1= Dropout(0.5) 
    dropout2 = Dropout(0.5) 
    flatten = Flatten() 

    layers = [conv1, pooling1, conv2, pooling2, conv3, conv4, conv5, 
      pooling3, flatten, fcl1, dropout1, fcl2, dropout2, fcl3] 

    for l in layers: 
     classifier.add(l) 

    return classifier 

model = build_classifier() 
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 

train_datagen = ImageDataGenerator(
     rescale=1./255, 
     shear_range=0.2, 
     zoom_range=0.2, 
     horizontal_flip=True) 

test_datagen = ImageDataGenerator(rescale=1./255) 

train_generator = train_datagen.flow_from_directory(
     'dataset/training_set', 
     target_size=(64, 64), 
     batch_size=32, 
     class_mode='categorical') 

validation_generator = test_datagen.flow_from_directory(
     'dataset/test_set', 
     target_size=(64, 64), 
     batch_size=32, 
     class_mode='categorical') 


model.fit_generator(
     train_generator, 
     steps_per_epoch=200, 
     epochs=32, 
     validation_data=validation_generator, 
     validation_steps=100) 

model.save('model.h5') 
model.save_weights('model_weights.h5') 

私は別のファイルで私の保存されたモデル開か:予測は、それがあることを述べている場合

Using TensorFlow backend. 
2017-10-09 14:06:25.520018: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations. 
2017-10-09 14:06:25.520054: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations. 
[[ 0. 1.]] 

しかし、どのように知っている:私はこれを取得、出力として

from keras.models import load_model 
from scipy import misc 
import numpy as np 

def single_pred(filepath, model): 
    classifier = load_model(model) 
    img = misc.imread(filepath) 
    img = misc.imresize(img, (64,64,3)) 
    img = np.expand_dims(img, 0) 
    print(classifier.predict(img)) 

if __name__ == '__main__': 
    single_pred('/home/leonardo/Desktop/Help/dataset/single_prediction/cat_or_dog_2.jpg', 'model.h5') 

を犬や猫。この結果を手に入れても、イメージが犬か猫かは分かりません。

+1

誰かが*基本*チュートリアルを読む必要があります。これを無視することは、あまり面白くないでしょう。 *ヒント*:最後のレイヤーを見てください。 '' 'fcl3 = Dense(2、activation = 'softmax')' ''、あなたの入力シェイプとあなたの損失! – sascha

+0

入力形状の問題点は何ですか? – Leo

+0

私は何かが間違っているとは言わなかった。私は出力を解釈することに関して3つの最も重要なことを暗示しました。 – sascha

答えて

1

ラベルを指定しない限り、ジェネレータは自動的にカテゴリラベルを作成します。 train_generator.class_indices クラスラベルの順序は英数字ですので、cats = 0 dogs = 1

関連する問題