当前位置: 首页 > news >正文

【Python TensorFlow】进阶指南(续篇一)

在这里插入图片描述

在前两篇文章中,我们介绍了TensorFlow的基础知识及其在实际应用中的初步使用,并探讨了更高级的功能和技术细节。本篇将继续深入探讨TensorFlow的高级应用,包括但不限于模型压缩、模型融合、迁移学习、强化学习等领域,帮助读者进一步掌握TensorFlow的全面应用。

1. 模型压缩与量化

1.1 模型量化

模型量化可以减少模型的大小和计算复杂度,使其更适合在边缘设备上运行。量化通常涉及将浮点数权重转换为较低位宽的整数表示。

import tensorflow as tf
from tensorflow.keras import layers# 创建模型
model = tf.keras.Sequential([layers.Dense(64, activation='relu', input_shape=(10,)),layers.Dense(64, activation='relu'),layers.Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 训练模型
model.fit(x_train, y_train, epochs=5)# 导入量化工具
quantize_model = tf.keras.Sequential([tfmot.quantization.keras.quantize_annotate_layer(layer) for layer in model.layers
])# 应用量化方案
quantize_model = tfmot.quantization.keras.quantize_apply(quantize_model)# 重新编译模型
quantize_model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 量化训练
quantize_model.fit(x_train, y_train, epochs=5)

1.2 模型剪枝

模型剪枝是一种减少模型复杂度的技术,通过移除权重较小的连接来降低模型的参数数量。

import tensorflow_model_optimization as tfmot# 创建剪枝模型
prune_low_magnitude = tfmot.sparsity.keras.prune_low_magnitude# 创建模型
model = tf.keras.Sequential([prune_low_magnitude(layers.Dense(64, activation='relu', input_shape=(10,))),prune_low_magnitude(layers.Dense(64, activation='relu')),prune_low_magnitude(layers.Dense(10, activation='softmax'))
])# 编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 设置剪枝配置
pruning_params = {'pruning_schedule': tfmot.sparsity.keras.PolynomialDecay(initial_sparsity=0.50,final_sparsity=0.90,begin_step=0,end_step=np.ceil(1.6 * len(x_train)),frequency=100)
}# 应用剪枝
model = tf.keras.Sequential([tfmot.sparsity.keras.prune_low_magnitude(layer, **pruning_params) for layer in model.layers
])# 训练剪枝后的模型
model.fit(x_train, y_train, epochs=5)
2. 模型融合与集成

2.1 Stacking Ensemble

Stacking Ensemble 是一种集成学习方法,通过将多个模型的输出组合起来形成新的特征,然后使用另一个模型来预测最终结果。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
from sklearn.ensemble import StackingClassifier# 定义基模型
def base_model():model = Sequential()model.add(Dense(64, activation='relu', input_shape=(10,)))model.add(Dense(10, activation='softmax'))model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])return model# 创建基模型实例
base_models = [KerasClassifier(build_fn=base_model, epochs=5) for _ in range(3)]# 创建集成模型
meta_model = KerasClassifier(build_fn=base_model, epochs=5)
stacked_model = StackingClassifier(estimators=[('model%d' % i, model) for i, model in enumerate(base_models)],final_estimator=meta_model)# 训练集成模型
stacked_model.fit(x_train, y_train)# 验证集成模型
score = stacked_model.score(x_test, y_test)
print("Stacked Ensemble accuracy:", score)
3. 迁移学习

3.1 使用预训练模型

迁移学习通过使用已经在大量数据上预训练的模型,可以节省大量的训练时间和资源。TensorFlow 提供了许多预训练模型,如 VGG16、InceptionV3 等。

