第二次作业:卷积神经网络 part 1
视频学习
卷积神经网络
卷积神经网络的组成
- 卷积:要计算一个feature(特征)和其在原图上对应的某一小块的结果,只需将两个小块内对应位置的像素值进行乘法运算,然后将整个小块内乘法运算的结果累加起来,最后再除以小块内像素点总个数即可(也可以不除)。当图像尺寸增大时,其内部的加法、乘法和除法操作的次数会增加得很快,每一个filter的大小和filter的数目呈线性增长。,很容易使得计算量变得非常大
- 池化:为了有效地减少计算量,CNN使用池化。池化就是将输入图像进行缩小,减少像素信息,只保留重要信息。通常情况下,池化区域是2*2大小,然后按一定规则转换成相应的值,例如取这个池化区域内的最大值(max-pooling)、平均值(mean-pooling)等,以这个值作为结果的像素值。最大池化(max-pooling)保留了每一小块内的最大值,相当于保留了这一块最佳的匹配结果(因为值越接近1表示匹配越好)。它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。通过加入池化层,图像缩小了,能很大程度上减少计算量,降低机器负载
- 在卷积神经网络中,激活函数一般使用ReLU,它的特点是收敛快,求梯度简单。计算公式也很简单,max(0,T),即对于输入的负值,输出全为0,对于正值,则原样输出。
- 全连接层:在整个卷积神经网络中起到“分类器”的作用,即通过卷积、激活函数、池化等深度网络后,再经过全连接层对结果进行识别分类。
卷积神经网络的特点
- CNN特点是头重脚轻(越往后输入权值越小),呈现出一个倒三角的形态,避免BP神经网络中反向传播的时候梯度损失得太快
- 可以并行学习
- 局部权值共享可以降低网络复杂度
几种常见卷积神经网络
- alexnet
AlexNet由Hinton的学生Alex Krizhevsky于2012年提出,并在当年取得了Imagenet比赛冠军
- 成功使用ReLu作为激活函数,解决了网络较深时的梯度弥散问题
- 使用数据增强、dropout和LRN层来防止网络过拟合,增强模型的泛化能力
- vggnet
- 泛化性能很好,容易迁移到其他的图像识别项目上
- 把网络层数加到了16-19层,而AlexNet是8层结构。
- 将卷积层提升到卷积块的概念。卷积块有2~3个卷积层构成,使网络有更大感受野的同时能降低网络参数,同时多次使用ReLu激活函数有更多的线性变换,学习能力更强
- resnet
ResNet(残差神经网络)由何凯明等人于2015年提出,成功训练了152层的卷积神经网络
视频学习
卷积神经网络
卷积神经网络的组成
- 卷积:要计算一个feature(特征)和其在原图上对应的某一小块的结果,只需将两个小块内对应位置的像素值进行乘法运算,然后将整个小块内乘法运算的结果累加起来,最后再除以小块内像素点总个数即可(也可以不除)。当图像尺寸增大时,其内部的加法、乘法和除法操作的次数会增加得很快,每一个filter的大小和filter的数目呈线性增长。,很容易使得计算量变得非常大
- 池化:为了有效地减少计算量,CNN使用池化。池化就是将输入图像进行缩小,减少像素信息,只保留重要信息。通常情况下,池化区域是2*2大小,然后按一定规则转换成相应的值,例如取这个池化区域内的最大值(max-pooling)、平均值(mean-pooling)等,以这个值作为结果的像素值。最大池化(max-pooling)保留了每一小块内的最大值,相当于保留了这一块最佳的匹配结果(因为值越接近1表示匹配越好)。它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。通过加入池化层,图像缩小了,能很大程度上减少计算量,降低机器负载
- 在卷积神经网络中,激活函数一般使用ReLU,它的特点是收敛快,求梯度简单。计算公式也很简单,max(0,T),即对于输入的负值,输出全为0,对于正值,则原样输出。
- 全连接层:在整个卷积神经网络中起到“分类器”的作用,即通过卷积、激活函数、池化等深度网络后,再经过全连接层对结果进行识别分类。
卷积神经网络的特点
- CNN特点是头重脚轻(越往后输入权值越小),呈现出一个倒三角的形态,避免BP神经网络中反向传播的时候梯度损失得太快
- 可以并行学习
- 局部权值共享可以降低网络复杂度
几种常见卷积神经网络
- alexnet
AlexNet由Hinton的学生Alex Krizhevsky于2012年提出,并在当年取得了Imagenet比赛冠军
- 成功使用ReLu作为激活函数,解决了网络较深时的梯度弥散问题
- 使用数据增强、dropout和LRN层来防止网络过拟合,增强模型的泛化能力
- vggnet
- 泛化性能很好,容易迁移到其他的图像识别项目上
- 把网络层数加到了16-19层,而AlexNet是8层结构。
- 将卷积层提升到卷积块的概念。卷积块有2~3个卷积层构成,使网络有更大感受野的同时能降低网络参数,同时多次使用ReLu激活函数有更多的线性变换,学习能力更强
- resnet
ResNet(残差神经网络)由何凯明等人于2015年提出,成功训练了152层的卷积神经网络
使用 VGG16 对 CIFAR10 分类
class VGG(nn.Module):
def __init__(self):
super(VGG, self).__init__()
self.cfg = [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M']
self.features = self._make_layers(self.cfg)
self.classifier = nn.Linear(512, 128) #由(2048, 10)修改
def forward(self, x):
out = self.features(x)
out = out.view(out.size(0), -1)
out = self.classifier(out)
return out
def _make_layers(self, cfg):
layers = []
in_channels = 3
for x in cfg:
if x == 'M':
layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
else:
layers += [nn.Conv2d(in_channels, x, kernel_size=3, padding=1),
nn.BatchNorm2d(x),
nn.ReLU(inplace=True)]
in_channels = x
layers += [nn.AvgPool2d(kernel_size=1, stride=1)]
return nn.Sequential(*layers)
for epoch in range(10): # 重复多轮训练
for i, (inputs, labels) in enumerate(trainloader):
inputs = inputs.to(device)
labels = labels.to(device)
# 优化器梯度归零
optimizer.zero_grad()
# 正向传播 + 反向传播 + 优化
outputs = net(inputs) #报错提示维度不匹配,修改nn.linear
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 输出统计信息
if i % 100 == 0:
print('Epoch: %d Minibatch: %5d loss: %.3f' %(epoch + 1, i + 1, loss.item()))
print('Finished Training')
![](https://img2020.cnblogs.com/blog/2099302/202008/2099302-20200801195045620-380142539.png
猫狗大战问题数据集解压出错还没有解决