Keras自定义softmax层:是否可以在softmax层的输出中将输出神经元设置为0(基于输入层中的数据的0)?

2024-09-27 21:30:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个神经网络,在最后一层有10个输出神经元,使用softmax激活。我也知道根据输入值,输出层的某些神经元应该有0值。所以我有一个由10个神经元组成的特殊输入层,每个神经元都是0或1。在

如果3号输入神经元也是0,那么有没有可能强迫3号输出神经元的值为0?在

action_input = Input(shape=(10,), name='action_input')
...

x = Dense(10,  kernel_initializer = RandomNormal(),bias_initializer = RandomNormal() )(x)
x = Activation('softmax')(x)

我知道有一种方法,通过这种方法,我可以屏蔽出神经网络之外的输出层的结果,并对所有非零相关的输出进行整形(以使总和为1)。但我想在网络中解决这个问题,并在网络培训中使用它。我要用自定义图层吗?在


Tags: 方法name网络inputaction神经网络activationkernel
2条回答

您可以使用Lambda层和K.switch检查输入中的零值,并在输出中屏蔽它们:

from keras import backend as K

inp = Input((5,))
soft_out = Dense(5, activation='softmax')(inp)
out = Lambda(lambda x: K.switch(x[0], x[1], K.zeros_like(x[1])))([inp, soft_out])

model = Model(inp, out)

model.predict(np.array([[0, 3, 0, 2, 0]]))
# array([[0., 0.35963967, 0., 0.47805876, 0.]], dtype=float32)

但是,正如您所看到的,输出的总和不再是一。如果希望总和为1,可以重新缩放值:

^{pr2}$

最后我想出了一个代码:

from keras import backend as K
import tensorflow as tf
def mask_output2(x):
    inp, soft_out = x
    # add a very small value in order to avoid having 0 everywhere
    c = K.constant(0.0000001, dtype='float32', shape=(32, 13))
    y = soft_out + c

    y = Lambda(lambda x: K.switch(K.equal(x[0],0), x[1], K.zeros_like(x[1])))([inp, soft_out])
    y_sum =  K.sum(y, axis=-1)

    y_sum_corrected = Lambda(lambda x: K.switch(K.equal(x[0],0), K.ones_like(x[0]), x[0] ))([y_sum])

    y_sum_corrected = tf.divide(1,y_sum_corrected)

    y = tf.einsum('ij,i->ij', y, y_sum_corrected)
    return y

相关问题 更多 >

    热门问题