我的生成神经网络的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?
答案 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的答案。