我有一个神经网络,最后一层有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)。但我想在网络内部解决这个问题,并在网络训练期间使用它。我应该使用自定义层来实现吗?
回答:
最后,我写出了以下代码:
from keras import backend as Kimport tensorflow as tfdef mask_output2(x): inp, soft_out = x # 添加一个非常小的值,以避免所有地方都是0 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