Tensorflow Keras 中的水印二元分类器卡住了
Watermark binary classifier in Tensorflow Keras stuck
我的目标是创建一个模型,可以根据 一个特定水印 是否存在对图片进行分类。如果我想检查不同的水印,理想情况下是创建另一个带有新水印的数据集,然后重新训练模型。据我了解,这是一个二元分类器。
这是正确的方法吗?
我一直在使用我的模型来识别图片上是否有水印。我的指标没有变化。示例:
loss: 0.6931 - accuracy: 0.5000 - val_loss: 0.6931 - val_accuracy: 0.5000
我准备了一个数据文件夹结构如下:
培训
- 水印
- No_watermark
验证
- 水印
- No_watermark
我使用了一个每个类别有 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, (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'
)
我的目标是创建一个模型,可以根据 一个特定水印 是否存在对图片进行分类。如果我想检查不同的水印,理想情况下是创建另一个带有新水印的数据集,然后重新训练模型。据我了解,这是一个二元分类器。
这是正确的方法吗?
我一直在使用我的模型来识别图片上是否有水印。我的指标没有变化。示例:
loss: 0.6931 - accuracy: 0.5000 - val_loss: 0.6931 - val_accuracy: 0.5000
我准备了一个数据文件夹结构如下:
培训
- 水印
- No_watermark
验证
- 水印
- No_watermark
我使用了一个每个类别有 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, (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'
)