我的Keras模型在输入图像时给出随机预测

我正在构建一个用于分类图像的模型,当我使用model.predict输入图像时,它会给出随机的输出。model.evaluate_generator给出的准确率为0.9530581049962875,损失为0.2506975952616229。图像大小为64×64,具有三个通道。

我尝试使用其他数据集,结果依然相同。

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

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 = 60pic_size = 64train_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 resizeimport matplotlib.pyplot as plt%matplotlib inlinemy_image = plt.imread('image.jpg')my_image_resized = resize(my_image, (64,64,3))import numpy as npprobabilities = model.predict(np.array( [my_image_resized,] ))print(probabilities)

回答:

我想到的一些建议包括:

  • 尽可能减少MaxPooling层的数量。即使是最轻微的最大池化,如你所使用的(2, 2),也会丢失75%的数据!

  • 降低Dropout的概率。如果在每次训练迭代中关闭一半的节点,要让它们学习东西是有些困难的(我知道有人会不同意,这是基于我的机器学习经验的个人观点)。我通常将其设置在0.1-0.25的范围内。

  • 通常情况下,你不需要那么多滤波器。CNN通常在初始层使用较少的滤波器,随着层数增加而增加。这样,你只需从噪声像素数据中提取相关信息,并让网络在后续阶段处理更复杂的表示。我通常从32开始,然后增加到64,128。请注意,这是我个人的经验法则(它总是能带来不错的结果,但其他架构也可能很好)。

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

另外,请分享训练代码。问题可能出在训练代码上,而不是模型架构本身。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注