深度学习之迁移学习

news2024/11/26 10:30:47

数据增强 

数据太少可能会过拟合

# data_transforms中指定了所有图像预处理(变换)操作(图像数据增强)
data_transforms = {
    'train': transforms.Compose([transforms.RandomRotation(45),  # 随机旋转,-45到45度之间随机选
                                 transforms.CenterCrop(224),  # 从中心开始裁剪,裁剪成224*224大小的(因为VGG、Resnet这些经典网络都是用此大小)
                                 transforms.RandomHorizontalFlip(p=0.5),  # 随机水平翻转,即有50%的概率翻转
                                 transforms.RandomVerticalFlip(p=0.5),  # 随机垂直翻转
                                 transforms.ColorJitter(brightness=0.2, contrast=0.1, saturation=0.1, hue=0.1),
                                 # 参数1为亮度,参数2为对比度,参数3为饱和度,参数4为色相
                                 transforms.RandomGrayscale(p=0.025),  # 概率转换成灰度率,如果原来是彩色图,转换后依旧是3通道只是R=G=B
                                 # 转成Tensor格式
                                 transforms.ToTensor(),
                                 # 因为别人的模型标准化了,所以我们拿他的均值,标准差来标准化
                                 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
                                 ]),
    'valid': transforms.Compose([transforms.Resize(256),
                                 transforms.CenterCrop(224),
                                 transforms.ToTensor(),
                                 # 验证集的均值和标准差要和测试集一致
                                 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
                                 ]),
}

 

常用网络模型

VGG-16

首先是VGG ,也叫作 VGG-16 网络。它 没有那么多超参数,是一种只需要专注于构建卷积层的简单网络。
首先用 3×3 ,步幅为 1 的过滤器构建卷积层, padding 参数为 same 卷积(意为卷积之后输出的feature map尺寸保持不变(相对于输入图片) )中的参数。然后用 一个 2×2 ,步幅为 2 的过滤器构建最大池化层。因此 VGG 网络的一大优点是它确实简化了神经网络结构,下面我们具体讲讲这种网络结构。
 
假设要识别这个图像,在最开始的两层用 64 3×3 的过滤器对输入图像进行卷积,输出结果是 224×224×64 ,因为使用了 same 卷积,通道数量也一样。 VGG-16 其实是一个很深的网络,这里并没有把所有卷积层都画出来。
 
假设这个小图是我们的输入图像,尺寸是 224×224×3 ,进行第一个卷积之后得到224×224×64 的特征图,接着还有一层 224×224×64 ,得到这样 2 个厚度为 64 的卷积层,意味着我们用 64 个过滤器进行了两次卷积。正如我在前面提到的,这里采用的都是大小为3×3,步幅为 1 的过滤器,并且都是采用 same 卷积,所以我就不再把所有的层都画出来了, 只用一串数字代表这些网络。接下来创建一个池化层,池化层将输入图像进行压缩,从 224×224×64 缩小到多少呢?
没错,减少到 112×112×64 。然后又是若干个卷积层,使用 129 个过滤器,以及一些 same卷积,我们看看输出什么结果,112×112×128.然后进行池化,可以推导出池化后的结果是这样(56×56×128 )。接着再用 256 个相同的过滤器进行三次卷积操作,然后再池化,然后再卷积三次,再池化。如此进行几轮操作后,将最后得到的 7×7×512 的特征图进行全连接操作,得到 4096 个单元,然后进行 softmax 激活,输出从 1000 个对象中识别的结果。
 
VGG-16 的这个数字 16 ,就是指在这个网络中包含 16 个卷积层和全连接层。确实是个很大的网络,总共包含约 1.38 亿个参数,即便以现在的标准来看都算是非常大的网络。但 VGG-16 的结构并不复杂,这点非常吸引人,而且这种网络结构很规整,都是几个卷积层后面跟着可以压缩图像大小的池化层,池化层缩小图像的高度和宽度。同时,卷积层的过滤器数量变化存在一定的规律,由 64 翻倍变成 128 ,再到 256 512 。作者可能认为 512 已经足够大了,所以后面的层就不再翻倍了。无论如何,每一步都进行翻倍,或者说在每一组卷积层进行过滤器翻倍操作,正是设计此种网络结构的另一个简单原则。
这种相对一致的网络结构对研究者很有吸引力,而它的主要缺点是需要训练的特征数量非常巨大。
 
  VGG-19 网络,它甚至比 VGG-16 还要大,但由于 VGG-16 的表现几乎和 VGG-19 不分高下,所以很多人还是会使用 VGG-16VGG-16随着网络的加深,图像的高度和宽度都在以一定的规律不断缩小,每次池化后刚好缩小一半,而通道数量在不断增加,而且刚好也是在每组卷积操作后增加一倍。也就是说,图像缩小的比例和通道数增加的比例是有规律的。

