news 2026/6/10 21:39:02

TensorFlow 功能 API 简介

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TensorFlow 功能 API 简介

原文:towardsdatascience.com/introduction-to-tensorflows-functional-api-b0c489da3d52

TensorFlow 的Sequential API帮助用户堆叠层,轻松创建线性模型,其中每一层的输入总是前一层输出。但是,当你的模型需要处理多个输入或输出、共享层或非线性连接时,会发生什么?在这些场景中,TensorFlow 的功能 API允许构建更高级、更灵活和可定制的模型,使用户能够轻松设计上述复杂架构。

本文将解释:

  • 功能 API 是什么

  • 如何使用功能 API 构建简单模型


Tensorflow 的功能 API 是什么?

TensorFlow 的功能 API是一种创建模型的方式,其中层像网络图一样连接,而不仅仅是像Sequential API中那样线性堆叠。想象一下用乐高积木搭建:虽然 Sequential API 只会允许我们堆叠积木,但功能 API 允许我们构建桥梁、塔楼和连接不同区域的路径。

TensorFlow 的功能 API 允许你创建比顺序 API 更复杂模型的主要原因有三个:

  • 允许构建具有多个输入和输出(如同时接受图像和文本作为输入或同时输出分类和回归值的模型)的模型。

  • 允许构建具有共享层(在模型中,两个路径复用相同的层)的模型。

  • 允许构建具有分支路径(如 ResNet,其中层“跳过”连接)的模型。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2afd9581cec319ca7b13c13373b45d70.png

顺序 API 和功能 API 的通用性差异。图由作者提供


功能 API 的工作原理

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7301dcfa241b939abb752f0d5ae9c19c.png

使用功能 API 创建模型所需的三个组件:输入、层和模型。图由作者提供

如上图所示,每次使用 TensorFlow 的功能 API 时,都需要定义三个基本组件:输入、层和模型。在下面的代码块中,将展示并解释这些组件的定义。

输入

fromtensorflow.keras.layersimportInput# Define inputinputs=Input(shape=(28,28,1))

如上图所示,tf.keras.layers.Input 类在构造函数中接收数据的形状,在本例中为(28, 28, 1),这是 28×28 灰度图像的形状。

fromtensorflow.keras.layersimportDense,Flatten# Define layersflatten_layer=Flatten()hidden_layer_1=Dense(128,activation='relu')hidden_layer_2=Dense(64,activation='relu')output_layer=Dense(10,activation='softmax')

在功能 API 中,当你用一个输入调用一个层实例时,它将返回通过层前向传播接收到的输入的结果。正因为如此,通过调用层实例的其他层的输出来创建层链,即连接某些层的输出到其他层的输入。

如下代码所示,在创建 tf.keras.Sequential 对象时,序列 API 层通过列表顺序链接,而功能 API 层通过将层输入与层输出连接来链接,通过调用层实例的其他层的输出。

# Sequential APImodel=tf.keras.Sequential(layers=[inputs,flatten,hidden_layer_1,hidden_layer_2,output_layer])# Functional APIx=flatten_layer(inputs)x=hidden_layer_1(x)x=hidden_layer_2(x)outputs=output_layer(x)

模型

fromtensorflow.keras.modelsimportModel model=Model(inputs=inputs,outputs=output_layer)

tf.keras.models.Model 类需要的唯一信息是哪些是输入层和输出层。


代码示例:使用功能 API 创建和训练模型

在本节中,将创建一个简单的神经网络并将其用于分类 10 个类别(数字 0-9)。用于训练和测试模型的将是流行的公共 MNIST 数据集[1],该数据集包含 60000 张 0 到 9 之间的手写单个数字的图像,每个图像的高度和宽度为 28 像素。

<…/Images/526b893b8a6d608ee3fea3d2ca079468.png>

MNIST 数据集图像及其标签的示例。图像来自GeeksForGeeks [1]

使用功能 API 创建模型

如前所述,正确定义 tensorflow 模型需要 3 个组件:输入、层和模型。这三个组件可以很容易地创建,如前节的代码所示。以下代码使用相同的代码创建输入、层和模型。最后,显示了模型的摘要,以便可以检查和审查模型的结构。

fromtensorflow.keras.layersimportInput,Dense,Flattenfromtensorflow.keras.modelsimportModel# Define the input layerinputs=Input(shape=(28,28,1))# Input with 32 features# Define the hidden and output layers and pass the input through themx=Flatten()(inputs)x=Dense(128,activation='relu')(x)x=Dense(64,activation='relu')(x)# Pass the output of the hidden layers through the output layeroutputs=Dense(10,activation='softmax')(x)# Create the modelmodel=Model(inputs=inputs,outputs=outputs)# Print the model summarymodel.summary()

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/14871f8fd9462d0cc17d7c61ce5b3da4.png

使用功能 API 创建的模型摘要。图由作者提供。

加载和预处理数据

一旦定义了模型,就会加载并预处理用于训练和测试模型的数据。

