首页 > 解决方案 > TensorFlow 二值图像分类:预测数据集中每个图像的每个类别的概率

问题描述

我正在为二进制图像分类构建一个 TensorFlow 模型。我有两个标签“好”和“坏”我希望模型应该为数据集中的每个图像输出,无论该图像是好是坏以及概率是多少

例如,如果我提交 1.jpg 并假设它是“好”图像。然后模型应该以 100% 的概率预测 1.jpg 是好的,而以 0% 的概率预测 1.jpg 是坏的。

到目前为止,我已经能够想出以下

model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(input_shape, input_shape, 3)),
  tf.keras.layers.MaxPool2D(2,2),
  #
  tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
  tf.keras.layers.MaxPool2D(2,2),
  #
  tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
  tf.keras.layers.MaxPool2D(2,2),
  ##
  tf.keras.layers.Flatten(),
  ##
  tf.keras.layers.Dense(512, activation='relu'),
  ##
  tf.keras.layers.Dense(1, activation='sigmoid')
])

上述模型的输出形状为 1 x 1。但我认为这不符合我的目的。

我正在以这种方式编译模型

 model.compile(loss='binary_crossentropy',
          optimizer=RMSprop(lr=0.001),
          metrics=['accuracy'])
 model_fit = model.fit(train_dataset,
                  steps_per_epoch=3,
                  epochs=30,
                  validation_data=validation_dataset)

任何帮助是极大的赞赏。

标签: pythontensorflowimage-processingclassification

解决方案


你不必让你的模型输出“好”和“坏”作为标签,相反,你可以独立地输出每一个的概率,换句话说,图像好的概率和图像坏的概率. 将最后一层的输出大小设为 2。因此,您的模型现在将输出一个二维向量,其中 [1.0, 0.0] 表示 100% 好,0% 坏,[0.0, 1.0] 表示 0% 好和100%的坏。使用二元交叉熵作为训练的损失函数。当然,您必须以类似方式标记您的训练数据,因此如果您有一个好的训练示例,请将其标记为 [1.0, 0.0],因为您 100% 确定它是好的,如果您有一个不好的训练示例,请将其标记为[0.0, 1.0] 因为您也 100% 确定这是一个坏例子。

我告诉你使用二元交叉熵作为损失函数的原因是,模型将学习输出二维向量输出分量的相反概率。因此,如果它是一个好的图像,第一个分量会很高,而第二个分量会很低,反之亦然,如果它是一个坏图像。另外,在训练之后,在进行预测时,你只取两者中最高的概率,如果更高的概率是第一个,那么它就是一个“好”的图像,你只使用那个概率。


推荐阅读