Tensorflow ReLu不工作?

2024-04-20 15:41:26 发布

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

我用tensorflow编写了一个卷积网络,relu作为激活函数,但是它不是学习的(eval和train数据集的损失都是常数)。 对于不同的激活功能,一切正常工作。在

以下是创建nn的代码:

def _create_nn(self):
    current = tf.layers.conv2d(self.input, 20, 3, activation=self.activation)
    current = tf.layers.max_pooling2d(current, 2, 2)
    current = tf.layers.conv2d(current, 24, 3, activation=self.activation)
    current = tf.layers.conv2d(current, 24, 3, activation=self.activation)
    current = tf.layers.max_pooling2d(current, 2, 2)
    self.descriptor = current = tf.layers.conv2d(current, 32, 5, activation=self.activation)
    if not self.drop_conv:
        current = tf.layers.conv2d(current, self.layer_7_filters_n, 3, activation=self.activation)
    if self.add_conv:
        current = tf.layers.conv2d(current, 48, 2, activation=self.activation)

    self.descriptor = current

    last_conv_output_shape = current.get_shape().as_list()
    self.descr_size = last_conv_output_shape[1] * last_conv_output_shape[2] * last_conv_output_shape[3]

    current = tf.layers.dense(tf.reshape(current, [-1, self.descr_size]), 100, activation=self.activation)
    current = tf.layers.dense(current, 50, activation=self.last_activation)

    return current

在自我激活设置为tf.nn.relu公司以及最后一次激活设置为tf.nn.softmax在

损失函数和优化器在此处创建:

^{pr2}$

我尝试通过传递tf.random_normal_initializer(0.1, 0.1)作为初始值设定项来更改变量初始化,但是它没有导致损失函数的任何更改。在

我将非常感谢帮助使这个神经网络与ReLu一起工作。在

编辑:漏热露也有同样的问题

编辑:我设法复制相同错误的小例子:

x = tf.constant([[3., 211., 123., 78.]])
v = tf.Variable([0.5, 0.5, 0.5, 0.5])
h_d = tf.layers.Dense(4, activation=tf.nn.leaky_relu)
h = h_d(x)
y_d = tf.layers.Dense(4, activation=tf.nn.softmax)
y = y_d(h)
d = tf.constant([[.5, .5, 0, 0]])

坡度(根据tf.梯度)对于h,y,核和偏差要么等于或接近于0


Tags: 函数selfoutputlayerstfnncurrentactivation
2条回答

看来问题出在输入数据的规模上。当值在0到255之间时,该标度或多或少地保留在下一层中,给出最后一层的预激活输出具有足够大的差异,从而将softmax梯度降低到(几乎)0。 它只能用类relu的激活函数来观察,因为其他函数,如sigmoid或softsign,保持网络中的值范围更小,数量级为1,而不是几十或数百。在

这里的解决方案是将输入乘以0-1,以字节为单位乘以1/255。在

在一个非常不可能的情况下,对于所有样本,某一层中的所有激活都可能是负的。它们被ReLU设置为零,并且没有学习进度,因为在ReLU的负部分梯度为零。在

使这种可能性更大的因素是小数据集、输入特性的怪异缩放、不适当的权重初始化和/或中间层中的几个通道。在

这里您将random_normal_initializermean=0.1一起使用,因此可能您的输入都是负数,因此映射到负值。尝试mean=0,或重新缩放输入功能。在

你也可以试试漏水的热露。也可能是学习率太小或太大。在

相关问题 更多 >