python - 当我给它图像时,我的 keras 模型会给出随机预测

标签 python machine-learning keras

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

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

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

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)

最佳答案

我想到的一些建议是:

  • 尝试尽可能减少 MaxPooling 层的数量。在您的情况下,使用最温和的最大池 (2, 2) 会消除 75% 的数据!

  • 降低辍学概率。如果在每次训练迭代时关闭一半的节点,那么让它们学习东西会有些困难(我知道有人会不同意,这是我根据我的 ML 经验得出的个人观点)。我一般设置在0.1-0.25范围内。

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

除此之外,您还可以尝试经典的正则化技术,例如:L1-L2 正则化或不同的权重初始化。

另外,请分享训练代码。问题可能就在那里,而不是在模型的架构中。

关于python - 当我给它图像时,我的 keras 模型会给出随机预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57445542/

相关文章:

python - n 球坐标系到笛卡尔坐标系

python - 为 pandas 数据帧的列中的子集建立索引

python - 根据numpy数组中一行中的重复值删除列

machine-learning - 神经网络训练期间的 MSE

python - tensorflow.keras.preprocessing.text.Tokenizer 中的文本编码与旧的 tfds.deprecated.text.TokenTextEncoder 有何不同

python - 顺序模型在每次运行时给出不同的结果

python - 按线程分析 Python CPU 使用情况

r - 如何在R中对具有不同大小向量的时间序列数据进行聚类

python - Tensorflow flatten vs numpy flatten 函数对机器学习训练的影响

react-native - 未知激活 : swish