【百度技术学院机器学习训练营第二期】-实验作业
liushuo008 发布于2019-11 浏览:20778 回复:65
15
收藏
最后编辑于2019-11

【学习有礼】百度技术学院机器学习训练营第二期作业:

进入训练营实验班级,完成班级作业:猫狗分类实验,并在评论区回答以下问题:

1、网络结构:计算每层网络结构和输入输出尺寸和参数个数。不加BN?更深?每层的尺寸变化?更多结构?

2、尝试不同的Loss函数和优化算法(SGD、Momentum、Adagrad、Adam),观察效果的变化,最好的选择是什么?为什么?

3、尝试不同的样本数量:随着每个类别样本数量由少变多,模型准确率变化的曲线是怎样的?每个类别至少有多少张图片可支撑一个准确率尚可的模型? 使用图像分类模型识别世界的万事万物是否可行?(自己编写数据读取程序,而不用默认函数;先完成同学可以在班级群内推送代码,供同学们参考)

4、使用模型实践:拍一些身边宠物狗的照片(或网上找),处理成32*32尺寸后试试模型效果,准或不准的原因是什么?

5、【挑战题,可选】VGGNet,ResNet如何搭建?在预测效果和训练时间上有怎样的差异?原因是什么? (飞桨官网上有参考代码,但不建议马上看)

 

作业提交截止时间及形式:

截止11月18日中午12点前,跟帖回答作业问题。在跟帖开头请注明:训练营班级+群内昵称(或姓名)以便发送奖励。

 

奖励:

截止11月18日中午12点前,参加【百度技术学院机器学习训练营第二期】并回答作业的同学

1、评论点赞前3名的同学分别获得训练营礼包一份(小度音箱Play1个+机械键盘1个)

2、评论点赞第4-5名同学分别获得机械键盘1个

3、老师点评作业,获得优秀作业同学分别获得双肩背包1个

4、评论有奖:按照评论时间从早到晚的顺序,将抽取第5、10、15、20、25、30、35、40、45、50层同学分别获得招财熊1个。

 

注意:

1、评论点赞前5名要求是回答作业的问题,无关话语不做点赞奖励的计算。

2、如果点赞排名有并列情况,则按照发布时间先后顺序为准,时间早的优先。

3、此奖励仅限训练营同学享有。

收藏
点赞
15
个赞
共65条回复 最后由anfangfei回复于2019-11
#26星光ld1回复于2019-11
#24 liguanghui2588回复
这个确定是线性关系

其他问题上不知道,这个问题上目前我做出来的结果还是与sample的10对数基本线性的

0
#25左手梦狼回复于2019-11

我的疑问

1)我看到别人都说,top-5的错误率,F1宏,mAP这些来说多分类问题的指标,这个和实验中的评判指标acc,以及loss中的交叉商,有什么更深入的关系么?

我大致知道,交叉熵低,那么每一类相对分的越纯,各指标大致上也是正相关的好;但是如果我系统用于召回,我最关心的是召回率,那么要改loss么?

0
#24liguanghui2588回复于2019-11
#21 星光ld1回复
4. 不太准。原因: 1)模型在训练和验证集合上的准确率均不高,且验证集准确率明显低于训练集,反应模型实际并没能够很好的学习图像分类任务且在训练过程中存在过拟合现象。从这个角度应该考虑修改模型结构,拓宽模型的假设空间,使得模型能够更好的学习图像分类任务,同时加入正则化、Dropout、EarlyStop等技巧防止过拟合的发生。 2)测试图像与验证和训练图像偏差较大,远远偏离了训练和测试数据同分布的假设,导致预测不准确。上述偏差可能来源于图像的类别不在训练和测试集内,图像的角度,大小,明暗,色彩等原因。从这个角度可以考虑通过数据增强对于模型的训练数据加以旋转、平移、放缩、截取部分等方式进行数据增强,使得训练数据与测试数据的分布尽可能接近。
展开

这个确定是线性关系

0
#23星光ld1回复于2019-11

忘记跟帖开头注明了:

第二期02班 + L

