在没有 Softmax 的情况下标准化输出
Posted
技术标签:
【中文标题】在没有 Softmax 的情况下标准化输出【英文标题】:Normalize output without Softmax 【发布时间】:2018-10-29 02:33:23 【问题描述】:使用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(output)) 而不是 softmax?
【问题讨论】:
【参考方案1】:你不需要添加两个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 的答案。
【讨论】:
我需要对我的输出进行标准化,总和正好 = 1。你的建议是一个非常好的建议,可以用 tanh 改进 relu。但不是我要解决的问题。我的模型不是分类,但我需要一个标准化的输出。我可以尝试不使用softmax,而是使用@nuric 建议的单位规范 我明白了 :) --- 即便如此,真正需要 softmax 的唯一层是最后一层。所以你只需要调用一次“softmax”,你的结果就不会那么极端了。【参考方案2】:您可以编写自己的层来将输出转换为单位范数(即在您的情况下进行归一化),而无需应用 softmax。您可以通过将输出转换为单位向量来实现。大致如下:
def unitnorm(x):
return x / (K.epsilon() + K.sqrt(K.sum(K.square(x), keepdims=True)))
# Wrap Lambda layer
outputs = Lambda(unitnorm, name='unitnorm')(outputs)
代码来自unit norm constraint,它对内核和层中的偏差执行相同的操作。您可以尝试不使用 epsilon 以更精确,但如果您有很多零,则可能会不太稳定。
【讨论】:
以上是关于在没有 Softmax 的情况下标准化输出的主要内容,如果未能解决你的问题,请参考以下文章