深度学习中最简单的就是线性回归的模型,使用的方法是nn.Linear函数,nn.Linear是PyTorch中的全连接层,用于构建神经网络,可以对输入的数据执行线性变换:
Y = XW^T + b
其中X是输入数据,W是可训练的权重矩阵,b是可训练的偏执向量(可以没有)。 这个层通常用于神经网络的全连接层,如MLP(多层感知机)或Transformer模型的前馈层。而分类任务的输出,我们可以使用Linear(n, k)配合One-hot(独热编码),其中k为分类数,这样的一个k维向量,最大值所在的下表为预测类。
一张224x224的图片,做分类任务如果直接使用Linear的话,参数量巨大很容易出现过拟合问题,所以在 使用Linear之前,我们要使用另外一个厉害的工具——卷积。
用于卷积的矩阵称为卷积核,卷积核和每个通道的大小相同的部分做卷积运算。
为了让卷积后的特征图大小保持和原始图片一致,可以使用Zero padding的方法,在周围扩展一圈或几圈0。
更大的卷积核可以拥有更大的感受野,更多的卷积核可以得到更大深度的特征图。
关于特征图怎么变小,常用的有两种方法,第一个就是扩大卷积的步长,第二个则是依靠Pooling:池化。
如此就得到卷积尺寸O = (I - K + 2P) / S + 1,其中I为输入图片的尺寸,K为卷积核大小、P为Padding,S为Stride。
池化有两种方式,最大池化和平均池化,比较常用的是最大池化。
通过卷积把特征图的参数变小之后,可以展平,展平后使用Linear变为n个类别即可实现分类。
计算loss交叉熵损失的公式为类别 X log这个类别的预测概率,求平均即可。
神经网络发展经过了AlexNet、VGG、GoogleNet、ResidualNet,层数和准确率大幅提升。
AlexNet提出了relu、dropout、池化、归一化。
relu作为效果很好的激发函数,在后面的神经网络中很常用。池化刚才提到过。
Dropout每次不选择全部神经网络中的节点,随机舍弃,可以缓解过拟合的现象。归一化让模型关注数据的分布、而不受数据量纲的影响,可以保持学习有效性,缓解梯度消失和爆炸。
VGGNet的创新之处在于更深更大,而且使用小的卷积核代替大的卷积核。
ResNet的创新之处在于1乘1卷积和残差连接。
梯度消失,神经网络层数太多传递loss的时候,幂次方太大,如果传递的数很小,经过高幂次运算就会消失掉、但若传递的数太大,经过高次幂运算就会变得很大,也不太适于更新
残差连接:输出Out = f(x) + x,残差连接为了防止梯度消失,加上原来的x,如果学习的好,会往f(x)靠近,如果f(x)消失也会保留x,不至于梯度消失.
1x1卷积可以起到生维,降维的作用,可用来减少参数.