我已经在张量流中用relu作为激活函数编写了一个卷积网络,但是它不是在学习(评估和训练数据集的损失都是恒定的)。
对于不同的激活功能,所有功能均应正常运行。

这是创建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


self.activiation设置为tf.nn.relu,self.last_activiation设置为tf.nn.softmax

损失函数和优化器在这里创建:

    self._nn = self._create_nn()

    self._loss_function = tf.reduce_sum(tf.squared_difference(self._nn, self.Y), 1)

    optimizer = tf.train.AdamOptimizer()
    self._train_op = optimizer.minimize(self._loss_function)


我尝试通过将tf.random_normal_initializer(0.1, 0.1)作为初始化程序来更改变量的初始化,但是它并未导致损失函数发生任何变化。

我非常感谢您帮助该神经网络与ReLu一起使用。

编辑:泄漏的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]])


h_d和y_d内核的梯度(用tf.gradients计算)和偏差等于或接近0

最佳答案

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

更可能的原因是数据集较小,输入要素的缩放比例怪异,权重初始化不适当和/或中间层中的通道很少。

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

您也可以尝试Leaky ReLU。也可能学习率太小或太大。

关于python - Tensorflow ReLu不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50838376/

10-12 21:10