我创建了一个代码来训练我的 CNN,它将确定图像是一个类还是另一个类(“pdr 或 nonPdr”)
这是我的 keras 模型:
model = Sequential()
model.add(Conv2D(input_shape=(605,700,3), filters=64, kernel_size=(3,3), padding="same",activation="tanh"))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(32, activation='tanh', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
data, labels = ReadImages(TRAIN_DIR)
model.fit(np.array(data), np.array(labels), epochs=10, batch_size=16)
model.save('model.h5')
这是我的 test_predict 文件:
model = load_model('model.h5')
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
test_image = cv2.imread("test_data/im0203.ppm")
test_image = test_image.reshape(1,605,700,3).astype('float')
test_image = np.array(test_image)
test_image2 = cv2.imread("test_data/im0001.ppm")
test_image2 = test_image2.reshape(1,605,700,3).astype('float')
#predict the result
print(model.predict(test_image))
print(model.predict(test_image2))
运行下面的代码后,我的 2 个图像得到相同的值(不同,一个是 pdr,另一个是 nonPdr)
[[0.033681]]
[[0.033681]]
我该如何修复它并改进我的 CNN。我感谢您的帮助。
更新我尝试删除一个密集层并更改 (2, activation='sigmoid') 中的最后一个但它也不起作用..我真的不知道该怎么做**
这可能是由于多种原因。最靠谱的是:
输入到网络的输入和预测期间输入的图像可能没有相同的预处理步骤。
该模型过度拟合,当它发现预测图像略有不同时,它往往会根据其训练来偏向其决策。
模型不好
为避免此类并发症,未来可能的解决方案可能是: 1. 尝试仅在训练和测试期间提供标准化或缩放的图像。
即使您尝试使用密集层,我也建议仅在最后一层使用密集层,它用于最后的 number_of_classes 层。更好的架构是
[ Conv 后跟几个转换块和瓶颈层 ] x 2 展平 Dense(number_of_classes)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句