【问题标题】:Python / Tensorflow - Input to reshape is a tensor with 92416 values, but the requested shape requires a multiple of 2304Python / Tensorflow - reshape 的输入是具有 92416 个值的张量,但请求的形状需要 2304 的倍数
【发布时间】:2017-03-24 22:45:09
【问题描述】:

我有以下卷积神经网络的代码部分:

import numpy as np
import matplotlib.pyplot as plt
import cifar_tools
import tensorflow as tf

data, labels = cifar_tools.read_data('C:\\Users\\abc\\Desktop\\temp')

x = tf.placeholder(tf.float32, [None, 150 * 150])
y = tf.placeholder(tf.float32, [None, 2])

w1 = tf.Variable(tf.random_normal([5, 5, 1, 64]))
b1 = tf.Variable(tf.random_normal([64]))

w2 = tf.Variable(tf.random_normal([5, 5, 64, 64]))
b2 = tf.Variable(tf.random_normal([64]))

w3 = tf.Variable(tf.random_normal([6*6*64, 1024]))
b3 = tf.Variable(tf.random_normal([1024]))

w_out = tf.Variable(tf.random_normal([1024, 2]))
b_out = tf.Variable(tf.random_normal([2]))

def conv_layer(x,w,b):
    conv = tf.nn.conv2d(x,w,strides=[1,1,1,1], padding = 'SAME')
    conv_with_b = tf.nn.bias_add(conv,b)
    conv_out = tf.nn.relu(conv_with_b)
    return conv_out

def maxpool_layer(conv,k=2):
    return tf.nn.max_pool(conv, ksize=[1,k,k,1], strides=[1,k,k,1], padding='SAME')

def model():
    x_reshaped = tf.reshape(x, shape=[-1,150,150,1])

    conv_out1 = conv_layer(x_reshaped, w1, b1)
    maxpool_out1 = maxpool_layer(conv_out1)
    norm1 = tf.nn.lrn(maxpool_out1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75)

    conv_out2 = conv_layer(norm1, w2, b2)
    maxpool_out2 = maxpool_layer(conv_out2)
    norm2 = tf.nn.lrn(maxpool_out2, 4, bias=1.0, alpha=0.001/9.0, beta=0.75)

    maxpool_reshaped = tf.reshape(maxpool_out2, [-1,w3.get_shape().as_list()[0]])
    local = tf.add(tf.matmul(maxpool_reshaped, w3), b3)
    local_out = tf.nn.relu(local)

    out = tf.add(tf.matmul(local_out, w_out), b_out)
    return out

model_op = model()

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(model_op, y))
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)

correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))

我正在阅读150x150 灰度图像,但无法理解我遇到的以下错误:

EPOCH 0
Traceback (most recent call last):
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1021, in _do_call
    return fn(*args)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1003, in _run_fn
    status, run_metadata)
  File "C:\Python35\lib\contextlib.py", line 66, in __exit__
    next(self.gen)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 469, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Input to reshape is a tensor with 92416 values, but the requested shape requires a multiple of 2304
         [[Node: Reshape_1 = Reshape[T=DT_FLOAT, Tshape=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_1, Reshape_1/shape)]]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "cnn.py", line 70, in <module>
    _, accuracy_val = sess.run([train_op, accuracy], feed_dict={x: batch_data, y: batch_onehot_vals})
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 766, in run
    run_metadata_ptr)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 964, in _run
    feed_dict_string, options, run_metadata)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1014, in _do_run
    target_list, options, run_metadata)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1034, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Input to reshape is a tensor with 92416 values, but the requested shape requires a multiple of 2304
         [[Node: Reshape_1 = Reshape[T=DT_FLOAT, Tshape=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_1, Reshape_1/shape)]]