0
#22星光ld1回复于2019-11

下面是题三的结果:

采用均衡采样5个训练batch上每个类别构成训练集和验证集,每个类别的采样数分别为[10,20,50,100,200,500,1000,2000,5000],并将构成的集合80%用于训练,20%用于验证,在训练过程中采用early stop(基于验证集的准确率,patients=3)。最后测试准确率在完整的测试集上进行即test10,以实现比较准确的泛化能力评估。

从上述结果中可以看出,训练准确率与样本对数基本呈现线性关系,随着样本数的提高,准确率逐渐提高,且可以看出在当前模型架构下每个类别sample 500个样本可以获得一个尚可的模型(基于肘部法则的判断)

1
#21星光ld1回复于2019-11

4. 不太准。原因:

1)模型在训练和验证集合上的准确率均不高,且验证集准确率明显低于训练集,反应模型实际并没能够很好的学习图像分类任务且在训练过程中存在过拟合现象。从这个角度应该考虑修改模型结构,拓宽模型的假设空间,使得模型能够更好的学习图像分类任务,同时加入正则化、Dropout、EarlyStop等技巧防止过拟合的发生。

2)测试图像与验证和训练图像偏差较大,远远偏离了训练和测试数据同分布的假设,导致预测不准确。上述偏差可能来源于图像的类别不在训练和测试集内,图像的角度,大小,明暗,色彩等原因。从这个角度可以考虑通过数据增强对于模型的训练数据加以旋转、平移、放缩、截取部分等方式进行数据增强,使得训练数据与测试数据的分布尽可能接近。

1
#20星光ld1回复于2019-11
#16 nxrnxrerhui回复
最后一层全连接层的参数计算是 50*10+1=501,还是(50+1)*10=510?
展开

是(50+1)*10或者你可以理解为50*10+10,其中50*10是前一层输出的50个结果与后层输出之间的连接权重,10为作用在结果上的偏置

2
#19liguanghui2588回复于2019-11

训练同学的福利

0
#18左手梦狼回复于2019-11
#16 nxrnxrerhui回复
最后一层全连接层的参数计算是 50*10+1=501,还是(50+1)*10=510?
展开

我觉得是510,w[50,10],b[10]

1
#17左手梦狼回复于2019-11
#14 左手梦狼回复
[代码]

在优化器修改之后,好像fluid.io.load_params(executor=exe, dirname=model_save_dir_now)可以重新载入,原来的持久化的不能载入。

所以我的处理过程是:Adam读入持久化,写参数;然后切换到SGD读入参数,写参数,完美解决问题,现在SGD正在ResNet18结构上跑(paddle我看博客说有经典高层残差网络,好像没有18,18好慢,我都准备买GPU了)

1
#16nxrnxrerhui回复于2019-11

最后一层全连接层的参数计算是 50*10+1=501,还是(50+1)*10=510?

0
#15悠月明回复于2019-11

二期01班+悠月明

1. 输入为 [3, 32, 32] 最后输出为 [10].

第一层为conv2d pool2d 和 batch_norm。卷积核为 【5,5】,数目 20,池 [2,2], 步长 [2,2],输出为【20,14,14】

第二层为conv2d pool2d 和 batch_norm。卷积核为 【5,5】,数目 50,池 [2,2], 步长 [2,2],输出为【50,5,5】

第二层为conv2d pool2d 和 全连接输出。卷积核为 【5,5】,数目 50,池 [2,2], 步长 [2,2],输出为【10】

不加bn暂时看没影响。。,更深更多结构,运行时间明显加长,还有就是感觉图片太小了,传入信息不会太少吗?

2. Adam效果比较好

3.样本数量增加训练效果变好,把图片随机旋转,垂直翻转,水平翻转可以当做一个新的样本使用。识别万事万物的想法感觉可以先往大类分,得到的结果再用更细分的的网络进行识别,最后到种类。比如先识别植物,动物,然后再识别是什么植物,什么动物这样。

4.识别效果不好,考虑是图片太小了,还有模型训练不够

