小论文之跟着李沐学AI(十)"/>
为了小论文之跟着李沐学AI(十)
卷积(二)
大无语,我发现我之前写的八没有上传就关了,无语了家人们
在这里沐神讲解了 填充 步幅 通道 池化这几个概念
首先感受野就是卷积核的大小,它反映的是,输出的那个点是由输入的哪些点影响而来的
填充
我们能感受到之前,卷积会造成output的减小,有些时候会丢失边缘点的信息,有些时候这样是没问题的,但是有些时候,我们并不希望output减小,不希望丢失边缘点的信息还是希望保证output能与input保持一样的维度,应该怎么做呢,这里就需要填充了。
ph=kh−1 和 pw=kw−1,一般都这样设置,这样可以保证输入输出的维数相同。还有别再去想kh or kw会是偶数,沐神都说了大部分的情况下是奇数,这真的不是你需要思考的好吧。下面来看实际代码中是如何实现的!
import torch
from torch import nn# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):# 这里的(1,1)表示批量大小和通道数都是1X = X.reshape((1, 1) + X.shape)Y = conv2d(X)# 省略前两个维度:批量大小和通道return Y.reshape(Y.shape[2:])# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
X = torch.rand(size=(8, 8))
comp_conv2d(conv2d, X).shape# 这里因为没有指名,kernel就是一个3 * 3的矩阵,而padding的意思就相当于添加了两行,添加了两列conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
comp_conv2d(conv2d, X).shape
#当我们的卷积核特殊的时候我们可以根据不同的来计算这都是可以的,去计算调整即可
步幅
这是经过步幅之后的矩阵形状
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape
步幅的意思就是,不希望获得那么完整的信息,也是相当于减少计算,相当于一个防止过拟合,提升计算速度的方法
通道
到目前为止,不论有多少输入通道,我们还只有一个输出通道。然而,正如我们在 6.1.4.1节 中所讨论的,每一层有多个输出通道是至关重要的。在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。直观地说,我们可以将每个通道看作是对不同特征的响应。
理论证明
代码操作
import torch
from d2l import torch as d2ldef corr2d_multi_in(X,K): #这个函数就是对于多通道输入的函数表达#先遍历X 和 K的第0个维度(通道维度),再将其叠加在一起return sum(d2l.corr2d(x,k) for x,k in zip(X,K))X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])
现在才发现,如果真的要我讲解还早呢的很困难,我只能尽量表达
首先看我们定义的X与K
X: 233 的一个矩阵。我们可以理解为一个两个通道,image为33的图片
K:222的一个矩阵。我们可以理解为一个两个通道,核大小为22
其实一次循环,就是一个通道的互相关运算
也就说
(3-2+1)(3-2+1) 变成一个 22的矩阵
sum函数把两次互相关运算加在了一起
def corr2d_multi_in_out(X, K):# 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。# 最后将所有结果都叠加在一起list_res = []for k in K:list_res.append(corr2d_multi_in(X, k))return torch.stack([res for res in list_res], 0)
相信结合我上面的图就一目了然了
1*1的kernel用于融合通道信息,你只需要知道这点就行,其实用全连接层这个,一般情况下我们并不会用,但是你可以这么理解(其实我理解了,但是不知道怎么硕emmm,就理解不够透彻,但是我有那种逻辑自洽的感觉,一般对于一个理论我自己有逻辑自洽的感觉我就觉得ok了)
Pool池化(汇聚)
在这里描述了最大汇聚层,其实汇聚可以理解为减小输入,可以理解为放大特征都可以,反正加了汇聚效果会好一点
import torch
from torch import nn
from d2l import torch as d2ldef pool2d(X, pool_size, mode='max'):p_h, p_w = pool_sizeY = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w + 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):if mode == 'max':Y[i, j] = X[i: i + p_h, j: j + p_w].max()elif mode == 'avg':Y[i, j] = X[i: i + p_h, j: j + p_w].mean()return Y
这个代码真的很容易就懂了,非常非常的简单不多说了
更多推荐
为了小论文之跟着李沐学AI(十)
发布评论