我不是一个深度学习的极客,我正在学习做作业。
>如何使我的神经网络输出一个总计为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,但其中每个元素都小于我设置的特定阈值。
非常感谢您的宝贵帮助。
答案 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
,则激活惩罚。如果较小,则惩罚为零,并且不执行任何操作。