2016-11-05 7 views
0

Ich habe kürzlich die mnist Tensorflow-Tutorial und wollte versuchen, es ein wenig zu ändern. In diesem Beispiel versuche ich eine Eingabe von 28 * 28 * 3 (3 für r, g, b) zu erhalten und gebe genau die gleiche Ausgabe zurück. Ich mache einfach reines Weiß rein und raus.Tensorflow-Vorhersage enthält alle Nullen

#!/usr/bin/env python 
import tensorflow as tf 

input_layer_size = 2352 # number of pixels * number of color channels (rgb) 

white = [255] * input_layer_size # white is a square of white pixels 
white = [white] 

sess = tf.InteractiveSession() 

x = tf.placeholder(tf.float32, shape=[None, input_layer_size]) 
y_ = tf.placeholder(tf.float32, shape=[None, input_layer_size]) 

W = tf.Variable(tf.truncated_normal([input_layer_size,input_layer_size], stddev=0.1)) 
b = tf.Variable(tf.truncated_normal([input_layer_size], stddev=0.1)) 

sess.run(tf.initialize_all_variables()) 

y = tf.nn.softmax(tf.matmul(x,W) + b) 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)), reduction_indices=[1])) 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 

for i in range(100): 
    train_step.run(feed_dict={x: white, y_: white}) 

feed_dict = {x:white} 
classification = sess.run(y, feed_dict) 
print ("Output:", classification[0]) 

aus irgendeinem Grund hierfür die Ausgabe [ 0., 0., 0., ..., 0., 0., 0.] ist. Warum ist es nicht das erwartete Ergebnis()?

Ich habe den exakt gleichen Code mit den Mnist-Daten versucht und es funktioniert gut, gibt mir 10 Ausgangskanäle mit angemessenen Ergebnissen in jedem.

Antwort

2

Aus dem Code scheint es, dass Sie versuchen, eine lineare Transformation von x nach y zu lernen, wobei sowohl x als auch y (Zeilen-) Vektoren zwei Bilder darstellen: y = x * W + b. Dies ist ein Regressionsproblem. Die Lösung wäre W - Identitätsmatrix und b ist ein Nullvektor. Der folgende Code löst dieses Problem durch Minimieren | y - (x * W + b) |:

#!/usr/bin/env python 
import tensorflow as tf 
tf.reset_default_graph() 

input_layer_size = 2352 # number of pixels * number of color channels (rgb) 

white = [255] * input_layer_size # white is a square of white pixels 
white = [white] 

sess = tf.InteractiveSession() 

x = tf.placeholder(tf.float32, shape=[None, input_layer_size]) 
y_ = tf.placeholder(tf.float32, shape=[None, input_layer_size]) 

W = tf.Variable(tf.truncated_normal([input_layer_size,input_layer_size], stddev=0.1)) 
b = tf.Variable(tf.truncated_normal([input_layer_size], stddev=0.1)) 

y = tf.matmul(x,W) + b 
loss = tf.reduce_sum(tf.abs(y - y_)) 
train_step = tf.train.AdagradOptimizer(0.001).minimize(loss) 

sess.run(tf.initialize_all_variables()) 

for i in range(1000): 
    loss_, _ = sess.run([loss, train_step], feed_dict={x: white, y_: white}) 

print loss_ 

feed_dict = {x:white} 
classification = sess.run(y, feed_dict) 
print ("Output:", classification[0]) 

Wenn Sie den gleichen Code mit den mnist Daten versucht, es hat funktioniert, weil y anders: es ist ein One-hot Kodierung der Zielziffer, dh für 0 wäre 1, 0, 0, 0, ...; für 1 wäre es 0, 1, 0, 0, ...; für 2 - 0, 0, 1, ... und so weiter.

+0

Aber was war falsch mit dem ursprünglichen Code? –

+0

Mehrere Dinge waren falsch: –

+1

Bitte ignorieren Sie meinen Unfall Kommentar oben. Mehrere Dinge lagen falsch: y wurde in den Bereich (1e-10, 1) geschnitten, während es etwa 255 sein sollte, um den Verlust zu minimieren, der Verlust selbst (Kreuz-Entropie von Softmax) ist für ein Klassifikationsproblem mit mehreren Klassen, aber nicht für ein Regressionsproblem. –

Verwandte Themen