# 机器学习作业
<p align="right">选题:花卉识别</p>
***
# 一、预实验
初次尝试对CNN网络的训练,对于程序的实现以及相应的参数都不够了解。为了熟悉通过pytorch训练CNN网络的方法,同时对模型的性能有一个基本的认识,进行了预实验。
## 1. 模型选取
首先尝试实现最简单的LeNet5网络结构。因为是初次尝试,尽可能避免调整模型的结构,这里仅仅修改了最后一个全连接层的结构。相应地,为了匹配LeNet5的输入格式,在预处理中不得不将输入图像的分辨率降低为32×32。
## 2. 参数设置
```python
sample_size = 40 # 计算 loss 函数的间隔
epoch_num = 10 # epoch 总数 (将进行多组实验,分别取2 10 30 50)
batch_size = 4 # 批规模
learn_rate_value = 0.001 # 学习率
```
## 3. 训练结果
详见报告
## 4. 进一步实验
详见报告
**分析:**
结合四次实验的结果,可以发现,模型在测试集上较差的表现并不能单纯地用欠拟合或过拟合来解释。实际上,从实验结果来看,增加训练时间并没有显著地影响模型的预测能力,但loss值已经稳定在一个较小值的附近了。因此,猜测为当前的模型过于简单,提取特征进行泛化的能力不足,后续的实验需适当地改变模型的结构,从而更好地提取图像的特征。
**总结:**
在后续实验中,需要注意以下几点:
1. 应当提高模型的深度,最好采用现有的性能较好的模型进行训练
2. 预实验中,对图像数据的预处理需要调整,不应当为了适应模型降低输入分辨率,而应调整模型的前置模块以适应输入。
3. 数据集的规模较小,覆盖的情形可能也不够全面,后续还应当在预处理中引入随机翻转、随机裁剪以及随机旋转等模块。
# 二、正式实验
根据预实验得到的三个结论,重新选取了网络模型,增加了隐藏层的个数,同时修改了模型输入图片的像素大小。在正式实验中,将首先在无BN层与dropout层的情况下进行训练,得到相应的训练结果。接着,实现BN层与dropout层,然后重新对模型进行训练,分析训练结果的变化。
## 1. 模型选取
为了提高模型的可输入图片大小,同时提高模型的深度,参照AlexNet的结构进行了类似实现。为了满足题目的要求,模型在AlexNet的基础上进行了简化,去除了分类模块的两个dropout层。同时,为了降低模型的训练的时间成本,只保留了四个卷积层。
## 2. 参数设置
```python
sample_size = 40
epoch_num = 10 # epoch 总数 (将进行多组实验,分别取2 10 30 50)
batch_size = 4
learn_rate_value = 0.002
```
## 3. 训练结果
详见报告
**分析:**
从训练loss曲线来看,30epoch时,模型已近似收敛,直到50epoch时,loss值也没有进一步下降,可知模型收敛所需的迭代次数约为30000。
从测试集的分类准确率来看,模型的准确率相比预实验有了显著的提升,这是由于提高隐藏层的数量,增强了模型的特征提取能力,同时输入图片分辨率变化为224×224,避免了预实验中的分辨率损失。
## 4. 进一步实验
### *加入BN层*
基于pytorch框架,自行实现了BN层,其中γ矩阵与β矩阵利用pytorch的自动微分机制进行更新。
```python
self.gamma = nn.Parameter(torch.ones(shape), requires_grad=True)
self.beta = nn.Parameter(torch.zeros(shape), requires_grad=True)
```
**加入BN层后的特征提取模块如下**
```python
(features): Sequential(
(0): Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))
(1): mBN2d() # 加入的BN层
(2): ReLU(inplace=True)
(3): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(4): Conv2d(64, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
(5): mBN2d() # 加入的BN层
(6): ReLU(inplace=True)
(7): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(8): Conv2d(128, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(9): mBN2d() # 加入的BN层
(10): ReLU(inplace=True)
(11): Conv2d(192, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(12): mBN2d() # 加入的BN层
(13): ReLU(inplace=True)
(14): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
)
```
**分析:**
结合loss曲线与测试集分类准确率,可以得出如下结论
* 增大batchsize,训练loss曲线将更加平滑
* batchsize取40时,训练初期loss值下降将十分缓慢,而加入BN层能有效改善这一情况
* 加入BN层通常有利于提高模型的准确率,但增加batchsize则不一定
* 加入BN层并适当地增加batchsize,能够提高模型的分类准确率
### *加入dropout层*
在加入BN层的基础上,同样基于pytorch框架实现并加入dropout层。由于不含待训练参数,只需实现其前向传播方法即可
```python
class mDropOut1d(nn.Module):
def __init__(self, p):
super(mDropOut1d, self).__init__()
self.p = p
def forward(self, x):
if not self.training:
return x
else:
judge_Tensor = torch.rand_like(x) > self.p
return judge_Tensor.float() * x / (1-self.p)
```
**加入dropout层后的分类模块如下**
```plain
(classifier): Sequential(
(0): mDropOut1d() #加入的dropout层
(1): Linear(in_features=4608, out_features=2048, bias=True)
(2): ReLU(inplace=True)
(3): mDropOut1d() #加入的dropout层
(4): Linear(in_features=2048, out_features=2048, bias=True)
(5): ReLU(inplace=True)
(6): Linear(in_features=2048, out_features=5, bias=True)
)
```
### *BN层与dropout层的pytorch实现补充*
由于BN层与dropout层在训练与测试时需要采用不同的流程,这里利用pytorch框架下的train模式与eval模式来实现。
```plain
print(net.features._modules['1'].training) # True
net.eval()
print(net.features._modules['1'].training) # False
net.train()
print(net.features._modules['1'].training) # True
```
由上述运行结果可知,继承于nn.Moudle的成员变量Training可以通过封装后的train()方法与eval()方法进行布尔赋值。
因此,以BN层为例,就有如下的实现
```python
def batch_norm(self, x):
if not self.training:
测试时执行的语句
else:
训练时执行的语句
return x
```
相应地,只需在进入测试阶段时,调用最外层模型的eval()方法即可
```python
net.eval() # 设置为测试模式
with torch.no_grad():
for data in test_loader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the all test images: %d %%' % (
100 * correct / total))
```
# 三、补充实验
在正式实验的基础上,考虑进一步增加模型的深度能否改善预测准确率。
补充实验中,选取vgg16网络模型。
## 1. 模型选取
由于使用的是cpu版本的pytorch,重新训练一个深层网络是不现实的,实验中将采用迁移学习的方式。补充实验将不再讨论BN层与dropout层的作用,重点关注随着深度的提升,模型在测试集上能否达到更好的预测性能。
```python
# —————————————————迁移学习vgg16模型————————————————————
net = models.vgg16_bn(pretrained=True)
# 对迁移模型进行调整
for parma in net.parameters():
parma.requires_grad = False
net.classifier._modules['6'] = nn.Linear(4096, 5)
# ——————————————————
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1、资源内容:机器学习大作业-通过pytorch训练CNN网络+源代码+文档说明 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释明细,都经过测试运行成功,功能ok的情况下才上传的。 3、适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 4、作者介绍:某大厂资深算法工程师,从事Matlab、Python、C/C++、Java、YOLO算法仿真工作10年;擅长计算机视觉、 目标检测模型、智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、智能控制、路径规划、无人机等多种领域的算法仿真实验,更多源码,请上博主主页搜索。 -------------------------------------------------------------------------- -
资源推荐
资源详情
资源评论
收起资源包目录
mechine_learning_homework-main.zip (9个子文件)
mechine_learning_homework-main
HomeWork_3
third_stage
main_flower_3.py 5KB
mSplit_ImageDataSet.py 3KB
first_stage
mSplit_ImageDataSet.py 3KB
main_flower_1.py 5KB
second_stage
mSplit_ImageDataSet.py 3KB
implement_BN_DropOut.py 2KB
main_flower_2.py 6KB
FinalProject.docx 537KB
README.md 13KB
共 9 条
- 1
资源评论
机器学习的喵
- 粉丝: 491
- 资源: 1259
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现多车辆车辆路径问题,用遗传算法编程,保证可用.rar
- 基于matlab实现多层极限学习机实现手写体识别,准确率超过99%.rar
- 基于matlab实现电力系统最优潮流程序,可以应用于电力市场下的最优潮流计算 适合电力系统专业的同仁使用.rar
- 串行通信的通信协议串口协议串行通信的通信协议串口协议
- Vue构建交互式的单页面应用程序Vue构建交互式的单页面应用程序
- Spring Boot快速搭建和部署应用程序
- Redis开源的高性键值存储系统广泛应用于缓存、实时消息传递
- Qt跨平台的应用程序开发框架Qt跨平台的应用程序开发框架
- 单片机是集成处理器、存储器和输入输出设备
- 深度学习机器习方法模仿人脑神经网络深度学习机器习方法模仿人脑神经网络
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功