torch.nn学习
文章目录
- torch.nn学习
- 1. 卷积层
-
- 2. 池化层
- 2.1 MaxPool2d
- 2.2 MaxUnpool2d
- 2.3 AvgPool2d
- 3. 代码实践
- 3.1 Inception Module
- 3.2 Residual Block
1. 卷积层
1.1 Conv2d
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
二维卷积,输入的tensor
的尺寸为(B,C,H,W)
参数主要有:
- in_channels(int):输入通道数
- out_channels(int):输出通道数
- kernel_size(int or tuple):卷积核大小
- stride(int or tuple,optional):卷积核移动的步长,默认为1
- padding(int or tuple or str,optional):给输入添加0的边距,默认为0
- padding_mode(string, optional):可选参数有zeros、reflect、replicate和circular,默认是zeros
- dilation(int or tuple, optional):卷积核膨胀(可以理解为卷积核每个像素之间的间隔),默认值为1
- groups(int, optional):通道分组数,in_channels和out_channels的公约数,默认值为1
- bias(bool, optional):是否需要可学习的偏差值,默认为True
参数kernel_size
, stride
, padding
,dilation
的取值可以是整数或者元组:
- 整数:在高度和宽度维度应用相同的值。
- 包含两个整数的元组:第一个int应用于高度维度,第二个int应用于宽度维度。
![在这里插入图片描述](https://img-blog.csdnimg.cn/a1ab9bc9b2eb41868dbe8b8ab2ae0b65.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqE6Li9,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
卷积可视化链接:https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
>>>
>>> m = nn.Conv2d(16, 33, 3, stride=2)
>>>
>>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
>>>
>>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1))
>>> input = torch.randn(20, 16, 50, 100)
>>> output = m(input)
2. 池化层
2.1 MaxPool2d
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
最大池化,也称下采样,输入的tensor的尺寸为(B,C,H,W)。
主要参数有:
- kernel_size:池化窗口的大小。
- stride:窗口移动的步长,默认和池化窗口大小一样。
- padding:填充0的边距大小。
- dilation:池化窗口膨胀,可以理解为窗口各像素之间相隔的距离。
- return_indices:如果为True,返回最大索引和输出值。
- ceil_mode:如果为True,将使用ceil模式计算输出形状;否则使用floor模式计算。
![在这里插入图片描述](https://img-blog.csdnimg.cn/5dc5cb573ef94589af42c0913511fe13.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqE6Li9,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
>>>
>>> m = nn.MaxPool2d(3, stride=2)
>>>
>>> m = nn.MaxPool2d((3, 2), stride=(2, 1))
>>> input = torch.randn(20, 16, 50, 32)
>>> output = m(input)
2.2 MaxUnpool2d
torch.nn.MaxUnpool2d(kernel_size, stride=None, padding=0)
上采样,可以将多个输入大小映射到相同的输出大小。
主要参数有:
- kernel_size:池化窗口的大小。
- stride:窗口移动的步长,默认和池化窗口大小一样。
- padding:填充0的边距大小。
输入有:
- input:需要上采用的输入张量。
- indices:MaxPool2d返回的最大索引下标数组。
- output_size (optional):输出张量的形状。
![在这里插入图片描述](https://img-blog.csdnimg.cn/5ea5025f078a4beca151027973eab111.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqE6Li9,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
>>> pool = nn.MaxPool2d(2, stride=2, return_indices=True)
>>> unpool = nn.MaxUnpool2d(2, stride=2)
>>> input = torch.tensor([[[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[13., 14., 15., 16.]]]])
>>> output, indices = pool(input)
>>> unpool(output, indices)
tensor([[[[ 0., 0., 0., 0.],
[ 0., 6., 0., 8.],
[ 0., 0., 0., 0.],
[ 0., 14., 0., 16.]]]])
>>>
>>> input = torch.torch.tensor([[[[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10.],
[11., 12., 13., 14., 15.],
[16., 17., 18., 19., 20.]]]])
>>> output, indices = pool(input)
>>>
>>> unpool(output, indices, output_size=input.size())
tensor([[[[ 0., 0., 0., 0., 0.],
[ 0., 7., 0., 9., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 17., 0., 19., 0.]]]])
2.3 AvgPool2d
torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)
平均池化。
主要参数有:
- kernel_size:池化窗口的大小。
- stride:窗口移动的步长,默认和池化窗口大小一样。
- padding:填充0的边距大小。
- ceil_mode:如果为True,将使用ceil模式计算输出形状;否则使用floor模式计算。
- count_include_pad:如果为True,在平均计算中会包含0填充边距。
- divisor_override:如果指定,则为除数,否则使用池化窗口的大小作为除数。
![在这里插入图片描述](https://img-blog.csdnimg.cn/913cc63a0c1543bba7ae0894b056d533.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqE6Li9,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
>>>
>>> m = nn.AvgPool2d(3, stride=2)
>>>
>>> m = nn.AvgPool2d((3, 2), stride=(2, 1))
>>> input = torch.randn(20, 16, 50, 32)
>>> output = m(input)
3. 代码实践
3.1 Inception Module
![在这里插入图片描述](https://img-blog.csdnimg.cn/7d94600d885b4d529916785b65b14027.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqE6Li9,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
代码实现:
import torch
import torch.nn as nn
import torch.nn.functional as F
class Inception(nn.Module):
def __init__(self, in_channles):
super(Inception, self).__init__()
self.cov1x1_1 = nn.Conv2d(in_channles, 16, kernel_size=1)
self.cov1x1_2 = nn.Conv2d(in_channles, 24, kernel_size=1)
self.cov3x3_1 = nn.Conv2d(16, 24, kernel_size=3)
self.cov3x3_2 = nn.Conv2d(24, 24, kernel_size=3)
self.cov5x5 = nn.Conv2d(16, 24, kernel_size=5)
def forward(self, x):
branch1 = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)
branch1 = self.cov1x1_2(x)
branch2 = self.cov1x1_1(x)
branch3 = self.cov1x1_1(x)
branch3 = self.cov5x5(branch3)
branch4 = self.cov1x1_1(x)
branch4 = self.cov3x3_1(branch4)
branch4 = self.cov3x3_2(branch4)
branchs = [branch1, branch2, branch3, branch4]
return torch.cat(branchs, dim=1)
3.2 Residual Block
![在这里插入图片描述](https://img-blog.csdnimg.cn/e0065b4022f048e3afb9e98e388828ed.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqE6Li9,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
代码实现:
import torch
import torch.nn as nn
import torch.nn.functional as F
class ResidualBlock(nn.Module):
def __init__(self, channles):
super(ResidualBlock, self).__init__()
self.conv = nn.Conv2d(channles, channles, kernel_size=3, padding=1)
def forward(self, x):
block = F.relu(self.conv(x))
block = self.conv(block)
return F.relu(block + x)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)