Skip to main content
 首页 » 编程设计

python之tensorflow 计算 tf.nn.conv2d

2024年09月03日26cyq1162

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

我想使用 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 得到的输出是关闭的:

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

我做错了什么?

请您参考如下方法:

要获得与 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())