Skip to main content
 首页 » 编程设计

python之为什么我必须在 CNN 中将一张图像 reshape 为 [n,height,width,channel]

2025年05月04日12bjzhanghao

我尝试将卷积层应用于形状为[256,256,3]的图片 a 直接使用图像张量时出现错误

conv1 = conv2d(input,W_conv1) +b_conv1  #<=== error  

错误信息:

ValueError: Shape must be rank 4 but is rank 3 for 'Conv2D' (op: 'Conv2D')  
with input shapes: [256,256,3], [3,3,3,1].     

但是当我 reshape 函数 conv2d 时正常工作

x_image = tf.reshape(input,[-1,256,256,3]) 
conv1 = conv2d(x_image,W_conv1) +b_conv1 

如果我必须 reshape 张量,在我的情况下 reshape 的最佳值是什么?为什么?

import tensorflow as tf 
import numpy as np 
from PIL import Image 
 
def img_to_tensor(img) : 
    return tf.convert_to_tensor(img, np.float32) 
 
def weight_generater(shape): 
    return tf.Variable(tf.truncated_normal(shape,stddev=0.1)) 
 
def bias_generater(shape): 
    return tf.Variable(tf.constant(.1,shape=shape)) 
 
def conv2d(x,W): 
    return tf.nn.conv2d(x,W,[1,1,1,1],'SAME') 
 
def pool_max_2x2(x): 
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,1,1,1],padding='SAME') 
 
#read image 
img = Image.open("img.tif") 
 
sess = tf.InteractiveSession() 
 
#convetir image to tensor 
input = img_to_tensor(img).eval() 
#print(input) 
 
# get img dimension 
img_dimension = tf.shape(input).eval() 
print(img_dimension) 
 
height,width,channel=img_dimension 
filter_size = 3 
feature_map = 32 
 
x = tf.placeholder(tf.float32,shape=[height*width*channel]) 
y = tf.placeholder(tf.float32,shape=21) 
 
# generate weigh [kernal size, kernal size,channel,number of filters] 
W_conv1 = weight_generater([filter_size,filter_size,channel,1]) 
 
#for each filter W has his  specific bais 
b_conv1 = bias_generater([feature_map]) 
 
""" I must reshape the picture 
x_image = tf.reshape(input,[-1,256,256,3]) 
""" 
conv1 = conv2d(input,W_conv1) +b_conv1  #<=== error 
 
h_conv1 = tf.nn.relu(conv1) 
 
h_pool1 = pool_max_2x2(h_conv1) 
 
layer1_dimension = tf.shape(h_pool1).eval() 
 
print(layer1_dimension) 

请您参考如下方法:

第一个维度是批量大小。如果您一次输入一张图像,您只需将第一个维度设置为 1,它不会更改您的数据,只需将索引更改为 4D:

x_image = tf.reshape(input, [1, 256, 256, 3]) 

如果您在第一个维度中用 -1 reshape 它,您所做的就是说您将输入一批 4D 图像(形状 [batch_size, height, width, color_channels],并且您允许批量大小是动态的(这很常见)。