深度学习总结(40)

article/2025/6/15 5:52:07

有以下两种方法可供选择。在我们的数据集上运行卷积基,将输出保存为NumPy数组,并保存在硬盘上,然后将这个数组输入到一个独立的密集连接分类器中​。这种方法速度快,计算代价低,因为对于每张输入图像只需运行一次卷积基,而卷积基是当前流程中计算代价最高的。但出于同样的原因,这种方法无法使用数据增强。在已有模型(conv_base)上添加Dense层,并在输入数据上端到端地运行整个模型。这样就可以使用数据增强,因为每张输入图像进入模型时都会经过卷积基。但出于同样的原因,这种方法的计算代价比第一种要高很多。以下分别介绍这两种方法。首先来看第一种方法:将conv_base在数据上的输出保存下来,然后将这些输出作为新模型的输入。不使用数据增强的快速特征提取我们将在训练集、验证集和测试集上调用conv_base模型的predict()方法,将特征提取为NumPy数组。我们来遍历数据集,提取VGG16的特征和对应的标签,如代码清单所示。

import numpy as npdef get_features_and_labels(dataset):all_features = []all_labels = []for images, labels in dataset:preprocessed_images = keras.applications.vgg16.preprocess_input(images)features = conv_base.predict(preprocessed_images)all_features.append(features)all_labels.append(labels)return np.concatenate(all_features), np.concatenate(all_labels)train_features, train_labels = get_features_and_labels(train_dataset)
val_features, val_labels = get_features_and_labels(validation_dataset)
test_features, test_labels = get_features_and_labels(test_dataset)

重要的是,predict()只接收图像作为输入,不接收标签,但当前数据集生成的批量既包含图像又包含标签。此外,VGG16模型的输入需要先使用函数keras.applications.vgg16.preprocess_input进行预处理。这个函数的作用是将像素值缩放到合适的范围内。提取的特征形状为(samples, 5, 5, 512)。

>>> train_features.shape
(2000, 5, 5, 512)

接下来,我们可以定义密集连接分类器(注意使用dropout正则化)​,并在刚刚保存的数据和标签上训练这个分类器,如代码清单所示。

代码清单 定义并训练密集连接分类器

inputs = keras.Input(shape=(5, 5, 512))
x = layers.Flatten()(inputs)----请注意,将特征传入Dense层之前,需要先经过Flatten层
x = layers.Dense(256)(x)
x = layers.Dropout(0.5)(x)outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)model.compile(loss="binary_crossentropy",optimizer="rmsprop",metrics=["accuracy"])callbacks = [keras.callbacks.ModelCheckpoint(filepath="feature_extraction.keras",save_best_only=True,monitor="val_loss")
]
history = model.fit(train_features, train_labels,epochs=20,validation_data=(val_features, val_labels),callbacks=callbacks)

训练速度非常快,因为只需要处理两个Dense层。即使在CPU上运行,每轮的时间也不到1秒。我们来看一下训练过程中的精度曲线和损失曲线。

在这里插入图片描述

代码清单 绘制结果

import matplotlib.pyplot as plt
acc = history.history["accuracy"]
val_acc = history.history["val_accuracy"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, "bo", label="Training accuracy")
plt.plot(epochs, val_acc, "b", label="Validation accuracy")
plt.title("Training and validation accuracy")
plt.legend()
plt.figure()
plt.plot(epochs, loss, "bo", label="Training loss")
plt.plot(epochs, val_loss, "b", label="Validation loss")
plt.title("Training and validation loss")
plt.legend()
plt.show()

验证精度达到约97%,比从头开始训练的小模型要高得多。但这种对比有失公平,因为ImageNet包含许多狗和猫的样本,也就是说,我们的预训练模型已经拥有完成当前任务所需的知识。在使用预训练的特征时,情况并非总是如此。然而,从图中也可以看出,尽管dropout比率很大,但模型几乎从一开始就出现过拟合。这是因为这种方法没有使用数据增强,而数据增强对防止小型图像数据集的过拟合非常重要。

