深度学习总结(41)

article/2025/6/23 16:32:04

微调预训练模型

另一种常用的模型复用方法是微调,如图所示,它与特征提取互为补充。微调是指,对于用于特征提取的已冻结模型基,将其顶部几层“解冻”​,并对这解冻的几层与新增加的部分(本例中为全连接分类器)共同训练。之所以叫作微调,是因为它只略微调整了复用模型中更加抽象的表示,以便让这些表示与手头的问题更加相关。

在这里插入图片描述

图 微调VGG16网络的最后一个卷积块

前面说过,冻结VGG16卷积基是为了能够在上面训练一个随机初始化的分类器。出于同样的原因,只有该分类器已经训练好,才能对卷积基的顶部几层进行微调。如果分类器没有训练好,那么训练过程中通过神经网络传播的误差信号将会非常大,微调的几层之前学到的表示将被破坏。因此,微调的步骤如下。(1)在已经训练好的基网络(base network)上添加自定义网络。(2)冻结基网络。(3)训练新添加的部分。(4)解冻基网络的一些层。​(注意,你不应该解冻“批量规范化”层。VGG16中没有这样的层,所以这里无须过多关注。)(5)共同训练解冻的这些层和新添加的部分。你在做特征提取时已经完成了前3个步骤。我们来完成第4步:先解冻conv_base,然后冻结其中的部分层。提醒一下,卷积基的架构如下所示。

>>> conv_base.summary()
Model: "vgg16"
_________________________________________________________________
Layer (type)                Output Shape              Param #
=================================================================
input_19 (InputLayer)       [(None, 180, 180, 3)]     0
_________________________________________________________________
block1_conv1 (Conv2D)       (None, 180, 180, 64)      1792
_________________________________________________________________
block1_conv2 (Conv2D)       (None, 180, 180, 64)      36928
_________________________________________________________________
block1_pool (MaxPooling2D)  (None, 90, 90, 64)        0
_________________________________________________________________
block2_conv1 (Conv2D)       (None, 90, 90, 128)       73856
_________________________________________________________________
block2_conv2 (Conv2D)       (None, 90, 90, 128)       147584
_________________________________________________________________
block2_pool (MaxPooling2D)  (None, 45, 45, 128)       0
_________________________________________________________________
block3_conv1 (Conv2D)       (None, 45, 45, 256)       295168
_________________________________________________________________
block3_conv2 (Conv2D)       (None, 45, 45, 256)       590080
_________________________________________________________________
block3_conv3 (Conv2D)       (None, 45, 45, 256)       590080
_________________________________________________________________
block3_pool (MaxPooling2D)  (None, 22, 22, 256)       0
_________________________________________________________________
block4_conv1 (Conv2D)       (None, 22, 22, 512)       1180160
_________________________________________________________________
block4_conv2 (Conv2D)       (None, 22, 22, 512)       2359808
_________________________________________________________________
block4_conv3 (Conv2D)       (None, 22, 22, 512)       2359808
_________________________________________________________________
block4_pool (MaxPooling2D)  (None, 11, 11, 512)       0
_________________________________________________________________
block5_conv1 (Conv2D)       (None, 11, 11, 512)       2359808
_________________________________________________________________
block5_conv2 (Conv2D)       (None, 11, 11, 512)       2359808
_________________________________________________________________
block5_conv3 (Conv2D)       (None, 11, 11, 512)       2359808
_________________________________________________________________
block5_pool (MaxPooling2D)  (None, 5, 5, 512)         0
=================================================================
Total params: 14,714,688
Trainable params: 14,714,688
Non-trainable params: 0
_________________________________________________________________

我们将微调最后3个卷积层,也就是说,直到block4_pool的所有层都应该被冻结,而block5_conv1、block5_conv2和block5_conv3这3层应该是可训练的。为什么不对更多的层进行微调?为什么不对整个卷积基进行微调?你当然可以这样做,但需要考虑以下两点。卷积基中较早添加的层编码的是更通用的可复用特征,较晚添加的层编码的则是针对性更强的特征。微调这些针对性更强的特征更有用,因为它们需要在你的新问题上改变用途。微调较早添加的层,得到的回报会更小。训练的参数越多,出现过拟合的风险就越大。卷积基有1500万个参数,在小型数据集上训练这么多参数是有风险的。因此,针对这种情况,一个好的策略是仅微调卷积基最后添加的两三层。我们从上一个例子结束的地方开始,继续实现这种策略,如代码清单所示。

代码清单 冻结除最后4层外的所有层

