第二次作业:卷积神经网络 part 1

视频学习

卷积神经网络

卷积神经网络的组成

  1. 卷积:要计算一个feature(特征)和其在原图上对应的某一小块的结果,只需将两个小块内对应位置的像素值进行乘法运算,然后将整个小块内乘法运算的结果累加起来,最后再除以小块内像素点总个数即可(也可以不除)。当图像尺寸增大时,其内部的加法、乘法和除法操作的次数会增加得很快,每一个filter的大小和filter的数目呈线性增长。,很容易使得计算量变得非常大
  2. 池化:为了有效地减少计算量,CNN使用池化。池化就是将输入图像进行缩小,减少像素信息,只保留重要信息。通常情况下,池化区域是2*2大小,然后按一定规则转换成相应的值,例如取这个池化区域内的最大值(max-pooling)、平均值(mean-pooling)等,以这个值作为结果的像素值。最大池化(max-pooling)保留了每一小块内的最大值,相当于保留了这一块最佳的匹配结果(因为值越接近1表示匹配越好)。它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。通过加入池化层,图像缩小了,能很大程度上减少计算量,降低机器负载
  3. 在卷积神经网络中,激活函数一般使用ReLU,它的特点是收敛快,求梯度简单。计算公式也很简单,max(0,T),即对于输入的负值,输出全为0,对于正值,则原样输出。
  4. 全连接层:在整个卷积神经网络中起到“分类器”的作用,即通过卷积、激活函数、池化等深度网络后,再经过全连接层对结果进行识别分类。

卷积神经网络的特点

  • CNN特点是头重脚轻(越往后输入权值越小),呈现出一个倒三角的形态,避免BP神经网络中反向传播的时候梯度损失得太快
  • 可以并行学习
  • 局部权值共享可以降低网络复杂度

几种常见卷积神经网络

  1. alexnet
    AlexNet由Hinton的学生Alex Krizhevsky于2012年提出,并在当年取得了Imagenet比赛冠军
  • 成功使用ReLu作为激活函数,解决了网络较深时的梯度弥散问题
  • 使用数据增强、dropout和LRN层来防止网络过拟合,增强模型的泛化能力
  1. vggnet
  • 泛化性能很好,容易迁移到其他的图像识别项目上
  • 把网络层数加到了16-19层,而AlexNet是8层结构。
  • 将卷积层提升到卷积块的概念。卷积块有2~3个卷积层构成,使网络有更大感受野的同时能降低网络参数,同时多次使用ReLu激活函数有更多的线性变换,学习能力更强
  1. resnet
    ResNet(残差神经网络)由何凯明等人于2015年提出,成功训练了152层的卷积神经网络

视频学习

卷积神经网络

卷积神经网络的组成

  1. 卷积:要计算一个feature(特征)和其在原图上对应的某一小块的结果,只需将两个小块内对应位置的像素值进行乘法运算,然后将整个小块内乘法运算的结果累加起来,最后再除以小块内像素点总个数即可(也可以不除)。当图像尺寸增大时,其内部的加法、乘法和除法操作的次数会增加得很快,每一个filter的大小和filter的数目呈线性增长。,很容易使得计算量变得非常大
  2. 池化:为了有效地减少计算量,CNN使用池化。池化就是将输入图像进行缩小,减少像素信息,只保留重要信息。通常情况下,池化区域是2*2大小,然后按一定规则转换成相应的值,例如取这个池化区域内的最大值(max-pooling)、平均值(mean-pooling)等,以这个值作为结果的像素值。最大池化(max-pooling)保留了每一小块内的最大值,相当于保留了这一块最佳的匹配结果(因为值越接近1表示匹配越好)。它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。通过加入池化层,图像缩小了,能很大程度上减少计算量,降低机器负载
  3. 在卷积神经网络中,激活函数一般使用ReLU,它的特点是收敛快,求梯度简单。计算公式也很简单,max(0,T),即对于输入的负值,输出全为0,对于正值,则原样输出。
  4. 全连接层:在整个卷积神经网络中起到“分类器”的作用,即通过卷积、激活函数、池化等深度网络后,再经过全连接层对结果进行识别分类。

卷积神经网络的特点

  • CNN特点是头重脚轻(越往后输入权值越小),呈现出一个倒三角的形态,避免BP神经网络中反向传播的时候梯度损失得太快
  • 可以并行学习
  • 局部权值共享可以降低网络复杂度

几种常见卷积神经网络

  1. alexnet
    AlexNet由Hinton的学生Alex Krizhevsky于2012年提出,并在当年取得了Imagenet比赛冠军
  • 成功使用ReLu作为激活函数,解决了网络较深时的梯度弥散问题
  • 使用数据增强、dropout和LRN层来防止网络过拟合,增强模型的泛化能力
  1. vggnet
  • 泛化性能很好,容易迁移到其他的图像识别项目上
  • 把网络层数加到了16-19层,而AlexNet是8层结构。
  • 将卷积层提升到卷积块的概念。卷积块有2~3个卷积层构成,使网络有更大感受野的同时能降低网络参数,同时多次使用ReLu激活函数有更多的线性变换,学习能力更强
  1. 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

猫狗大战问题数据集解压出错还没有解决

posted @ 2020-08-01 20:49  wuuuhy  阅读(29)  评论(0编辑  收藏