from tensorflow.keras.applications import VGG16# 加载预训练模型
vgg16 = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))# 冻结预训练层
for layer in vgg16.layers:layer.trainable = False# 构建新模型
model = tf.keras.Sequential([vgg16,layers.Flatten(),layers.Dense(256, activation='relu'),layers.Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 训练模型
model.fit(x_train, y_train, epochs=5)# 评估模型
score = model.evaluate(x_test, y_test)
print("Transfer Learning accuracy:", score[1])

3.2 Fine-Tuning

Fine-Tuning 是另一种迁移学习方法,通过解冻部分预训练层并重新训练这些层来适应新的任务。

from tensorflow.keras.applications import VGG16# 加载预训练模型
vgg16 = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))# 解冻最后一部分卷积层
for layer in vgg16.layers[:-4]:layer.trainable = False# 构建新模型
model = tf.keras.Sequential([vgg16,layers.Flatten(),layers.Dense(256, activation='relu'),layers.Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 训练模型
model.fit(x_train, y_train, epochs=5)# 评估模型
score = model.evaluate(x_test, y_test)
print("Fine-Tuning accuracy:", score[1])
4. 强化学习

4.1 DQN(Deep Q-Network)

强化学习是机器学习的一个重要分支,旨在让智能体通过与环境交互来学习最优策略。DQN 是一种基于深度学习的强化学习算法。

import tensorflow as tf
from tensorflow.keras import layers# 创建 Q-Network
model = tf.keras.Sequential([layers.Dense(24, activation='relu', input_shape=(4,)),layers.Dense(24, activation='relu'),layers.Dense(2, activation='linear')  # 输出动作空间大小
])# 编译模型
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
loss = tf.keras.losses.Huber()# 更新 Q-Network 参数
@tf.function
def update_target_network(main_network, target_network, tau=1.0):for main_weights, target_weights in zip(main_network.trainable_variables, target_network.trainable_variables):target_weights.assign(tau * main_weights + (1.0 - tau) * target_weights)# 训练 DQN
def train_dqn(state, action, reward, next_state, done):# 计算目标 Q 值target_q_values = target_network(next_state)max_future_q = tf.reduce_max(target_q_values, axis=1)expected_q = reward + (1 - done) * 0.99 * max_future_q# 获取当前 Q 值with tf.GradientTape() as tape:current_q = main_network(state)main_q_values = tf.reduce_sum(current_q * tf.one_hot(action, 2), axis=1)# 计算损失loss_value = loss(expected_q, main_q_values)# 更新 Q-Network 参数gradients = tape.gradient(loss_value, main_network.trainable_variables)optimizer.apply_gradients(zip(gradients, main_network.trainable_variables))# 更新目标网络参数update_target_network(main_network, target_network, tau=0.01)# 初始化主网络和目标网络
main_network = model
target_network = model# 训练循环
for episode in range(100):state = env.reset()done = Falsewhile not done:action = choose_action(main_network, state)next_state, reward, done, _ = env.step(action)train_dqn(state, action, reward, next_state, done)state = next_state
5. 高级主题

5.1 AutoML

AutoML 是一种自动化的机器学习流程,可以自动选择最佳的模型架构和超参数。

import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import RandomizedSearchCV# 定义模型构造函数
def create_model(hidden_layers=[64], learning_rate=0.01):model = tf.keras.Sequential()model.add(layers.Dense(hidden_layers[0], activation='relu', input_shape=(10,)))for units in hidden_layers[1:]:model.add(layers.Dense(units, activation='relu'))model.add(layers.Dense(10, activation='softmax'))model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate),loss='sparse_categorical_crossentropy',metrics=['accuracy'])return model# 创建 KerasClassifier
model = KerasClassifier(build_fn=create_model, epochs=5)# 设置超参数搜索空间
param_dist = {'hidden_layers': [[64], [64, 64], [128, 64]],'learning_rate': [0.01, 0.001, 0.0001]
}# 使用 RandomizedSearchCV 进行超参数搜索
search = RandomizedSearchCV(estimator=model, param_distributions=param_dist, n_iter=10, cv=3, verbose=1)
search.fit(x_train, y_train)# 输出最佳模型
best_model = search.best_estimator_
score = best_model.score(x_test, y_test)
print("AutoML accuracy:", score)

5.2 模型解释

模型解释是理解模型预测背后逻辑的关键步骤,可以帮助提升模型的信任度和透明度。

