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

TensorFlow计算tf.nn.conv2d

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

    我在Excel中手动计算了3x3图像和两个2x2过滤器之间的卷积:

    我想用TensorFlow重现相同的结果 tf.nn.conv2d:

    x_raw=np.array([
    [2,5,3],
    [3,4,2],
    [41,1,1]
    )
    
    f_raw=np.数组(
    [[
    [2,1],
    [3,4]
    ]
    [4,1],
    [1,2]
    ])
    
    f=tf.常量(f_raw,dtype=tf.float32)
    x=tf.常量(x_raw,dtype=tf.float32)
    
    滤波器=tf.整形(f,[2,2,1,2])
    图像=tf.重塑(x,[1,3,3,1])
    
    tf.nn.conv2d(图像,过滤器,[1,1,1,1],“有效”).eval()
    < /代码> 
    
    

    但是TensorFlow的输出是关闭的:

    < Buff行情>

    数组([[[35.,33.],[37.,25.],[[35.,25.],[19.,15.]]],dtype=float32)

    < /块引用>

    我做错了什么?

    我想用TensorFlow重现同样的结果tf.nn.conv2d:

    x_raw = np.array([
        [2,5,3],
        [3,4,2],
        [4,1,1]
    ])
    
    f_raw = np.array(
    [[
        [2,1],
        [3,4]
    ],[
        [4,1],
        [1,2]   
    ]])
    
    f = tf.constant(f_raw, dtype=tf.float32)
    x = tf.constant(x_raw, dtype=tf.float32)
    
    filter = tf.reshape(f, [2, 2, 1, 2])
    image  = tf.reshape(x, [1, 3, 3, 1])
    
    tf.nn.conv2d(image, filter, [1, 1, 1, 1], "VALID").eval()
    

    但是TensorFlow的输出是关闭的:

    数组([[[35.,33.],[37.,25.],[[35.,25.],[19.,15.]]],dtype=float32)

    我做错了什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tim    6 年前

    要获得与Excel示例中相同的结果,需要进行以下更改:

    1. 创建两个单独的权重
    2. 分别计算每个权重的卷积

    代码示例:

    x_raw = np.array([
        [2,5,3],
        [3,4,2],
        [4,1,1]
    ])
    #created two seperate weights 
    weight1 = np.array(
    [[
        [2,1],
        [3,4]
    ]])
    
    weight2 = np.array(
    [[
        [4,1],
        [1,2]
    ]]
    )
    weight1 = tf.constant(weight1, dtype=tf.float32)
    weight2 = tf.constant(weight2, dtype=tf.float32)
    x = tf.constant(x_raw, dtype=tf.float32)
    
    #change out_channels to 1 
    filter1 = tf.reshape(weight1, [2, 2, 1, 1])
    filter2 = tf.reshape(weight2, [2, 2, 1, 1])
    image = tf.reshape(x, [1, 3, 3, 1])
    
    with tf.Session() as sess:
      print(tf.nn.conv2d(image, filter1, [1, 1, 1, 1], "VALID").eval())
      print(tf.nn.conv2d(image, filter2, [1, 1, 1, 1], "VALID").eval())