【问题标题】:Gradients of Logical Operators in TensorflowTensorFlow 中逻辑运算符的梯度
【发布时间】:2016-08-27 16:06:34
【问题描述】:

我正在尝试在 Tensorflow 中对生成的数据创建一个非常简单的二元分类器。

我正在从两个独立的正态分布中生成随机数据。然后,如果结果数据小于或大于数字 A,我会将其分类为二进制类。

理想情况下,A 将是两条法线中间的截止点。例如。如果我的数据是由 N(1,1) + N(-1,1) 生成的,那么 A 应该约为 0。

我遇到了“没有为任何变量提供渐变...”错误。具体来说:

No gradients provided for any variable: ((None, <tensorflow.python.ops.variables.Variable object at 0x7fd9e3fae710>),)

我认为这可能与 Tensorflow 无法计算逻辑运算符的梯度有关。我对任何给定 A 值的分类应该是这样的:

给定一个数据点 x 和一个 A 值:

[1,0] : 如果 x

[0,1] : 如果 x >= A

鉴于这个想法,这是我在 Tensorflow 中对输出的计算:

my_output = tf.concat(0,[tf.to_float(tf.less(x_data, A)), tf.to_float(tf.greater_equal(x_data, A))])

这是实现此输出的错误方法吗?是否存在非逻辑功能等价物?

谢谢。如果您想查看我的整个代码,这里有一个要点: https://gist.github.com/nfmcclure/46c323f0a55ae1628808f7a58b5d437f


编辑: 全栈跟踪:

Traceback (most recent call last):

  File "<ipython-input-182-f8837927493d>", line 1, in <module>
    runfile('/.../back_propagation.py', wdir='/')

  File "/usr/local/lib/python3.4/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 699, in runfile
execfile(filename, namespace)

  File "/usr/local/lib/python3.4/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 88, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)

  File "/.../back_propagation.py", line 94, in <module>
train_step = my_opt.minimize(xentropy)

  File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/training/optimizer.py", line 192, in minimize
name=name)

  File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/training/optimizer.py", line 286, in apply_gradients
(grads_and_vars,))

ValueError: No gradients provided for any variable: ((None, <tensorflow.python.ops.variables.Variable object at 0x7fd9e3fae710>),)

【问题讨论】:

  • 完整的堆栈跟踪可能会有所帮助

标签: python classification tensorflow logical-operators gradient-descent


【解决方案1】:

通常您会使用 sigmoid 函数将函数的输出固定在 0 到 1 的范围内。您想要训练以下函数:

y = a*x_input + b,其中 a 和 b 是可训练变量。

您将使用的损失函数将是 tf.sigmoid_cross_entropy_with_logits

要评估课程,您将评估 sigmoid(y) > 0.5。大于逻辑运算符没有创建优化函数的梯度。

【讨论】:

  • 谢谢,我可能会切换到 sigmoid 或连续逼近阶跃函数。
【解决方案2】:

您尝试使用的阈值函数在阈值处不可微,并且导数在其他任何地方都为零。正如 szabadaba 所提到的,您通常会使用 sigmoidal 函数作为二元分类器的输出。对于多类分类,使用 softmax 函数。这些函数可以解释为为您提供类值的概率或置信度(这比仅仅获得硬值更好)。重要的是,梯度表现良好。但是,您必须注意不要使单位饱和。

例如,参见:

乐存 (1998)。高效的BackProp。

在带 sigmoid 输出的二元分类的情况下,他通过选择特定的 sigmoid 函数、到该 sigmoid 的类标签的正确映射等,提出了一些关于保持非饱和状态的有趣观点。

阅读逻辑回归教程可能会有所帮助。这是TensorFlow 的一个和Theano 的一个。

【讨论】:

    【解决方案3】:

    我想也许你不应该使用 my_output 计算损失,因为也许 tf 不能支持计算 tf.lesstf 中的后向梯度.greater 操作 您可以尝试在 x_data

    中计算损失函数

    【讨论】:

      【解决方案4】:

      只需更改 my_output 如下

      my_output = tf.concat(0,[tf.to_float(tf.less(tf.div(x_data,A), 1.)), 
      tf.to_float(tf.greater_equal(tf.div(x_data, A),1.0)])
      

      【讨论】:

        猜你喜欢
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多