繁体   English   中英

Tensorflow中逻辑运算符的梯度

[英]Gradients of Logical Operators in Tensorflow

我正在尝试在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 <A

[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>),)

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

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

这样,您将使用的损失函数为tf.sigmoid_cross_entropy_with_logits

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

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

例如,请参见:

勒村(1998)。 高效的BackProp。

对于带有S型输出的二进制分类,他提出了一些有趣的观点,即通过选择特定的S型函数,正确映射到该S型的类标签等,来保持不饱和状态。

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

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

只需如下更改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)])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM