gpt4 book ai didi

python - 有没有办法向神经网络输出添加约束但仍然具有 softmax 激活函数?

转载 作者:太空宇宙 更新时间:2023-11-04 11:18:08 25 4
gpt4 key购买 nike

我不是一个深度学习极客,我正在学习做这个作为我的家庭作业。如何让我的神经网络输出一个总和为 1 的正 float 列表,但同时列表中的每个元素都小于阈值(例如 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,但它的每个元素都小于我设置的特定阈值。

非常感谢您提供的宝贵帮助。

最佳答案

你想要做的是添加一个惩罚,以防任何输出大于指定的 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 .如果它更小,则惩罚为零并且不执行任何操作。

关于python - 有没有办法向神经网络输出添加约束但仍然具有 softmax 激活函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56577529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com