代码之家  ›  专栏  ›  技术社区  ›  Wizard

带TensorFlow的CNN架构

  •  2
  • Wizard  · 技术社区  · 6 年前

    我正在实施本文中找到的体系结构 https://cs.nyu.edu/~fergus/papers/zeilereccv2014.pdf using tensorflow.

    我已将输入格式化为 224、224、3 并具有以下TensorFlow层。我得到的问题是,纸张状态下的输出尺寸不是110乘110乘96,而是109乘109乘96。我怎么修这个?

    我遵循了第8页论文中指定的超参数。我唯一的想法是填充可能不正确(正如TensorFlow为您设置的那样)。

    我的代码如下:

    输入层 #将x改为4-d张量:【批量大小、宽度、高度、通道】 输入_层=tf.重塑(功能[“x”],[-1,img_大小,img_大小,3]) 打印(输入_layer.get_shape(),'224,224,3') #卷积层1 #输入张量形状:【批量大小,224,224,3】 conv1=tf.layers.conv2d( 输入=输入层, 过滤器=96, 内核大小=[7,7], 步幅=2, padding=“有效”padding=1 激活=tf.nn.relu) 打印(conv1.get_shape(),'110,110,96') #最大池层 #输入张量形状:【批量大小,110,110,96】 pool1=tf.layers.max_pooling2d(输入=conv1,pool_size=[3,3],步幅=2) #对比度归一化 #输入张量形状:【批量大小,55、55、96】 对比度_Norm1=tf.nn.局部响应_Normalization( POOL1, 深度_半径=5, 偏差=1, α=0.0001, β=0.75) 打印(contrast_norm1.get_shape(),'55,55,96') #CNN的其他人…

    输出:括号内-实际尺寸,外部-所需尺寸/纸张尺寸

    (?,224,224,3)224,224,3输入
    ?,109,109,96)110,110,96
    ?,54,54,96)55,55,96对比度正常1后
    使用TensorFlow。

    CNN

    我已经将输入格式化为224, 224, 3并具有以下张量流层。我得到的问题是conv1不是110乘110乘96,而是109乘109乘96。我怎么修这个?

    我遵循了第8页论文中指定的超参数。我唯一的想法是填充可能不正确(正如TensorFlow为您设置的那样)。

    我的代码如下:

    # Input Layer
    # Reshape X to 4-D tensor: [batch_size, width, height, channels]
    input_layer = tf.reshape(features["x"], [-1, IMG_SIZE, IMG_SIZE, 3])
    
    print(input_layer.get_shape(), '224, 224, 3')
    # Convolutional Layer #1
    # Input Tensor Shape: [batch_size, 224, 224, 3]
    conv1 = tf.layers.conv2d(
        inputs=input_layer,
        filters=96,
        kernel_size=[7, 7],
        strides=2,
        padding="valid",  # padding = 1
        activation=tf.nn.relu)
    print(conv1.get_shape(), '110, 110, 96')
    
    # Max Pooling Layer
    # Input Tensor Shape: [batch_size, 110, 110, 96]
    pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[3, 3], strides=2)
    
    # Contrast Normalisation
    # Input Tensor Shape: [batch_size, 55, 55, 96]
    contrast_norm1 = tf.nn.local_response_normalization(
        pool1,
        depth_radius=5,
        bias=1,
        alpha=0.0001,
        beta=0.75)
    print(contrast_norm1.get_shape(), '55, 55, 96')
    
    # The rest of the CNN...
    

    输出:括号内-实际尺寸,外部-所需尺寸/纸张尺寸

    (?, 224, 224, 3) 224, 224, 3  # Input
    (?, 109, 109, 96) 110, 110, 96  # Following conv1
    (?, 54, 54, 96) 55, 55, 96  # Following contrast_norm1
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   abhuse    6 年前

    卷积运算的输出高度和宽度维数 valid 填充可以计算为:

    output_size = (input_size - kernel_size) // stride + 1
    

    在您的例子中,第一层的输出:

    output_size = (224 - 7) // 2 + 1 = 217 // 2 + 1 = 109
    

    使第一层的输出等于110的一种方法是将内核大小设置为 6x6 . 另一种方法是使用 tf.pad :

    # suppose this is a batch of 10 images of size 4x4x3
    data = np.ones((10, 4, 4, 3), dtype=np.float32)
    
    paddings = [[0, 0], # no values are added along batch dim
                [1, 0], # add one value before the content of height dim
                [1, 0], # add one value before the content of width dim
                [0, 0]] # no values are added along channel dim
    
    padded_data = tf.pad(tensor=data,
                         paddings=paddings,
                         mode='CONSTANT',
                         constant_values=0)
    
    sess = tf. InteractiveSession()
    output = sess.run(padded_data)
    print(output.shape)
    # >>> (10, 5, 5, 3)
    
    # print content of first channel of first image
    print(output[0,:,:,0])
    # >>> [[0. 0. 0. 0. 0.]
    #      [0. 1. 1. 1. 1.]
    #      [0. 1. 1. 1. 1.]
    #      [0. 1. 1. 1. 1.]
    #      [0. 1. 1. 1. 1.]]
    

    在上面的示例中,大小为1的零填充是沿着高度和宽度维度添加的。填充物应该是形状的 [number_of_dimensions, 2] 例如,对于输入矩阵的每个维,指定在张量内容之前和之后要添加多少值。

    如果将此填充应用于输入数据,将导致形状的张量 batch x 225 x 225 x 3 因此,卷积层的输出高度和宽度将 110x110 .