2015-11-13 17 views
7

Mam funkcję strat zaimplementowaną w TensorFlow, która oblicza błąd średniokwadratowy. Wszystkie tensory używane do obliczenia celu są typu float64, a zatem sama funkcja strat jest typu dtype float64. W szczególnościBłąd typu minimalizacji strat typu tensorflow

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

Jednak, kiedy próbują zminimalizować mogę uzyskać wartość błędu w odniesieniu do typu tensora:

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

Nie rozumiem dlaczego oczekiwany dtype tensora jest pojedyncza precyzja zmienna, gdy wszystkie zmienne poprzedzające obliczenia są typu float64. Potwierdziłem, że kiedy przymuszam wszystkie zmienne do float32, obliczenia są wykonywane poprawnie.

Czy ktoś ma wgląd w to, dlaczego tak się dzieje? Mój komputer to maszyna 64-bitowa.

Oto przykład, który powiela zachowanie

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) 

Odpowiedz

4

Obecnie tf.train.GradientDescentOptimizer klasa tylko supports szkolenie na 32-bitowych zmiennych zmiennoprzecinkowych oraz wartości strat.

Jednak wygląda na to, że jądro jest zaimplementowane dla wartości podwójnej precyzji, więc powinno być możliwe trenowanie w swoim scenariuszu.

Szybkie obejście byłoby określenie podklasy, który obsługuje tf.float64 wartości, a także:

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

... a następnie użyć DoubleGDOptimizer zamiast tf.train.GradientDescentOptimizer.

EDYCJA: Musisz przejść kurs nauki jako tf.constant(learning_rate, tf.float64), aby to działało.

(NB To nie jest obsługiwany interfejs i może ulec zmianie w przyszłości, ale zespół jest świadome dążenie do optymalizacji podwójnej precyzji pływaków i zamierza zapewnić wbudowany rozwiązanie.)

+0

Zrozumiano! Dzięki! – user1936768

+0

Doens't wydaje się działać teraz (tf v0.6). 'TypeError: Wejście 'alpha' z 'ApplyGradientDescent' Op ma typ float32, który nie pasuje do typu float64 z argumentu 'var'. – colinfang

+0

Dzięki za wskazanie tego. Poprawiłem odpowiedź poprawką. – mrry

Powiązane problemy