教程深度学习机器学习【免费下载链接】eat_tensorflow2_in_30_daysTensorflow2.0 is delicious, just eat it! 项目地址https://gitcode.com/gh_mirrors/ea/eat_tensorflow2_in_30_days点击查看免费下载中阶 APIMid-level API是 TensorFlow 层次结构中承上启下的墙它把低阶的张量运算、计算图与自动微分封装成模型层、损失函数、优化器、数据管道、评估指标等可复用组件。本文基于《30天吃掉那个TensorFlow2.0》教程eat_tensorflow2_in_30_days 项目的 Chapter3-2 章节以线性回归模型和 DNN 二分类模型两个完整范例为主线演示中阶 API 的组装方式与训练流程并对照仓库中 Chapter5 系列文档说明各中阶组件的选择依据。读完本文你将能够用layers、losses、metrics、optimizers、tf.data独立搭建并训练回归与分类模型。一、中阶 API 在 TensorFlow 层次中的定位在 Chapter3 中TensorFlow 被划分为五个层次硬件层CPU/GPU/TPU 资源池、C 实现的内核层、Python 编写的低阶算子层、Python 实现的模型组件层、以及面向对象的模型类层。**低阶 API第三层**是砖块tf.Variable、tf.constant、tf.function、tf.GradientTape等张量操作、计算图与自动微分原语**中阶 API第四层**是墙tf.keras.layers模型层、tf.keras.losses损失函数、tf.keras.metrics评估指标、tf.keras.optimizers优化器、tf.data.Dataset数据管道、tf.feature_column特征列等**高阶 API第五层**是房子tf.keras.models中以 OOP 封装好的模型类接口如Sequential、Model详见 Chapter6-1。本文要演示的中阶 API 路线其核心思路是用低阶的tf.GradientTape承担自动微分与手动更新参数的责任但把权重初始化、前向传播、损失计算、梯度下降等重复劳动交给中阶组件完成。与低阶 API 示范Chapter3-1相比代码量显著减少与高阶 API 的model.fitChapter3-3相比又保留了训练循环的完全控制权。二、环境准备与辅助工具中阶 API 范例需要如下导入并定义一个基于tf.function的时间打印辅助函数printbarimport tensorflow as tf # 打印时间分割线 tf.function def printbar(): today_ts tf.timestamp()%(24*60*60) hour tf.cast(today_ts//36008,tf.int32)%tf.constant(24) minite tf.cast((today_ts%3600)//60,tf.int32) second tf.cast(tf.floor(today_ts%60),tf.int32) def timeformat(m): if tf.strings.length(tf.strings.format({},m))1: return(tf.strings.format(0{},m)) else: return(tf.strings.format({},m)) timestring tf.strings.join([timeformat(hour),timeformat(minite), timeformat(second)],separator :) tf.print(*8timestring)printbar全程使用张量运算tf.timestamp、tf.cast、tf.strings.format/join与tf.print而不是 Python 的print因此它可以被tf.function编译进静态图中执行——这是 Autograph 机制详见 Chapter2-2的典型应用把 Python 动态图函数转换为静态图以获得加速同时保留日志输出能力。三、范例一线性回归模型线性回归是最简单的监督学习模型适合用来展示中阶 API 的完整工作流数据管道 → 模型层 → 损失函数 → 优化器 → 训练循环。3.1 准备数据合成数据集 数据管道import numpy as np import pandas as pd from matplotlib import pyplot as plt import tensorflow as tf from tensorflow.keras import layers,losses,metrics,optimizers # 样本数量 n 400 # 生成测试用数据集 X tf.random.uniform([n,2],minval-10,maxval10) w0 tf.constant([[2.0],[-3.0]]) b0 tf.constant([[3.0]]) Y Xw0 b0 tf.random.normal([n,1],mean 0.0,stddev 2.0) # 表示矩阵乘法,增加正态扰动这里用tf.random.uniform生成 400 个二维特征样本真实权重为w0[2.0, -3.0]、偏置为b03.0并通过Xw0 b0线性变换叠加标准差为 2.0 的正态噪声生成标签得到的是带噪的线性关系数据恰好可以检验回归模型能否还原出真实参数。数据可视化横轴为两个特征 x1、x2纵轴为 y%matplotlib inline %config InlineBackend.figure_format svg plt.figure(figsize (12,5)) ax1 plt.subplot(121) ax1.scatter(X[:,0],Y[:,0], c b) plt.xlabel(x1) plt.ylabel(y,rotation 0) ax2 plt.subplot(122) ax2.scatter(X[:,1],Y[:,0], c g) plt.xlabel(x2) plt.ylabel(y,rotation 0) plt.show()接下来用tf.data构建输入数据管道数据管道的完整讲解见 Chapter5-1ds tf.data.Dataset.from_tensor_slices((X,Y)) \ .shuffle(buffer_size 100).batch(10) \ .prefetch(tf.data.experimental.AUTOTUNE)from_tensor_slices把 NumPy/Tensor 张量切分为样本流shuffle(100)打乱缓冲区内样本避免训练顺序引入偏差batch(10)每 10 个样本组成一个小批次mini-batchprefetch(AUTOTUNE)让数据加载与模型计算流水线并行由 TensorFlow 自动决定预取数量减少 GPU/CPU 等待。3.2 定义模型Dense 层 动态挂载损失函数与优化器model layers.Dense(units 1) model.build(input_shape (2,)) #用build方法创建variables model.loss_func losses.mean_squared_error model.optimizer optimizers.SGD(learning_rate0.001)要点分析layers.Dense(units1)是全连接层Chapter5-4输出维度为 1参数数量 输入特征数 × 权重 偏置 2×11 3 个model.build(input_shape(2,))是显式创建变量的关键Dense 层的权重kernel形状 [2,1]与偏置bias形状 [1]只有在知道输入维度后才会被实例化调用build后即可通过model.variables访问model.loss_func、model.optimizer是直接挂在模型实例上的动态属性这不是tf.keras.Model的内置 API而是本教程为展示中阶组件可自由组合而采用的编程风格——模型对象成为参数、损失函数、优化器的集合体回归任务选用均方误差losses.mean_squared_error优化器选用带动量的随机梯度下降optimizers.SGD(learning_rate0.001)优化器选型参考 Chapter5-7。3.3 训练模型GradientTape Autograph 静态图加速# 使用autograph机制转换成静态图加速 tf.function def train_step(model, features, labels): with tf.GradientTape() as tape: predictions model(features) loss model.loss_func(tf.reshape(labels,[-1]), tf.reshape(predictions,[-1])) grads tape.gradient(loss,model.variables) model.optimizer.apply_gradients(zip(grads,model.variables)) return loss # 测试train_step效果 features,labels next(ds.as_numpy_iterator()) train_step(model,features,labels)这是中阶 API 训练循环的标准骨架与低阶 APIChapter3-1的区别在于前向传播由model(features)完成Dense 层内部自动做XWb梯度更新交给optimizer.apply_gradients我们只需用tf.GradientTape()记录梯度即可。细节tf.reshape(labels, [-1])把标签与预测展平为一维保证形状一致才能计算损失model.variables即[kernel, bias]apply_gradients将梯度与变量一一配对更新tf.function把该函数编译为静态图Autograph 机制详见 Chapter2-2大幅减少 Python 与 C 内核之间的通信开销。随后定义完整训练循环每 50 个 epoch 打印一次损失与参数def train_model(model,epochs): for epoch in tf.range(1,epochs1): loss tf.constant(0.0) for features, labels in ds: loss train_step(model,features,labels) if epoch%500: printbar() tf.print(epoch ,epoch,loss ,loss) tf.print(w ,model.variables[0]) tf.print(b ,model.variables[1]) train_model(model,epochs 200)运行输出示例具体数值因随机初始化而略有差异17:01:48 epoch 50 loss 2.56481647 w [[1.99355531] [-2.99061537]] b [3.09484935] 17:01:51 epoch 100 loss 5.96198225 w [[1.98028314] [-2.96975136]] b [3.09501529] 17:01:54 epoch 150 loss 4.79625702 w [[2.00056171] [-2.98774862]] b [3.09567738] 17:01:58 epoch 200 loss 8.26704407 w [[2.00282311] [-2.99300027]] b [3.09406662]注意训练后的权重w收敛到接近真实值[2.0, -3.0]偏置b收敛到接近3.0——这正是对噪声数据可还原真实线性关系的验证单次迭代的loss会在噪声影响下波动因此更应关注参数值而非单个 batch 的损失读数。结果可视化%matplotlib inline %config InlineBackend.figure_format svg w,b model.variables plt.figure(figsize (12,5)) ax1 plt.subplot(121) ax1.scatter(X[:,0],Y[:,0], c b,label samples) ax1.plot(X[:,0],w[0]*X[:,0]b[0],-r,linewidth 5.0,label model) ax1.legend() plt.xlabel(x1) plt.ylabel(y,rotation 0) ax2 plt.subplot(122) ax2.scatter(X[:,1],Y[:,0], c g,label samples) ax2.plot(X[:,1],w[1]*X[:,1]b[0],-r,linewidth 5.0,label model) ax2.legend() plt.xlabel(x2) plt.ylabel(y,rotation 0) plt.show()四、范例二DNN 二分类模型第二个范例把中阶 API 从单层线性模型推进到多层非线性深度模型用tf.Module子类化的方式组装 3 层 Dense 网络完成环形分布的二分任务。4.1 准备数据环形分布合成数据import numpy as np import pandas as pd from matplotlib import pyplot as plt import tensorflow as tf from tensorflow.keras import layers,losses,metrics,optimizers %matplotlib inline %config InlineBackend.figure_format svg #正负样本数量 n_positive,n_negative 2000,2000 #生成正样本, 小圆环分布 r_p 5.0 tf.random.truncated_normal([n_positive,1],0.0,1.0) theta_p tf.random.uniform([n_positive,1],0.0,2*np.pi) Xp tf.concat([r_p*tf.cos(theta_p),r_p*tf.sin(theta_p)],axis 1) Yp tf.ones_like(r_p) #生成负样本, 大圆环分布 r_n 8.0 tf.random.truncated_normal([n_negative,1],0.0,1.0) theta_n tf.random.uniform([n_negative,1],0.0,2*np.pi) Xn tf.concat([r_n*tf.cos(theta_n),r_n*tf.sin(theta_n)],axis 1) Yn tf.zeros_like(r_n) #汇总样本 X tf.concat([Xp,Xn],axis 0) Y tf.concat([Yp,Yn],axis 0) #可视化 plt.figure(figsize (6,6)) plt.scatter(Xp[:,0].numpy(),Xp[:,1].numpy(),c r) plt.scatter(Xn[:,0].numpy(),Xn[:,1].numpy(),c g) plt.legend([positive,negative]);数据生成逻辑正样本红色标签 1半径约 5.0 的小圆环r 5.0 截断正态噪声角度 θ 在 [0, 2π] 均匀采样坐标(r·cosθ, r·sinθ)负样本绿色标签 0半径约 8.0 的大圆环同样方式生成两类样本在二维平面上呈内外两个同心圆环分布线性分类器无法分割天然需要带非线性激活函数的深度网络。构建数据管道本例缓冲区更大、批次为 100ds tf.data.Dataset.from_tensor_slices((X,Y)) \ .shuffle(buffer_size 4000).batch(100) \ .prefetch(tf.data.experimental.AUTOTUNE)4.2 定义模型tf.Module 子类化 input_signatureclass DNNModel(tf.Module): def __init__(self,name None): super(DNNModel, self).__init__(namename) self.dense1 layers.Dense(4,activation relu) self.dense2 layers.Dense(8,activation relu) self.dense3 layers.Dense(1,activation sigmoid) # 正向传播 tf.function(input_signature[tf.TensorSpec(shape [None,2], dtype tf.float32)]) def __call__(self,x): x self.dense1(x) x self.dense2(x) y self.dense3(x) return y model DNNModel() model.loss_func losses.binary_crossentropy model.metric_func metrics.binary_accuracy model.optimizer optimizers.Adam(learning_rate0.001)实现要点通过继承tf.Module而非tf.keras.Model搭建模型layers.Dense会被自动收集为模块的变量容器——这是从低阶向高阶过渡的示范tf.Module是tf.keras.Model的底层基类详见 Chapter4-5网络结构为 4→8→1 的三层全连接前两层用relu提供非线性表达能力最后一层用sigmoid把输出压缩到 (0,1)作为正类概率tf.function(input_signature[...])显式声明输入签名shape[None,2]表示任意 batch 大小、2 维特征dtypetf.float32固定类型。有了签名该函数在首次调用前即可编译为静态图无需先用真实数据触发热身这也是tf.Module可以被tf.saved_model导出为可部署服务Chapter6-6的前提二分类任务选用losses.binary_crossentropy作为损失、metrics.binary_accuracy作为评估指标损失与指标选型详见 Chapter5-5 与 Chapter5-6优化器选用Adam——对初学者而言Adam 搭配默认参数通常是稳妥的首选Chapter5-7。模型定义完成后先用一批数据测试前向传播与指标计算(features,labels) next(ds.as_numpy_iterator()) predictions model(features) loss model.loss_func(tf.reshape(labels,[-1]),tf.reshape(predictions,[-1])) metric model.metric_func(tf.reshape(labels,[-1]),tf.reshape(predictions,[-1])) tf.print(init loss:,loss) tf.print(init metric,metric)输出示例随机初始化下 loss 接近 ln2≈0.693 的随机猜测水平accuracy 接近 0.5init loss: 1.13653195 init metric 0.54.3 训练模型同时返回损失与指标# 使用autograph机制转换成静态图加速 tf.function def train_step(model, features, labels): with tf.GradientTape() as tape: predictions model(features) loss model.loss_func(tf.reshape(labels,[-1]), tf.reshape(predictions,[-1])) grads tape.gradient(loss,model.trainable_variables) model.optimizer.apply_gradients(zip(grads,model.trainable_variables)) metric model.metric_func(tf.reshape(labels,[-1]), tf.reshape(predictions,[-1])) return loss,metric # 测试train_step效果 features,labels next(ds.as_numpy_iterator()) train_step(model,features,labels)与线性回归范例的差异梯度作用于model.trainable_variables而非model.variablestf.Module内部自动区分可训练变量与不可训练变量这里所有 Dense 层权重均可训练二者等价但语义上更严谨train_step同时返回 loss 与 metric便于训练循环中监控准确率首步输出的(tf.Tensor ... numpy1.2033114, tf.Tensor ... numpy0.47)表明在单个 batch 上 loss 与 accuracy 均会抖动属正常现象。def train_model(model,epochs): for epoch in tf.range(1,epochs1): loss, metric tf.constant(0.0),tf.constant(0.0) for features, labels in ds: loss,metric train_step(model,features,labels) if epoch%100: printbar() tf.print(epoch ,epoch,loss ,loss, accuracy ,metric) train_model(model,epochs 60)运行输出示例17:07:36 epoch 10 loss 0.556449413 accuracy 0.79 17:07:38 epoch 20 loss 0.439187407 accuracy 0.86 17:07:40 epoch 30 loss 0.259921253 accuracy 0.95 17:07:42 epoch 40 loss 0.244920313 accuracy 0.9 17:07:43 epoch 50 loss 0.19839409 accuracy 0.92 17:07:45 epoch 60 loss 0.126151696 accuracy 0.95可见 loss 从 1.1 左右逐步下降到 0.13accuracy 从随机水平的 0.5 提升到约 0.95个别 epoch 的准确率波动源于打印的是该 epoch 最后一个 batch 的瞬时值说明三层 DNN 成功学会了区分内外圆环。结果可视化用tf.boolean_mask按预测阈值 0.5 划分正负类fig, (ax1,ax2) plt.subplots(nrows1,ncols2,figsize (12,5)) ax1.scatter(Xp[:,0].numpy(),Xp[:,1].numpy(),c r) ax1.scatter(Xn[:,0].numpy(),Xn[:,1].numpy(),c g) ax1.legend([positive,negative]); ax1.set_title(y_true); Xp_pred tf.boolean_mask(X,tf.squeeze(model(X)0.5),axis 0) Xn_pred tf.boolean_mask(X,tf.squeeze(model(X)0.5),axis 0) ax2.scatter(Xp_pred[:,0].numpy(),Xp_pred[:,1].numpy(),c r) ax2.scatter(Xn_pred[:,0].numpy(),Xn_pred[:,1].numpy(),c g) ax2.legend([positive,negative]); ax2.set_title(y_pred);左图为真实标签分布右图为模型预测分布右图预测结果与左图几乎重合直观印证了模型已经把两个圆环分离开来。五、中阶 API 组件全景从范例到系统认知上述两个范例用到了中阶 API 的五类核心组件仓库 Chapter5 系列文档对每一类都有系统讲解可对照查阅组件本文用法深入参考数据管道tf.datafrom_tensor_slices().shuffle().batch().prefetch()Chapter5-1 Dataset模型层layerslayers.Dense(units, activation)、model.build(input_shape)Chapter5-4 layers损失函数lossesmean_squared_error回归、binary_crossentropy二分类Chapter5-5 losses评估指标metricsbinary_accuracy二分类准确率Chapter5-6 metrics优化器optimizersSGD(0.001)回归、Adam(0.001)分类Chapter5-7 optimizers补充几个与范例直接相关的组件使用要点损失函数与任务匹配回归首选mean_squared_error二分类用binary_crossentropy多分类时若标签为 one-hot 编码用categorical_crossentropy若为序号编码则用sparse_categorical_crossentropy。所有损失函数均有函数式与类式两种实现如binary_crossentropy与BinaryCrossentropy函数式在本文这种手动训练循环中更直接Chapter5-5。评估指标与损失的差异指标不要求连续可导因此AUC、Precision、Recall等只能当指标不能当损失。函数式指标在 epoch 内只做 batch 平均与全量计算存在偏差若追求精确可用类式metrics.Metric继承实现update_state/resultChapter5-6。本例直接使用函数式binary_accuracy打印瞬时值实现最简。优化器的三种使用方式optimizer.apply_gradients(zip(grads, variables))本文方式、optimizer.minimize(loss, var_list)、或把优化器交给model.compile/model.fit高阶 API 方式。注意优化器内部会创建iterations变量记录迭代次数因此优化器必须在tf.function装饰的函数之外创建理由与tf.Variable一致Chapter5-7。Autograph 加速是贯穿始终的关键无论线性模型还是 DNNtrain_step与printbar都用tf.function编译为静态图。静态图几乎全部在 C 内核中执行并会裁剪与结果无关的算子从而获得比逐算子 eager 执行更高的效率Chapter2-2。六、总结中阶 API 的承上启下价值从本文两个范例可以看到中阶 API 的典型分工tf.data负责喂数据layers负责参数与前向传播losses定义优化目标metrics定义评估口径optimizers负责参数更新而tf.GradientTape低阶与tf.functionAutograph作为粘合剂把训练循环串起来。这种手动训练循环 中阶组件的模式比低阶 APIChapter3-1大幅减少了样板代码又比高阶 API 的model.fitChapter3-3保留了灵活度特别适合需要自定义训练逻辑、逐批监控指标或研究新算法的场景。掌握这一层之后再学习 Chapter6 的三种模型构建方法Sequential、Functional、Model 子类化与三种训练方法时就能清楚地理解高阶 API 内部不过是把这些组件按既定流程组织起来而已。赞分享教程深度学习机器学习【免费下载链接】eat_tensorflow2_in_30_daysTensorflow2.0 is delicious, just eat it! 项目地址https://gitcode.com/gh_mirrors/ea/eat_tensorflow2_in_30_days点击查看免费下载相关推荐如何实现TensorFlow损失函数回归与分类问题详解如何实现TensorFlow损失函数回归与分类问题详解 TensorFlow作为目前最流行的机器学习框架之一其强大的 损失函数 功能为各类模型训练提供了关键示例工程contribute-to-open-source从零开始掌握GitHub开源贡献完整指南contribute to open source从零开始掌握GitHub开源贡献完整指南 contribute to open source是一个互动式开源管 50 台远程桌面不慌RDCMan 实操指南管 50 台远程桌面不慌RDCMan 实操指南 周五下午三点你刚打完一轮补丁屏幕上叠着十几个远程桌面窗口其中一个悄悄变灰。你翻了五分钟窗口栏才定位到它运维上一篇Acemcp高级配置技巧如何优化索引性能与搜索结果质量下一篇GitHub Pages企业级静态网站部署架构与性能优化策略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
PaddleSpeech TADEResBlock 源码级解析:Style MelGAN 语音声码器的时序自适应残差模块 人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword… · 2026/9/24 14:44:37
PinchTab 结果验证与陷阱排查指南:从“事件已触发“到“状态已确认“的可靠浏览器自动化 PinchTab 结果验证与陷阱排查指南:从"事件已触发"到"状态已确认"的可靠浏览器自动化 【免费下载链接】pinchtab High-performance browser automation bridge and multi-instance orchestrator with advanced stealth injection and real-time … · 2026/9/24 14:44:31
AI黄瓜病虫害防治机器人 QT 信创完整项目 # AI黄瓜病虫害防治机器人 QT 信创完整项目 ## 项目说明 1. 平台:Qt5.15 / Qt6 兼容(适配银河麒麟、统信UOS信创操作系统) 2. 功能:AI图像识别黄瓜病虫害、机器人运动控制、病害数据库、喷洒作业调度、日志记录、本地模型推理 3. 架构:主窗口+AI推理模块+串口机器人控制+… · 2026/9/24 16:05:46
力扣刷题总结(内容简单,个人记录,有问题请各位大佬评论区指出) 1. 二分法简单题给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums [-1,0,3,5,9,12], target 9
输出: 4… · 2026/9/24 16:05:46
Prisma CLI 集群管理实战:`prisma cluster list` 命令详解与集群注册表机制剖析 Prisma CLI 集群管理实战:prisma cluster list 命令详解与集群注册表机制剖析 【免费下载链接】prisma1 💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated] 项目地址: https://gitcode.com/gh_mirr… · 2026/9/24 16:05:40
fast-compress-cj 实战手册:Snappy 类全 API 详解,从字符串到多类型数组全覆盖 fast-compress-cj 实战手册:Snappy 类全 API 详解,从字符串到多类型数组全覆盖 【免费下载链接】fast-compress-cj 一个快速的压缩/解压缩库 项目地址: https://gitcode.com/Cangjie-TPC/fast-compress-cj
fast-compress-cj 是谷歌 Snappy 压缩算… · 2026/9/24 16:05:40
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44