如何在Keras CNN模型中预测单幅图像?

eeq64g8w  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(177)

我按照这个指南学习图像分类与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

补充:当我尝试使用模型.预测这样我得到了这个错误:

ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (1024, 1024)

或者转换到2D(以及3D)NP阵列仍然得到相同的结果。

    • 我的第二个问题是:**有没有办法预测没有完成%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,)
s2j5cfk0

s2j5cfk01#

第一个问题:我可以得到训练和验证的准确率,但我想得到单幅图像的预测结果,我该怎么做?
正如您在the doc中所看到的,您完全可以使用model.predict(x),只要您的x是:

  • Numpy数组(或类数组)或数组列表(如果模型有多个输入)。
  • 如果模型有命名的输入,则将输入名称Map到相应的数组/Tensor的一个命令。
  • 返回(输入、目标)或(输入、目标、样本权重)的生成器或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)
the doc中所示,由于这是input_layer,因此需要提供4D格式的shape:如果只想给出一个图像,则需要一个(1, rows, cols, channels)形式的数组。

xxhby3vn

xxhby3vn2#

这可能会帮助您:
图像形状为(28,28,1)
我用下面的代码将它修改为(1,28,28,1),并且成功了!

img = np.expand_dims(img,0)
result = cnn.predict(img)

最后通过以下方式获得输出:

result = result.round()

相关问题