Python Tensorflow Keras中的水印二值分类器

Python Tensorflow Keras中的水印二值分类器,python,tensorflow,keras,watermark,image-classification,Python,Tensorflow,Keras,Watermark,Image Classification,我的目标是创建一个模型,该模型可以根据是否存在一个特定的水印对图片进行分类。如果我想检查一个不同的水印,理想的情况是用新的水印创建另一个数据集,然后重新训练模型。据我所知,这是一个二进制分类器 这是正确的方法吗 我一直用我的模型来识别图片上是否有水印。我的指标不会从。例如: loss: 0.6931 - accuracy: 0.5000 - val_loss: 0.6931 - val_accuracy: 0.5000 我准备了一个数据文件夹结构,如: 训练 水印 无水印 验证 水印 无

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

这是正确的方法吗

我一直用我的模型来识别图片上是否有水印。我的指标不会从。例如:

loss: 0.6931 - accuracy: 0.5000 - val_loss: 0.6931 - val_accuracy: 0.5000
我准备了一个数据文件夹结构,如:

训练

  • 水印
  • 无水印
验证

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

我希望你能帮我

  • 如何更改模型以“识别”水印
  • 为什么即使更改图像大小、年代和数据集,我的“损失”和“准确性”也不会移动
  • 我是否应该只使用带有增强的水印图像而不使用背景来训练模型

  • 谢谢

    因为您正在执行二进制分类,您是否在
    ImageDataGenerator.flow\u从_目录
    方法到
    'binary'
    中设置了
    class\u模式
    参数?默认值是
    “分类的”
    ,这不是您应该在这里使用的,因为您只有一个输出节点

    这是一个常见的陷阱。我猜准确度的值一开始是0.5,因为有水印图像和无水印图像的数量可能相等,而且性能永远不会提高,因为您传递了错误的
    class\u mode


    TL;DR:Set
    class\u mode='binary'
    (而不是默认的
    class\u mode='classifical'
    )在
    flow\u from\u directory
    中设置
    class\u mode='binary'
    ),因为您正在执行二进制分类,您是否在
    ImageDataGenerator.flow\u from\u directory
    方法中将
    class\u mode
    参数设置为
    'binary'
    ?默认值是
    “分类的”
    ,这不是您应该在这里使用的,因为您只有一个输出节点

    这是一个常见的陷阱。我猜准确度的值一开始是0.5,因为有水印图像和无水印图像的数量可能相等,而且性能永远不会提高,因为您传递了错误的
    class\u mode


    TL;DR:从目录中设置
    flow\u中的
    class\u mode='binary'
    (而不是默认的
    class\u mode='classifical'
    )!这改变了一切。太棒了!这改变了一切。
    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)