使用数据增强的特征提取

下面我们来看特征提取的第二种方法。它的速度更慢,计算代价更高,但在训练过程中可以使用数据增强。这种方法就是将conv_base与一个新的密集分类器连接起来以创建一个新模型,然后在输入数据上端到端地训练这个模型。为了实现这一方法,首先要冻结卷积基。冻结一层或多层,是指在训练过程中保持其权重不变。如果不这样做,那么卷积基之前学到的表示将会在训练过程中被修改。因为其上添加的Dense层是随机初始化的,所以在神经网络中传播的权重更新将非常大,会对之前学到的表示造成很大破坏。在Keras中,冻结某层或模型的方法是将其trainable属性设为False,如代码清单所示。

代码清单 将VGG16卷积基实例化并冻结

conv_base = keras.applications.vgg16.VGG16(weights="imagenet",include_top=False)
conv_base.trainable = False

将trainable设为False,这将清空该层或模型的可训练权重列表,如代码清单所示。

代码清单 打印冻结前后的可训练权重列表

>>> conv_base.trainable = True
>>> print("This is the number of trainable weights ""before freezing the conv base:", len(conv_base.trainable_weights))
This is the number of trainable weights before freezing the conv base: 26
>>> conv_base.trainable = False
>>> print("This is the number of trainable weights ""after freezing the conv base:", len(conv_base.trainable_weights))
This is the number of trainable weights after freezing the conv base: 0

现在我们可以创建一个新模型,将以下三部分连接起来,如代码清单所示。(1)一个数据增强代码块(2)已冻结的卷积基(3)一个密集连接分类器代码清单 在卷积基上添加数据增强代码块和分类器

