张量流损失最小化类型错误

我在TensorFlow中实现了一个计算均方误差的损失函数。 所有用于计算目标的张量都是float64类型,因此损失函数本身是dtype float64。 尤其是,

print cost
==> Tensor("add_5:0", shape=TensorShape([]), dtype=float64)

但是,当我尝试最小化时,我获得了关于张量类型的值错误:

GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
==> ValueError: Invalid type <dtype: 'float64'> for add_5:0, expected: [tf.float32].

我不明白为什么当张量计算的所有变量都是float64类型时,张量的预期dtype是单精度浮点数。 我已经确认,当我强制所有变量为float32时,计算正确执行。

有没有人有任何见解,为什么会发生这种情况? 我的电脑是一台64位机器。

这是一个重现行为的例子

import tensorflow as tf
import numpy as np

# Make 100 phony data points in NumPy.
x_data = np.random.rand(2, 100) # Random input
y_data = np.dot([0.100, 0.200], x_data) + 0.300

# Construct a linear model.
b = tf.Variable(tf.zeros([1], dtype=np.float64))
W = tf.Variable(tf.random_uniform([1, 2], minval=-1.0, maxval=1.0, dtype=np.float64))
y = tf.matmul(W, x_data) + b

# Minimize the squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# For initializing the variables.
init = tf.initialize_all_variables()

# Launch the graph
sess = tf.Session()
sess.run(init)

# Fit the plane.
for step in xrange(0, 201):
    sess.run(train)
    if step % 20 == 0:
        print step, sess.run(W), sess.run(b)

目前, tf.train.GradientDescentOptimizer类仅支持32位浮点变量和损失值的培训。

但是,看起来内核是为双精度值实现的,所以应该可以在你的场景中进行训练。

一个快速的解决方法是定义一个支持tf.float64值的子类:

class DoubleGDOptimizer(tf.train.GradientDescentOptimizer):
  def _valid_dtypes(self):
    return set([tf.float32, tf.float64])

...然后使用DoubleGDOptimizer代替tf.train.GradientDescentOptimizer

编辑:你需要传递学习率作为tf.constant(learning_rate, tf.float64)来完成这项工作。

注意:这不是一个支持的接口,将来可能会有变化,但团队意识到优化双精度浮点数的愿望,并打算提供一个内置解决方案。)

链接地址: http://www.djcxy.com/p/88797.html

上一篇: tensorflow loss minimization type error

下一篇: Why Web Audio API isn't supported in nodejs?