pytorch中构建卷积层一般使用nn.Conv2d方法,有些情况下我们需要自定义卷积核的权值weight,而nn.Conv2d中的卷积参数是不允许自定义的,此时可以使用torch.nn.functional.conv2d简称F.conv2d
1 | torch.nn.functional.conv2d(input, weight, bias = None , stride = 1 , padding = 0 , dilation = 1 , groups = 1 ) |
F.conv2d可以自己输入且也必须要求自己输入卷积权值weight和偏置bias。因此,构建自己想要的卷积核参数,再输入F.conv2d即可。
下面是一个用F.conv2d构建卷积层的例子
这里为了网络模型需要写成了一个类:
1 2 3 4 5 6 7 8 9 10 | class CNN(nn.Module): def __init__( self ): super(CNN, self ).__init__() self .weight = nn.Parameter(torch.randn( 16 , 1 , 5 , 5 )) # 自定义的权值 self .bias = nn.Parameter(torch.randn( 16 )) # 自定义的偏置 def forward( self , x): x = x.view(x.size( 0 ), - 1 ) out = F.conv2d(x, self .weight, self .bias, stride = 1 , padding = 0 ) return out |
值得注意的是,pytorch中各层需要训练的权重的数据类型设为nn.Parameter,而不是Tensor或者Variable。parameter的require_grad默认设置为true,而Varaible默认设置为False。
补充:pytorch中卷积参数的理解
kernel_size代表着卷积核,例如kernel_size=3或kernel_size=(3,7);
stride
:表明卷积核在像素级图像上行走的步长,如图2,步长为1;
padding
:为上下左右填充的大小,例如padding=0/1/(1,1)/(1,3),
padding=0 不填充;
padding=1/(1,1) 上下左右分别填充1个格;
padding=(1,3) 高(上下)填充2个格,宽(左右)填充6个格;
卷积代码
1 | torch.nn.Conv2d( 512 , 512 ,kernel_size = ( 3 , 7 ),stride = 2 ,padding = 1 ) |
指定输出形状的上采样
1 2 3 | def upsample_add( self ,x,y): _,_,H,W = y.size() return F.interpolate(x, size = (H,W), mode = 'bilinear' , align_corners = False ) + y |
反卷积上采样
1 | output_shape_w = kernel_size_w + (output_w - 1 )(kernel_size_w - 1 ) + 2padding |
1 2 | self .upscore2 = nn.ConvTranspose2d( 512 , 1 , kernel_size = 3 , stride = 2 ,padding = 0 , bias = False ) |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/213371/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)