残差网络(ResNets)

因为层数越多可能会反而出现效果更差的效果,为了降低其中不好的层的影响(即相当于权重置0去掉),可以“跳跃连接”跳过这层直接连到下一层,这样深度越深总会达到更好的效果。

非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。跳跃连接( Skip connection ),它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳跃连接构建能够训练深度网络的 ResNets ,有时深度能够超过 100 层。
ResNets 是由残差块( Residual block )构建的,首先解释一下什么是残差块。

在上面这个图中,我们也可以画一条捷径,直达第二层。实际上这条捷径是在进行 ReLU 非线性激活函数之前加上的,而这里的每一个节点都执行了线性函数和 ReLU 激活函数。所以𝑎 [𝑙] 插入的时机是在线性激活之后, ReLU激活之前。除了捷径,另一个术语“ 跳跃连接”,就是指 𝑎 [𝑙] 跳过一层或者好几层,从而将信息传递到神经网络的更深层。
使用残差块能够训练更深的神经网络。 所以构建一个 ResNet 网络就是通过将很多这样的残差块堆积在一起,形成一个很深神经网络,我们来看看这个网络。

这并不是一个残差网络,而是一个普通网络(Plain network)。

把它变成 ResNet 的方法是加上所有跳跃连接,正如前一张幻灯片中看到的,每两层增加一个捷径,构成一个残差块。如图所示,5 个残差块连接在一起构成一个残差网络。

如果我们使用标准优化算法训练一个普通网络,比如说梯度下降法,或者其它热门的优化算法。如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。也就是说,理论上网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。
但有了 ResNets 就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达 100 层的网络也不例外。有人甚至在1000 多层的神经网络中做过实验,尽管目前我还没有看到太多实际应用。但是对𝑥 的激活,或者这些中间的激活能够到达网络的更深层。这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越来深,网络连接会变得臃肿,但是 ResNet 确实在训练深度网络方面非常有效。

迁移学习

为什么要迁移学习?

  • 相关数据太少,训练的模型不好
  • 训练网络模型时调参花费时间太长
  • 训练大型模型的时间所需太多

迁移学习就是将他人已经训练好要达到类似目标的模型(比如自己想做车的分类,就拿他人车的分类模型)的参数(即权重参数、偏置参数等)拿过来初始化(不用简单的随机初始化了)。

 

举个例子, ImageNet 数据集,它有 1000 个不同的类别,因此这个网络会有一个 Softmax 单元,它可以输出 1000 个可能类别之一。
我们可以去掉这个 Softmax 层,创建自己的 Softmax 单元,用来输出 Tigger Misty neither 三个类别。就网络而言,建议把所有的层看作是冻结的,冻结网络中所有层的参数,只需要训练和你的 Softmax 层有关的参数。这个 Softmax 层有三种可能的输出, Tigger Misty 或者都不是。
通过使用其他人预训练的权重,很可能得到很好的性能,即使只有一个小的数据集。幸运的是,大多数深度学习框架都支持这种操作,事实上,取决于用的框架,它也许会trainableParameter=0 这样的参数,对于这些前面的层,你可能会设置这个参数。为了不训练这些权重,有时也会freeze=1 这样的参数。不同的深度学习编程框架有不同的方式,允许你指定是否训练特定层的权重。在这个例子中,我们只需要训练 softmax 层的权重,把前面这些层的权重都冻结。

