news 2026/5/12 0:51:24

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/5/11 8:43:58

Qwen3-VL浏览GitHub镜像库查找最新AI项目

Qwen3-VL 浏览 GitHub 镜像库查找最新 AI 项目 在多模态 AI 技术飞速演进的今天&#xff0c;开发者面临的不再是“有没有模型可用”&#xff0c;而是“如何快速试用、验证并集成前沿能力”。传统方式下&#xff0c;下载百亿参数模型动辄耗费数小时&#xff0c;环境配置复杂、依…

作者头像 李华
网站建设 2026/5/3 19:17:48

STLink驱动安装操作指南:适用于Windows系统

STLink驱动安装全攻略&#xff1a;从零搞定Windows下的调试连接 在STM32开发的世界里&#xff0c;你可能写过无数行代码、调通过复杂的外设驱动&#xff0c;但最让人抓狂的往往不是程序逻辑&#xff0c;而是—— 电脑连不上STLink调试器 。 插上开发板&#xff0c;打开IDE&…

作者头像 李华
网站建设 2026/5/1 14:21:47

零基础也能懂的nrf52832的mdk下载程序教程

从零开始玩转nRF52832&#xff1a;Keil MDK下载程序全解析&#xff0c;不只是“点一下”那么简单 你有没有过这样的经历&#xff1f; 明明代码写好了&#xff0c;工程也编译通过了&#xff0c;信心满满地点击 Keil 的“Download”按钮&#xff0c;结果弹出一串红字&#xff1…

作者头像 李华
网站建设 2026/5/8 19:58:25

写给初次用IDEA的新人

在初次使用IntelliJ IDEA 中&#xff0c;很多新人可能不是很理解一个项目的大体架构&#xff0c;本篇文章将对此进行简略讲解。项目文件从大到小的核心包含关系如下&#xff1a;1. Project&#xff08;项目&#xff09; 这是最顶层的容器&#xff0c;对应一个完整的开发任务&am…

作者头像 李华
网站建设 2026/5/10 3:49:01

低功耗场景下UART中断唤醒MCU的操作指南

用UART中断“叫醒”沉睡的MCU&#xff1a;低功耗通信的实战秘籍你有没有遇到过这样的场景&#xff1f;设备靠电池供电&#xff0c;要连续工作几个月甚至几年&#xff0c;但每天只上报一次数据。大部分时间它其实在“睡觉”&#xff0c;可偏偏又不能彻底关机——万一错过了远程指…

作者头像 李华