Caused by op 'Reshape_1', defined at:
  File "cnn.py", line 50, in <module>
    model_op = model()
  File "cnn.py", line 43, in model
    maxpool_reshaped = tf.reshape(maxpool_out2, [-1,w3.get_shape().as_list()[0]])
  File "C:\Python35\lib\site-packages\tensorflow\python\ops\gen_array_ops.py", line 2448, in reshape
    name=name)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 759, in apply_op
    op_def=op_def)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 2240, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 1128, in __init__
    self._traceback = _extract_stack()

InvalidArgumentError (see above for traceback): Input to reshape is a tensor with 92416 values, but the requested shape requires a multiple of 2304
         [[Node: Reshape_1 = Reshape[T=DT_FLOAT, Tshape=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_1, Reshape_1/shape)]]

EDIT-1

根据这些编辑进行修改后出现此新错误:

x_reshaped = tf.reshape(x, shape=[-1,150,150,1])
batch_size = x_reshaped.get_shape().as_list()[0]

... Same code as above ...

maxpool_reshaped = tf.reshape(maxpool_out2, [batch_size, -1])

错误:

Traceback (most recent call last):
  File "cnn.py", line 52, in <module>
    model_op = model()
  File "cnn.py", line 45, in model
    maxpool_reshaped = tf.reshape(maxpool_out2, [batch_size, -1])
  File "C:\Python35\lib\site-packages\tensorflow\python\ops\gen_array_ops.py", line 2448, in reshape
    name=name)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 493, in apply_op
    raise err
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 490, in apply_op
    preferred_dtype=default_dtype)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 669, in convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\constant_op.py", line 176, in _constant_tensor_conversion_function
    return constant(v, dtype=dtype, name=name)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\constant_op.py", line 165, in constant
    tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape))
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 441, in make_tensor_proto
    tensor_proto.string_val.extend([compat.as_bytes(x) for x in proto_values])
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 441, in <listcomp>
    tensor_proto.string_val.extend([compat.as_bytes(x) for x in proto_values])
  File "C:\Python35\lib\site-packages\tensorflow\python\util\compat.py", line 65, in as_bytes
    (bytes_or_text,))
TypeError: Expected binary or unicode string, got None

EDIT-2

进行以下编辑后(除了删除batch_size

w3 = tf.Variable(tf.random_normal([361, 256])) 
...
...
w_out = tf.Variable(tf.random_normal([256, 2])) 

我遇到以下错误:

EPOCH 0
W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:975] Invalid argument: logits and labels must be same size: logits_size=[256,2] labels_size=[1,2]
         [[Node: SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_2, Reshape_3)]]
Traceback (most recent call last):
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1021, in _do_call
    return fn(*args)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1003, in _run_fn
    status, run_metadata)
  File "C:\Python35\lib\contextlib.py", line 66, in __exit__
    next(self.gen)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 469, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: logits and labels must be same size: logits_size=[256,2] labels_size=[1,2]
         [[Node: SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_2, Reshape_3)]]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "cnn.py", line 73, in <module>
    _, accuracy_val = sess.run([train_op, accuracy], feed_dict={x: batch_data, y: batch_onehot_vals})
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 766, in run
    run_metadata_ptr)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 964, in _run
    feed_dict_string, options, run_metadata)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1014, in _do_run
    target_list, options, run_metadata)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1034, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: logits and labels must be same size: logits_size=[256,2] labels_size=[1,2]
         [[Node: SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_2, Reshape_3)]]

Caused by op 'SoftmaxCrossEntropyWithLogits', defined at:
  File "cnn.py", line 55, in <module>
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(model_op, y))
  File "C:\Python35\lib\site-packages\tensorflow\python\ops\nn_ops.py", line 1449, in softmax_cross_entropy_with_logits
    precise_logits, labels, name=name)
  File "C:\Python35\lib\site-packages\tensorflow\python\ops\gen_nn_ops.py", line 2265, in _softmax_cross_entropy_with_logits
    features=features, labels=labels, name=name)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 759, in apply_op
    op_def=op_def)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 2240, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "C:\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 1128, in __init__
    self._traceback = _extract_stack()

