我的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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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