首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReLu不工作吗?

ReLu不工作吗?
EN

Stack Overflow用户
提问于 2018-06-13 13:22:20
回答 2查看 1.1K关注 0票数 1

我用tensorflow编写了一个以relu作为激活函数的卷积网络,但是它并不是学习(损失对于标准数据集和训练数据集都是常数)。对于不同的激活功能,一切都按其应有的方式工作。

下面是创建nn的代码:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
    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也有同样的问题

编辑:小示例,其中我复制了相同的错误:

代码语言:javascript
复制
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.gradients计算出的h_d和y_d内核和偏差的梯度不是等于就是接近0

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-18 21:12:16

看起来问题出在输入数据的规模上。当值介于0到255之间时,该比例或多或少地保留在下一层中,从而使最后一层的预激活输出有足够大的差异,从而将softmax梯度降低到(几乎)0。只有类似relu的激活函数才能观察到,因为其他的,如乙状结肠或软信号,使网络中的值范围变小,数量级为1,而不是几十或数百。

这里的解决方案是将输入乘以以0-1表示,在字节数为1/255的情况下。

票数 0
EN

Stack Overflow用户

发布于 2018-06-13 15:04:27

在极不可能的情况下,某些层中的所有激活对所有样品都是阴性的。它们被ReLU设置为零,并且没有学习过程,因为ReLU的负部分的梯度为零。

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

在这里,您将random_normal_initializermean=0.1结合使用,因此您的输入可能都是负值,从而映射到负值。尝试mean=0,或者重新确定输入特性。

您也可以尝试一个漏式ReLU。也许学习速度太小或者太大。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50838376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档