2015-11-13 34 views
7

Tôi có chức năng mất mát được thực hiện trong TensorFlow tính toán sai số trung bình bình phương. Tất cả các tensors được sử dụng để tính toán mục tiêu là kiểu float64 và do đó chức năng mất chính nó là của float64 dtype. Đặc biệt,lỗi giảm thiểu mất lưu lượng dòng chảy

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

Tuy nhiên, khi tôi cố gắng để hạn chế tối đa tôi có được một lỗi giá trị liên quan đến loại của tensor:

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

Tôi không hiểu tại sao các dtype dự kiến ​​của tensor là một float chính xác duy nhất khi tất cả các biến dẫn đến tính toán là kiểu float64. Tôi đã xác nhận rằng khi tôi ép tất cả các biến là float32 thì việc tính toán sẽ thực hiện chính xác.

Có ai có bất kỳ thông tin chi tiết nào về lý do tại sao điều này có thể xảy ra không? Máy tính của tôi là một máy 64bit.

Dưới đây là một ví dụ mà tái tạo các hành vi

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) 

Trả lời

4

Hiện nay tf.train.GradientDescentOptimizer lớp chỉ supports đào tạo về biến dấu chấm động 32-bit và giá trị tổn thất.

Tuy nhiên, có vẻ như hạt nhân được triển khai cho các giá trị có độ chính xác kép, vì vậy bạn có thể tập luyện trong kịch bản của mình.

Một cách giải quyết nhanh chóng sẽ được xác định một lớp con hỗ trợ tf.float64 giá trị cũng như:

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

... và sau đó sử dụng DoubleGDOptimizer ở vị trí của tf.train.GradientDescentOptimizer.

EDIT: Bạn sẽ cần phải vượt qua tỷ lệ học tập dưới dạng tf.constant(learning_rate, tf.float64) để thực hiện công việc này.

(NB Đây không phải là giao diện được hỗ trợ và có thể thay đổi trong tương lai, nhưng nhóm nhận thức được mong muốn tối ưu hóa phao chính xác kép và dự định cung cấp giải pháp tích hợp.)

+0

Đã hiểu! Cảm ơn! – user1936768

+0

Dường như dường như không hoạt động (tf v0.6). 'TypeError: Input 'alpha' của 'ApplyGradientDescent' Op có kiểu float32 không khớp với kiểu float64 của đối số 'var'.' – colinfang

+0

Cảm ơn bạn đã chỉ ra điều đó. Tôi đã chỉnh sửa câu trả lời với bản sửa lỗi. – mrry

Các vấn đề liên quan