目录
第一部分 论文阅读与视频学习
1.1 ResNet![](https://i-blog.csdnimg.cn/blog_migrate/bf3a99e3cd119dc748f3875c48bea269.png)
Deep Residual Learning for Image Recognition是一篇2015年由微软研究院的何凯明等人发表的论文,提出了一种用于图像识别的深度残差学习框架。该框架的主要思想是让网络层学习输入和输出之间的残差,而不是直接学习原始映射。这样可以避免网络深度增加时出现的退化问题,即网络的训练误差和测试误差随着层数的增加而上升。作者通过引入快捷连接(shortcut connection)来实现残差学习,即在网络中添加跨越一层或多层的直接连接,将输入和输出进行逐元素相加。这种方式不增加额外的参数和计算复杂度,也便于使用标准的优化方法进行端到端的训练。作者在ImageNet和CIFAR-10等数据集上进行了实验,证明了残差网络可以有效地训练超过100层甚至1000层的深度网络,并且随着网络深度的增加,可以获得更高的准确率。该论文在2016年获得了CVPR最佳论文奖,并且在ILSVRC和COCO等图像识别和检测比赛中取得了优异的成绩。
1.2 ResNeXt
Aggregated Residual Transformations for Deep Neural Networks是一篇由微软研究院的谢思杰等人发表在2017年CVPR上的论文,提出了一种简单而高效的深度神经网络架构,称为ResNeXt。该架构的主要特点是将残差网络和Inception模块的思想结合起来,使用分组卷积和相同拓扑的多分支结构来增强网络的表达能力和泛化能力。作者引入了一个新的维度,叫做基数(cardinality),来表示每个模块中转换的数量,发现基数对于网络性能的影响比深度和宽度更大。作者在ImageNet和COCO等数据集上进行了实验,证明了ResNeXt可以有效地训练超过1000层的深度网络,并且在图像分类和目标检测等任务上取得了优异的结果。
第二部分 代码作业
AI研习社 “猫狗大战” 比赛(AI研习社 - 研习AI产学研新知,助力AI学术开发者成长。)
导入数据
# 用wget命令从指定的网址下载文件
!wget -nc https://static.leiphone.com/cat_dog.rar
# 用pip命令安装pyunpack模块,这是一个可以解压缩各种格式文件的Python模块
!pip install pyunpack
#用pip命令安装patool模块
!pip install patool
from pyunpack import Archive
#用Archive类创建一个cat_dog.rar文件的对象,然后调用extractall方法将其解压缩到指定的路径中
Archive('/content/cat_dog.rar').extractall('/content/drive/MyDrive/Zhuangzicong/cat_dog')
定义一个LeNet5深度神经网络模型类,并实现其前向传播(forward)方法
import torch.nn.functional as F
class LeNet5(nn.Module):
def __init__(self):
super(LeNet5, self).__init__()
self.conv1 = nn.Conv2d(3, 16, 5)
self.pool1 = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(16, 32, 5)
self.pool2 = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(32*5*5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool1(x)
x = F.relu(self.conv2(x))
x = self.pool2(x)
x = x.view(-1, 32*5*5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
定义一个ResNet34的深度神经网络模型,并加载训练和验证数据集
num_workers = 2
batch_size = 32
# lenet
# net = LeNet5()
# resnet34
net = models.resnet34(pretrained=True)
net.fc = nn.Linear(512,2,bias=True)
net = net.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(),lr=0.001)
train_data = CatDogDataset(train_dir,transform=transform)
print(train_data.__len__()) # 20000
train_dataloader = DataLoader(dataset=train_data,shuffle=True,num_workers=num_workers,batch_size=batch_size,pin_memory=True)
val_data = CatDogDataset(val_dir,transform=transform)
val_dataloader = DataLoader(dataset=val_data,shuffle=True,num_workers=num_workers,batch_size=batch_size,pin_memory=True)
开始训练
net.train() # BN参数
for epoch in range(15): # 重复多轮训练
for i,(img,label) in enumerate(train_dataloader):
img = img.to(device)
labels = label.to(device)
# 优化器梯度归零
optimizer.zero_grad()
# 正向传播+反向传播+优化
outputs = net(img)
loss = criterion(outputs,labels)
loss.backward()
optimizer.step()
# 输出统计信息
print('Epoch: %d loss: %.3f' %(epoch+1,loss.item()))
print('Finished Training')
预测结果
通过得分可以看到,使用ResNet比LeNet效果更好
第三部分 思考题
1、Residual learning 的基本原理?
残差学习是一种用于训练深度神经网络的技术,它可以有效地解决网络退化(degradation)问题,即随着网络深度的增加,模型的性能反而下降。残差学习的核心思想是引入残差连接(residual connection),也称为快捷连接(shortcut connection),让神经网络可以学习输入和输出之间的残差(residual),而不是直接学习映射函数(mapping function)。残差连接可以跨越一个或多个层,将上一层或几层的输出与本层的输出相加,形成一个残差块(residual block)。
2、Batch Normailization 的原理,思考 BN、LN、IN 的主要区别。
BN是一种用于深度神经网络中的数据归一化方法,它可以加速模型的收敛速度,提高模型的泛化能力,避免梯度消失或梯度爆炸等问题。BN的基本思想是在每个批次(batch)的数据中,对每个特征维度进行归一化处理,使其均值为0,方差为1,并且引入两个可学习的参数,分别用于缩放和平移归一化后的数据。这样,BN可以减少内部协变量偏移(Internal Covariate Shift),即网络层之间输入分布的变化,从而使得网络更容易训练。
BN与LN和IN的主要区别在于归一化的维度和范围不同。LN是在每个样本(instance)中,对所有特征维度进行归一化处理,而不考虑不同样本之间的差异。LN适用于循环神经网络(Recurrent Neural Network,RNN),因为RNN中每个时间步的输入分布可能不同,而BN假设每个批次中的输入分布相似。IN是在每个样本中,对每个通道(channel)进行归一化处理,而不考虑不同通道之间的差异。IN适用于风格迁移(Style Transfer),因为不同风格的图像可能有不同的通道分布,而BN假设每个批次中的通道分布相似。
3、为什么分组卷积可以提升准确率?即然分组卷积可以提升准确率,同时还能降低计算量,分数数量尽量多不行吗?
分组卷积是一种在深度神经网络中使用多个卷积核(kernel)的技术,它可以增加网络的宽度(width),从而提高网络的表达能力和泛化能力。分组卷积的原理是将输入通道(channel)和输出通道分成若干个组(group),每个组内的卷积核只与对应的输入通道进行卷积,然后将各个组的输出通道拼接起来,形成最终的输出。这样,每个卷积核只需要处理一部分的输入通道,从而减少了参数数量和计算量,同时也增加了特征的多样性和冗余性,有利于网络学习更丰富和鲁棒的特征。
并不是基数越大越好,因为过大的基数可能导致过拟合(overfitting)或者欠拟合(underfitting)等问题。因此,在实际应用中,需要根据实验结果和经验来选择合适的基数。