Keras 如何知道model.predict()的输出对应于什么?

Keras 如何知道model.predict()的输出对应于什么?,keras,neural-network,conv-neural-network,cnn,Keras,Neural Network,Conv Neural Network,Cnn,我正在尝试制作一个CNN,对猫和狗进行分类,我正在使用flow\u from\u directory()为模型准备数据 from keras import Sequential from keras_preprocessing.image import ImageDataGenerator from keras.layers import * from keras.callbacks import ModelCheckpoint from keras.optimizers import * im

我正在尝试制作一个CNN,对猫和狗进行分类,我正在使用
flow\u from\u 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]]

正如你所看到的,预测给出了一个由两个数字组成的数组,但是哪一个对应于狗的标签,哪一个对应于猫的标签?顺便说一句,模型没有经过充分训练,所以我只是测试代码,看看它是否有效。

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

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)
在加载数据的过程中,您指定类将在类参数中先按Cat排序,然后按Dog排序

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

您可以使用以下行:

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

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

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

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)
在加载数据的过程中,您指定类将在类参数中先按Cat排序,然后按Dog排序

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

您可以使用以下行:

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

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

np.argmax(回答正确,轴=1)为了获得类0或1。从你的代码中,猫似乎是类0,而狗1你能解释一下我如何实现你的代码以及正确答案的来源吗?对不起,正确答案是你的预测数组。你的设置有一个有趣的地方:如果你使用多个输出(每个类一个)softmax输出激活,确保分类的交叉熵损失。如果你只使用一个输出,比如说一个输出对猫意味着0,对狗意味着1,那么确保你使用二进制交叉熵损失函数。注意,我肯定会改变这一点。我之所以使用错误的方法,唯一的原因是因为我想看看两者的区别是什么.argmax(正确回答,axis=1)以获得类0或1。从您的代码中,猫似乎是类0,而狗1您能解释我如何实现您的代码以及正确回答的来源吗?抱歉,正确回答是您的预测数组。您的设置有一点很有趣:如果您使用多个输出(每个类一个输出)softmax输出激活,确保分类交叉熵损失。如果你只使用一个输出,比如说一个输出对猫来说意味着0,对狗来说意味着1,那么确保你使用二进制交叉熵损失函数。注意,我肯定会改变这一点。我之所以使用错误的方法,唯一的原因是因为我想看看有什么区别