有没有一种方法可以向神经网络输出添加约束,但仍然具有softmax激活功能?

时间:2019-06-13 09:34:02

标签: python tensorflow neural-network deep-learning

我不是一个深度学习的极客,我正在学习做作业。

>如何使我的神经网络输出一个总计为1的正浮点列表,但同时该列表的每个元素都小于一个阈值(例如0.4)?

我尝试在输出层之前添加一些隐藏层,但这并不能改善结果。
这是我从哪里开始的:

def build_net(inputs, predictor,scope,trainable):
    with tf.name_scope(scope):
        if predictor == 'CNN':
            L=int(inputs.shape[2])
            N = int(inputs.shape[3])
            conv1_W = tf.Variable(tf.truncated_normal([1,L,N,32], stddev=0.15), trainable=trainable)
            layer = tf.nn.conv2d(inputs, filter=conv1_W, padding='VALID', strides=[1, 1, 1, 1])
            norm1 = tf.layers.batch_normalization(layer)
            x = tf.nn.relu(norm1)

            conv3_W = tf.Variable(tf.random_normal([1, 1, 32, 1], stddev=0.15), trainable=trainable)
            conv3 = tf.nn.conv2d(x, filter=conv3_W, strides=[1, 1, 1, 1], padding='VALID')
            norm3 = tf.layers.batch_normalization(conv3)
            net = tf.nn.relu(norm3)

            net=tf.layers.flatten(net)

            return net




x=build_net(inputs,predictor,scope,trainable=trainable)
y=tf.placeholder(tf.float32,shape=[None]+[self.M])

network = tf.add(x,y)
w_init=tf.random_uniform_initializer(-0.0005,0.0005) 
outputs=tf.layers.dense(network,self.M,activation=tf.nn.softmax,kernel_initializer=w_init)

我希望输出仍将为1,但其中每个元素都小于我设置的特定阈值。

非常感谢您的宝贵帮助。

1 个答案:

答案 0 :(得分:1)

您想要做的是在任何输出大于某些指定的thresh的情况下增加罚款,您可以使用max函数来做到这一点:

thresh = 0.4
strength = 10.0
reg_output = strength * tf.reduce_sum(tf.math.maximum(0.0, outputs - thresh), axis=-1)

然后,您需要在损失中添加reg_output,以便针对其余损失进行优化。 strength是一个可调参数,用于定义超过阈值的惩罚程度,您必须根据需要进行调整。

此惩罚通过在最后一个维度上求和max(0, output - thresh)来起作用,如果output大于thresh,则激活惩罚。如果较小,则惩罚为零,并且不执行任何操作。