python - 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)
任何帮助是极大的赞赏。
解决方案
你不必让你的模型输出“好”和“坏”作为标签,相反,你可以独立地输出每一个的概率,换句话说,图像好的概率和图像坏的概率. 将最后一层的输出大小设为 2。因此,您的模型现在将输出一个二维向量,其中 [1.0, 0.0] 表示 100% 好,0% 坏,[0.0, 1.0] 表示 0% 好和100%的坏。使用二元交叉熵作为训练的损失函数。当然,您必须以类似方式标记您的训练数据,因此如果您有一个好的训练示例,请将其标记为 [1.0, 0.0],因为您 100% 确定它是好的,如果您有一个不好的训练示例,请将其标记为[0.0, 1.0] 因为您也 100% 确定这是一个坏例子。
我告诉你使用二元交叉熵作为损失函数的原因是,模型将学习输出二维向量输出分量的相反概率。因此,如果它是一个好的图像,第一个分量会很高,而第二个分量会很低,反之亦然,如果它是一个坏图像。另外,在训练之后,在进行预测时,你只取两者中最高的概率,如果更高的概率是第一个,那么它就是一个“好”的图像,你只使用那个概率。
推荐阅读
- php - 如何使用 php 和 angularjs 显示 wordpress 内容和图像?
- rebol - rebol / red parse with [to end] 规则
- sql - 带条件的 Oracle SQL 求和
- java - 使用 RecyclerView 的 OnLoadMore 功能
- image - Joomla 图像滑块,内置
- .net - 如何使用 iText7 从结果 PDF 中删除隐藏层
- php - 使用 Laravel 的 Azure Active Directory SSO
- regex - 用于捕获 Python 中所有数学运算符的正则表达式,例如 >=、<= 和 ==
- gnu-make - 食谱中变量的早期扩展
- java - 在片段中实现计时器