【发布时间】: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