【问题标题】:Keras loss gets stuck at one point CNNKeras 的损失一度陷入 CNN
【发布时间】:2020-07-19 06:45:52
【问题描述】:

我有 12k rgb 图像,一组 100x100 中有 6 个。

所以我使用了形状为 (-1,100,100,3,6) 的 Conv3d

作为输出,我有布尔值(0 或 1)

所以我所做的是,我首先保留了几个 CNN 层,将其展平为 DNN 层,最后应用 sigmoid 激活函数得到从 0 到 1 的结果。

我有前 400 个布尔输出为 1 的图像和其他 1600 个布尔输出为 0 的图像。

所以我写了这段代码

import numpy as np
from tensorflow.contrib.keras import models,layers,losses,optimizers


x=np.load('features.npy')

y=np.zeros(2000)
y[:400]=1

model = models.Sequential()
model.add(layers.Conv3D(32, (3,3,3), input_shape=(100,100,3,6),activation='linear',padding='same'))
model.add(layers.MaxPool3D((2,2,2),padding='same'))
model.add(layers.Conv3D(32, (3,3,3),activation='linear',padding='same'))
model.add(layers.MaxPool3D((2,2,2),padding='same'))
model.add(layers.Conv3D(32, (3,3,3),activation='linear',padding='same'))
model.add(layers.Flatten())
model.add(layers.Dense(10, activation='linear'))
model.add(layers.Dense(units=1,activation='sigmoid'))

model.compile(optimizer=optimizers.Nadam(),loss=losses.mean_absolute_percentage_error)
model.fit(x,y,epochs=10,shuffle=True,batch_size=20)

model.fit(x,y,epochs=100,shuffle=True,batch_size=20)

model.save_weights("model0.h5")
print("Saved model to disk")

但问题是, 当应用 sigmoid 或任何映射到有限空间的函数时,模型总是给出输出为 0 或 1,并且损失总是保持在 20

当我用线性替换最后一个激活时,模型效果很好,但由于线性函数不适合二进制输出,它会损失超过一百万。

【问题讨论】:

  • 请在此处查看为什么将代码输出作为图像发布不是一个好主意:meta.stackoverflow.com/questions/285551/…
  • mean_absolute_percentage_error 在分类问题中的意义不如损失函数...尝试 binary_crossentropy

标签: python tensorflow keras deep-learning


【解决方案1】:

问题是你使用了线性激活,使用 ReLU 激活。

另外,在倒数第二个 Dense 层中,您使用了 10 个单位,请考虑使用 [128, 512] 范围内的单位。

要考虑的另一件事是您的数据集不平衡。尝试使用相同数量的样本来平衡您的数据集。

【讨论】:

  • 您尝试过平衡数据吗?您是否将损失更改为二元交叉熵?
  • 你能告诉我训练曲线和验证曲线吗?如果您发现损失减少缓慢,请考虑增加层的大小。
  • 另外,将学习率设为 1 或 0.1 以查看损失是否真的在变化。使用普通 Adam,您可以在那里轻松设置学习率。
【解决方案2】:

二进制输出对我来说很奇怪,模型试图给出全 0 或全 1。

所以我将 1 替换为 randint(90,100) 并将 0 替换为 randint(0,10)

还将激活从 sigmoid 更改为 relu

现在,每次模型尝试全为 0 时,都会出现巨大错误并自行纠正。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多