5.已经看过官网的代码了,哈哈,没办法

1
#14左手梦狼回复于2019-11
#13 左手梦狼回复
参考上面大佬的话: 优化算法上: Adam优化相对较快,采用了自适应学习率的相关技术,实现多变量之间学习速率差异,以及优化的过去信息依赖,相当于结合了Adagrad和Momentum算法两者的优势,对于大部分问题可以在较短的时间内获得较好的解,但是查阅资料可以发现尽管Adam有良好适应性,但是通过精细调节学习率SGD算法下,往往网络可以获得更佳的表现 我准备对代码做如下优化: 1)前20轮是Adam,后面20轮采用SGD,就是采用SGD进行Fine-Tune(微调) 2)修改保存,加载模型的代码
展开
# 读取模型,在训练之前读入数据
model_save_dir_now="/home/aistudio/work/catdog.inference.model-ResNet18-yyh/pass_id/p_1107_19"
if os.path.exists(model_save_dir_now):
    print('使用持久化变量模型作为预训练模型')
    fluid.io.load_persistables(executor=exe, dirname=model_save_dir_now)
    print ('load models from %s' % (model_save_dir_now)) 

# 保存代码,每个pass_id(每训练完一批)保存一次
model_save_dir_batch=model_save_dir+"/pass_id/p_"+save_pre+"_"+str(pass_id) 
if os.path.exists(model_save_dir_batch):
    shutil.rmtree(model_save_dir_batch, ignore_errors=True)
    print("shutil.rmtree")
if not os.path.exists(model_save_dir_batch):
    os.makedirs(model_save_dir_batch)
    print ('save models to %s' % (model_save_dir_batch))
    fluid.io.save_persistables(executor=exe, dirname=model_save_dir_batch)
    print('训练模型保存完成!') 
1
#13左手梦狼回复于2019-11
#11 左手梦狼回复
大佬说的很有道理,这里再说一点:BatchNorm也会使得权重的初始化不那么重要(增加系统的鲁棒性) 这里我引用博客的观点: 1)BN可以使学习率增大,而不至于会震荡(优化器的技巧降低) 2)BN使得系统不那么依赖初始值(对于初始值的选用降低技巧) 3) BN一定程度上抑制过拟合(Dropout等技巧选用降低)
展开

参考上面大佬的话:

优化算法上:
Adam优化相对较快,采用了自适应学习率的相关技术,实现多变量之间学习速率差异,以及优化的过去信息依赖,相当于结合了Adagrad和Momentum算法两者的优势,对于大部分问题可以在较短的时间内获得较好的解,但是查阅资料可以发现尽管Adam有良好适应性,但是通过精细调节学习率SGD算法下,往往网络可以获得更佳的表现

我准备对代码做如下优化:

1)前20轮是Adam,后面20轮采用SGD,就是采用SGD进行Fine-Tune(微调)

2)修改保存,加载模型的代码

1
#12星光ld1回复于2019-11

2. 不同Loss和优化算法的影响
优化算法上:
Adam优化相对较快,采用了自适应学习率的相关技术,实现多变量之间学习速率差异,以及优化的过去信息依赖,相当于结合了Adagrad和Momentum算法两者的优势,对于大部分问题可以在较短的时间内获得较好的解,但是查阅资料可以发现尽管Adam有良好适应性,但是通过精细调节学习率SGD算法下,往往网络可以获得更佳的表现
不同Loss:
常见loss主要有MSE,CEE,MAE等
通过尝试MSE替换CEE发现交叉熵做分类的效果相比于MSE更好。
尝试分析:
直觉上,如果MSE去评估,实际观测获得的是0 1的离散结果,但是其实
其他类别仍然存在发生概率,采用这种描述,没有道理,而且MSE会将错误类别趋于平均化,上述调整对于分类问题是不必要的,而交叉熵通过分布采样的观点,衡量了两个分布之间的差异,认为实际的观测是潜藏的分布的抽样更make sense
数值上,sigmoid/cross-entropy+MSE会使得问题的优化变成一个非凸优化问题,导致优化过程掉入local-optimum的概率增大,而采用交叉熵仍然保持凸优化问题的本质。另一方面,使用MSE时,w、b的梯度均与sigmoid函数对z的偏导有关系,而sigmoid函数的偏导在自变量非常大或者非常小时,偏导数的值接近于零,这将导致w、b的梯度将不会变化,也就是出现所谓的梯度消失现象;而使用cross-entropy时,w、b的梯度就不会出现上述的情况