InvalidArgumentError (see above for traceback): logits and labels must be same size: logits_size=[256,2] labels_size=[1,2]
         [[Node: SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_2, Reshape_3)]]

EDIT-3

这是二进制(腌制)文件的样子[标签,文件名,数据]:

[array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), array(['1.jpg', '10.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg',
       '7.jpg', '8.jpg', '9.jpg'], 
      dtype='<U6'), array([[142, 138, 134, ..., 128, 125, 122],
       [151, 151, 149, ..., 162, 159, 157],
       [120, 121, 122, ..., 132, 128, 122],
       ..., 
       [179, 175, 177, ..., 207, 205, 203],
       [126, 129, 130, ..., 134, 130, 134],
       [165, 170, 175, ..., 193, 193, 187]])]

我该如何解决这个问题?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    让我们来看看你原来的错误:

    reshape 的输入是一个具有 92416 个值的张量,但请求的形状需要 2304 的倍数

    这是因为您将代码改编自原始输入图像大小为 24*24 的代码。经过两个卷积和两个最大池化层后的张量形状为 [-1, 6, 6, 64]。但是,由于您的输入图像形状为 150*150,因此中间形状变为 [-1, 38, 38, 64]。

    尝试更改 w3

    w3 = tf.Variable(tf.random_normal([38*38*64, 1024]))

    你应该时刻关注你的张量形状流。

    【讨论】:

      【解决方案2】:

      错误发生在这里:

      maxpool_reshaped = tf.reshape(maxpool_out2, [-1,w3.get_shape().as_list()[0]])
      

      正如它所说:reshape 的输入是一个具有 92416 个值的张量,但请求的形状需要 2304 的倍数

      意义

      w3.get_shape().as_list()[0] = 2304

      maxpool_out2 有 92416 个值

      但 92416 /2304 有一个小数余数,因此 python 无法将其余部分均匀地放入“-1”。

      所以你需要重新检查 w3 的形状以及你期望它是什么。

      替代建议更新:

      x_reshaped = tf.reshape(x, shape=[-1,150,150,1])
      batch_size = x_reshaped.get_shape().as_list()[0]
      
      ... Same code as above ...
      
      maxpool_reshaped = tf.reshape(maxpool_out2, [batch_size, -1])
      

      【讨论】:

      • 感谢您的友好回复。我所做的唯一一件事就是将“24”更改为“150”,并且出现了这个错误。因此,无论您在代码中哪里看到“150”,它最初都是“24”。我应该做出哪些改变来适应“150”。我认为这个更改不会导致这样的错误。
      • 最简单的解决方法是反其道而行之。将 batch_size 保存为变量并将其余设置为 -1。如果这没有意义,我可以在上面的答案中输入。
      • 我真的没有完全明白这一点。感谢您是否可以在答案中输入它。谢谢
      • 如果您的问题仍未解决,请告诉我。另请注意,您的 w3 的形状可能必须更改。
      • 对于前面的评论,你应该删除关于批量大小的行,然后回到原始代码。
      【解决方案3】:

      我也遇到过同样的问题,我尝试在 CNN 中为给定的 300*200 图像打印张量层。

      Tensor("add_35:0", shape=(?, 300, 200, 16), dtype=float32)
      Tensor("MaxPool_21:0", shape=(?, 100, 150, 16), dtype=float32)
      Tensor("MaxPool_22:0", shape=(?, 75, 50, 32), dtype=float32)
      Tensor("MaxPool_23:0", shape=(?, 38, 25, 64), dtype=float32)
      

      每层将每一层除以2,在全连接层,我们可以尝试38*25*64(上一层的输出)

      'w_fc_layer' : tf.Variable(tf.random_normal([38*38*64,1024]))
      

      【讨论】:

        猜你喜欢
        • 2023-01-30
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多