首页 > 解决方案 > Keras 的损失一度陷入 CNN

问题描述

我有 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

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

输出

标签: pythontensorflowkerasdeep-learning

解决方案


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

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

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


推荐阅读