fromtensorflow.keras.datasetsimportmnistfromtensorflow.keras.utilsimportto_categorical(x_train,y_train),(x_test,y_test)=mnist.load_data()x_train=x_train/255.0x_test=x_test/255.0y_train=to_categorical(y_train,10)y_test=to_categorical(y_test,10)

编译 TF 模型

模型通过传递用于训练的优化器和损失函数以及要计算和打印的指标来编译。

model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])

训练和测试模型

最后,创建并编译的模型将在 MNIST 数据上训练和评估。这次训练将持续 5 个周期,并使用 32 张图像的批次。此外,20% 的数据将作为验证数据,将在训练过程中使用,以提供有关模型是否正确训练的洞察信息。

# Train the modelhistory=model.fit(x_train,y_train,epochs=5,batch_size=32,validation_split=0.2)# Evaluate the model on the test settest_loss,test_acc=model.evaluate(x_test,y_test,verbose=2)print("nTest accuracy: {}".format(test_acc*100))

从训练模型获取预测

为了评估训练模型的性能,一些测试数据被传递通过模型以获得预测。这些预测值以及期望值被打印出来,以便可视化预测值与真实值之间的差异。

# Select a few random samples from the test setimportrandomimportnumpyasnp indices=random.sample(range(len(x_test)),5)x_samples=x_test[indices]y_samples=y_test[indices]# Make predictionspredictions=model.predict(x_samples)# Display predictions and true valuesforiinrange(5):print(f" Prediction:{np.argmax(predictions[i])}")print(f" Expected Value:{np.argmax(y_samples[i])}")print("-"*30)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1164be256b3d0fc7b83fb277b83be25c.png

预测值与期望值之间的比较。图片由作者提供

从模型的评估中可以推断出,训练是成功的,在测试集上达到了 97.57%的准确率,在训练集上达到了 98.68%的准确率。这些值在上面的图像中得到了进一步证实,其中显示了测试集中一些图像的预测值和期望标签:模型正确预测了所有图像的类别。


摘要

在这篇文章中,已经提到了函数式 API 和顺序 API 之间的主要区别,并解释了使用函数式 API 编码神经网络的通用性和灵活性。以函数式 API 构建模型的主要三个组件(输入、层和模型)在代码中进行了展示和定义。最后,文章展示了如何使用 MNIST 数据集成功训练和测试使用函数式 API 创建的模型。


数据

[1]文章中使用的数据是从 MNIST 数据集中提取的,该数据集可在Creative Commons Attribution-Share Alike 3.0 许可下获得。


非常感谢阅读这篇文章!我希望这篇文章可能已经帮助您更好地理解和使用 TensorFlow 的函数式 API,以及如何以这种方式创建模型。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 12:59:08

【Java进阶】面向对象编程第一站:深入理解类、对象与封装前言

大家好&#xff0c;我是夏幻灵&#xff0c;今天带大家跨入Java编程的核心领域——面向对象编程。这是Java语言的灵魂所在。本篇我们将攻克最基础也是最重要的两个概念&#xff1a;“类”与“对象”&#xff0c;并深入探讨面向对象三大特征之一的“封装”。一、 类与对象的本质在…

作者头像 李华
网站建设 2026/6/10 15:38:47

零基础入门:搭建STM32 + TouchGFX开发环境

从零开始&#xff1a;手把手搭建 STM32 TouchGFX 图形开发环境 你有没有遇到过这样的场景&#xff1f;项目需要一个带触摸屏的界面&#xff0c;老板说“要好看、要流畅”&#xff0c;可你手里只有一块STM32单片机&#xff0c;连操作系统都没有。这时候&#xff0c;大多数人第…

作者头像 李华
网站建设 2026/6/10 14:30:41

使用I2S驱动DAC输出模拟音频:实战项目应用

用I2S驱动DAC播放音频&#xff1a;从原理到实战的完整指南 你有没有遇到过这样的问题——明明代码跑通了&#xff0c;音频文件也加载成功&#xff0c;结果耳机里传来的却是“咔哒”声、杂音&#xff0c;甚至完全无声&#xff1f;在嵌入式系统中实现高质量音频输出&#xff0c;远…

作者头像 李华
网站建设 2026/6/10 20:30:09

Sonic是否会取代配音演员?短期内不会

Sonic是否会取代配音演员&#xff1f;短期内不会 在短视频日活破十亿的今天&#xff0c;内容创作者正面临一个尴尬局面&#xff1a;生产速度赶不上平台算法更新。一条高质量虚拟主播视频&#xff0c;过去需要专业团队花三天完成建模、绑定、动画和渲染&#xff0c;而现在用户期…

作者头像 李华
网站建设 2026/6/10 14:44:27

FAQ整理:关于Sonic最常见的二十个疑问解答

Sonic常见问题深度解析&#xff1a;从技术原理到实战应用 在虚拟内容爆发式增长的今天&#xff0c;如何快速、低成本地生成“会说话的数字人”视频&#xff0c;已成为短视频平台、在线教育、企业宣传等领域共同关注的核心命题。传统依赖3D建模与动捕设备的方式不仅成本高昂&…

作者头像 李华