predict 为每个图像提供相同的输出值(Keras)

数据挖掘 Python 神经网络 喀拉斯 图像分类
2021-09-21 13:51:53

我正在尝试对图像进行分类并为它们分配标签 1 或 0。(皮肤癌与否)。

我知道关于在每个输入中具有相同输出的三个主要问题。

我没有拆分集合,我只是尝试将 CNN 应用到火车集合上,我知道这没有意义,但这只是为了验证它是如何工作的。(对未标记数据的预测给出完全相同的概率)

我已经验证了三个要点:

1:缩放日期(图像大小和像素强度值) 2:采用低学习率 3:由于计算时间,我最多只尝试了小 epoch 6,是否值得让它运行一天只是为了看到更多时期的结果?

无论如何,我无法理解糟糕的训练如何导致网络每次都给出相同的类别概率?

我尝试了批处理选项等。没有任何改变。

准确度非常低,因为这种分类并不真正适合 CNN,但这不应该解释奇怪的结果。

这是我的输出: 预测的输出

以下是程序的不同部分: 模型: 美国有线电视新闻网

调整大小: 在此处输入图像描述

感谢您的帮助,并对丑陋的屏幕截图感到抱歉。

2个回答

当所有预测都给出完全相同的值时,您就知道您的模型没有学习,因此出了点问题!

在您的情况下,问题是具有softmax和sigmoid激活的最后一个密集层。

model.add(keras.layers.Dense(1, activation=tf.nn.softmax))
model.add(keras.layers.Activation('sigmoid'))

这会产生冲突,其中 softmax 输出1(因为只有一个节点),而 sigmoid 采用此1并计算其 sigmoid 值给出:

1/(1+exp(- 1 )) = 0.731058

还有我们的朋友!

为了解决这个问题,您只需要删除最后一个激活层,并更改 sigmoid 的 softmax,因为您的输出是二进制的:

model = keras.Sequential()
model.add(keras.layers.Conv2D(16, [3,3], activation='relu', padding='same'))
model.add(keras.layers.Conv2D(32, [3,3], activation='relu', padding='same'))
model.add(keras.layers.Conv2D(64, [3,3], activation='relu', padding='same'))

model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(0.15))
model.add(keras.layers.Activation('relu'))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(50))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))
#model.add(keras.layers.Activation('sigmoid'))

这应该工作!

也可能是这个问题很难学习。我已经有了这个,实际上在每批 6 小时的相同输出之后(发生这种情况是因为“平均”答案最容易将损失最小化),网络终于开始学习:

在此处输入图像描述

我计划做一些事情来让学习更早发生:

  1. 学习率的变化
  2. 使用网络早期的特征