本博客系OUC软件工程第三次作业:卷积神经网络基础
文章目录
视频学习
传统神经网络和卷积神经网络
传统的神经网络的学习流程和弊端
传统深度学习的弊端
- 全连接的参数太多,导致过拟合
- 每个层都是全连接,不够灵活
卷积神经网络的基本组成结构
- 卷积层
- 池化层
- 全连接层
1. 卷积层
什么是卷积:
在输入中,取和卷积核尺寸相同的区域,对应位置相乘求和,得到一次卷积的结果。
- W:卷积核(滤波器)
- X:二维矩阵输入
- b:偏置项
weights
权重:卷积核的每一项,称为权重receptive field
感受野:进行卷积的时候,对应的输入部分。(和卷积核尺寸相同)feture map
特征图:输入经过卷积后的结果。
2. 池化层
池化:就是缩放,把原来 500500的数据,缩小成 200200,数据量小了,计算量就更小,进而防止过拟合。
- 最大值池化:在池化区域中,取最大值作为池化结果
- 平均值池化:在池化区域中,取平均值作为池化结果
3. 全连接
- 全连接的参数量通常是最大的
- 全连接层 通常放在卷积神经网络的尾部
小结
未加padding时,输出的feature map大小:
(
N
−
F
)
/
s
t
r
i
d
e
+
1
(N-F)/stride+1
(N−F)/stride+1
有padding时,输出的feature map大小:
(
N
+
p
a
d
d
i
n
g
×
2
−
F
)
/
s
t
r
i
d
e
+
1
(N+padding\times2-F)/stride +1
(N+padding×2−F)/stride+1
卷积神经网络典型结构
1. AlexNet
AlexNet 的网络结构
AlexNet的优点
-
出现了百万级数据集的 ImageNet 图像数据
-
非线性激活函数ReLU
-
防止过拟合的技术:Dropout,Data augmentatioin
- Dropout:训练时,随机地关闭部分神经元,减少训练时的参数量,防止过拟合。
- Dropout:训练时,随机地关闭部分神经元,减少训练时的参数量,防止过拟合。
-
其他:双 GPU 实现
2. ZFNet
- 网络结构和 AlexNet 相同
- 改变了卷积核的大小和步长
- 使正确率提升了 2%
3. VGG
更深的网络
4. GoogleNet
利用 Inception 和 Max Pooling,使用多个卷积核,增加了结果的多样性。
4. Res网络
残差学习网络
回答问题
1. dataloader 里面 shuffle 取不同值有什么区别?
- DataLoader是PyTorch库中数据模块中一个比较重要的类,其作用也像它的名字一样适用于加载数据的,其中的shuffle参数是用于决定是否进行随机打乱顺序的操作的,如果不打乱的话就以batch为单位顺序地从数据集中读取数据,否则的话就会在每一个epoch中对数据进行打乱之后再以batch为单位读取数据,这样每个epoch中的数据顺序就是不同的。
2. transform 里,取了不同值,这个有什么区别?
- transform参数的作用如其名字,是用于变换的,也就是在输入的原始数据和最后喂到训练里的数据之间进行转换的函数。
- transform.Totensor()将[0,255]之间的数字归一化到[0,1]之间,方法是直接除以255
- normalization()也是归一化,将输入的值转化成均值为0方差为1的数据,取值在[-1,1]之间
3. epoch 和 batch 的区别?
- batch一般作为训练之前提取数据时候的单位,即每次读取一个batch_size大小的数据,也就是一批样本。而epoch是算法在训练模型的时候进行的工作次数,即训练了多少轮或训练多少次。
- Batch大小是在更新模型之前处理的多个样本。Epoch数是通过训练数据集的完整传递次数。批处理的大小必须大于或等于1且小于或等于训练数据集中的样本数。可以将epoch设置为1和无穷大之间的整数值。
4. 1x1的卷积和 FC 有什么区别?主要起什么作用?
- 在卷积神经网络中,插入一个1x1的卷积核的作用多是为了降维,使feature map的深度变小。而全连接FC多时用于在最后几层用于将结果输出。但其实从数学运算的角度来看1x1的卷积核全连接并没有什么不同之处。
- 1×1的卷积主要作用有降维和加入非线性。
- 区别在于输入尺寸是否可变,卷积层可以对输入进行升维或者降维,以及卷积层可以引入非线性特征。对于尺寸,当输入为c×w×h时,卷积层和全连接层的输出尺寸就不一样了,1×1的卷积输出为n×w×h,全连接的输出是n×1×1。此时,全连接可以等价于n个c×w×h卷积核的卷积层。对于维度,当输入为c×w×h时,设此时c=3,若使用2个filters的1x1卷积层,那么输出将是2×w×h,实现了降维,若使用4个filters,则输出为4×w×h,实现了升维。
5. residual leanring 为什么能够提升准确率?
- 提升了深度却没有出现梯度消失,这是因为残差block在最后的输出中还加上其输入本身,这样的话它在复合求导的时候,即使某一个部分导数是0,但由于加了输入本身x,所以求导之后还是会加上一个1,这样计算出的权重就不会不发生改变了,也就避免出现梯度消失进而提升准确率。
- 通过支路的设计在传递时加上自身,即Y=F(x)+x的结构,这样一来,无论经过多少层求导,梯度始终不会小于1,解决了梯度消失的问题,因此得以训练深度更大的网络
6. 代码练习二里,网络和1989年 Lecun 提出的 LeNet 有什么区别?
# 代码二的LeNet网络,可以看出是LeNet-5
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# PyTorch中的LeNet5网络
class LeNet5(nn.Module):
def __init__(self, num_classes):
super(LeNet5, self).__init__()
self.grayscale = grayscale
self.num_classes = num_classes
# 卷积神经网络
self.features = nn.Sequential(
nn.Conv2d(3, 6, kernel_size=5),
nn.MaxPool2d(kernel_size=2),
nn.Conv2d(6, 16, kernel_size=5),
nn.MaxPool2d(kernel_size=2) # 原始的模型使用的是 平均池化
)
# 分类器
self.classifier = nn.Sequential(
nn.Linear(16*5*5, 120), # 这里把第三个卷积当作是全连接层了
nn.Linear(120, 84),
nn.Linear(84, num_classes)
)
def forward(self, x):
x = self.features(x) # 输出 16*5*5 特征图
x = torch.flatten(x, 1) # 展平 (1, 16*5*5)
logits = self.classifier(x) # 输出 10
probas = F.softmax(logits, dim=1)
return logits, probas
可以看出差不太多,但是代码二中只有六层,少一层均值池化层。
- 网络层数不同:练习2的少了一层池化层;激活函数不同:练习2的是ReLU,LeNet的是sigmod;输入大小不同:练习2的是3通道RGB图像,LeNet是单通道灰度图;
- 练习二中的网络与LeNet主要的区别是激活函数的不同,网络使用的是ReLU函数,LeNet使用的是Sigmoid激活函数,ReLU函数训练起来可以更简单,效果也会更好。
- Lecun使用的是最大池化,激活函数是ReLU,LeNet使用的是平均池化,激活函数是sigmoid
7. 代码练习二里,卷积以后feature map 尺寸会变小,如何应用 Residual Learning?
- 用1×1的卷积改变通道数,进行升维
8. 有什么方法可以进一步提升准确率?
- 增大数据集规模、增加训练轮数、调整参数、使用更有效果的网络模型等。
- 采用更加优化的数据处理模型;提升训练次数等