从最简单的代码入手,认识 UNet
。
环境
- python3.6
- torch 1.3.1
简单的 UNet 网络
先看一下代码
1 | class ConvAutoEncoder(nn.Module): |
UNet
有两个部分,分别是 encoder
和 decoder
。关于 encoder
,你可以参考我下面的博文。
下面重点说说 decoder
。
首先输入到 decoder
的数据维度是 N * 4 * 1 * 75
。在第一个逆卷积中,nn.ConvTranspose2d(4, 8, 3, stride=2, padding=1, output_padding=(0, 1))
,stride = 2
进行扩充,变成 N * 4 * 1 * 149
,接着,进行卷积核为 3 * 3
的逆操作,即变成 149 + 3 - 1 = 151
,数据变成 N * 8 * 3 * 151
,接着进行 padding = 1
的向内压缩,变成 N * 8 * 1 * 149
,又因为 output_padding=(0, 1)
这个向得到结果的右侧添加了一列,变成 N * 8 * 1 * 150
。接着进入了第二个逆卷积操作 nn.ConvTranspose2d(8, 8, 3, stride=2, padding=1, output_padding=(0, 1))
,同理可以得到数据为 N * 8 * 1 * 300
,接着到了第三层逆卷积,数据变成了 N * 1 * 1 * 300
。
关于上面的计算过程,你可以参考我下面的博文。
函数说明
nn.ConvTranspose2d
torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1, padding_mode=’zeros’)
关于这个的用法,我推荐你看我下面的博文。
Parameters
in_channels
(int) – 输入信号的通道数out_channels
(int) – 卷积产生的通道数kernel_size
(int or tuple) – 卷积核的大小stride
(int or tuple, optional) – 卷积步长,即要将输入扩大的倍数. Default: 1padding
(int or tuple, optional) – 向内压缩. Default: 0output_padding
(int or tuple, optional) – Additional size added to one side of each dimension in the output shape. Default: 0groups
(int, optional) – Number of blocked connections from input channels to output channels. Default: 1bias
(bool, optional) – If True, adds a learnable bias to the output. Default: Truedilation
(int or tuple, optional) – Spacing between kernel elements. Default: 1