ASGNet论文和代码解读( 二 )


接着.bn1:self.bn1 = (64),直接调用 = torch.nn.
PS:2. torch.nn.的作用:(批归一化)参考:【系列】 nn.用法详解
self.bn1 = BatchNorm(64)# 64为上一步输出的通道数
机器学习中,进行模型训练之前,需对数据做归一化处理,使其分布一致 。在深度神经网络训练过程中,通常一次训练是一个batch,而非全体数据 。每个batch具有不同的分布产生了shift问题——在训练过程中,数据分布会发生变化,对下一层网络的学习带来困难 。
Batch 强行将数据拉回到均值为0,方差为1的正太分布上,一方面使得数据分布一致,另一方面避免梯度消失 。
之后进行.relu1,.py中调用:self.relu1 = nn.ReLU(=True)
PS:nn.ReLU(=True)激活
默认为false
为True,将会改变输入的数据 ,否则不会改变原输入,只会产生新的输出
:cando thein-place. : False
注: 产生的计算结果不会有影响 。利用in-place计算可以节省内(显)存,同时还可以省去反复申请和释放内存的时间 。但是会对原变量覆盖,只要不带来错误就用 。
关于激活函数的详细解释参考:ReLU激活函数及其他激活函数
2.12 继续两次卷积、批归一化、relu激活
下一步循环进行.conv2, .bn2, .relu2,,卷积通道数64-64
接着类似重复.conv3, .bn3, .relu3,卷积通道数64-128
2.13 最后.
调用.py中的self. = nn.(=3, =2, =1)
最大值池化,尺寸3,步长2,填充1
PS:torch.nn.
我们先来看一下基本参数,一共六个:
关于的详解:
注意这里的跟卷积核不是一个东西 。可以看做是一个滑动窗口,这个窗口的大小由自己指定,如果输入是单个值,例如 3 33 ,那么窗口的大小就是 3 × 3 3 \times 33×3 ,还可以输入元组,例如 (3, 2) ,那么窗口大小就是 3 × 2 3 \times 23×2。
最大池化的方法就是取这个窗口覆盖元素中的最大值 。
关于的详解:
上一个参数我们确定了滑动窗口的大小,现在我们来确定这个窗口如何进行滑动 。如 果 不 指 定 这 个 参 数 ,那 么 默 认 步 长 跟 最 大 池 化 窗 口 大 小 一 致 \color{red}{如果不指定这个参数,那么默认步长跟最大池化窗口大小一致} 如果不指定这个参数,那么默认步长跟最大池化窗口大小一致 。如果指定了参数,那么将按照我们指定的参数进行滑动 。例如 =(2,3) ,那么窗口将每次向右滑动三个元素位置,或者向下滑动两个元素位置 。
关于的详解:
这参数控制如何进行填充,填充值默认为0 。如果是单个值,例如 1,那么将在周围填充一圈0 。还可以用元组指定如何填充,例如 p a d d i n g = ( 2 , 1 ) =(2, 1)=(2,1) ,表示在上下两个方向个填充两行0,在左右两个方向各填充一列0 。
参考:torch.nn.详解
关于 = 1:
这个参数决定了是否采用空洞卷积,默认为1(不采用) 。从中文上来讲,这个参数的意义从卷积核上的一个参数到另一个参数需要走过的距离,那当然默认是1了,毕竟不可能两个不同的参数占同一个地方吧(为0) 。
参考:的nn.()详解
2.2 函数、、、
.py中有:
self.layer1, self.layer2, self.layer3, self.layer4 = resnet.layer1, resnet.layer2, resnet.layer3, resnet.layer4
选择一个.
这里我们使用
model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)
可以看到参数传给的:block=、=[3, 4, 6, 3];=1000, =True
调用函数传入参数,其中[0]=3
self.layer1 = self._make_layer(block, 64, layers[0])