所以Loss在分类问题上最好选择交叉熵或者类似的基于概率分布描述的loss,优化器上Adam优化器更计算经济,能够较快拿到一个比较好的结果。

2
#11左手梦狼回复于2019-11
#9 星光ld1回复
补充:BN的作用是层内实现缓解Internal Covariate Shift问题,使得各层权重参数分布的均值方差落在一定范围内,相当于一个全局归一化层,可以使用大的学习率,从而加快训练速度,对于比较深的网络有无batch-normalization有较大的影响
展开

大佬说的很有道理,这里再说一点:BatchNorm也会使得权重的初始化不那么重要(增加系统的鲁棒性)

这里我引用博客的观点:

1)BN可以使学习率增大,而不至于会震荡(优化器的技巧降低)

2)BN使得系统不那么依赖初始值(对于初始值的选用降低技巧)

3) BN一定程度上抑制过拟合(Dropout等技巧选用降低)

1
#10左手梦狼回复于2019-11
#5 左手梦狼回复
训练营1班+12号袁小白 2:相比较而言SGD好像很慢,原有的Adam较快,我查了资料,这里使用了 调整+动量,调整能够让学习率衰减,使得开始大步走,最后精细调;而动量在一定程度上能加速靠近极点 5:VGG16代码层数高,filter数目大致呈指数递增,所以,训练时间非常长,一晚上才3batch,见没收敛就停了。 ResNet18,使用残差,filter数目较小,虽然比原始网络复杂,但是算力跟的上,acc效果非常好 我看了别人的:利用paddlepaddle中的resnet网络训练人脸验证1:1 其中"input_size","batch_size"均改了,net那个函数,返回没有加softmax层,我参考原有网络手动加了 原有网络大致acc:0.65,resNet18现在EPOCH是3,都已经0.59+,有望打败原有网络
展开

居然可以自己回复自己

1
#9星光ld1回复于2019-11
#7 星光ld1回复
回答比较长,这边先放上第一问: 1. 网络结构: 1) 首层输入 输入层,输出(-1, 3, 32, 32) 参数量 0 2) 第一卷积池化batch-normalization Conv+Pool+Bacth,输出(-1, 20, 14, 14) 这边有三个操作分别是卷积、池化、批归一化 其中只有卷积操作有训练参数 卷积核为 5x5,共20个卷积核 总参数量 (5*5+1)*20=520 池化核 2x2, 步长2 输出维度分析: 卷积后变为(-1, 20, 32-5+1, 32-5+1)=(-1, 20, 28, 28) 池化后变为(-1, 20, 28/2, 28/2)=(-1, 20, 14, 14) 批归一化后维度不变(-1, 20, 14, 14) 3) 第二卷积池化batch-normalization Conv+Pool+Bacth,输出(-1, 50, 5, 5) 这边有三个操作分别是卷积、池化、批归一化 其中只有卷积操作有训练参数 卷积核为 5x5,共50个卷积核 总参数量 (5*5+1)*50=1300 池化核 2x2, 步长2 输出维度分析: 卷积后变为(-1, 50, 14-5+1, 14-5+1)=(-1, 50, 10, 10) 池化后变为(-1, 50, 10/2, 10/2)=(-1, 50, 5, 5) 批归一化后维度不变(-1, 50, 5, 5) 3) 第三卷积池化 Conv+Pool,输出(-1, 50, 1, 1) 这边有两个操作分别是卷积、池化 其中只有卷积操作有训练参数 卷积核为 5x5,共50个卷积核 总参数量 (5*5+1)*50=1300 池化核 2x2, 步长2 输出维度分析: 卷积后变为(-1, 50, 5-5+1, 5-5+1)=(-1, 50, 1, 1) 池化这边感觉其实不必要在池化了图像特征图尺度已经为1了没必要再池化,池化过程应该是通过padding的方式进行保持了图像的大小(-1, 50, 1, 1) 4) FC layer 输出(-1, 10) 这边应该涉及到三个操作: Flatten、FC、Softmax 其中只有FC有训练参数 总参数量 (50+1)*10=510 整个网络参数量: 3630 输出维度分析: Flatten后(-1, 50) FC后(-1, 10) Softmax后(-1,10) 网络总参数520+1300*2+510=3630
展开