conv_base.trainable = True
for layer in conv_base.layers[:-4]:layer.trainable = False

下面我们开始微调模型,如代码清单所示。我们将使用学习率很小的RMSprop优化器。之所以将学习率设置得很小,是因为对于微调的3层表示,我们希望其变化幅度不要太大。太大的权重更新可能会破坏这些表示。

代码清单 微调模型

model.compile(loss="binary_crossentropy",optimizer=keras.optimizers.RMSprop(learning_rate=1e-5),metrics=["accuracy"])callbacks = [keras.callbacks.ModelCheckpoint(filepath="fine_tuning.keras",save_best_only=True,monitor="val_loss")
]
history = model.fit(train_dataset,epochs=30,validation_data=validation_dataset,callbacks=callbacks)

最后,我们在测试数据上评估这个模型。

model = keras.models.load_model("fine_tuning.keras")
test_loss, test_acc = model.evaluate(test_dataset)
print(f"Test accuracy: {test_acc:.3f}")

测试精度为98.5%(同样,你得到的结果可能会有不到1%的差距)​。在围绕这个数据集的原始Kaggle竞赛中,这个结果是最佳结果之一。但这样比较并不公平,因为我们使用了预训练特征,这些特征已经包含了关于猫和狗的先验知识,而当时的参赛者无法使用这些特征。从积极的一面来看,利用现代深度学习技术,我们只用了一小部分比赛训练数据(约10%)就得到了这个结果。训练20 000个样本与训练2000个样本是有很大差别的!至此,你已经拥有一套可靠的工具来处理图像分类问题,特别是对于小型数据集。

总结

卷积神经网络是用于计算机视觉任务的最佳机器学习模型。即使在非常小的数据集上从头开始训练一个卷积神经网络,也可以得到不错的结果。卷积神经网络通过学习模块化模式概念的层次结构来表示视觉世界。模型在小型数据集上的主要问题是过拟合。在处理图像数据时**,数据增强是降低过拟合的强大方法。利用特征提取**,可以很容易地将现有的卷积神经网络复用于新的数据集。对于小型图像数据集,这是一种很有用的方法。作为特征提取的补充,你还可以使用微调技术,将现有模型之前学到的一些数据表示应用于新问题。这种方法可以进一步提高模型性能。

三项基本的计算机视觉任务

到目前为止,我们一直专注于图像分类模型:输入一张图片,输出一个标签。​“这张图片里可能有一只猫;那张图片里可能有一只狗。​”但图像分类只是深度学习在计算机视觉领域的诸多应用之一。总体来说,你需要了解以下三项基本的计算机视觉任务。图像分类(image classification)的目的是为图像指定一个或多个标签。它既可以是单标签分类(一张图像只能属于一个类别,不属于其他类别)​,也可以是多标签分类(找出一张图像所属的所有类别)。如果你在谷歌照片应用程序中搜索一个关键词,后台会查询一个非常大的多标签分类模型。这个模型包含20 000多个类别,是在数百万张图像上训练出来的。图像分割(image segmentation)的目的是将图像“分割”或“划分”成不同的区域,每个区域通常对应一个类别。例如,使用软件进行视频通话时,你可以在身后设置自定义背景,它就是用图像分割模型将你的脸和身后的物体区分开,并且可以达到像素级的区分效果。目标检测(object detection)的目的是在图像中感兴趣的目标周围绘制矩形(称为边界框)​,并给出每个矩形对应的类别。例如,自动驾驶汽车可以使用目标检测模型监控摄像头中的汽车、行人和交通标志


http://www.hkcw.cn/article/LYqFHUiqUa.shtml

相关文章

QT入门学习

一: 新建QT项目 二:QT文件构成 2.1 first.pro 项目管理文件,下面来看代码解析 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11TARGET main# The following define makes your compiler emit warnings if you use # any Qt feature …

kaggle 预测房价

利用简单的线性模型,训练kaggle 房屋数据集: import os import random import tarfile import time import zipfile import pandas as pd import requests import torch from torch import nn from torch.utils import data from matplotlib import pyp…

ASP.NET Core SignalR的基本使用

文章目录 前言一、SignalR是什么?在 ASP.NET Core 中的关键特性:SignalR 工作原理简图: 二、使用步骤1.创建ASP.NET Core web Api 项目2.添加 SignalR 包3.创建 SignalR Hub4.配置服务与中间件5.创建控制器(模拟服务器向客户端发送消息)6.创建…

AI书签管理工具开发全记录(七):页面编写与接口对接

