2017-06-10 14 views
0

ich mit den mnist Daten übe zu füllen und Ich habe Probleme, den Platzhalter wegen dieser Fehler Fütterung:Tensorflow Fehler beim Versuch, einen Platzhalter

ValueError: Cannot feed value of shape (20,) for Tensor 'Placeholder_1:0', which has shape '(?, 10)' 

Mein Code bis jetzt:

import gzip 
#https://stackoverflow.com/questions/37132899/installing-cpickle-with-python-3-5 
import _pickle as cPickle 

import tensorflow as tf 
import numpy as np 


# Translate a list of labels into an array of 0's and one 1. 
# i.e.: 4 -> [0,0,0,0,1,0,0,0,0,0] 
def one_hot(x, n): 
    """ 
    :param x: label (int) 
    :param n: number of bits 
    :return: one hot code 
    """ 
    if type(x) == list: 
     x = np.array(x) 
    x = x.flatten() 
    o_h = np.zeros((len(x), n)) 
    o_h[np.arange(len(x)), x] = 1 
    return o_h 


f = gzip.open('mnist.pkl.gz', 'rb') 
#https://stackoverflow.com/questions/40493856/python-pickle-unicodedecodeerror 
train_set, valid_set, test_set = cPickle.load(f, encoding='latin1') 
f.close() 



train_x, train_y = train_set 



# ---------------- Visualizing some element of the MNIST dataset -------------- 

import matplotlib.cm as cm 
import matplotlib.pyplot as plt 

plt.imshow(train_x[57].reshape((28, 28)), cmap=cm.Greys_r) 
plt.show() # Let's see a sample 
print (train_y[57]) 


# TODO: the neural net!! 

# OJO hace falta formatear los datos. 
#x_data = train_set[:, 0:784].astype('f4') 
#y_data = one_hot(train_set[:, 785].astype(int), 10) 

#Conocemos que las imagenes son de 28x28 entonces las columnas son 784, las filas se dejan para el momento del relleno 
x = tf.placeholder("float", [None, 784]) 

#Necesitamos albergar las etiquetas reales del 0-9 para luego comparar y hallar el error. 
y_ = tf.placeholder("float", [None, 10]) 

#Recibimos las 784 entradas y las sumamos a trav�s de 10 neuronas 
W1 = tf.Variable(np.float32(np.random.rand(784, 10)) * 0.1) 
#El umbral es 10 porque queremos que todas las neuronas participen �? AND �? 
b1 = tf.Variable(np.float32(np.random.rand(10)) * 0.1) 
#La funcion que clasifica la aplicamos a las entradas x con los pesos W1 adicionando el b1 
y = tf.nn.softmax(tf.matmul(x, W1) + b1) 

#Nuestro error es la diferencia entre las etiquetas reales de los n y las predichas por la red, al cuadrado; haciendo la media. 
loss = tf.reduce_sum(tf.square(y_ - y)) 

#Minimizamos el error con un factor de aprendizaje de 0.01 
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

init = tf.initialize_all_variables() 

sess = tf.Session() 
sess.run(init) 

print ("----------------------") 
print (" Start training... ") 
print ("----------------------") 

batch_size = 20 

for epoch in range(100): 
    #https://stackoverflow.com/questions/19824721/i-keep-getting-this-error-for-my-simple-python-program-typeerror-float-obje 
    for jj in range(len(train_x) // batch_size): 
     batch_xs = train_x[jj * batch_size: jj * batch_size + batch_size] 
     batch_ys = train_y[jj * batch_size: jj * batch_size + batch_size] 
     tf.reshape(batch_ys, [2, 10]) 
     sess.run(train, feed_dict={x: batch_xs, y_: batch_ys}) 

    print ("Epoch #:", epoch, "Error: ", sess.run(loss, feed_dict={x: batch_xs, y_: batch_ys})) 
    result = sess.run(y, feed_dict={x: batch_xs}) 
    for b, r in zip(batch_ys, result): 
     print (b, "-->", r) 
    print ("----------------------------------------------------------------------------------") 

###�Como usamos el conjunto de validacion???? 

Ich würde wirklich jede Hilfe zu schätzen wissen. Auch habe ich dieses Thema lesen:

TensorFlow ValueError: Cannot feed value of shape (64, 64, 3) for Tensor u'Placeholder:0', which has shape '(?, 64, 64, 3)'

und

Tensorflow error using my own data

aber ich brauche Hilfe.

Antwort

1

Sie galt nicht one_hot auf die Elemente train_y (wie #y_data = one_hot(train_set[:, 785].astype(int), 10) werden, um die Zeile angezeigt, die nur ein Kommentar, und der einzige Ort in Ihrem Code, wo Sie one_hot verwendet).

Daher batch_ys ist ein Array von Zahlen, und Sie müssen es in ein Array von one_hot zu transformieren ist, wenn Sie es in feed_dict füttern wollen, weil y_ ein Platzhalter ist, die one_hot den 'entspricht s:

y_ = tf.placeholder("float", [None, 10]) 

Entfernen Sie auch die Zeile tf.reshape(batch_ys, [2, 10]), da Sie batch_ys nicht umformen müssen. Stattdessen müssen Sie es wie oben beschrieben unter Verwendung von one_hot transformieren.

+0

Danke Miriam Farber du hast mir geholfen, weil ich versuchte, Zahlen von 0-9 in einen Platzhalter zu füttern, genannt y_, der ein einziges Array von 10 Elementen benötigt – Enoy

+0

Gern geschehen :) –