另一个技巧,也许对一些情况有用,由于前面的层都冻结了,相当于一个固定的函数,不需要改变。因为不需要改变它,也不训练它,取输入图像𝑋 ,然后把它映射到这层(softmax 的前一层)的激活函数。所以这个能加速训练的技巧就是,如果我们先计算这一层(紫色箭头标记),计算特征或者激活值,然后把它们存到硬盘里。你所做的就是用这个固定的函数,在这个神经网络的前半部分(softmax 层之前的所有层视为一个固定映射),取任意输入图像𝑋 ,然后计算它的某个特征向量,这样你训练的就是一个很浅的 softmax 模型,用这个特征向量来做预测。对计算有用的一步就是对自己训练集中所有样本的这一层的激活值进行预计算,然后存储到硬盘里,然后在此之上训练 softmax 分类器。所以,存储到硬盘或者说预计算方法的优点就是,你不需要每次遍历训练集再重新计算这个激活值了。
因此如果任务只有一个很小的数据集,可以这样做。要有一个更大的训练集怎么办呢?根据经验,如果有一个更大的标定的数据集,也许有大量的 Tigger Misty的照片,还有两者都不是的,这种情况,应该冻结更少的层,比如只把这些层冻结,然后训练后面的层。如果输出层的类别不同,那么需要构建自己的输出单元,Tigger Misty 或者两者都不是三个类别。有很多方式可以实现,我们可以取后面几层的权重,用作初始化,然后从这里开始梯度下降。

或者可以直接去掉这几层,换成自己的隐藏单元和你自己的 softmax 输出层,这些方法值得一试。但是有一个规律,如果有越来越多的数据,需要冻结的层数越少,能够训练的层数就越多。这个理念就是,如果你有一个更大的数据集,也许有足够多的数据,那么不要单单训练一个 softmax 单元,而是考虑训练中等大小的网络,包含你最终要用的网络的后面几层。
最后,如果有大量数据,我们应该做的就是用开源的网络和它的权重,把这所有的权重当作初始化,然后训练整个网络。再次注意,如果这是一个 1000 节点的 softmax ,而我们只有三个输出,需要自己的 softmax 输出层来输出你要的标签。如果有越多的标定的数据,或者越多的 Tigger Misty 或者两者都不是的图片,可以训练越多的层。极端情况下,我们可以用下载的权重只作为初始化,用它们来代替随机初始化,接着可以用梯度下降训练,更新网络所有层的所有权重。这就是卷积网络训练中的迁移学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地测试使用自签名证书以开启网站https(例子说明:Nginx、Tomcat)

文章目录 数字证书简介工作原理证书链获取SSL证书和自签名证书前提条件创建根 CA 证书1.生成 RSA 私钥2.生成根证书签名请求(CSR)3.生成自签根证书 创建服务器证书1.创建服务器 RSA 私钥2.创建 CSR(证书签名请求)3.使用 CSR 和私钥…

Requestly工具快速提升前端开发与测试的效率

痛点 前端测试 在进行前端页面开发或者测试的时候,我们会遇到这一类场景: 在开发阶段,前端想通过调用真实的接口返回响应在开发或者生产阶段需要验证前端页面的一些 异常场景 或者 临界值 时在测试阶段,想直接通过修改接口响应来…

字节跳动的网络工程师,是什么神仙存在?

大家好,我是老杨。 要是说起网络工程师的待遇天花板,你觉得会是什么样的? 在2022年,互联网大厂虽然裁了很多人,但却刺激了更多人想要进入大厂,一探究竟。 就从网工这个岗位来说,你说大小厂的…

Linux文本三剑客之awk)

Linux文本三剑客之awk 一、awk的简介二、awk的工作原理三、命令格式四、实例1、按行输出文本2、BEGIN模式和END模式3、按字段输出文本4、通过管道,双引号调用shell命令5、date的用法6、getline的用法7、awk数组 一、awk的简介 awk是一种处理文本文件的语言&#xf…

C++STL——哈希

哈希 unordered系列关联式容器unordered_set与unordered_mapset VS unordered_set 底层结构哈希概念与哈希冲突哈希冲突的解决闭散列——开放定址法开散列——哈希桶 模拟实现unordered_set与unordered_map其他哈希函数哈希的应用哈希切割(面试题)位图位…

如何把容器变成物理机

如何把容器变成物理机 本文的主题是把容器变成物理机,根据所学的知识。以及通过各种搜索引擎。他们都告诉我们,这是不可能的。这真的是不可能的吗?我不信,那我就要创造奇迹。请继续往下看。本文将教你如何把容器变成物理机。 这…

java多线程_01

文章目录 1. 线程的概念1. 程序2. 进程3. 线程4. Java程序的运行原理5. 并发与并行概念1. 并发2. 并行3. 并发编程和并行编程 2. Java中的Thread线程类1. Thread类构造方法2. Thread类普通方法3. Thread类静态方法4. Thread类特殊方法 3.线程的创建方式1. 继承Thread类2. 实现R…

