2017-06-10 47 views
0

我與MNIST數據練習,我有麻煩餵養,因爲這個錯誤的佔位符:Tensorflow錯誤,同時試圖填補一個佔位符

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

我的代碼直到現在:

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???? 

我真的很感激任何幫助。此外,我已閱讀本主題:

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

Tensorflow error using my own data

,但我需要幫助。

回答

1

你沒有對train_y元素(如對該行#y_data = one_hot(train_set[:, 785].astype(int), 10),這僅僅是一個評論,並在代碼中,你使用one_hot唯一的地方所示)申請one_hot

因此batch_ys是數字數組,你需要把它改造成的one_hot數組的,如果你想將它送入feed_dict,因爲y_是對應於one_hot一個佔位符的:

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

此外,刪除行tf.reshape(batch_ys, [2, 10]),因爲您不需要重塑batch_ys。相反,您需要使用one_hot進行轉換,如上所述。

+0

謝謝Miriam Farber你幫助我,因爲我試圖強制餵食0-9的數字到一個佔位符中,叫做y_,需要一個10個元素的熱門陣列 – Enoy

+0

不客氣:) –