import torch
import torch.nn as nn
import numpy as np
from torch.autograd import Variable
x = torch.Tensor([1,10,100,1000,10000,100000]).view(1,2,-1,1,1)
# view()函数用来reshape,-1参数意为自动设置,此处计算得6
# Conv2d的规定输入数据格式为(batch, channel, Height, Width)
# Conv3d的规定输入数据格式为(batch, channel, Depth, Height, Width)
x = Variable(x)
conv = nn.Conv3d(in_channels=2,
out_channels=6,
kernel_size=(2,1,1),
stride=1,
padding=0,
dilation=1,
groups=1,
bias=False)
# 参数group的作用为:将输入数据按通道顺序分组, 每组有in_channel/group个通道.(例:group为2时,输入数据前一半通道为一组)
# 同时, 每组对应的kernel个数, 从原来的out_channel变为outchannel/group.
# 此处的kernel为三维及以上结构,而filter特指二维层状的过滤器。
# 原来的情况中, 每个生成的特征图都有所有通道的贡献.
# 而现在, 特征图仅由其所在group对应的通道卷积构成.
# 简而言之, group参数的目的就是将原本的大卷积分成多个并联(side by side)的小卷积
# 另: 在in_channel不变的情况下, 当group>1时, kernel总数不变, 而filter总数缩小group倍.
# 而在filter、kernel总数不变的情况下, group增大, 需要的in_channel按同样比例增大.
# 参数dilation的作用为: 控制卷积核元素的间隔大小.具体可搜索“空洞卷积”
print(conv.weight.data.size())
## conv.weight.data.size()的返回值:
# # (num_kernels, num_filters_perkernel, (Depth,) Height, Width)
# # i.e.:(out_channels, in_channels/group, kernel_size)
# 影响权重数目的因素有:
# 欲输出featurecube的个数,直接影响卷积核的个数(相等)
# 输入的通道数与设定的该层group数, 多通道卷积会导致与某输出值相关的卷积核成倍增加
# 每个卷积核的尺寸
# ————————————————————————
conv.weight.data=torch.from_numpy(np.ones(24,dtype=np.float32).reshape(6,2,2,1,1))
# 替换权重值便于观察输出
print(conv.weight.data)
output=conv(x)
print('output=',output.data)
print('outputsize=',output.data.size())
# output.data.size()的返回值:
# (batch, out_channels/ or num_of_featurecube, size_of_featurecube)
2019/2/26:group的作用之终极版:可以通过设置group,将某层的单路卷积分为多个并行的卷积支路。
参考:
[pyotrch]nn.Conv2d中groups参数的理解
Pytorch - Conv2d 卷积