2017-06-18 79 views
1

我试图将Keras中的tutorial转换为TF。 我收到以下错误:Tensorflow占位符声明

Traceback (most recent call last): 
    File "/Users/spicyramen/Documents/Development/google/python/machine_learning/deep_learning/exercise1_tf.py", line 64, in <module> 
    sess.run(train_step, feed_dict=train_data) 
    File "/Library/Python/2.7/site-packages/tensorflow/python/client/session.py", line 789, in run 
    run_metadata_ptr) 
    File "/Library/Python/2.7/site-packages/tensorflow/python/client/session.py", line 975, in _run 
    % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape()))) 
ValueError: Cannot feed value of shape (768,) for Tensor u'Placeholder_1:0', which has shape '(?, 1)' 

这似乎是我如何传递目标标签和我的占位符值是如何声明有关。 当我返回标签我有这样的:

>>> dataset[:, 8].shape 
(768,) 
>>> dataset[:, 0:8].shape 
(768, 8) 

代码

import tensorflow as tf 
import numpy as np 

print("Tensorflow version: " + tf.__version__) 
tf.set_random_seed(0) 

FILENAME = 'pima-indians-diabetes.csv' 
_LEARNING_RATE = 0.003 
_NUM_FEATURES = 8 
_NUM_LABELS = 1 
_NUM_EPOCHS = 150 
_BATCH_SIZE = 10 


def import_data(filename): 
    if filename: 
     dataset = np.loadtxt(filename, delimiter=",") 
     return dataset[:, 0:8], dataset[:, 8] 


# create placeholder. Dataset contains _NUM_FEATURES features: 
X = tf.placeholder(tf.float32, [None, _NUM_FEATURES]) 
Y_ = tf.placeholder(tf.float32,[None, _NUM_LABELS]) # Placeholder for correct answers 

# weights and biases 
W = tf.Variable(tf.random_normal([_NUM_FEATURES, _NUM_LABELS], 
           mean=0, 
           stddev=0.1, 
           name='weights')) 

b = tf.Variable(tf.random_normal([1, _NUM_LABELS], 
           mean=0, 
           stddev=0.1, 
           name='bias')) 

# activation function 
Y = tf.nn.relu(tf.matmul(X, W) + b, name='activation') 

# cost function i.e. sigmoid_cross_entropy_with_logits 
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=Y_, logits=Y, name='loss_function') 
optimizer = tf.train.AdamOptimizer(_LEARNING_RATE) # Formal derivation 
train_step = optimizer.minimize(cross_entropy) 

# cost function i.e. RMSE 
# cross_entropy = tf.nn.l2_loss(Y - Y_, name="squared_error_cost") 
# optimizer = tf.train.GradientDescentOptimizer(_LEARNING_RATE) 
# train_step = optimizer.minimize(cross_entropy) 

is_correct = tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1)) 
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32)) 

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

for i in range(_NUM_EPOCHS): 
    # data 
    batch_X, batch_Y = import_data(FILENAME) 
    # train 
    train_data = {X: batch_X, Y_: batch_Y} 
    sess.run(train_step, feed_dict=train_data) 
    a, c = sess.run([accuracy, cross_entropy], feed_dict=train_data)   
    print(str(i) + ": accuracy:" + str(a) + " loss: " + str(c)) 

回答

2

这是你的问题就在这里:

>>> dataset[:, 8].shape 
(768,) 

TensorFlow期待形状(768,1),而不是一个数组作为错误参考的(768,)

Cannot feed value of shape (768,) for Tensor u'Placeholder_1:0', which has shape '(?, 1)' 

两种形状之间的差异有点小,Numpy通常会在很多情况下为您播放这些,但TF不会。看到这两种形状之间的区别in this question with a great answer

幸好在你的情况下,解决方案非常简单。您可以使用np.expand_dims()把你(768,)载体引入(768,1)载体,这表现在这里:

>>> np.array([5,5,5]).shape 
(3,) 
>>> np.expand_dims(np.array([5,5,5]), axis=1).shape 
(3, 1) 

在你import_data功能,只需将回线改为

return dataset[:, 0:8], np.expand_dims(dataset[:, 8], axis=1) 

编辑:我喜欢上面的原因np.expand_dims稍微更加明确一点,但还有另外一种同样简单的方式,其他人可能会认为它更加清晰 - 仅取决于您习惯的方式。我想包括它的完整性。 (N,)(N,1)阵列之间的差异是0维阵列中的第一个保持值np.array([5, 5, 5]),而第二个保持1维阵列中的值np.array([[5],[5],[5]])。您可以通过在其周围添加一个括号将您的0-d数组转换为1-d数组;但它是一排而不是一列,所以它需要转置。所以这两个建议的方法在一起。 B是新的建议,C是上述建议:

>>> A = np.array([5,5,5]) 
>>> B = np.array([A]).T 
>>> C = np.expand_dims(A, axis=1) 
>>> A; A.shape 
array([5, 5, 5]) 
(3,) 
>>> B; B.shape 
array([[5], 
     [5], 
     [5]]) 
(3, 1) 
>>> C; C.shape 
array([[5], 
     [5], 
     [5]]) 
(3, 1) 

EDIT2:也TensorFlow本身具有tf.expand_dims()功能。