视频学习
邱琦
讲述了卷积神经网络的应用:分类,检索,检测,分割,人脸识别,表情识别,图像生成,自动驾驶。卷积神经网络相对传统神经网络的优点:局部关联,参数共享。卷积神经网络存在卷积层,RELU激活层,池化层,全连接层。其中卷积是对两个实变函数的一种数学操作,将图片进行参数化。池化层保留了主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力。全连接层两层之间所有神经元都有权重链接,通常在卷积神经网络尾部,参数量通常最大。卷积神经网络典型结构包括AlexNet,ZFNet,VGG,GoogleNet,ResNet。这次视频最后举的例子,能够帮助较好的理解,再加上自己的实验,能够对课程有更好的理解。
陈江栋
对于计算机视觉来说,每⼀个图像是由⼀个个像素点构成,每个像素点有三个通道,分别
代表RGB三种颜⾊(不计算透明度),我们以⼿写识别的数据集MNIST举例,每个图像的是 ⼀个⻓宽均为28,channel(通道数)为1的单⾊图像,如果使⽤全连接的⽹络结构, 即,⽹络中的神经与相邻层上的每个神经元均连接,那就意味着我们的⽹络有
28×28=784个神经元(RGB3⾊的话还要乘3),hidden层如果使⽤了15个神经元,需要 的参数个数(w和b)就有:28×28×15×10+15+10=117625个,这个数量级到现在为⽌也是 ⼀个很恐怖的数量级,⼀次反向传播计算量都是巨⼤的,这还只是⼀个单⾊的28像素⼤ ⼩的图⽚,如果我们使⽤更⼤的像素,计算量可想⽽知。 上⾯说到传统的⽹络需要⼤量的参数,但是这些参数是否重复了呢,例如,我们识别⼀个
⼈,只要看到他的眼睛,⿐⼦,嘴,还有脸基本上就知道这个⼈是谁了,只是⽤这些局部 的特征就能做做判断了,并不需要所有的特征。 另外⼀点就是我们上⾯说的可以有效提 取了输⼊图像的平移不变特征,就好像我们看到了这是个眼睛,这个眼睛在左边还是在右 边他都是眼睛,这就是平移不变性。并且我们也⼀般认为两个靠近的物品他俩都有相似的 属性。这也是图像本⾝的特性,这⼀特性在把NLP中transformer模型迁移到CV领域⽽产 ⽣的swin-transformer这⼀篇论⽂中起到了很⼤的影响⼒。 我们通过卷积的计算操作来提 取图像局部的特征,每⼀层都会计算出⼀些局部特征,这些局部特征再汇总到下⼀层,这 样⼀层⼀层的传递下去,特征由初级变为⾼级,最后在通过这些局部的特征对图⽚进⾏处 理,这样⼤⼤提⾼了计算效率,也提⾼了准确度。
李智杰
通过视频,学习到了许多关于卷积神经网络的知识,学习到了卷积网络的基本结构,卷积、池化和一些经典的网络与结构,AlexNet、VGG16、VGG19,GoogleNet的Inception和ResNet,通过后面的代码练习也了解到了相比传统的神经网络,卷积网络具有巨大的优势。
宋子昂
卷积神经网络的应用非常广泛,包括分类、检索、检测、分割、人脸识别、图像生成等,这些应用在我们现在看来都非常普遍;由此可以看出卷积神经网络的重要性。而与传统神经网络相比,卷积神经网络主要突出在局部关联、参数共享,它不像传统的网络那样需要大量的参数。这样可以在训练的时候大大节省时间。CNN在图像处理问题上优势明显,它是一个可以自动提取特征,而且待训练参数相对不是很多的神经网络。卷积神经网络是一个由卷积层、激活层、池化层、全连接层聚合而成的网络结构。卷积运用了局部连接的思想,它对图片的处理方式是一块一块的,并不是所有像素值一起处理,因此可以极大的降低参数值的总量。通过视频的学习,我觉得发现卷积这一个点的人也是相当厉害了,通过矩阵相乘来实现了提取特征这一过程。但同时池化层的思想,我认为在网络中的使用有待商榷,我认为应该分情况来决定是否使用池化层,这可以说是一种丢失了细节来提升模型不变性的方法,是存在一定弊端的,以后的研究可以提高池化层的准确率,避免在训练时丢失掉重要的细节。而全连接层实际上就是一个分类器!在CNN有不少优势的同时,我们也需正视其局限性:没有考虑图像中特征的依赖关系,且对特征的全局位置不敏感等在以后的研究中,希望可以有这些问题的解决。
韦境
通过本次对神经网络的学习,我深刻了解到了这一学科的严谨性和思维发散性。最令我感触的时googlenet模型中,对1×1卷积的应用。当某个卷积层输入的特征数较多,对这个输入进行卷积运算将产生巨大的计算量;如果对输入先进行降维到1×1,减少特征数后再做卷积计算量就会显著减少。它更高效的利用计算资源,在相同的计算量下能提取到更多的特征。
陈晓政
卷积神经网络是一种深度学习模型或类似于人工神经网络的多层感知器,卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,是传统神经网络的一个改进。卷积神经网络是仿照生物的视知觉来构建的,可以进行监督学习和非监督学习。
卷积神经网络主要由 5 层组成:数据输入层,卷积计算层,ReLU 激励层 ,池化层 ,全连接层 。
优点:共享卷积核,对高维数据处理无压力,无需手动选取特征,训练好权重,即得特征分类效果好。
缺点:需要调参,需要大样本量,训练最好要 GPU,物理含义不明确,也就是说,我们并不知道没个卷积层到底提取到的是什么特征,而且神经网络本身就是一种难以解释的“黑箱模型”。
代码练习
MNIST 数据集分类
构建简单的CNN对 mnist 数据集进行分类。同时,还会在实验中学习池化与卷积操作的基本作用。
1. 引入库文件
mport torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
import numpy
# 一个函数,用来计算模型中有多少参数
def get_n_params(model):
np=0
for p in list(model.parameters()):
np += p.nelement()
return np
# 使用GPU训练,可以在菜单 "代码执行工具" -> "更改运行时类型" 里进行设置
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
2. 加载数据
PyTorch里包含了 MNIST, CIFAR10 等常用数据集,调用 torchvision.datasets 即可把这些数据由远程下载到本地,下面给出MNIST的使用方法:
torchvision.datasets.MNIST(root, train=True, transform=None, target_transform=None, download=False)
- root 为数据集下载到本地后的根目录,包括 training.pt 和 test.pt 文件
- train,如果设置为True,从training.pt创建数据集就是为训练集,否则从test.pt创建即测试集。
- download,如果设置为True, 从互联网下载数据并放到root文件夹下
- transform, 一种函数或变换,输入PIL图片,返回变换之后的数据。
- target_transform 一种函数或变换,输入目标,进行变换。
配合DataLoader进行使用
loader_data=DataLoader(test_set,batch_size=64,shuffle=True,drop_last=True)
- 首先传入一个dataset数据类型的数据
- batch_size:可以理解为一副牌,每个人手里拿几张牌
- shuffle:是否每次随机抓取,就是是否重新洗牌
- drop_last:总共的dataset的数量除以batch_size的余数是否保留
- num_workers:加载数据的时候使用几个子进程
input_size = 28*28 # MNIST上的图像尺寸是 28x28
output_size = 10 # 类别为 0 到 9 的数字,因此为十类
train_loader = torch.utils.data.DataLoader(
datasets.MNIST('./data', train=True, download=True,
transform=transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))])),
batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(
datasets.MNIST('./data', train=False, transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))])),
batch_size=1000, shuffle=True)
2.1 查看数据
除了使用老师提供的plt,还可以使用tensorboard展示
#显示数据集中的部分图像
#除了老师使用的plt还可以使用SummaryWriter
from torch.utils.tensorboard import SummaryWriter
writer=SummaryWriter('logs')#日志文件的存放地址
step=0
for data in train_loader:
img,target=data
writer.add_images('train_loader',img,step)
step=step+1
%load_ext tensorboard
%tensorboard --logdir logs
writer.close(