学习笔记-深度学习1.1
简单讲讲VGG,不难知识点也不多,但是很有效。
#经过了5次下采样,所以会从224*224最后得到一个7*7的;然后顶层接三个全连接来实现分类,所以这个模型很好理解。他的改进在哪里?
#他有5个改进:1、结构明显。
2、小的卷积核和多层卷积核是对网络模型比较有好的。VGG用的都是3*3的卷积核,没有其他的:一方面减少参数,另一方面进行了更多的非线性映射,增加网络的拟合和特征提取能力。
证明了用小卷积核是更好的。
3、4、5 小池化,2*2的池化。在尺寸减少时,通道数要提升。
#ppt来自老师的博文CSDN:VGG
#通道数更多如何理解?答:这么理解通道,通道数是特征,RGB是3个颜色特征,但是当通道数增加时,存储的是更高级别的特征,不仅仅是颜色。
#VGG不打算给大家读,因为本身想法比较简单,只是表述不同。但是VGG一定要读。自己读,有问题问。是一个作业。老师不可能永远给大家读论文。作业:1、理论方面:自己读VGG;2、train_sample.py和test.py一定要读,train可以选读。比较新的可视化代码也可以看。
-----------------------------
有时间讲一下googlenet个人觉得思想比较超前。
#先讲VGG代码。
#15行,features和之前的模型处理的不一样。
#这里features别没有在这里讲我们之前的一大串代码实现出来,而是用传参的方式,通过features的组件用传参的方式传进来。这是为什么?--这是因为我们VGG这个架构比较深。比如VGG16里面有16层卷积,如果像之前搭建AlexNet一样写到
这里的话,一般卷积之后有一个激活函数,这样的话就写上去不那么简洁。
#classifier跟之前的一样,后面跟一个sequential。最后23行会输出一个分类的类别num_classes。
#然后26行是初始化,下面37行设定了初始化的方法。这个初始化方法里先判断有多少层,是否是conv2d,如果是的话,用xavier_uniform初始化方法,或者凯明初始化方法。然后判断一下卷积里面有没有偏执,如果有的话就初始化一个0;然后再判断层里面是否有一个全连接,如果有的话也是用一个初始化的方法。当然这里是我们设定的一个initial,你也可以不设定,包括25、26这块代码都可以不要。如果你不要的话我们的模型会自动选择一个初始化方法,他底层会给大家初始化好。
#那很多模型都会选择手动初始化,是为什么?--因为不一样的初始化策略会影响你的模型训练结果,所以有很多模型都是为了刷榜、打比赛经历一个ImageNet,所以他们就会尝试写一个初始化,用不同的初始化来提高自己模型的准确率。
#前向传播过程,首先将图像送进sequential里,然后在打平,然后得到分类结果。
#这里是feature; cfg是参数名字,list是对参数的注解,是列表。cfgs是字典,里面传的是列表。M代表maxpooling就是最大池化层,如果是M就将我们设定好的参数结果传到sequential里面。
对与第一层卷积,输入的通道数量in_channels等于3,输出就是列表里面v的值,第一层卷积VGG11是64,输出通道数就是v=64;然后传kernel_size和padding。这个是VGG11的网络结构。
同理论文里还有VGG13 VGG16 VGG19结构,所以就把这些网络结构都写进列表里。
这里读VGG11还是VGG16...
#问:*是sequential自带的功能吗?
答:不是。一般是跟列表配合使用,会将列表里的没一个元素按顺序读取出来。sequential希望收集到的一堆网络结构,而一堆网络结构是存在列表里的,但不能将列表直接传过来,而是将结构传过来,所以带*
###############################featuremap的可视化#########
这里用alexnet.py来讲可视化,因为大家都比较熟悉这个了
需要稍加一点改动。他改的地方其实是forward函数这里,我们要想去可视化网络层计算得到的featuremap,首先要把它存下来。如何储存? 考虑一下featuremap是什么时候产生的?是不是网络在前向计算的过程当中,他流经卷积层之后才生产的东西,所以如果要存下来的话需要在 forward函数中找到。新建一个空列表,去存储。
features.named_children是pytorch封装好的API,他的作用就是查找网络结构的key-value对。named_children就是将网络结构取出来,为什么是children?因为网络第一层是features和sequential,或者是classifier和sequential,但是我们想取得网络结构是在第二层里。
而self.features是之前搭建网络时定义的东西。
#下面36行:x = module(x) #是指将数据x送到卷积里面得到一个输出结果来;
#37行:判断一下当前key是否是0、3、6,因为第0、3、6层都是卷积;如果是卷积层,将我们的x = module(x)卷积层计算得到的featuremap保存到outputs中。这样都得到了前向计算过程中的三层卷积的featuremap了。
#然后就是查看我们的存的featuremap了。重写一个脚本,这个脚本是查看我们的featuremap的.

浙公网安备 33010602011771号