不使用Softmax标准化输出

时间:2018-05-18 15:40:47

标签: tensorflow neural-network keras

我的生成神经网络的softmax输出层训练比relu整体提供更好的结果,但relu给出了我需要的稀疏度(以像素为单位的零)。 Softmax也有助于获得标准化输出(即sum = 1。)。

我想这样做:

outputs = Dense(200, activation='softmax', activity_regularizer=l1(1e-5))(x)
outputs = Activation('relu')(outputs) # to get real zeros
outputs = Activation('softmax')(outputs) # still real zeros, normalized output

但是通过应用连续的softmax,我将获得极端输出。是否有一个我可以使用的层,它只是将输出规范化为1(output_i / sum(输出))而不是softmax?

2 个答案:

答案 0 :(得分:2)

您可以编写自己的图层,将输出转换为单位范数(即在您的情况下标准化),而不应用softmax。您可以通过将输出转换为单位矢量来实现。有点像:

die(print_r($_POST));

代码来自unit norm constraint,它对内核和层中的偏差执行相同的操作。你可以尝试不用epsilon来更精确,但是当你有很多零时可能会更不稳定。

答案 1 :(得分:2)

您无需添加两个softmax。只是最后一个很好:

outputs = Dense(200, activation='relu', activity_regularizer=l1(1e-5))(x)
outputs = Activation('softmax')(outputs) # still real zeros, normalized 

然而,如果你有更多的中间层并且你希望它们表现得更适度,你可以使用“tanh”而不是softmax。

relu模型的问题通常并不完全是“它们不是1”,而只是“它们的值越来越高,渐变效果不好”。

#this combines a max output of 1 (but doesn't care about the sum)
#yet keeping the sparsity:
outputs = Dense(200, activation='tanh')(x)
outputs = Activation('relu')(outputs) # to get real zeros

outputs = Dense(200, activation='relu')(outputs)

#this should only be used at the final layer
#and only if you really have a classification model with only one correct class
outputs = Activation('softmax')(outputs) # still real zeros, normalized output

Softmax往往只赞成其中一项结果。如果你不想改变结果比较的方式,但你想要sum=1,你可以去@nuric的答案。