【发布时间】:2016-06-10 08:33:29
【问题描述】:
我正在尝试在 TensorFlow 0.9 中实现一个基本的二进制 Hopfield Network。不幸的是,我很难让激活功能正常工作。我正在寻找非常简单的If net[i] < 0, output[i] = 0, else output[i] = 1,但我尝试的一切似乎都消除了梯度,即在尝试实现训练操作时出现“没有为任何变量提供梯度”异常。
例如,我尝试将tf.less() 转换为float,我尝试按照以下方式进行操作
tf.maximum(tf.minimum(net, 0) + 1, 0)
但我忘记了小十进制值。最后我做到了
tf.maximum(tf.floor(tf.minimum(net, 0) + 1), 0)
但是tf.floor 没有注册渐变。我还尝试用强制转换为 int 替换地板,然后再强制转换为浮动,但同样的处理。
对我能做什么有什么建议吗?
【问题讨论】:
-
If net[i] < 0, output[i] = 0, else output[i] = 1的结果的梯度为 0。处处(0 中没有梯度。) -
@OlivierMoindrot 啊,看来我需要复习一下 calc 1,谢谢!
-
您是否尝试过使用 tf.nn.sigmoid() 或 tf.nn.tanh()?它们是可区分的函数,其行为有点像您描述的。
-
我不确定注册渐变,但您是否尝试过
tf.round和tf.add? -
嗯,所以主要问题是我试图在梯度为 0 的激活函数上使用反向传播,而反向传播使用激活函数的梯度来计算误差项。我当时使用的网络需要二进制输出,所以我不能使用 sigmoid 等。当我写这篇文章时,我对 TF 真的很陌生,所以我什至没有想过要编写自己的训练操作。因此,获取二进制输出的初始问题在下面得到解答,但实际上训练具有二进制阈值激活函数的网络无法通过 TF 中的梯度下降操作构建来完成。
标签: python python-3.x tensorflow