python - 如何在 Keras CNN 模型中预测单个图像?
问题描述
我正在按照本指南学习使用 CNN 进行图像分类,并将此代码实现到我的数据集中:
https://www.tensorflow.org/tutorials/images/classification
代码更新
train_image_generator = ImageDataGenerator(rescale=1. / 255) # Generator for our training data
validation_image_generator = ImageDataGenerator(rescale=1. / 255) # Generator for our validation data
train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
directory=train_img_folder,
shuffle=True,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='categorical',
color_mode='grayscale')
val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,
directory=valid_img_folder,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='categorical',
color_mode='grayscale'
)
model = Sequential([
Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 1)),
MaxPooling2D(),
Conv2D(32, 3, padding='same', activation='relu'),
MaxPooling2D(),
Conv2D(64, 3, padding='same', activation='relu'),
MaxPooling2D(),
Flatten(),
Dense(512, activation='relu'),
Dense(3, activation='softmax')
])
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
history = model.fit_generator(
train_data_gen,
steps_per_epoch=total_train_value // batch_size,
epochs=epochs,
validation_data=val_data_gen,
validation_steps=total_valid_value // batch_size
)
# Single prediction
img = []
temp = np.array(Image.open('path/to/pic.jpg').resize((256, 256), Image.ANTIALIAS))
temp.shape = temp.shape + (1,) # now its (256, 256, 1)
img.append(temp)
test = np.array(img) # (1, 1024, 1024, 1)
prediction = model.predict(test)
当我尝试 predict_generator 函数时:
test_datagen = ImageDataGenerator(rescale=1 / 255.)
test_generator = test_datagen.flow_from_directory('test_images/',
classes=['0', '1', '2'],
color_mode='grayscale',
shuffle=True,
# use same size as in training
target_size=(256, 256))
preds = model.predict_generator(test_generator, steps=4) # I dont know what is steps doing. I put there because of error.
我的第一个问题是:我可以获得训练和验证的准确性,但我想获得单张图片的预测结果。我怎样才能做到这一点?例子:
foo = model.predict(path/to/pic.jpg)
# foo returns 0-> 0.70 | 1-> 0.30
补充:当我尝试使用 model.predict 时,我得到了这个错误:
ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (1024, 1024)
或转换为 2d(以及 3d)np.array 仍然相同。
我的第二个问题是:没有完整的 %100 有什么方法可以预测?我的意思是,如果我们有 2 个班级(猫和狗)并测试月球图片,我想得到这样的结果:
%15 cat | %10 dog
不是
%50 cat | %50 dog
补充:我尝试将垃圾类按照以下更改。当我在线运行时,history = model.fit_generator
出现以下错误:
ValueError: Error when checking target: expected dense_2 to have shape (3,) but got array with shape (2,)
先感谢您
解决方案
第一个问题:我可以获得训练和验证的准确性,但我想获得单张图片的预测结果。我怎样才能做到这一点?
正如您在文档中看到的那样,您可以完全使用model.predict(x)
,只要您x
是:
- Numpy 数组(或类似数组)或数组列表(如果模型有多个输入)。
- 如果模型具有命名输入,则将输入名称映射到相应的数组/张量的字典。
- 生成器或 keras.utils.Sequence 返回(输入、目标)或(输入、目标、样本权重)。
您只需编写读取 .jpg 图像并将其提供给模型的代码。
第二个问题:没有完整的 %100 有什么方法可以预测?我的意思是,如果我们有 2 个班级(猫和狗)并测试月球图片,我想得到这样的结果:
您可以创建第三类“垃圾”,为此您需要将网络的最后一层更改为:
Dense(3, activation='softmax')
并将您的损失更改为categorical_crossentropy
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
并更改class_mode
为categorical
和不binary
。
在这种情况下,您将拥有狗:15%,猫:10%,垃圾:75%
编辑 conv2D 错误:
ValueError:检查输入时出错:预期 conv2d_1_input 有 4 个维度,但得到了形状为 (1024、1024) 的数组
你有 :
Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
这意味着图像是(height, width, channel)
. 如文档
中
所见,由于这是 input_layer,您需要提供 4D 格式的形状:。如果你只想给出一个图像,你需要一个形状为 的数组。(samples, rows, cols, channels)
(1, rows, cols, channels)
推荐阅读
- c# - 清除 CollectionViewSource 的源时,WPF 接口变得无响应
- qgis - 从 QGIS 发布编辑到 Open Street Map 数据库
- swift - Swift init() 可以返回以前创建的对象吗?
- python - 将 3D numpy 转换为数组到 4D 数组而不更改
- javascript - 无法从地理服务器中的 SQL Server 加载图层
- powershell - 可以从 cmd 调用 headless 但不能从 powershell
- azure-storage-emulator - Unable to start Azure Storage Emulator
- php - Laravel paginate() 方法不适用于 distinct() 方法
- ruby-on-rails - Rails: Add form from different model
- vba - VBA循环遍历InputBox中给出的行数