Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将创建的CNN模型用于Keras中的新数据_Python_Tensorflow_Keras_Conv Neural Network - Fatal编程技术网

Python 如何将创建的CNN模型用于Keras中的新数据

Python 如何将创建的CNN模型用于Keras中的新数据,python,tensorflow,keras,conv-neural-network,Python,Tensorflow,Keras,Conv Neural Network,我刚刚学习了一个教程,该教程使用CNN的KerasTensorflow后端对10万张猫和狗的图像进行了分类 一切似乎都正常,我在测试和训练集上都获得了很好的准确性: .... Epoch 24/25 250/250 [==============================] - 26s 104ms/step - loss: 0.2938 - acc: 0.8745 - val_loss: 0.4235 - val_acc: 0.8270 Epoch 25/2

我刚刚学习了一个教程,该教程使用CNN的KerasTensorflow后端对10万张猫和狗的图像进行了分类

一切似乎都正常,我在测试和训练集上都获得了很好的准确性:

....    
    Epoch 24/25
    250/250 [==============================] - 26s 104ms/step - loss: 0.2938 - acc: 0.8745 - val_loss: 0.4235 - val_acc: 0.8270
    Epoch 25/25
    250/250 [==============================] - 25s 99ms/step - loss: 0.2901 - acc: 0.8719 - val_loss: 0.4324 - val_acc: 0.8270
但是我如何使用这个模型来预测新图像的类别呢

创建并适合分类器的我的代码:

# Importing the Keras libraries and packages
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
import PIL
#these 2 lines are for timer
import cv2
from timeit import default_timer as timer
start = timer()
# Initialising the CNN
classifier = Sequential()
# Step 1 - Convolution
classifier.add(Conv2D(32, (3, 3), activation="relu", input_shape=(64, 64, 3)))
# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Adding a second convolutional layer
classifier.add(Conv2D(32, (3, 3), activation="relu"))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Step 3 - Flattening
classifier.add(Flatten())
# Step 4 - Full connection
classifier.add(Dense(units=128, activation="relu"))
classifier.add(Dense(units=1, activation="sigmoid"))
# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# Part 2 - Fitting the CNN to the images
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')
test_set = test_datagen.flow_from_directory('dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')
classifier.fit_generator(training_set,
                         steps_per_epoch = 250,
                         epochs = 25,
                         validation_data = test_set,
                         validation_steps = 63)
# elapsed time
end = timer()
print(end - start)
# end of work message
import os
os.system('say "your program has finished"')

数据集:

这应该有效。我喜欢使用撇渣法,但这取决于你

import skimage.io as io
import skimage.transform as tr

img = io.imread('img.jpg')         # Reads the image
img = tr.resize(img, (64, 64, 3))  # Resizes the image
img = img[np.newaxis, ...]         # Adds a new dim to simulate a batch
pred = classifier.predict(img)     # Predicts a value between 0 and 1

if pred > 0.5:
    print('Class 1')
else:
    print('Class 2')

您还可以为要预测的数据创建另一个ImageDataGenerator。注意,您计划预测的数据在技术上称为测试集,而您称为测试集的数据实际上是验证集


在任何情况下,在为测试集创建ImageDataGenerator后,您可以调用classifier.predict_generator,调用方式与调用classifier.fit_generator的方式类似。我举了一个例子来说明如何做到这一点

你检查预测方法了吗?是的,但我无法将代码实现到我的案例中。换句话说,我不知道如何使用它。非常感谢。这正是我要找的。你能描述一下为什么你把图像的大小调整为64,64,因为彩色图像有三个维度吗?这是一个公平的观点。在skimage中,提供频道数量是可选的,但由于您的模型预期为3个,因此添加频道更安全。我将调整我的答案。还有一个问题,我如何获得每个预测的信心?一个非猫和狗的形象也将被预测为其中之一。我想阻止它。跳过我的If-Else,你可以查看实际预测值,它越接近0.5,模型的可信度就越低。如果您想了解每个类的信心,请考虑将类模式设置为分类。这样,您的输出将不是单个值,而是一个长度为2个类的数组。即使对于二进制分类器,我也更喜欢这样,因为将代码扩展到两个以上的类会稍微简单一些。