【发布时间】:2021-04-01 16:23:26
【问题描述】:
我计划创建一个 CNN 来预测蘑菇类型,并从互联网上收集了 2500 多张照片。数据集有 156 个类(不同类型的蘑菇)。我在 Tensorflow 2 和 Keras 上使用 ImageDataGenerator 对其进行了训练。 这是图像生成器:
image_gen = ImageDataGenerator(rotation_range = 20,
width_shift_range=0.12,
height_shift_range=0.12,
shear_range=0.1,
zoom_range = 0.06,
horizontal_flip=True,
fill_mode='nearest',
rescale=1./255)
这是模型;
model = Sequential()
model.add(Conv2D(filters=32,kernel_size=(3,3),input_shape=image_shape,activation='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Conv2D(filters=64,kernel_size=(3,3),input_shape=image_shape,activation='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Conv2D(filters=64,kernel_size=(3,3),input_shape=image_shape,activation='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(2,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(156,activation='softmax'))
model.compile(loss = 'categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
使用提前停止如下;
early_stop = EarlyStopping(monitor='val_loss',patience=2)
模型从 acc=0.006 开始,在 acc=0.2 左右的 20 个 epoch 后停止。
当我从测试集中预测图像时,我得到了这个荒谬的结果(我在数组中看到一个“1.”,但测试图像必须与数组的最后一个元素相对应): Random image prediction after compiling the model
不使用提前停止(我认为它是过度拟合?),完成了 2000 个 epoch 并导致 0.8 的准确度,但预测仍然是错误的。
第一个问题 准确率低的原因是什么?是因为我的数据样本少吗? 我读过 Class_num/100,所以 156/100 在我的情况下可能有很好的准确性,但是当我从测试文件中预测照片时,它永远找不到相应的蘑菇类型。
我试过了 使用一个更大的数据集,其中包含 7000 多张照片,只有 9 个类别,准确度为 0.23。 但是在测试用例中,
model.predict(my_image_arr).round(3)
无论我输入什么照片,结果如下;
array([[0.063, 0.11 , 0.153, 0.123, 0.064, 0.059, 0.208, 0.162, 0.059]],
dtype=float32)
如果有人能帮助我解决我做错的事情,我将不胜感激。
【问题讨论】:
标签: python tensorflow machine-learning keras neural-network