ValueError: Cannot reshape a tensor with 173056 elements to shape [1,208,208,3] (129792 elements)

问题报错

题目有长度限制,完整报错为ValueError: Cannot reshape a tensor with 173056 elements to shape [1,208,208,3] (129792 elements) for '{{node Reshape}} = Reshape[T=DT_FLOAT, Tshape=DT_INT32](per_image_standardization, Reshape/shape)' with input shapes: [208,208,4], [4] and with input tensors computed as partial shapes: input[1] = [1,208,208,3].

(查看解决办法可直接跳到最下面)

出现此报错情况是在做神经网络图像分类训练完模型后,进行测试test模块输入jpg图片文件分类时,出现的错误。报错大致意思为:不能对一个包含173056个元素的张量进行重塑[1,208,208,3](129792个元素)...

在网上没发现与之匹配的解决方法,然后就根据报错分析

首先找到是reshape重塑问题,源代码用到的是tf.reshape

image = tf.cast(image_array, tf.float32)
image = tf.image.per_image_standardization(image)
image = tf.reshape(image, [1, 208, 208, 3])

这里为什么无法重塑呢,这里介绍一下reshape

Reshape

Python中的shape与reshape

shape就是看数组的形状,也就是各维数都是多少,对于二位数组就是看行数和列数,reshape就是重构一下维数,按照顺序排列进去。下面直接看例子即可

import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9,0])
print(a,a.shape, a.shape[0], type(a),sep='\n')
    '''
    [1 2 3 4 5 6 7 8 9 0]
    (10,)
    10
    
    '''
print(a.shape[1]) #IndexError: tuple index out of range
b = a.reshape((2,5))
print(b)
print(a)
a[1]=99
print(b)
'''
[[ 1 99  3  4  5]
 [ 6  7  8  9  0]]
[ 1 99  3  4  5  6  7  8  9  0]
[[ 1 99  3  4  5]
 [ 6  7  8  9  0]]

'''

这里的例子是把1*10的数组变成了2*5的数组,同时可以看出reshape是个浅拷贝过程。

Tensorflow中的reshape

参考博文:TensorFlow的reshape操作 tf.reshape_lxg0807的博客-CSDN博客_tf.reshape

# tensor 't' is [1, 2, 3, 4, 5, 6, 7, 8, 9]
# tensor 't' has shape [9]
reshape(t, [3, 3]) ==> [[1, 2, 3],
                        [4, 5, 6],
                        [7, 8, 9]]

# tensor 't' is [[[1, 1], [2, 2]],
#                [[3, 3], [4, 4]]]
# tensor 't' has shape [2, 2, 2]
reshape(t, [2, 4]) ==> [[1, 1, 2, 2],
                        [3, 3, 4, 4]]

# tensor 't' is [[[1, 1, 1],
#                 [2, 2, 2]],
#                [[3, 3, 3],
#                 [4, 4, 4]],
#                [[5, 5, 5],
#                 [6, 6, 6]]]
# tensor 't' has shape [3, 2, 3]

问题解决

了解reshape后,找到错误代码,输入的是jpg文件,存储数据是三层二维数据为什么不能重塑呢

不断观察发现,报错中的173056正好是208*208*4,而不是208*208*3所需的129792个单元,检查确认输入的确实是jpg格式,不是png格式,怀疑输入数据的第三维数是4,就在出错代码的每一行加上

image = tf.cast(image_array, tf.float32)
print('第一个'image)
image = tf.image.per_image_standardization(image)
print('第二个'image)
image = tf.reshape(image, [1, 208, 208, 3])
print('第三个'image)

 

 发现只输出了前两个,且shape确实是(208,208,4),往前找到

数组的时候进行输出查看,

image = Image.open(img_dir)
image = image.resize((208, 208))
image = np.array(image)
print(image.shape, image)  #(208,208,4)

查看输出的数组发现规律,在最后输出的里面都是0和一列255,判断第四层数组为无效数据,所以在image转换成np.array形式后,在下面进行tf.reshape之前加上一个if语句,删掉最后一层的无效数据即可。

if image.shape==(208,208,4):
    image = image[:,:,0:3]

你可能感兴趣的:(Tensorflow,Python,python,tensorflow,深度学习)