C++ 仿函数(一)

目录 一、仿函数是什么? 二、仿函数的特点 1.仿函数在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值 2.仿函数超出普通函数的概念,可以有自己的状态 ​编辑3.仿函数可以作为参数传递。 三、谓词 一元谓词示例&a…

38【源码】数据可视化:基于 Echarts + Python 动态实时大屏 - 全国图书零售监测数据

效果图展示 1.动态效果演示 2.静态切片效果图 一、确定需求方案 1.确定产品上线部署的屏幕LED分辨率 本案例基于16:9 屏宽比,F11全屏显示。 2.部署方式 浏览器打开播放,Chrome浏览器、360浏览器等。 二、整体架构设计 前端基于 Echarts开源库设计…

leetcode27.移除元素

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【LeetCode】 🍓希望我们一起努力、成长,共同进步。 👉题目链接 题目描述 给你一个数组 nums 和一个…

从0开始学习数据库(持续更新)

一个数据库最重要的部分是什么? 关系型数据库mysql有着四大特性,原子性,隔离性,一致性,持久性。 kv数据库有着原子性,持久性,弱一致性。 可见,不管数据库的存储引擎是什么&#xff0…

LeetCode_递归_中等_138.复制带随机指针的链表

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random,该指针可以指向链表中的任何节点或空节点。 构造这个链表的深拷贝。 深拷贝应该正好由 n 个全新节点组成&#…

vector源码解析及扩容优化

一、vector源码解析 没有任何一个东西可以在原地扩充,因为要了一块内存后,后面这块内存有可能被使用了,或者能不能用也不知道。链表可以保留原有节点,再将指针指向别处开辟的新内存,但这个也不算原地扩充。 对于vecto…

不需要等待列表,也不用魔法上网的Claude,能否比肩ChatGPT?

近期,国外Anthropic公司发布了Claude聊天机器人,堪比ChatGPT的最大竞争对手。一经推出,市场上就经常拿它俩来对比,因为推出Claude产品的Anthropic 公司是由多位前OpenAI前员工组成,两家公司,以及他们推出的…

ssm框架之SpringMVC:乱码问题

一种修改tomcat配置文件 如果tomcat乱码修改Tomcat的conf的server.xml文件加上 URIEncoding“UTF-8” 添加一个URIEncoding“UTF-8” tomcat 如果7.0 不这样设置,无论get还是post后台都显示乱码。tomcat如果是8.0版本,只有post后台显示是乱码 一种过滤…

Redis进阶

主要内容 Redis持久化Redis主从Redis哨兵Redis分片集群 Redis持久化 Redis有两种持久化的方案: RDB持久化AOF持久化 1. RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所…

HTML基本知识与常用标签的使用以及实现一个HTML版本个人简历

文章目录 HTML1. HTML结构1.1 认识标签1.1.2 HTML文件结构 2. HTML常见标签2.1 注释标签2.2 标题标签2.3 段落标签2.4 换行标签2.5 格式化标签2.6 图片标签2.7 超链接标签2.8 表格标签2.9 列表标签2.10 表单标签2.11 label 标签2.12 select 标签2.13 textarea 标签2.14 无语义标…

[架构之路-200]- 性能需求与性能分析:影响性能的主要因素

目录 前言:关于性能的几点说明 第一章 性能需求:提出各种性能指标 1.1 可靠性或可用性: stablity 1.2 处理能力或效率: Performance 1.2.1 指标是吞吐率 1.2.2 指标是响应时间: 1.2.3 指标是资源利用率 1.3 高并发性 1.…

FreeRTOS开启任务调度函数xPortStartScheduler详解

在FreeRTOS中,创建完任务后需要调用vTaskStartScheduler开启调度器,在这个函数主要就是创建空闲任务然后调用xPortStartScheduler函数开启任务的调度,本篇文章就以Cortex-M7为例来分析一下这个函数具体做了什么事,并深入理解其中的…

文献阅读:A Lite Distributed Semantic Communication System for Internet of Things

目录 动机:为什么作者想要解决这个问题?贡献:作者在这篇论文中完成了什么工作(创新点)?规划:他们如何完成工作?理由:通过什么实验验证它们的工作结果自己的看法 动机:为什么作者想要…