代码之家  ›  专栏  ›  技术社区  ›  Sakhri Houssem

为什么我必须在美国有线电视新闻网(CNN)中将一幅图像重塑为[n,高度,宽度,频道]

  •  1
  • Sakhri Houssem  · 技术社区  · 7 年前

    我尝试将卷积层应用于形状的图片 [256,256,3] 当我直接使用图像的张量时,有一个错误

    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].    
    

    但是 重塑函数时,conv2d正常工作

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

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

    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 回复  |  直到 6 年前
        1
  •  10
  •   David Parks    5 年前

    第一个维度是批次大小。如果一次馈送一个图像,只需将第一个维度设为1,而不会更改任何数据,只需将索引更改为4D:

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

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