形状与tf.placeholder不匹配

时间:2017-04-06 12:09:58

标签: tensorflow

我使用128 x 128 x 128 ndarray作为输入到cnn使用:

# input arrays
    x = tf.placeholder(tf.float32, [None, 128, 128, 128, 1])

每个ndarray都没有colur通道数据,所以我使用了:

data = np.reshape(data, (128, 128, 128, 1))

为了让它最初适合占位符。但现在我收到了这个错误:

Traceback (most recent call last):
  File "tfvgg.py", line 287, in <module>
    for i in range(10000 + 1): training_step(i, i % 100 == 0, i % 20 == 0)
  File "tfvgg.py", line 277, in training_step
    a, c = sess.run([accuracy, cross_entropy], {x: batch_X, y: batch_Y})
  File "/home/entelechy/tfenv/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 717, in run
run_metadata_ptr)
  File "/home/entelechy/tfenv/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 894, in _run
% (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
ValueError: Cannot feed value of shape (128, 128, 128, 1) for Tensor 'Placeholder:0', which has shape '(?, 128, 128, 128, 1)'

我对占位符的工作方式感到困惑,因为我认为第一个参数是批量大小。通过使用None,我认为占位符将采用任意数量的(128,128,128,1)输入。因为这是一个3d网络,如果我将占位符更改为(128,128,128,1),则会在第一个conv3d图层上抛出错误,导致缺少该参数。

关于占位符参数传递我错过了什么?

编辑: (train_data是一个列表列表,每个列表都是[ndarray,label])

这是网络的初始化:

def training_step(i, update_test_data, update_train_data):

    for a in range(len(train_data)):

        batch = train_data[a]
        batch_X = batch[0]
        batch_Y = batch[1]

        # learning rate decay
        max_learning_rate = 0.003
        min_learning_rate = 0.0001
        decay_speed = 2000.0
        learning_rate = min_learning_rate + (max_learning_rate - min_learning_rate) * math.exp(-i / decay_speed)

        if update_train_data:
            a, c = sess.run([accuracy, cross_entropy], {x: batch_X, y: batch_Y})
            print(str(i) + ": accuracy:" + str(a) + " loss: " + str(c) + " (lr:" + str(learning_rate) + ")")


        if update_test_data:
            a, c = sess.run([accuracy, cross_entropy], {x: test_data[0], y: test_data[1]})
        print(str(i) + ": ********* epoch " + " ********* test accuracy:" + str(a) + " test loss: " + str(c))

        sess.run(train_step, {x: batch_X, y: batch_Y, lr: learning_rate})

for i in range(10000 + 1): training_step(i, i % 100 == 0, i % 20 == 0)

2 个答案:

答案 0 :(得分:1)

在上一个问题中,您为网络提供了一个列表,其中包含一张图片:[image]。这就是为什么不需要第一维数据并且重塑为(128,128,128,1)就足够了。在最后一个示例中,提供[image]或[image1,image2,image3]。但是,现在您在没有列表的情况下提供图像:df x1 x2 winner 1 1 1 a 2 4 0 h 3 0 0 a 4 2 1 h 5 1 1 a 6 1 1 a 7 1 1 a 8 0 0 a > 因此第一个维度消失了,但它不起作用。

batch[0]的整体形状为(1,128,128,128,1)并且有效

[np.reshape(image, (128, 128, 128, 1))]的总体形状为(1,128,128,128,1)并且也有效

没有列表的

np.reshape(image, (1, 128, 128, 128, 1))的整体形状为(128,128,128,1)并且不起作用。

您可以将图像放回列表中,也可以直接将图像重新整形为(1,128,128,128,1)。在这两种情况下,整体形状都是正确的。但是,如果您还计划输入多个图像,则使用该列表会更简单,并用(128,128,128,1)个形状图像填充。

就目前而言,您还可以将np.reshape(image, (128, 128, 128, 1))用于1张图片,将batch_X = [batch[0]]用于多张图片

答案 1 :(得分:0)

您的占位符的等级为5,因此您需要提供一个5维np数组,但您重新定义为4维np数组。因此,请在评论中指出使用data = np.reshape(data, (1, 128, 128, 128, 1))而不是data = np.reshape(data, (128, 128, 128, 1))

基本上,占位符形状的None表示此维度的大小是可变的,但维度应该仍然存在。