2015-11-13 67 views
7

我在TensorFlow中實現了計算均方誤差的損失函數。所有用於計算目標的張量都是float64類型,因此損失函數本身是dtype float64。特別是,tensorflow損失最小化類型錯誤

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]. 

我不明白爲什麼張的預期是D型當所有導致計算的變量都是float64類型時,爲單精度浮點型。我已經確認,當我強制所有變量爲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) 

回答

4

爲例目前tf.train.GradientDescentOptimizer類只supports培訓的32位浮點變量和損耗值。

但是,看起來內核是爲雙精度值實現的,所以應該可以在您的場景中進行訓練。

一個快速的解決方法是定義支持tf.float64值以及一個子類:

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

...然後代替tf.train.GradientDescentOptimizer使用DoubleGDOptimizer。

編輯:你需要通過學習率爲tf.constant(learning_rate, tf.float64)來完成這項工作。

NB這不是一個支持的接口,它可能會在將來改變,但球隊意識到優化的雙精度浮點數的願望,並打算提供一個內置的解決方案。 )

+0

瞭解!謝謝! – user1936768

+0

Doens't似乎現在工作(tf v0.6)。 'TypeError:輸入'ApplyGradientDescent'的'alpha'Op的類型爲float32,與參數'var'的類型float64不匹配。 – colinfang

+0

感謝您指出。我修正了答案。 – mrry

相關問題