【问题标题】:Shape mismatch with tf.placeholder形状与 tf.placeholder 不匹配
【发布时间】:2017-04-06 12:09:58
【问题描述】:

我使用 128 x 128 x 128 ndarrays 作为 cnn 的输入:

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

每个ndarray没有颜色通道数据,所以我用了:

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)

【问题讨论】:

  • 您不应该将数据整形为大小(1, 128, 128, 128, 1),即批量大小 = 1?

标签: tensorflow


【解决方案1】:

在您的最后一个问题中,您向网络提供了一个带有一张图片的列表:[图片]。这就是为什么不需要数据的第一个维度并且将其重塑为 (128, 128, 128, 1) 就足够了。在上一个示例中,馈送 [image] 或 [image1, image2, image3] 有效。但是,现在您正在输入没有列表的图像:batch[0],所以第一个维度已经消失并且它不起作用。

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

np.reshape(image, (1, 128, 128, 128, 1)) 的整体形状为 (1, 128, 128, 128, 1) 并且也可以工作

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

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

按照现在的方式,您也可以将batch_X = [batch[0]] 用于一张图片,batch_X = batch[0:4] 用于多张图片

【讨论】:

    【解决方案2】:

    您的占位符排名为 5,因此您需要输入一个 5 维 np 数组,但您重新调整为一个 4 维 np 数组。因此,请使用 data = np.reshape(data, (1, 128, 128, 128, 1)) 而不是 cmets 中指出的 data = np.reshape(data, (128, 128, 128, 1))

    本质上,占位符形状的None意味着这个维度的大小是可变的,但维度应该仍然存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2019-03-05
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多