Tensorflow Keras中的水印二进制分类器卡住了



我的目标是创建一个模型,该模型可以根据是否存在一个特定水印对图片进行分类。如果我想检查一个不同的水印,理想情况下是用这个新水印创建另一个数据集,并重新训练模型。据我所知,这是一个二进制分类器。

这是正确的方法吗?

我一直在使用我的模型来识别图片上是否有水印。我的指标没有变化。示例:

loss: 0.6931 - accuracy: 0.5000 - val_loss: 0.6931 - val_accuracy: 0.5000

我准备了一个数据文件夹结构,如:

培训

  • 水印
  • 无水印(_W(

验证

  • 水印
  • 无水印(_W(

我使用了一个数据集,每个类别中有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

我希望你能帮上忙。。。。

  1. 如何将我的模型更改为";识别";水印
  2. 为什么我的";损失;以及";准确度";即使我更改图像大小、历元、数据集也不移动
  3. 我应该只训练模型,只使用带有增强的水印图像,而不使用背景吗
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, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(512, activation='relu'),
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)

感谢

由于执行二进制分类,是否将ImageDataGenerator.flow_from_directory方法中的class_mode参数设置为'binary'?默认值是'categorical',这不是您应该在这里使用的,因为您只有一个输出节点。

这是一个常见的陷阱。我猜一开始准确度的值是0.5,因为你可能有相同数量的带水印和无水印图像,而性能永远不会提高,因为你通过了错误的class_mode值。

TL;DR:在flow_from_directory中设置class_mode='binary'(而不是默认的class_mode='categorical'(。

最新更新