import shap# 使用 SHAP 解释模型
explainer = shap.KernelExplainer(model.predict_proba, x_train[:100])
shap_values = explainer.shap_values(x_test[:10])# 可视化 SHAP 值
shap.summary_plot(shap_values, x_test[:10], plot_type="bar")
6. 生产环境中的模型管理

6.1 模型版本控制

在生产环境中,管理不同版本的模型非常重要,可以使用模型存储库来记录模型的每次迭代。

import mlflow# 初始化 MLflow
mlflow.tensorflow.autolog()# 创建实验
mlflow.set_experiment("my-experiment")# 记录模型
with mlflow.start_run():model.fit(x_train, y_train, epochs=5)model.evaluate(x_test, y_test)# 查看实验结果
mlflow.ui.open_ui()

6.2 模型监控与评估

在模型上线后,持续监控模型的表现和评估其效果是非常重要的。

import tensorflow as tf
from tensorflow.keras import layers# 创建模型
model = tf.keras.Sequential([layers.Dense(64, activation='relu', input_shape=(10,)),layers.Dense(64, activation='relu'),layers.Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 使用 TensorBoard 监控模型
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="logs")# 训练模型
model.fit(x_train, y_train, epochs=5, callbacks=[tensorboard_callback])# 启动 TensorBoard
!tensorboard --logdir logs
7. 结论

通过本篇的学习,你已经掌握了TensorFlow在实际应用中的更多高级功能和技术细节。从模型压缩与量化、模型融合与集成、迁移学习、强化学习,到高级主题如 AutoML、模型解释,再到生产环境中的模型管理,每一步都展示了如何利用TensorFlow的强大功能来解决复杂的问题。

相关文章:

【Python TensorFlow】进阶指南(续篇一)

在前两篇文章中,我们介绍了TensorFlow的基础知识及其在实际应用中的初步使用,并探讨了更高级的功能和技术细节。本篇将继续深入探讨TensorFlow的高级应用,包括但不限于模型压缩、模型融合、迁移学习、强化学习等领域,帮助读者进一…...

机器视觉和计算机视觉的区别

机器视觉和计算机视觉的区别 1、本质上两者是一样的,都是将光信号转换成电信号,然后交给计算机处理; 2、二者侧重点不同,计算机视觉更偏向研究,更前沿,采集到图像后交给计算机进行分析处理,包括…...

RDD 算子全面解析:从基础到进阶与面试要点

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...

Vue.js动态组件使用

在 Vue.js 中&#xff0c;动态组件是一种功能强大的特性&#xff0c;它允许你在同一个挂载点根据条件动态地切换不同的组件。这通常通过 Vue 的 <component> 元素和 is 特性来实现。以下是如何在 Vue 3 中使用动态组件的详细指南&#xff1a; 基本用法 定义组件&#xf…...

智能合约在供应链金融中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 引言 智能合约概述 定义与原理 发展…...

【大数据技术基础 | 实验十】Hive实验:部署Hive

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;安装部署&#xff08;二&#xff09;配置HDFS&#xff08;三&#xff09;启动Hive 六、实验结果&#xff08;一&#xff09;启动结果&#xff08;二&#xff09;Hive基…...

Golang常见编码

1. URL 编码、解码 2. base64 编码、解码 3. hex 编码、解码 4. md5 编码 5. sha-1 编码 6. sha-256 编码 7. sha-512 编码 package mainimport ("crypto/md5""crypto/sha256""crypto/sha512""encoding/base64""encoding/h…...

搭建Spring gateway网关微服务

在使用微服务架构时&#xff0c;往往我们需要搭建一个网关服务&#xff0c;作为各个微服务的统一入口。Spring gateway作为网关服务的后起之秀&#xff0c;受到各大企业的欢迎。下面介绍下网关服务Spring gateway的搭建。 引入依赖&#xff0c;这一步比较重要&#xff0c;也需要…...

性能测试|JMeter接口与性能测试项目

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…...

spring boot 难点解析及使用spring boot时的注意事项

1、难点解析&#xff1a; 1.1 配置管理&#xff1a; --- 尽管Spring Boot强调“习惯优于配置”&#xff0c;但在实际项目中&#xff0c;仍然需要面对大量的配置问题。如何合理地组织和管理这些配置&#xff0c;以确保项目的稳定性和可维护性&#xff0c;是一个挑战。 --- Sp…...

通过投毒Bingbot索引挖掘必应中的存储型XSS

简介 在本文中&#xff0c;我将讨论如何通过从外部网站对Bingbot进行投毒&#xff0c;来在Bing.com上实现持久性XSS攻击。 什么是存储型或持久性XSS&#xff1f;存储型攻击指的是将恶意脚本永久存储在目标服务器上&#xff0c;例如数据库、论坛、访问日志、评论栏等。受害者在…...

STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55

STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55 前面我们讲述了几种BootLoader中的命令&#xff0c;包括获取软件版本号、获取帮助、获取芯片ID、读取Flash保护Level。 下面我们来介绍一下BootLoader中最重要的功能之一—跳转&#xff01;就像BootLoader词汇中的Boot…...

【Linux篇】面试——用户和组、文件类型、权限、进程

目录 一、权限管理 1. 用户和组 &#xff08;1&#xff09;相关概念 &#xff08;2&#xff09;用户命令 ① useradd&#xff08;添加新的用户账号&#xff09; ② userdel&#xff08;删除帐号&#xff09; ③ usermod&#xff08;修改帐号&#xff09; ④ passwd&…...

PET-文件包含

include发生错误报warning&#xff0c;继续执行。require发生错误直接error&#xff0c;不继续执行 无视扩展名&#xff0c;只要能解析&#xff0c;就能当可执行文件执行&#xff0c;哪怕文件后缀或没后缀 1 条件竞争 pass17 只需要知道tmp的路径。把xieshell.jpg上传&…...

实现uniapp-微信小程序 搜索框+上拉加载+下拉刷新

pages.json 中的配置 { "path": "pages/message", "style": { "navigationBarTitleText": "消息", "enablePullDownRefresh": true, "onReachBottomDistance": 50 } }, <template><view class…...

PostgreSQL 修改字段类型但是存在视图依赖

其实视图的存在与否在数据库界一直是一个话题。用好视图可以简化程序的很多代码&#xff0c;用不好视图不仅会给维护带来很多的不便&#xff0c;也会造成很大的性能问题。下面我从维护方面给出案例&#xff0c;以及当存在这种问题的时候&#xff0c;如何去解决这个问题。 假设…...

基于.NET 9实现实时进度条功能:前后端完整示例教程

要在基于.NET 9的应用中实现进度条功能&#xff0c;我们可以通过HttpContext.Response来发送实时的进度更新到前端。以下是一个简单的示例&#xff0c;展示了如何在ASP.NET Core应用中实现这一功能。 但是&#xff0c;我在.net framework4.7.2框架下&#xff0c;实际不了HttpC…...

力扣 LeetCode 19. 删除链表的倒数第N个结点(Day2:链表)

解题思路&#xff1a; 快慢指针 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy new ListNode(-1);dummy.next head;ListNode fast dummy;ListNode slow dummy;for (int i 0; i < n; i) {fast fast.next;}while (fast.ne…...

音频格式转换

一、场景 项目需求需要App实现声纹识别功能&#xff0c;调用科大讯飞接口&#xff1a; 声纹识别 API 文档 | 讯飞开放平台文档中心 其接口要求音频文件格式为mp3 二、问题产生 在安卓端根据官方文档说明&#xff0c;系统并不支持直接录制mp3格式音频&#xff0c;支持格式如…...

npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系

文章目录 作用示例常用选项示例命令注意事项 1、实战举例**解决方法**1. **锁定唯一的 types/node 版本**2. **清理依赖并重新安装**3. **设置 tsconfig.json 的 types**4. **验证 Promise 类型支持** **总结** npm list types/node 命令用于列出当前项目中 types/node 包及其…...

DeviceNet转Modbus TCP网关的远程遥控接收端连接研究

在港口码头作业中&#xff0c;遥控器因其精确的操作控制和稳定的性能&#xff0c;已成为起重机货物装卸作业的重要辅助工具。然而&#xff0c;在某港口码头实施无线遥控器远程控制掘进机的过程中&#xff0c;由于通信协议的不兼容&#xff0c;遭遇了技术难题。具体而言&#xf…...

开发常用的QT mql组件

Column Column 是一种将其子项沿单个列定位的类型。它是不使用锚点的情况下垂直定位一系列项目的便捷方式。 add : Transition bottomPadding : real leftPadding : real move : Transition padding : real populate : Transition rightPadding : real spacing : rea…...

【docker】容器技术如何改变软件开发与部署格局

在当今数字化时代&#xff0c;软件开发与部署的效率和灵活性至关重要。就像古人云&#xff1a;“工欲善其事&#xff0c;必先利其器。”Docker 作为一款强大的容器技术&#xff0c;正如同软件开发领域的一把利器&#xff0c;极大地改变了应用的开发、交付和运行方式。本文将深入…...

PLC远程控制网关支持多塘口水环境数据边缘计算与远程安全传输的配置指南

一、项目背景 渔业养殖是关系到我国食物安全和海洋经济发展的重要产业&#xff0c;随着科技的不断进步&#xff0c;传统的养殖模式面临着诸多挑战&#xff0c;如养殖环境复杂、水质变化难以实时监测、设备运行状态不稳定等&#xff0c;这些问题不仅增加了养殖成本&#xff0c;还…...

C++11 中 final 和 override 从入门到精通

文章目录 一、引言二、final 关键字2.1 final 关键字的基本概念2.2 final 关键字的语法2.3 final 关键字的使用示例2.3.1 防止类被继承2.3.2 防止虚函数被重写 2.4 final 关键字的使用场景2.5 final 关键字的注意事项 三、override 关键字3.1 override 关键字的基本概念3.2 ove…...

Redis 安装配置和性能优化

目录 简介 一、Redis 基础概念与优势 1.1 关系型与非关系型数据库对比 1.2 Redis 核心特性 二、Redis 部署 2.1 环境准备与源码安装 2.2 服务脚本配置与启动 三、Redis 配置参数 四、Redis 命令工具与常用操作 4.1 命令行工具&#xff08;redis-cli&#xff09; 4.2…...

深入Java NIO:构建高性能网络应用

引言 在上一篇文章中&#xff0c;我们介绍了Java网络编程的基础模型&#xff1a;阻塞式I/O和线程池模型。这些模型在处理高并发场景时存在明显的局限性。本文将深入探讨Java NIO&#xff08;New I/O&#xff09;技术&#xff0c;这是一种能够显著提升网络应用性能的非阻塞I/O模…...

springcloud openfeign 偶现 Caused by: java.net.UnknownHostException

背景 最近查看日志发现某服务偶现Caused by: java.net.UnknownHostException 同时查看eureka的access.log 出现如下异常 10.xxx.xxx.xxx - - [27/May/2025:23:57:29 0800] “PUT /eureka/apps/{appName}/{host}:xxx-job:8082?statusUP&lastDirtyTimestamp1748351637173 H…...

股指期货合约价值怎么算?

股指期货合约价值就是你买一手股指期货合约&#xff0c;理论上值多少钱。这个价值是根据期货的价格和合约乘数来计算的。就好比你买了一斤苹果&#xff0c;价格是5块钱一斤&#xff0c;那你买一斤就得付5块钱。股指期货也是一样&#xff0c;只不过它的计算稍微复杂一点点。 一…...

服务器重启后配置丢失怎么办?

服务器重启后配置丢失是一个常见问题&#xff0c;特别是在云服务器或容器环境中&#xff0c;若未正确保存或持久化配置&#xff0c;系统重启后就会恢复默认状态。下面是问题分析 解决方案&#xff1a; &#x1f9e0; 一、常见原因分析 原因描述❌ 配置保存在临时目录如 /tmp、…...