文章目录 AI书签管理工具开发全记录(七):页面编写与接口对接前言 📝1. 页面功能规划 📌2. 接口api编写 📡2.1 创建.env,设置环境变量2.2 增加axios拦截器2.3 创建接口 2. 页面编写 📄2.1 示例代…

“AI 编程三国杀” Google Jules, OpenAl Codex, Claude Code,人类开始沦为AI编程发展的瓶颈?

AI 编程三国杀:Google Jules, OpenAI Codex, Claude code “AI 编程三国杀”是一个形象的比喻,借指当前 AI 编程领域中几个主要参与者之间的激烈竞争与并存的局面。这其中,Google、OpenAI 以及 Anthropic (Claude 的开发者) 是重要的“国家”,而它们各自的 AI 编程工具则是…

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 文件事件处理部分)

分析客户端和服务端网络诵信交互实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 命令请求的执行过程案例分析介绍发送命令请求读取命令请求客户端状态的argv属性和argc属性命令执行器第…

第29次CCF计算机软件能力认证-3-LDAP

LDAP 刷新 时间限制: 10.0 秒 空间限制: 512 MiB 下载题目目录(样例文件) 题目背景 西西艾弗岛运营公司是一家负责维护和运营岛上基础设施的大型企业,拥有数千名员工。公司内有很多 IT 系统。 为了能够实现这些…

2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版

1.题目描述 2.思路 输入:旋转后的数组 nums,和一个整数 target 输出:target 在 nums 中的下标,如果不存在,返回 -1 限制:时间复杂度为 O(log n),所以不能用遍历,必须使用 二分查找…

HomeKit 基本理解

概括 HomeKit 将用户的家庭自动化信息存储在数据库中,该数据库由苹果的内置iOS家庭应用程序、支持HomeKit的应用程序和其他开发人员的应用程序共享。所有这些应用程序都使用HomeKit框架作为对等程序访问数据库. Home 只是相当于 HomeKit 的表现层,其他应用在实现 …

秒杀系统—5.第二版升级优化的技术文档三

大纲 8.秒杀系统的秒杀库存服务实现 9.秒杀系统的秒杀抢购服务实现 10.秒杀系统的秒杀下单服务实现 11.秒杀系统的页面渲染服务实现 12.秒杀系统的页面发布服务实现 8.秒杀系统的秒杀库存服务实现 (1)秒杀商品的库存在Redis中的结构 (2)库存分片并同步到Redis的实现 (3…

尚硅谷-尚庭公寓知识点

文章目录 尚庭公寓知识点1、转换器(Converter)2、全局异常3、定时任务1. 核心步骤(1) 启用定时任务(2) 创建定时任务 2. Scheduled 参数详解3. Cron 表达式语法4. 配置线程池(避免阻塞)5. 动态控制任务(高级用法)6. 注意事项 4、M…

字符串~~~

字符串~~ KMP例题1.无线传输2.删除字符串3.二叉树中的链表 AC自动机Manacher例题 扩展KMP字符串哈希 KMP (1) (2) (3) 经典例题 https://leetcode.cn/problems/find-the-index-of-the-first-occurre…

WEB3——简易NFT铸造平台之nft.storage

🧠 1. nft.storage 是什么? https://nft.storage 是 一个免费的去中心化存储平台,由 Filecoin 背后的 Protocol Labs 推出。 它的作用是: ✅ 接收用户上传的文件(图片、JSON 等) ✅ 把它们永久存储到 IPFS…

MCP架构全解析:从核心原理到企业级实践

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…

注销微软账户

若你需要注销微软账号,请点击下方超链接。 点击此处

华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《生成…

Python实现P-PSO优化算法优化BP神经网络分类模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能技术的快速发展,神经网络在分类任务中展现了强大的性能。BP(Back Propagation&…

学习海康VisionMaster之表面缺陷滤波

一:进一步学习了 今天学习下VisionMaster中的表面缺陷滤波:简单、无纹理背景的表面缺陷检测,可以检测表面的异物,缺陷,划伤等 二:开始学习 1:什么表面缺陷滤波? 表面缺陷滤波的核心…

34.x64汇编写法(一)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:33.第二阶段x64游戏实战-InLineHook 首先打开 Visual Studio,然后创…

Java网络编程实战:TCP/UDP Socket通信详解与高并发服务器设计

🔍 开发者资源导航 🔍🏷️ 博客主页: 个人主页📚 专栏订阅: JavaEE全栈专栏 内容: socket(套接字)TCP和UDP差别UDP编程方法使用简单服务器实现 TCP编程方法Socket和ServerSocket之间的关系使用简…