data_augmentation = keras.Sequential([layers.RandomFlip("horizontal"),layers.RandomRotation(0.1),layers.RandomZoom(0.2),]
)inputs = keras.Input(shape=(180, 180, 3))
x = data_augmentation(inputs)----使用数据增强
x = keras.applications.vgg16.preprocess_input(x)----对输入值进行缩放
x = conv_base(x)
x = layers.Flatten()(x)
x = layers.Dense(256)(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.compile(loss="binary_crossentropy",optimizer="rmsprop",metrics=["accuracy"])

如此设置之后,只会训练新添加的2个Dense层的权重。总共有4个权重张量,每层2个(主权重矩阵和偏置向量)​。请注意,为了让这些修改生效,你必须编译模型。如果在编译之后修改权重的trainable属性,那么应该重新编译模型,否则这些修改将被忽略。下面来训练模型。由于使用了数据增强,模型需要更长时间才会开始过拟合,因此可以训练更多轮—这里设为50轮。注意 这种方法的计算代价很高,只有在能够使用GPU的情况下(比如Colab的免费GPU)才可以去尝试。它在CPU上是无法运行的。如果无法在GPU上运行代码,那么应首选第一种方法。

callbacks = [keras.callbacks.ModelCheckpoint(filepath="feature_extraction_with_data_augmentation.keras",save_best_only=True,monitor="val_loss")
]
history = model.fit(train_dataset,epochs=50,validation_data=validation_dataset,callbacks=callbacks)

我们再次绘制结果。可以看到,验证精度达到约98%。这比之前的模型有了很大改进。

在这里插入图片描述

我们来看一下测试精度,如代码清单所示。

代码清单 在测试集上评估模型

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

测试精度为97.5%。与之前相比,这只是一个不大的改进。鉴于模型在验证数据上取得的好结果,这有点令人失望。模型的精度始终取决于评估模型的样本集。有些样本集可能比其他样本集更难以预测,在一个样本集上得到的好结果,并不一定能够在其他样本集上完全复现。


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

相关文章

打造苹果级视差滚动动画:现代网页滚动动画技术详解

目录 实现原理分析 完整实现方案 ​编辑 核心技术解析 1. 视差滚动效果 2. 滚动触发动画 3. 3D透视效果 4. 性能优化技巧 进阶实现方案 设计原则 苹果、华为等顶尖科技公司的官网以其流畅的滚动动画效果著称,这种随着页面滚动而播放的动画能显著提升用户体…

[GHCTF 2025]SQL???

打开题目在线环境: 先尝试注入: id1;show databases; 发现报错,后来看了wp才知道这个题目是SQLite注入。 我看的是这个师傅的wp: https://blog.csdn.net/2401_86190146/article/details/146164505?ops_request_misc%257B%2522request%255Fid…

中国单方面免签“朋友圈”再增5国 拉美五国享便利

从6月1日起,中国对巴西、阿根廷、智利、秘鲁、乌拉圭五个国家的普通护照持有者试行免签政策。这一举措标志着中国的单方面免签“朋友圈”再次扩大。自2025年6月1日至2026年5月31日,这五国的公民来华经商、旅游观光、探亲访友或交流访问时,如果停留时间不超过30天,则无需办理…

Leetcode第451场周赛分析总结

题目链接 竞赛 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 题目解析 A. 3560. 木材运输的最小成本 AC代码 class Solution { public:long long minCuttingCost(int n, int m, int k) {if (n > m) swap(n, m); // n < m;using ll long lon…

Maestro CLI云端测试以及github cl,bitrise原生cl的测试流程

昨天我们了解了maestro测试框架以及maestro studio工具以及创建我们的第一个flow&#xff0c;然后通过例子在maestro cli云端进行测试请求并且成功&#xff0c;今天我们就在我们自己的app上简单的进行三种测试流程&#xff0c;maestro cli云端测试&#xff0c;github cl集成测试…

少年跪地救人 获救者到学校感谢 深情拥抱致谢恩人

5月25日晚,在芜湖市繁昌一中东大门外,中年男子孙修义在路边昏厥。17岁高二学生骆易跪地三分钟,成功施救。5月30日下午,康复出院后的孙修义和妻子俞乃芽来到学校,向救命恩人骆易当面致谢,送上锦旗、感谢信和鲜花。见到骆易时,孙修义眼眶泛红,快步上前将少年拥入怀中,哽…

亚洲篮球冠军联赛完成抽签 小组对决揭晓

北京时间5月31日,2025年FIBA亚洲篮球冠军联赛分组抽签结果公布。浙江广厦男篮与乌兰巴托野马队及塔比亚特队同处A组。A组包括:浙江广厦(中国)、乌兰巴托野马(蒙古)、塔比亚特(伊朗);B组有宇都宫Brex队(日本)、马尼拉电气(菲律宾)、迪拜青年国民(阿联酋);C组则由…

知名黄金机构疑爆雷 有人被套超千万 黄金托管模式风险凸显

近日,浙江永坤控股有限公司(以下简称永坤黄金)出现兑付异常,引发广泛关注。多名投资者反映,无论在线上还是线下购买的黄金都无法提取或退款。永坤黄金提供线上和线下的黄金买卖服务,但大部分时间里,黄金并不在投资者手中,这种模式被称为黄金托管。业内人士指出,这种模…

广州市中心堵船了 龙舟盛景再现珠江

端午节期间,广州CBD上演了一场热闹非凡的龙舟招景仪式。5月31日上午,猎德涌上锣鼓喧天、鞭炮齐鸣,140个兄弟村社的150多条龙船汇聚于此,共庆佳节。这是猎德村近十年来规模最大的一次龙舟招景活动。河涌里舟楫相连,出现了“堵船”的盛况。河涌两岸挤满了围观的市民游客,欢…

用python绘制表格

1. 使用 tabulate 库&#xff08;终端/文本表格&#xff09; 适合在命令行或终端中快速生成简单的文本表格。 # 安装库 pip install tabulate # 示例代码 from tabulate import tabulatedata [["Alice", 28, "Engineer"],["Bob", 32, "…

【图文】VSCode配置与安装(超详细教程版)

目录 一、下载 二、安装 三、设置 四、环境配置&#xff08;随时更新&#xff09; 1.Python配置 一、下载 官网链接&#xff1a;Visual Studio Code - Code Editing. Redefined 点击“Download for Windows”&#xff0c;下载安装包后双击安装。 二、安装 双击下载好的…

【五子棋在线对战】一.前置知识的了解

前置知识的了解 前言1.Websocketpp1.1 使用Websocketpp的原因1.2 Websocket常用接口1.3 Websocket搭建服务器流程 2.JsonCpp2.1 Json 数据对象类的表示2.2序列化和反序列化的接口2.3 演示代码 3.Mysql![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/93305f423b544fc1…

数据中台(大数据平台)之主数据管理

主数据管理是为了确保主数据一致性和准确性而进行的一系列管理活动&#xff0c;包括主数据的收集、存储、分析、更新和共享等&#xff0c;旨在确保一个组织中使用的各个系统都有准确、一致的主数据。 1.主数据编码管理&#xff1a;主数据编码是主数据的唯一标识符。主数据编码…

Leetcode 1908. Nim 游戏 II

1.题目基本信息 1.1.题目描述 Alice 和 Bob 交替进行一个游戏&#xff0c;由 Alice 先手。 在游戏中&#xff0c;共有 n 堆石头。在每个玩家的回合中&#xff0c;玩家需要 选择 任一非空石头堆&#xff0c;从中移除任意 非零 数量的石头。如果不能移除任意的石头&#xff0c…

飞致云开源社区月度动态报告(2025年5月)

自2023年6月起&#xff0c;中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…

湖北秭归:屈原故里过端午 龙舟竞渡展非遗

5月30日,2025年屈原故里传统龙舟大赛在湖北省秭归县茅坪镇徐家冲港湾激情开赛。秭归作为屈原的故乡,也是中国龙舟运动的重要发源地之一,端午节期间赛龙舟、祭屈原的传统习俗一直延续至今。今年的比赛继续展示了“点睛、下水、游江、竞渡、抢红”等传统的龙舟仪式,追溯历史岁…

Target店铺应该如何入驻?

Target作为美国知名的零售巨头&#xff0c;其电商平台为众多商家提供了一个拓展业务、提升品牌知名度的绝佳机会。然而&#xff0c;入驻Target平台并非易事&#xff0c;需要商家满足一系列的条件并支付相应的费用。 以下是&#xff0c;明月跨境&#xff0c;总结出的详细的入驻指…

基于PyQt5 开发的Todo应用

Demo地址&#xff1a;https://gitcode.com/rmbnetlife/todo-app-pyqt.git PyQt Todo 应用 一个使用 PyQt5 开发的现代化任务管理应用&#xff0c;帮助您高效管理日常任务和待办事项。 &#x1f4cb; 应用简介 这是一个功能完整的桌面任务管理应用&#xff0c;具有直观的图形…

springboot集成websocket给前端推送消息

一般通常情况下&#xff0c;我们都是前端主动朝后端发送请求&#xff0c;那么有没有可能&#xff0c;后端主动给前端推送消息呢&#xff1f;这时候就可以借助websocket来实现。下面给出一个简单的实现样例。 首先创建一个websocketDemo工程&#xff0c;该工程的整体结构如下&a…

002医护人员排班系统技术解析:构建高效医疗人力管理平台

医护人员排班系统技术解析&#xff1a;构建高效医疗人力管理平台 在医疗行业高速发展的今天&#xff0c;科学合理的医护人员排班对保障医疗服务质量和效率至关重要。医护人员排班系统作为医疗信息化管理的重要工具&#xff0c;通过整合医院信息管理、医护信息管理、医护类型管…