补充:BN的作用是层内实现缓解Internal Covariate Shift问题,使得各层权重参数分布的均值方差落在一定范围内,相当于一个全局归一化层,可以使用大的学习率,从而加快训练速度,对于比较深的网络有无batch-normalization有较大的影响

1
#8130******50回复于2019-11

我是小白,对于第4题的一些见解

1.使用的测试照片与原训练数据集中相似度本身比较高的,识别比较准。

2.测试照片中物体与背景反差不是很大时,识别不准

3.测试照片中的物体只是某种物体局部的话,识别不准

4.存在逆光照片的话识别不准,与照片拍摄时场景/光线有很大的关系

5.本身训练模型的准确率

6.训练集和测试集的划分不合理等问题

7.训练集中没有我测试图片相关的训练数据

我大概只能说出这么多,基本上是我进行大量替换照片进行测试后得出的结果,其他几道题比较偏理论分析,我会继续加油补上相关的基础知识的,嘻嘻

2
#7星光ld1回复于2019-11

回答比较长,这边先放上第一问:

1. 网络结构:
1) 首层输入
输入层,输出(-1, 3, 32, 32)
参数量 0
2) 第一卷积池化batch-normalization
Conv+Pool+Bacth,输出(-1, 20, 14, 14)
这边有三个操作分别是卷积、池化、批归一化
其中只有卷积操作有训练参数
卷积核为 5x5,共20个卷积核
总参数量 (5*5+1)*20=520
池化核 2x2, 步长2
输出维度分析:
卷积后变为(-1, 20, 32-5+1, 32-5+1)=(-1, 20, 28, 28)
池化后变为(-1, 20, 28/2, 28/2)=(-1, 20, 14, 14)
批归一化后维度不变(-1, 20, 14, 14)
3) 第二卷积池化batch-normalization
Conv+Pool+Bacth,输出(-1, 50, 5, 5)
这边有三个操作分别是卷积、池化、批归一化
其中只有卷积操作有训练参数
卷积核为 5x5,共50个卷积核
总参数量 (5*5+1)*50=1300
池化核 2x2, 步长2
输出维度分析:
卷积后变为(-1, 50, 14-5+1, 14-5+1)=(-1, 50, 10, 10)
池化后变为(-1, 50, 10/2, 10/2)=(-1, 50, 5, 5)
批归一化后维度不变(-1, 50, 5, 5)
3) 第三卷积池化
Conv+Pool,输出(-1, 50, 1, 1)
这边有两个操作分别是卷积、池化
其中只有卷积操作有训练参数
卷积核为 5x5,共50个卷积核
总参数量 (5*5+1)*50=1300
池化核 2x2, 步长2
输出维度分析:
卷积后变为(-1, 50, 5-5+1, 5-5+1)=(-1, 50, 1, 1)
池化这边感觉其实不必要在池化了图像特征图尺度已经为1了没必要再池化,池化过程应该是通过padding的方式进行保持了图像的大小(-1, 50, 1, 1)
4) FC layer
输出(-1, 10)
这边应该涉及到三个操作:
Flatten、FC、Softmax
其中只有FC有训练参数
总参数量 (50+1)*10=510
整个网络参数量:
3630
输出维度分析:
Flatten后(-1, 50)
FC后(-1, 10)
Softmax后(-1,10)

网络总参数520+1300*2+510=3630

3
快速回复
TOP
切换版块