卷积和转置卷积,都涉及到padding, 那么添加padding 的具体方式,就会影响到计算结果,所以搞清除tensorflow中卷积和转置卷积的具体实现有助于模型的灵活部署应用。
一、卷积
举例说明:
X: 1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
w: 1 1 1 1
1 2 1 1
1 1 3 1
1 1 1 4
如对于:tf.nn.conv2(X,w,stride=[1,1],padding='SAME')
需要在X 中添加3 行 3列, 那么在tensorflow 中的添加方式如下:
left_w = 3/2 up_h =3/2
right_w = 3-left_w down_h = 3- up_h
也即: 添加padding 时如左右、上下不能呢个平均分配,则左边<=右边,上边<=下边
故,卷积后的 (0,0)位置的值为, 1*2 + 2*1+ 3*1+ 6*1+7*3+8*1+11*1+12*1+14*4
二 、转置卷积
X: 1 2 3 4 5 w: 1 1 1 1
6 7 8 9 10 1 2 1 1
11 12 13 14 15 1 2 3 1
16 17 18 19 20
21 22 23 24 25
tf.nn.conv2d_transpose(X,W,tf.stack([10,10]),strides=[2,2],padding="SAME")
1、对X扩展,
strides=[2,2] 故扩展后的 X 为:(shape:10X10)
1 0 2 0 3 0 4 0 5 0
0 0 0 0 0 0 0 0 0 0
6 0 7 0 8 0 9 0 10 0
. . . . . . . . . .
. . . . . . . . . .
2、加padding,由于padding = "SAME" 所以需要加 3行 3列
对X 扩展再加padding 后的 高和宽为:
H = X.H * stride + (w.H-1)
W = X.W*stride + (w.W-1)
l_h = ceil(((w.H - 1)*1.0 + (stride - 1)) / 2.0); // 向上取整数
l_h = l_h>(w.H - 1) ? (w.H - 1) : l_h; // 在左边添加padding 的列数
up_w = ceil(((w.W - 1)*1.0 + (stride - 1)) / 2.0) // 向上取整数
up_w = up_w>(w.W - 1) ? (w.W - 1) : up_h; // 在上边添加padding 的行数
说明:
input.shape: 5X5 ; stride = 3 ; w.shape =5*5 padding = "SAME" 时
扩展后,input.shape = 15*15 , 其中 最右边扩展2列, 最下边扩展2行
加padding后, input.shape = 19*19, 其中在最左边扩展3列, 最上边扩展3行; 最右边再扩展1列,最下边再扩展1行
卷积(步长为1)后 , output .shape = 15*15
3、卷积
tensorflow 中conv2d_transpose对卷积的实现有别于conv2, 相当于将 w 进行reverse 后进行卷积。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:tensorflow中卷积、转置卷积具体实现方式 - Python技术站