【发布时间】:2020-07-15 10:08:30
【问题描述】:
我正在将此代码用于 CNN
train_batches = ImageDataGenerator().flow_from_directory('dice_sklearn/train', target_size=(IMG_WIDTH, IMG_HEIGHT),
classes=['1', '2', '3', '4', '5', '6'],
batch_size=cv_opt['batch'],
color_mode="grayscale")
test_batches = ImageDataGenerator().flow_from_directory('dice_sklearn/test', target_size=(IMG_WIDTH, IMG_HEIGHT),
class_mode='categorical',
batch_size=cv_opt['batch'],
shuffle=False)
train_num = len(train_batches)
test_num = len(test_batches)
model = Sequential([
Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=(IMG_WIDTH, IMG_HEIGHT, 1)),
Conv2D(32, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.30),
Conv2D(64, (3, 3), padding='same', activation='relu'),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.30),
Conv2D(64, (3, 3), padding='same', activation='relu'),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.30),
Flatten(),
Dense(512, activation='relu'),
Dropout(0.5),
Dense(6, activation='softmax'),
])
print(model.summary())
model.compile(Adam(lr=cv_opt['lr']), loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(train_batches, steps_per_epoch=train_num,
epochs=cv_opt['epoch'], verbose=2)
model.save('cnn-keras.h5')
test_batches.reset()
prediction = model.predict(test_batches, steps=test_num, verbose=1)
predicted_class = np.argmax(prediction, axis=1)
classes = test_batches.classes[test_batches.index_array]
accuracy = (predicted_class == classes).mean()
print("Final accuracy:", accuracy * 100)
在哪里
- cv_opt['batch'] 设置为 50
- cv_opt['lr'] 设置为 0.0003
- cv_opt['epoch'] 设置为 50
最后一行(last epoch)的训练阶段(使用model.fit)的输出返回:
192/192 [==============================] - 98s 510ms/step - loss: 0.0514 - accuracy: 0.9818 - val_loss: 0.0369 - val_accuracy: 0.9833
但是当我运行这部分代码时:
test_batches.reset()
prediction = model.predict(test_batches, steps=test_num, verbose=1)
predicted_class = np.argmax(prediction, axis=1)
classes = test_batches.classes[test_batches.index_array]
accuracy = (predicted_class == classes).mean()
print("Final accuracy:", accuracy * 100)
我的准确度得分非常低:(0.16)。 但是,如果绘制学习曲线,我可以看到测试/验证曲线(如果在测试或参数调整中)都达到接近 90% 的准确度。
我是否以错误的方式使用了 model.predict?
【问题讨论】:
-
不,问题是使用 generator.classes 是不可靠的,因为生成器有一个状态并且可能与 generator.classes 中的顺序不匹配,您应该迭代生成器以获取输入和目标为了计算任何指标,model.evaluate 是如何工作的。
-
很久以前我遇到了一个类似且非常奇怪的错误,您可以尝试从 model.fit 中删除验证拆分然后尝试验证吗?
标签: machine-learning keras deep-learning neural-network conv-neural-network