Pytorch中torch.nn.Conv3D、torch.nn.Conv2D函数详解

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 卷积

你可能感兴趣的:(Pytorch,Pytorch,3D-CNN,2D-CNN)