第三次作业:卷积神经网络


第三次作业:卷积神经网络

Part1 视频学习心得及问题总结

学习心得

姓名 心得
蹇浩航 卷积神经网络的优点有共享卷积核,对高维数据处理无压力;无需手动选取特征,训练好权重即得特征,分类效果好等等,是深度学习的代表算法。但是也是基于大样本量的数据进行计算,所以对GPU也有一定要求。基础的CNN由卷积、激活和池化三种结构组成,其中卷积是最基础的操作;卷积之后,通常会加入偏置, 并引入非线性激活函数;池化是一种降采样操作,主要目标是降低feature maps的特征空间,或者可以认为是降低feature maps的分辨率。因为feature map参数太多,而图像细节不利于高层特征的抽取。
MYNOTE
赵泽昊 一。卷积层相对于全连接层,最大的一个优势即考虑了输入数据的形状。图像处理中的输入数据为图像,而图像是三维数据,将其展平输入全连接层和保持其三维特性输入卷积层相比,显然后者对于原数据特征的保留做得更好。二。池化层是用来缩小高和长方向上空间大小的操作。池化层在保留最有效数据的同时,减少了数据的数量。另外,池化层对于微小的数据偏差具有鲁棒性。
丁浩喆 深度学习是指多层神经网络上运用各种机器学习算法解决图像,文本等各种问题的算法集合。深度学习从大类上可以归入神经网络,不过在具体实现上有许多变化。深度学习的核心是特征学习,旨在通过分层网络获取分层次的特征信息,从而解决以往需要人工设计特征的重要难题。卷积网络通过一系列方法,成功将数据量庞大的图像识别问题不断降维,最终使其能够被训练。
郭升 体会:最近在信号与系统学到了卷积这个名词,老师也有提到卷积神经网络在深度学习里面的重要性,在学习了这次课程视频和完成代码练习以后更加体会到了卷积神经网络的优越性。比如在相同的参数下,其效果要明显优于简单的全连接网络,是因为其可以更好的挖掘图像中的信息,而其手段主要是卷积和池化。同时,网络结构对于分类也有着很大的影响。
郭英来 我学到了卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。结构包括输入层,隐含层,卷积层,输出层等.....其中最主要的卷积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量,类似于一个前馈神经网络的神经元。

问题总结

姓名 问题
蹇浩航 实现起来大部分还是抄代码,对于深度学习的应用还处在CV阶段
赵泽昊 暂无
丁浩喆 卷积神经网络典型结构之间的区分以及理解不是很清楚明白
郭升 简化版的VGG网络对于准确率并无显著影响是发生了什么问题
郭英来 对于概念方面有所掌握,而在一些算法实现和函数理解上还有待提升

Part2 代码练习

0x01 MNIST 数据集分类

  1. 加载数据

    显示数据集中的部分图像

  2. 创建网络

    定义训练和测试函数

  3. 在小型全连接网络上训练

  4. 在卷积神经网络上训练

  5. 打乱像素顺序再次在两个网络上进行训练与测试

    重新定义测试与训练函数

    在全连接网络上训练与测试:

    在卷积神经网络上训练与测试:

0x02 CIFAR10 数据集分类

  • 加载并归一化 CIFAR10 使用 torchvision

  • 展示 CIFAR10 里面的一些图片

  • 定义网络,损失函数和优化器

    • 训练网络

    • 从测试集中取出8张图片:

    • 图片识别:

    • 网络在整个数据集上的表现:

0x03 使用 VGG16 对 CIFAR10 分类

  1. 定义dataloder

  2. VGG 网络定义及初始化

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]
        self.features = self._make_layers(self.cfg)
        self.classifier = nn.Linear(2048, 200)

    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 self.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)

        #网络放到GPU上
        net = VGG().to(device)
        criterion =nn.crossEntropyLoss()
        optimizer = optim.Adam(net.parameters(),1r=0.001)
  1. 训练网络

  2. 测试正确率

可以看出 正确率有显著提升