【问题标题】:Hard limiting / threshold activation function in TensorFlowTensorFlow 中的硬限制/阈值激活函数
【发布时间】: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.roundtf.add
  • 嗯,所以主要问题是我试图在梯度为 0 的激活函数上使用反向传播,而反向传播使用激活函数的梯度来计算误差项。我当时使用的网络需要二进制输出,所以我不能使用 sigmoid 等。当我写这篇文章时,我对 TF 真的很陌生,所以我什至没有想过要编写自己的训练操作。因此,获取二进制输出的初始问题在下面得到解答,但实际上训练具有二进制阈值激活函数的网络无法通过 TF 中的梯度下降操作构建来完成。

标签: python python-3.x tensorflow


【解决方案1】:

有点晚了,但如果有人需要,我用了这个定义

def binary_activation(x):

    cond = tf.less(x, tf.zeros(tf.shape(x)))
    out = tf.where(cond, tf.zeros(tf.shape(x)), tf.ones(tf.shape(x)))

    return out

x 是张量

【讨论】:

    【解决方案2】:

    为了记录,可以通过tf.sign获得签名功能。它输出一个浮点数或整数(取决于输入),用-11 表示符号。但是,请注意tf.sign(0) == 0!

    对于硬限制激活函数二元阈值激活函数Heaviside step function,请参见其他答案。

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 2021-07-30
      • 2021-10-29
      • 1970-01-01
      • 2020-12-07
      • 2018-09-30
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多