我正在构建一个用于分类图像的模型,当我使用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正则化或不同的权重初始化方法。
另外,请分享训练代码。问题可能出在训练代码上,而不是模型架构本身。