教程深度学习机器学习【免费下载链接】eat_tensorflow2_in_30_daysTensorflow2.0 is delicious, just eat it! 项目地址https://gitcode.com/gh_mirrors/ea/eat_tensorflow2_in_30_days点击查看免费下载本章导读本文以开源教程仓库 eat_tensorflow2_in_30_days 的 Chapter 3: Hierarchy of TensorFlow 为骨架系统讲解 TensorFlow 自底向上的五层结构——硬件层、C 内核层、低阶 API、中阶 API、高阶 API并分别用线性回归与 DNN 二分类两个模型直观对比同一任务在不同层级下的实现方式。读完本文你将掌握各层 API 的定位、核心接口清单tf.Variable、tf.GradientTape、tf.data.Dataset、tf.keras.layers、tf.keras.models等并能根据场景选择适合自己的建模层级。TensorFlow 的层次结构从低到高可以分成五层。如果把模型比作一栋房子那么低阶 API 是【模型之砖】中阶 API 是【模型之墙】高阶 API 就是【模型之屋】本身。一、五层结构的全景图层级名称实现语言主要内容类比第 1 层硬件层——CPU、GPU、TPU 加入计算资源池地基第 2 层内核层C跨平台分布的 kernel 算子建材第 3 层低阶 APIPython张量操作算子、计算图、自动微分模型之砖第 4 层中阶 APIPython模型层、损失函数、优化器、数据管道、特征列模型之墙第 5 层高阶 APIPythontf.keras.models提供的模型类接口模型之屋1. 第 1 层硬件层最底层为硬件层。TensorFlow 支持将 CPU、GPU 或 TPU 加入计算资源池同一份代码可以通过设备指定在不同硬件上运行。这一层是性能的基础——项目在 第 6 章 中分别演示了单 GPU6-3、多 GPU6-4与 TPU6-5三种训练方式正是对硬件层能力的直接使用。2. 第 2 层C 内核层第二层为 C 实现的内核kernel。这些内核可以跨平台分布运行是真正执行数值计算的部分。TensorFlow 的计算模型是数据流图图中的节点代表算子边代表节点间依赖关系实线表示带张量数据传递的数据依赖虚线表示控制依赖。从源码结构看Python 侧 API 最终都会落到这一层的 C 算子上执行。3. 第 3 层低阶 API模型之砖第三层为 Python 实现的操作符对 C 内核做了封装提供低阶 API 指令主要包括各种张量操作算子tf.Variable、tf.constant计算图tf.function自动微分tf.GradientTape各类算子tf.nn.softmax等如果把模型比作一个房子那么第三层 API 就是【模型之砖】——所有更高层的组件都由它们拼装而来。低阶 API 的核心能力张量结构操作、数学运算、AutoGraph、自动微分在 第 4 章 的 4-1、4-2、4-3、4-4、4-5 中有详细展开。4. 第 4 层中阶 API模型之墙第四层为 Python 实现的模型组件对低阶 API 进行了函数封装主要包括模型层tf.keras.layers损失函数tf.keras.losses评估指标tf.keras.metrics优化器tf.keras.optimizers数据管道tf.data.Dataset特征列tf.feature_column如果把模型比作一个房子那么第四层 API 就是【模型之墙】。这一层的 8 大组件数据管道、特征列、激活函数、模型层、损失函数、评估指标、优化器、回调函数在 第 5 章 的 5-1 至 5-8 中逐一讲解。5. 第 5 层高阶 API模型之屋第五层为 Python 实现的模型成品一般是按照 OOP面向对象方式封装的高级 API主要为tf.keras.models提供的模型类接口。tf.keras.models.Model与tf.keras.layers.Layer实际上都继承自tf.Module可通过issubclass(tf.keras.Model, tf.Module)验证返回 True它们统一管理变量与子模块。如果说前三层提供的是砖和墙这一层交付的就是可以直接居住的【模型之屋】。二、同一个线性回归模型三种层级的写法对比Chapter3-1、Chapter3-2、Chapter3-3 三篇子章节使用完全相同的数据生成方式和同一个线性回归任务分别用低阶、中阶、高阶 API 实现。这是理解层级差异的最佳素材。数据准备三篇共用import tensorflow as tf 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) # 为矩阵乘法并叠加高斯噪声真实模型为Y X·w0 b0w0 [2, -3]b0 3加噪声后用于回归训练。1. 低阶 API手写参数与梯度更新低阶方案在 3-1 中需要手工定义变量、模型、损失函数与更新规则# 手工初始化可训练变量 w tf.Variable(tf.random.normal(w0.shape)) b tf.Variable(tf.zeros_like(b0,dtype tf.float32)) # 用类封装模型的前向计算与损失 class LinearRegression: def __call__(self,x): return xw b def loss_func(self,y_true,y_pred): return tf.reduce_mean((y_true - y_pred)**2/2) model LinearRegression() # 手写一步训练自动微分 梯度下降 def train_step(model, features, labels): with tf.GradientTape() as tape: predictions model(features) loss model.loss_func(labels, predictions) dloss_dw,dloss_db tape.gradient(loss,[w,b]) # 反向传播求梯度 w.assign(w - 0.001*dloss_dw) # 手工实现梯度下降学习率 0.001 b.assign(b - 0.001*dloss_db) return loss注意这里没有使用任何优化器学习率、参数更新全部手工完成数据读取也是用生成器data_iter手工 shuffle 与 batch。训练 200 轮后w 收敛到约 [1.98, -2.98]b 收敛到约 3.01接近真实值。在动态图下调试通过后可以给train_step加上tf.function装饰器由 AutoGraph 将动态图转换为静态图获得加速详见 2-2 三种计算图。2. 中阶 API引入数据管道与优化器中阶方案在 3-2 中数据读取交给tf.data.Dataset损失与优化交给现成函数from tensorflow.keras import layers,losses,metrics,optimizers # 数据管道切片 → 打乱 → 分批 → 预取 ds tf.data.Dataset.from_tensor_slices((X,Y)) \ .shuffle(buffer_size 100).batch(10) \ .prefetch(tf.data.experimental.AUTOTUNE) # 直接使用 Dense 层自动创建 w、b 变量 model layers.Dense(units 1) model.build(input_shape (2,)) # 用 build 创建变量 model.loss_func losses.mean_squared_error model.optimizer optimizers.SGD(learning_rate0.001) 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与低阶版相比tf.data.Dataset用声明式管道替代手写生成器layers.Dense替代手工变量optimizers.SGD的apply_gradients替代w.assign(...)。梯度计算仍显式保留tf.GradientTape这是中阶与低阶共享的砖。3. 高阶 API一行 fit 完成训练高阶方案在 3-3 中建模与训练全部封装进 Keras 高层接口from tensorflow.keras import models,layers tf.keras.backend.clear_session() model models.Sequential() model.add(layers.Dense(1,input_shape (2,))) model.summary() # 输出: dense (Dense) Output Shape (None, 1) Param # 3 model.compile(optimizeradam,lossmse,metrics[mae]) model.fit(X,Y,batch_size 10,epochs 200)200 轮训练后w [[1.99339032], [-3.00866461]]、b [2.67018795]与低阶、中阶结果一致——三种层级殊途同归。区别在于低阶版需要理解梯度、变量、自动微分中阶版需要理解数据管道与优化器高阶版只需要声明式地compilefit学习门槛最低。三、DNN 二分类从低阶到高阶的复杂度迁移三篇子章节还用同一个双环二分类数据集内环半径 5、外环半径 8 的 4000 个样本用tf.random.truncated_normal加噪声、tf.cos/tf.sin生成实现了 DNN 二分类网络结构统一为 2→4→8→1激活函数为 relu sigmoid。1. 低阶版用 tf.Module 手工组织 6 个变量低阶版在 3-1 中直接用tf.Module组织参数tf.Module的用法详见 4-5 AutoGraph 和 tf.Moduleclass DNNModel(tf.Module): def __init__(self,name None): super(DNNModel, self).__init__(namename) self.w1 tf.Variable(tf.random.truncated_normal([2,4]),dtype tf.float32) self.b1 tf.Variable(tf.zeros([1,4]),dtype tf.float32) self.w2 tf.Variable(tf.random.truncated_normal([4,8]),dtype tf.float32) self.b2 tf.Variable(tf.zeros([1,8]),dtype tf.float32) self.w3 tf.Variable(tf.random.truncated_normal([8,1]),dtype tf.float32) self.b3 tf.Variable(tf.zeros([1,1]),dtype tf.float32) tf.function(input_signature[tf.TensorSpec(shape [None,2], dtype tf.float32)]) def __call__(self,x): x tf.nn.relu(xself.w1 self.b1) x tf.nn.relu(xself.w2 self.b2) y tf.nn.sigmoid(xself.w3 self.b3) return y # 二分类交叉熵手工实现并用 clip 防止 log(0) tf.function(input_signature[tf.TensorSpec(shape [None,1], dtype tf.float32), tf.TensorSpec(shape [None,1], dtype tf.float32)]) def loss_func(self,y_true,y_pred): eps 1e-7 y_pred tf.clip_by_value(y_pred,eps,1.0-eps) bce - y_true*tf.math.log(y_pred) - (1-y_true)*tf.math.log(1-y_pred) return tf.reduce_mean(bce) tf.function(input_signature[tf.TensorSpec(shape [None,1], dtype tf.float32), tf.TensorSpec(shape [None,1], dtype tf.float32)]) def metric_func(self,y_true,y_pred): y_pred tf.where(y_pred0.5,tf.ones_like(y_pred,dtype tf.float32), tf.zeros_like(y_pred,dtype tf.float32)) acc tf.reduce_mean(1-tf.abs(y_true-y_pred)) return acc由于继承tf.Module模型可通过model.trainable_variables自动收集全部 6 个可训练变量训练循环用tape.gradient(loss, model.trainable_variables)一次性求梯度、再逐个p.assign(p - 0.001*dloss_dp)更新。600 轮后准确率约 0.96。2. 中阶版Dense 层替代手工矩阵中阶版在 3-2 中网络结构不变但三组手工w/b变量被三个layers.Dense层替代激活函数、损失、指标全部改用现成接口class 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)训练时model.optimizer.apply_gradients(zip(grads,model.trainable_variables))完成更新数据管道改为tf.data.Dataset.from_tensor_slices((X,Y)).shuffle(4000).batch(100).prefetch(AUTOTUNE)。仅 60 轮就达到 0.95 准确率Adam 优化器 更成熟的封装带来的收敛效率差异。3. 高阶版继承 Model 自定义训练循环高阶版在 3-3 中采用两种 Keras 风格线性回归用Sequentialfit入门用法DNN 用继承models.Model的类 自定义训练循环进阶用法并引入了tf.keras.metrics.Mean、tf.keras.metrics.BinaryAccuracy这类有状态指标用update_state/result/reset_states管理同时把数据集划分为训练集与验证集ds_train/ds_valid。1000 轮后训练准确率约 0.959、验证准确率约 0.935。四、三种层级的选型对照维度低阶 API第 3 层中阶 API第 4 层高阶 API第 5 层典型接口tf.Variable、tf.GradientTape、tf.functiontf.data.Dataset、tf.keras.layers、tf.keras.optimizerstf.keras.models、model.fit参数管理手工定义并维护层对象自动管理Model 自动管理梯度更新手工assign优化器apply_gradientscompile后由fit完成训练循环完全手写手写但组件化fit一行 / 自定义循环灵活度最高中低但可用子类化 Model 保留灵活性适用人群框架研究者、自定义算子/训练逻辑常规工业项目快速原型、标准建模流程从源码结构看三层是层层包裹的关系高阶 API 内部依赖中阶组件中阶组件内部由低阶算子与tf.Module拼装而成。因此掌握低阶 API 并不是过时的学习——它决定了你能在多大程度上驾驭tf.function、tf.GradientTape与tf.Module这些整个框架的地基。五、五层结构与教程章节地图本仓库按五层结构组织教程见 SUMMARY_eng.md 的目录树各层对应的深入学习入口第 1 层 硬件层Chapter 6 → 6-3 单 GPU、6-4 多 GPU、6-5 TPU第 2 层 内核层贯穿各章的算子执行可通过 2-2 三种计算图 了解图执行模型第 3 层 低阶 APIChapter 4 → 4-1 张量结构操作、4-2 张量数学运算、4-3 AutoGraph 使用规范、4-4 AutoGraph 机制原理、4-5 AutoGraph 和 tf.Module第 4 层 中阶 APIChapter 5 → 5-1 数据管道 Dataset、5-2 特征列、5-3 激活函数、5-4 模型层、5-5 损失函数、5-6 评估指标、5-7 优化器、5-8 回调函数第 5 层 高阶 APIChapter 6 → 6-1 构建模型的 3 种方法、6-2 训练模型的 3 种方法需要说明的是教程全部代码在 TensorFlow 2.1 环境下测试通过见 README_eng.md 的环境说明不同小版本间的 API 细节可能略有差异运行示例时请以本机 TensorFlow 版本的实际行为为准。结语TensorFlow 的五层结构是一个由地基到成品的完整技术栈硬件层提供算力C 内核层提供跨平台算子Python 低阶 API 提供砖块中阶 API 砌成墙高阶 API 交付房屋。通过线性回归与 DNN 二分类这两个贯穿全文的示例可以直观体会到任务不变变的是封装程度与学习曲线。日常开发中建议以中阶/高阶 API 为默认选择、以低阶 API 为疑难场景的兜底手段而理解五层结构本身正是驾驭 TensorFlow2 的关键一步。赞分享教程深度学习机器学习【免费下载链接】eat_tensorflow2_in_30_daysTensorflow2.0 is delicious, just eat it! 项目地址https://gitcode.com/gh_mirrors/ea/eat_tensorflow2_in_30_days点击查看免费下载相关推荐TensorFlow 的层次结构从硬件内核到高阶 API 的五层架构与三层实战对比TensorFlow 的层次结构从硬件内核到高阶 API 的五层架构与三层实战对比 本文基于《30天吃掉那只TensorFlow2》开源教程第三章系统梳理教程深度学习机器学习Dask 高层图HighLevelGraph分层任务图结构与高层优化的核心机制Dask 高层图HighLevelGraph分层任务图结构与高层优化的核心机制 Dask 中由 Array、Bag、DataFrame 等集合产生的任务图大数据数据分析任务调度ESP-IDF 硬件抽象层解析LL 层、HAL 层与驱动层的分层设计及实操要点ESP IDF 硬件抽象层解析LL 层、HAL 层与驱动层的分层设计及实操要点 ESP IDF 提供了一组硬件抽象 API让你可以在不同抽象级别上控制 UA物联网嵌入式上一篇AduSkin WPF美化控件库5分钟搞定现代化界面设计终极指南下一篇如何为OPNsense开源项目做贡献新手入门终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考