torch.nn.functional.conv2d()
torch.nn.functional.conv2d(x, y, groups=3)
这个函数在torch中可以通过控制group的大小,来对输入的channle进行分组,然后每组使用filter卷积生成一个输出。
可以实现depthwise
普通的卷积来说,filter的channels应该等于input的channels,
比如一张图片为(3, 600, 600),可知channels=3
我们使用的卷积核一般大小也是(3, x, x)
其中我们一般只控制filter的个数,来控制输出结果有多少维。
比如我们使用10个filter,strides = 1, 那么输出就是(10, 600-x+1, 600-x+1)
但是如果我们使用group来将input的channel分组,然后对每一组使用相应大小的filter进行卷积,
此时input_channels_num应该可以整除group,并且filter的个数乘以filter的channel个数,应该是input_channels_num的整数倍。即input的channel可以被平均分组,fllter的个数可以产生整数个输出channel。
上述图片(3, 600, 600)这种group只能是1,或3.就是把3个channel一起卷积,或者每个channel单独卷积。
3个channel一起卷积时我们的filter大小应该是(n, input_channels_num/group, x, x),即 (10, 3/1, x, x)即(10, 3, 1, 1)
当我们group设为3时,filter的大小应为(10, 1, x, x),但此时不能产生整数个输出channel,实际产生了10/3个输出channle,这是不允许的。
所以此时filter的个数n应该是(input_channle_num/group)即(3/1)的整数倍,即3的整数倍。
input_channle_num/group的实际意义是多少个filter能够处理一个input。
''' import torch import torch.nn.functional as F
if name == 'main':
# With square kernels and equal stride
filters = torch.randn(2,2,3,3)
inputs = torch.randn(1,4,3,3)
print(filters.shape)
print(inputs.shape)
score = F.conv2d(inputs, filters, groups=2)
print(score)
'''