Keras可能在最后一层使用多个“ Softmax”吗?


Answers:


7

我会使用功能界面。

像这样:

from keras.layers import Activation, Input, Dense
from keras.models import Model
from keras.layers.merge import Concatenate

input_ = Input(shape=input_shape)

x = input_
x1 = Dense(4, x)
x2 = Dense(4, x)
x3 = Dense(4, x)
x1 = Activation('softmax')(x1)
x2 = Activation('softmax')(x2)
x3 = Activation('softmax')(x3)
x = Concatenate([x1, x2, x3])

model = Model(inputs=input_, outputs=x)

2
我不建议您添加解决方案,但我认为按原样回答将给人一种印象,即OP的模型构建工作将完成。但是,如果其他人想实际训练模型,OP还要在代码的其他部分中做同样多的工作。您至少可以参考该要求。其他答案也一样。。。
尼尔·斯莱特

1
@NeilSlater你是完全正确的。我不知道为什么需要其他成本函数。你能告诉我为什么这很重要吗?
arthurDent

1
@arthurDent-因为Keras的多类交叉熵损失可能无法适应每个示例上的三个同时存在的真实类,并且分成几类-一组错误可能会导致梯度错误地分配给其他组的输出。您可以尝试一下,看看会发生什么。。。它可能仍会收敛,但平衡点可能不如拥有三个完全独立的网络一样好。
尼尔·斯莱特

1
ÿ^-ÿ

1
指标categorical_accuracypredict_classes方法的使用可能需要更多的思考。。。
尼尔·斯莱特

5

可以只实现自己的softmax函数。您可以将张量分割为多个部分,然后分别为每个部分计算softmax并连接张量部分:

def custom_softmax(t):
    sh = K.shape(t)
    partial_sm = []
    for i in range(sh[1] // 4):
        partial_sm.append(K.softmax(t[:, i*4:(i+1)*4]))
    return K.concatenate(partial_sm)

concatenate 不带轴参数的连接通过最后一个轴连接(在本例中为axis = 1)。

然后,您可以将此激活功能包括在隐藏层中或将其添加到图形中。

Dense(activation=custom_activation)

要么

model.add(Activation(custom_activation))

您还需要定义一个新的成本函数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.