我怎么知道model.predict()的输出对应什么?

时间:2020-10-27 08:52:25

标签: keras neural-network conv-neural-network cnn

我正在尝试制作一个对猫和狗进行分类的CNN,并且我正在使用flow_from_directory()为模型准备数据。

from keras import Sequential
from keras_preprocessing.image import ImageDataGenerator
from keras.layers import *
from keras.callbacks import ModelCheckpoint
from keras.optimizers import *
import keras
import numpy as np
import os

img_size = 250 # number of pixels for width and height

#Random Seed
np.random.seed(123456789)


training_path = os.getcwd() + "/cats and dogs images/train"
testing_path = os.getcwd() + "/cats and dogs images/test"

#Defines the Model
model = Sequential([
        Conv2D(filters=128, kernel_size=(3,3), activation="relu", padding="same", input_shape=(img_size,img_size,3)),
        MaxPool2D(pool_size=(2,2), strides=2),
        Conv2D(filters=64, kernel_size=(3,3), activation="relu", padding="same"),
        Flatten(),
        Dense(32, activation="relu"),
        Dense(2, activation="softmax")
])


#Scales the pixel values to between 0 to 1
datagen = ImageDataGenerator(rescale=1.0/255.0)

Batch_size = 10

#Prepares Training Data
training_dataset = datagen.flow_from_directory(directory = training_path,
                                               target_size=(img_size,img_size),
                                               classes = ["cat","dog"],
                                               class_mode = "categorical",
                                               batch_size = Batch_size)

#Prepares Testing Data
testing_dataset = datagen.flow_from_directory(directory = testing_path,
                                              target_size=(img_size,img_size),
                                              classes = ["cat","dog"],
                                              class_mode = "categorical",
                                              batch_size = Batch_size)


#Compiles the model
#model.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=['accuracy'])
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=['accuracy'])
#model.compile(loss="mse", optimizer="sgd", metrics=[keras.metrics.MeanSquaredError()])

#Checkpoint
filepath = os.getcwd() + "/trained_model.h5"
checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1, save_best_only=True, mode='min', save_freq=1)

#Fitting the model to the dataset (Training the Model)
model.fit(x = training_dataset, steps_per_epoch = 400,
          validation_data=testing_dataset, validation_steps=100,
          epochs = 10, callbacks=[checkpoint], verbose = 1)


# evaluate model on training dataset
_,acc = model.evaluate_generator(training_dataset, steps=len(training_dataset), verbose=0)
print("Accuracy on training dataset:")
print('> %.3f' % (acc * 100.0))


#evaluate model on testing dataset
_,acc = model.evaluate_generator(testing_dataset, steps=len(testing_dataset), verbose=0)
print("Accuracy on testing dataset:")
print('> %.3f' % (acc * 100.0))

我想知道model.predict()的输出将如何与标签cats和dogs相对应,并且输出中两个数字中的哪个是cat,而哪个是dog? 这是我的代码,用于加载模型并给出预测:

from keras.models import Sequential
from keras_preprocessing.image import *
from keras.layers import *
import tensorflow as tf
import numpy as np
from keras.layers.experimental.preprocessing import Rescaling
import os
import cv2
from keras.models import *

img_size = 250

#Load weights into new model
filepath = os.getcwd() + "/trained_model.h5"

model = load_model(filepath)
print("Loaded model from disk")

#Scales the pixel values to between 0 to 1
#datagen = ImageDataGenerator(rescale=1.0/255.0)

#Prepares Testing Data

testing_dataset = cv2.imread(os.getcwd() + "/cats and dogs images/single test sample/507.png")
#img = datagen.flow_from_directory(testing_dataset, target_size=(img_size,img_size))

img = cv2.resize(testing_dataset, (img_size,img_size))
newimg = np.asarray(img)
pixels = newimg.astype('float32')
pixels /= 255.0
print(pixels.shape)
pixels = np.expand_dims(pixels, axis=0)
print(pixels.shape)
prediction = model.predict(pixels)
print(prediction)

这是上面的预测代码的输出:

Loaded model from disk
(250, 250, 3)
(1, 250, 250, 3)
[[5.4904184e-27 1.0000000e+00]]

如您所见,预测给出了两个数字组成的数组,但是哪个对应于狗标签,哪个对应于猫标签?顺便说一下,该模型尚未经过充分训练,因此我只是测试代码以查看其是否有效。

1 个答案:

答案 0 :(得分:0)

模型输出取决于您如何加载数据并指定如何在提供的此代码中对类进行排序/标记:

training_dataset = datagen.flow_from_directory(directory = training_path,
                                           target_size=(img_size,img_size),
                                           classes = ["cat","dog"],
                                           class_mode = "categorical",
                                           batch_size = Batch_size)

#Prepares Testing Data
testing_dataset = datagen.flow_from_directory(directory = testing_path,
                                              target_size=(img_size,img_size),
                                              classes = ["cat","dog"],
                                              class_mode = "categorical",
                                              batch_size = Batch_size)

您在加载数据时指定要对类进行排序,然后在classes参数中指定Cat然后Dog。

因此,输出将按两个概率排序(总和为1) 第一个概率是指输入图像是猫的百分比,第二个概率是指输入图像是狗的百分比。

您使用以下行:

output_class = np.argmax(prediction, axis=1)

此行将比较列表的元素,并以[1](或[0,1])的形式输出列表中元素的哪个索引最大(在我们的示例中,列表包含两个概率)取决于输出的形状),这表示该图像是狗,因为如果输出列表中的第二个元素是[0](或[1,0]取决于输出的形状),则输出列表中的第二个元素为1,则这意味着输入图像的输出类别为cat。