如何解决Tensorflow Keras 中的水印二元分类器卡住了
我的目标是创建一个模型,该模型可以根据一个特定的水印是否存在对图片进行分类。如果我想检查不同的水印,理想情况下会使用该新水印创建另一个数据集,然后重新训练模型。据我了解,这是一个二元分类器。
这是正确的方法吗?
我坚持使用我的模型来识别图片上是否有水印。我的指标不会移动。示例:
loss: 0.6931 - accuracy: 0.5000 - val_loss: 0.6931 - val_accuracy: 0.5000
我准备了一个数据文件夹结构,如:
培训
- 水印
- 无水印
验证
- 水印
- 无水印
我使用了每个类别中包含 1000 张图像的数据集。这是带有我自己的水印的数据集的示例:
- https://drive.google.com/file/d/1JBdbIw1yehx9XX9S6X7esVhVL8NG1dAK/view?usp=sharing
- https://drive.google.com/file/d/14Rxul13zGzXgKD9GZeudn_K69BRBJ1tR/view?usp=sharing
- https://drive.google.com/file/d/1oeXxSjppDMScoj04hzEEl3587ccCFqrB/view?usp=sharing
希望你能帮上忙....
- 如何更改模型以“识别”水印?
- 为什么即使我更改图像大小、时期、数据集,我的“损失”和“准确度”也不会移动?
- 我是否应该只使用带增强的水印图像而不使用背景来训练模型?
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(250,250,3)),tf.keras.layers.MaxPooling2D(2,2),tf.keras.layers.Conv2D(64,activation='relu'),tf.keras.layers.Conv2D(128,tf.keras.layers.Flatten(),tf.keras.layers.Dropout(0.5),tf.keras.layers.Dense(512,tf.keras.layers.Dense(1,activation='sigmoid')
])
model.compile(loss = 'binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
history = model.fit(train_generator,epochs=25,validation_data = validation_generator,verbose = 1,validation_steps=3)
谢谢
解决方法
由于您正在执行二元分类,您是否将 class_mode
方法中的 ImageDataGenerator.flow_from_directory
参数设置为 'binary'
?默认值为 'categorical'
,这不是您在这里应该使用的,因为您只有一个输出节点。
这是一个常见的陷阱。我猜一开始准确率的值是 0.5,因为你可能有相同数量的水印和非水印图像,而且性能永远不会提高,因为你传递了错误的 class_mode
值。
TL;DR:在 class_mode='binary'
中设置 class_mode='categorical'
(而不是默认的 flow_from_directory
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。