首页 > 解决方案 > 当我给它图像时,我的 keras 模型给了我随机预测

问题描述

我正在制作一个模型来对图像进行分类,当我使用 model.predict 给它图像时,它会给我随机输出。model.evaluate_generator 的准确度为 0.9530581049962875,损失为 0.2506975952616229。图像为 64x64,具有三个通道

我尝试过使用其他数据集,得到了相同的结果。

我想知道我的模型架构是否有任何问题。

model = Sequential()
model.add(Conv2D(128, (3, 3), input_shape=(64, 64, 3), activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(BatchNormalization())
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(BatchNormalization())
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(BatchNormalization())
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(Flatten())
model.add(Dropout(.50))
model.add(Dense(500, activation='relu'))
model.add(Dropout(.50))
model.add(Dense(100, activation='relu'))
model.add(Dropout(.50))
model.add(Dense(9, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

编辑:我的训练代码和用于预测的代码

batch_size = 60
pic_size = 64

train_datagen = ImageDataGenerator()

test_datagen = ImageDataGenerator()

train_generator = train_datagen.flow_from_directory(
        '/DATASET/Training_Samples',
       target_size=(64, 64),
        color_mode='rgb',
        batch_size=batch_size,
        class_mode="categorical",
        shuffle=True)

validation_generator = test_datagen.flow_from_directory(
        '/DATASET/Test_Samples',
        target_size=(64, 64),
        color_mode='rgb',
        batch_size=batch_size,
        class_mode="categorical",
        shuffle=False)



history = model.fit_generator(generator=train_generator,
                            steps_per_epoch=train_generator.n//train_generator.batch_size,
                            epochs=150,
                            validation_data=validation_generator,
                            validation_steps = validation_generator.n//validation_generator.batch_size)

from skimage.transform import resize
import matplotlib.pyplot as plt
%matplotlib inline

my_image = plt.imread('image.jpg')
my_image_resized = resize(my_image, (64,64,3))

import numpy as np
probabilities = model.predict(np.array( [my_image_resized,] ))

print(probabilities)

标签: pythonmachine-learningkeras

解决方案


我想到的一些建议是:

  • 尽量减少MaxPooling层数。事件最温和的最大池,(2, 2)就像你的情况一样,摆脱了 75% 的数据!

  • 降低辍学概率。如果你的一半节点在每次训练迭代时都关闭,那么让它们学习有些困难(我知道有人会不同意,这是我基于我的 ML 经验的个人意见)。我通常将其设置在 0.1-0.25 范围内。

  • 通常,您不需要所有这些过滤器。CNN 通常在初始层使用较少数量的过滤器,随着层数的增加而增加。通过这种方式,您只需从嘈杂的像素数据中提取相关信息,并让网络稍后详细说明更复杂的表示。我通常从 32 开始,然后到 64、128 之后。请考虑这是我个人的经验法则(它总是返回良好的结果,但其他架构也可能很棒)。

其中一部分,您可以尝试经典的正则化技术,例如:L1-L2 正则化或不同的权重初始化。

另外,请分享培训代码。问题可能存在,而不是模型的架构。


推荐阅读