python - 当我给它图像时,我的 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)
解决方案
我想到的一些建议是:
尽量减少
MaxPooling
层数。事件最温和的最大池,(2, 2)
就像你的情况一样,摆脱了 75% 的数据!降低辍学概率。如果你的一半节点在每次训练迭代时都关闭,那么让它们学习有些困难(我知道有人会不同意,这是我基于我的 ML 经验的个人意见)。我通常将其设置在 0.1-0.25 范围内。
通常,您不需要所有这些过滤器。CNN 通常在初始层使用较少数量的过滤器,随着层数的增加而增加。通过这种方式,您只需从嘈杂的像素数据中提取相关信息,并让网络稍后详细说明更复杂的表示。我通常从 32 开始,然后到 64、128 之后。请考虑这是我个人的经验法则(它总是返回良好的结果,但其他架构也可能很棒)。
其中一部分,您可以尝试经典的正则化技术,例如:L1-L2 正则化或不同的权重初始化。
另外,请分享培训代码。问题可能存在,而不是模型的架构。
推荐阅读
- html - 根据容器的宽度和高度缩放字体大小
- reactjs - 如何从服务器获取数据,如使用 axios 在 reactjs 中的控制台中给出的
- matlab - MATLAB - 查找参数的最大似然估计时出错
- c++ - 如何使用 vlc-qt libvlc 在 qt 中向后播放视频
- python-3.x - 当我不关心外部值的键时,如何在字典字典中获取值
- node.js - sequelize:连接三个表
- python - 在 mac 中安装 pip
- pandas - 将数据框插入stackoverflow问题的最佳方法
- python - SMTPSenderRefused 在 /accounts/signup/
- flutter - Flutter - 在小部件中访问 ThemeData.primarySwatch