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

Watermark binary classifier in Tensorflow Keras stuck

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

这是正确的方法吗?

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

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

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

培训

验证

我使用了一个每个类别有 1000 张图像的数据集。这是我的数据集的示例,带有我自己的水印:

希望你能帮上忙....

  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.[=18 值=]

TL;DR:在 flow_from_directory.

中设置 class_mode='binary'(而不是默认的 class_mode='categorical'