关于TensorFlow ,你应该知道的那些事

请叫我小蜜蜂同学 2023-05-24 16:29:02

背景

TensorFlow™是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库DistBelief [1] 。

Tensorflow拥有多层级结构,可部署于各类服务器、PC终端和网页并支持GPU和TPU高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究 [1-2]。

TensorFlow由谷歌人工智能团队谷歌大脑(Google Brain)开发和维护,拥有包括TensorFlow Hub、TensorFlow Lite、TensorFlow Research Cloud在内的多个项目以及各类应用程序接口(Application Programming Interface, API) [2] 。自2015年11月9日起,TensorFlow依据阿帕奇授权协议(Apache 2.0 open source license)开放源代码 [2] 。

TensorFlow可以完成的工作

TensorFlow 作为一个由 Google 开发的开源机器学习框架,它可以完成如下工作:

  1. 建立和训练神经网络模型:TensorFlow 提供了丰富的 API 和函数库,可以方便地实现多层神经网络和深度学习模型,并提供灵活的训练和优化工具。

  2. 图像识别和分类:TensorFlow 包括了一些流行的卷积神经网络模型,例如 Inception、ResNet 和 MobileNet,可以用于图像识别和分类任务。

  3. 自然语言处理:TensorFlow 提供了很多自然语言处理的 API 和工具,包括文本分类、语言翻译、情感分析、命名实体识别等任务。

  4. 强化学习:TensorFlow 支持强化学习框架,可以用于实现智能体环境交互和学习。

  5. 数据预处理和可视化:TensorFlow 提供了处理和转换不同格式数据的工具,并提供了可视化工具,方便用户查看模型的输出和性能。

 TensorFlow 是一个非常强大的机器学习框架,可以应用于各种类型的机器学习问题。

语言与系统支持

TensorFlow支持多种客户端语言下的安装和运行。截至版本1.12.0,绑定完成并支持版本兼容运行的语言为C和Python,其它(试验性)绑定完成的语言为JavaScript、C++、Java、Go和Swift,依然处于开发阶段的包括C#、Haskell、Julia、Ruby、Rust和Scala [5] 。

 

人工智能三学派

提到TensorFlow就要说人工智能,那么什么是人工智能?我们常说的人工智能,就是让机器具备人的思维和意识。人工智能主要有三个学派,即行为主义、符号主义和连接主义。

行为主义:是基于控制论的,是在构建感知、动作的控制系统。单脚站立是行为主义一个典型例子,通过感知要摔倒的方向,控制两只手的动作,保持身体的平衡。这就构建了一个感知、动作的控制系统,是典型的行为主义。

符号主义:基于算数逻辑表达式。即在求解问题时,先把问题描述为表达式,再求解表达式。例如在求解某个问题时,利用 if case 等条件语句和若干计算公式描述出来,即使用了符号主义的方法,如专家系统。符号主义是能用公式描述的人工智能,它让计算机具备了理性思维。

连接主义:仿造人脑内的神经元连接关系,使人类不仅具备理性思维,还具备无法用公式描述的感性思维,如对某些知识产生记忆。人脑就是由 860 亿个神经元首尾相接组成的网络。如下图所示,图中展示了人脑中的一根神经元,其中紫色部分为树突,其作为神经元的 输入。黄色部分为轴突,其作为神经元的输出。

 基于连接主义的神经网络模仿上图的神经元,使计算机具有感性思维。下图展示了从出生到成年,人脑中神经网络的变化。

 随着我们的成长,大量的数据通过视觉、听觉涌入大脑,使我们的神经网络连接,也就是这些神经元连接线上的权重发生了变化,有些线上的权重增强了, 有些线上的权重减弱了。

神经网络设计过程

我们要用计算机模仿刚刚说到的神经网络连接关系,让计算机具备感性思维。 首先,需要准备数据,数据量越大越好,要构成特征和标签对。如要识别猫, 就要有大量猫的图片和这个图片是猫的标签,构成特征标签对。 随后,搭建神经网络的网络结构,并通过反向传播,优化连线的权重,直到模型的识别准确率达到要求,得到最优的连线权重,把这个模型保存起来。 最后,用保存的模型,输入从未见过的新数据,它会通过前向传播,输出概率值,概率值最大的一个,就是分类或预测的结果。

TensorFlow2.1 基本概念

TensorFlow 中的 Tensor 表示张量,是多维数组、多维列表,用阶表示张量的维数。0 阶张量叫做标量,表示的是一个单独的数,如 123;1 阶张量叫作向量, 表示的是一个一维数组如[1,2,3];2 阶张量叫作矩阵,表示的是一个二维数组, 它可以有 i 行 j 列个元素,每个元素用它的行号和列号共同索引到,如在 [[1,2,3],[4,5,6],[7,8,9]]中,2 的索引即为第 0 行第 1 列。张量的阶数与方括号的数量相同,0 个方括号即为 0 阶张量,1 个方括号即为 1 阶张量。故张量可以表示0 阶到 n 阶的数组。也可通过 reshape 的方式得到更高维度数组,

举例如下:

c = np.arange(24).reshape(2,4,3)

print(c)

输出结果:

[[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]]

[[12 13 14] [15 16 17] [18 19 20] [21 22 23]]]

TensorFlow中数据类型包括 32 位整型(tf.int32)、32 位浮点(tf.float32)、64 位浮点(tf.float64)、布尔型(tf.bool)、字符串型(tf.string) 创建张量有若干种不同的方法:

(1)利用 tf.constant(张量内容,dtype=数据类型(可选)),第一个参数表示张量内容, 第二个参数表示张量的数据类型。

举例如下:

import tensorflow as tf a=tf.constant([1,5],dtype=tf.int64)

print(a)

print(a.dtype)

print(a.shape)

输出结果为:

<tf.Tensor([1,5],shape=(2,),dtype=int64)>

<dtype:'int64'>

(2,)

即会输出张量内容、形状与数据类型,shape 中数字为 2,表示一维张量里有 2 个元素。

注:去掉 dtype 项,不同电脑环境不同导致默认值不同,可能导致后续程序 bug

(2)很多时候数据是由 numpy 格式给出的,此时可以通过如下函数将 numpy 格式化为 Tensor 格式:

tf. convert_to_tensor(数据名,dtype=数据类型(可选))。

举例如下:

import tensorflow as tf

import numpy as np

a = np.arange(0, 5)

b = tf.convert_to_tensor( a, dtype=tf.int64 )

print(a)

print(b)

输出结果:

tf.Tensor([[0. 0. 0.] [0. 0. 0.]], shape=(2, 3), dtype=float32)

tf.Tensor([1. 1. 1. 1.], shape=(4, ), dtype=float32)

tf.Tensor([[9 9] [9 9]], shape=(2, 2), dtype=int32)

可见,tf.zeros([2,3])创建了一个二维张量,第一个维度有两个元素,第二个维度有三个元素,元素的内容全是 0;tf.ones(4)创建了一个一维张量,里边有 4 个元素,内容全是 1;tf.fill([2,2],9)创建了一个两行两列的二维张量,第一个维度有两个元素,第二个维度也有两个元素,内容都是 9。

(4)可采用不同函数创建符合不同分布的张量。如用 tf. random.normal (维度, mean=均值,stddev=标准差)生成正态分布的随机数,默认均值为 0,标准差为 1; 用 tf. random.truncated_normal (维度,mean=均值,stddev=标准差)生成截断式正 态分布的随机数,能使生成的这些随机数更集中一些,如果随机生成数据的取值 在 (µ - 2σ,u + 2σ ) 之外则重新进行生成,保证了生成值在均值附近;利用 tf. random. uniform(维度,minval=最小值,maxval=最大值),生成指定维度的均匀分布随机数,用 minval 给定随机数的最小值,用 maxval 给定随机数的最大值,最小、最大值是前闭后开区间。

举例如下:

d = tf.random.normal ([2, 2], mean=0.5, stddev=1) 

print(d)

e = tf.random.truncated_normal ([2, 2], mean=0.5, stddev=1)

print(e)

f = tf.random.uniform([2, 2], minval=0, maxval=1)

print(f)

输出结果:

tf.Tensor([[0.7925745 0.643315 ]

[1.4752257 0.2533372]], shape=(2, 2), dtype=float32)

tf.Tensor([[ 1.3688478 1.0125661 ]

[ 0.17475659 -0.02224463]], shape=(2, 2), dtype=float32)

tf.Tensor([[0.28219545 0.15581512]

[0.77972126 0.47817433]], shape=(2, 2), dtype=float32)

神经网络优化

TensorFlow 提供了多种神经网络优化方法,以下是几种常用的优化方法:

  1. 梯度下降法(Gradient Descent):梯度下降法是深度学习中最基本的优化算法之一,它通过计算模型参数的梯度,并沿着梯度的反方向更新参数值来逐渐降低损失函数的值。

  2. 随机梯度下降法(Stochastic Gradient Descent):随机梯度下降法是梯度下降法的一种改进,在每一次迭代时只用一个样本来更新模型参数,可以加快训练速度。

  3. Adam 优化器:Adam 是一种自适应学习率优化算法,它在梯度下降的基础上引入二阶动量和偏置校正,可以更快地收敛,同时也比较容易使用。

  4. Adagrad 优化器:Adagrad 是一种自适应学习率优化算法,它会根据每个参数不同的历史梯度来自适应地调整学习率,可以更好地处理稀疏数据。

以上是几种常用的神经网络优化方法,TensorFlow 还提供了许多其他的优化策略,用户可以根据不同任务选择最适合的优化方法。

应用场景

TensorFlow 可以应用于各种领域,以下是一些常见的应用场景:

  1. 图像处理和计算机视觉:TensorFlow 可以用于图像分类、物体检测、图像分割、人脸识别和图像生成等任务。

  2. 自然语言处理:TensorFlow 可以用于文本分类、情感分析、语言翻译、命名实体识别和问答系统等自然语言处理任务。

  3. 推荐系统:TensorFlow 可以用于推荐算法的实现,包括协同过滤、内容推荐和深度推荐等。

  4. 强化学习:TensorFlow 支持强化学习框架,可以用于实现智能体环境交互和学习。

  5. 金融预测:TensorFlow 可以应用于股票预测、信用评估、风险管理和欺诈检测等金融预测领域。

  6. 医疗保健:TensorFlow 可以应用于医学影像分析、疾病诊断和基因组学研究等医疗保健领域。

总之,TensorFlow 在各种领域都有广泛的应用,可以帮助人们实现更高效、更准确和更智能的工作和生活。

神经网络搭建八股

tf.keras 是 tensorflow2 引入的高封装度的框架,可以用于快速搭建神经网络模型,keras 为支持快速实验而生,能够把想法迅速转换为结果,是深度学习框架之中最终易上手的一个,它提供了一致而简洁的 API,能够极大地减少一般应用下的工作量,提高代码地封装程度和复用性。

Keras 官方文档: https://tensorflow.google.cn/api_docs/python/tf

tf.keras 搭建神经网络六部法

第一步:import 相关模块,如 import tensorflow as tf。

第二步:指定输入网络的训练集和测试集,如指定训练集的输入 x_train 和标签 y_train,测试集的输入 x_test 和标签 y_test。

第三步:逐层搭建网络结构,model = tf.keras.models.Sequential()。

第四步:在 model.compile()中配置训练方法,选择训练时使用的优化器、损失 函数和最终评价指标。

第五步:在 model.fit()中执行训练过程,告知训练集和测试集的输入值和标签、 每个 batch 的大小(batchsize)和数据集的迭代次数(epoch)。

第六步:使用 model.summary()打印网络结构,统计参数数目。

入门小案例

(1) 预测(对连续数据进行预测) 如,预测某小区 100 平米的房价卖多少钱。 根据以往数据(红色),拟合出一条线,让它“穿过”所有的点,并且与各个点 的距离尽可能的小。

 我们可以把以前的数据,输入神经网络,让他训练出一个模型,比如这张图中红 色点表示了以往的数据,虚线表示了预测出的模型 Y = ax + b ,大量历史数据 也就是面积 x 和房价 y 作为输入,训练出了模型的参数 a = 3.5, b = 150,则你家 100 平米的房价应该是 3.5 * 100 + 150 = 500 万。 我们发现,模型不一定全是直线,也可以是曲线;我们还发现,随着数据的增多, 模型一般会更准确。

(2) 分类(对离散数据进行分类) 如,根据肿瘤患者的年龄和肿瘤大小判断良性、恶性。 红色样本为恶性,蓝色样本为良性,绿色分为哪类?

假如让计算机判断肿瘤是良性还是恶性,先要把历史数据输入到神经网络进行建 模,调节模型的参数,得到一条线把良性肿瘤和恶性肿瘤分开。比如输入患者的 年龄、肿瘤的大小 还有对应的良性肿瘤还是恶性肿瘤,使用神经网络训练模型 调整参数,再输入新的患者年龄和肿瘤大小时,计算机会直接告诉你肿瘤是良性 还是恶性。比如上图的绿色三角就属于良性肿瘤。

优点

TensorFlow具有以下优点:

  1. 易于使用:TensorFlow 提供了丰富的高级 API 和函数库,可以快速地构建和训练各种类型的神经网络和深度学习模型。同时,TensorFlow 还提供了易用的可视化工具,方便用户查看模型的输出和性能。

  2. 高效性能:TensorFlow 实现了底层计算,支持多种 CPU 和 GPU 硬件加速,能够快速处理大规模数据和复杂模型。

  3. 兼容性好:TensorFlow 支持多种操作系统、编程语言和硬件平台,可以运行在各种设备上,非常适合企业级应用。

  4. 开放性:TensorFlow 是一个开源项目,拥有庞大的社区,可以分享和交流最新的研究成果和技术进展,使得 TensorFlow 在不断的更新和发展中保持领先地位。

  5. 强大的功能:TensorFlow 提供了多种机器学习和深度学习的模型和算法,包括图像识别、自然语言处理、推荐系统和强化学习等,可以应用于各种类型的任务。

总之,TensorFlow 是一个稳定、灵活和强大的机器学习框架,具有广泛的应用和活跃的社区支持,在实际应用中具有很高的价值和意义。

心得体会

  1. 深度学习需要大量的数据和时间:在使用 TensorFlow 进行深度学习时,需要大量的数据和时间来训练模型,并进行参数调节和优化。需要花费大量的时间来对数据进行预处理、特征提取和清洗,以便更好地适应模型的要求。

  2. 理解算法和网络结构很重要:深度学习算法和网络结构非常复杂,需要深入理解才能使用 TensorFlow 构建和训练模型。需要按照不同的任务和数据来选择合适的算法和网络结构,并进行逐步优化和调参。

  3. 需要具备良好的编程技能:TensorFlow 是一个开发框架,需要具备良好的编程技能才能充分发挥其功能。需要熟悉编程语言,了解 TensorFlow 的 API 和函数库,以及相关的工具和技术。

  4. 可视化和监控非常重要:TensorFlow 提供了多种可视化工具和监控模式,可以帮助开发者更好地跟踪和理解模型的运行情况。需要注意模型的性能和效果,并及时调整和优化。

总之,使用 TensorFlow 进行深度学习需要多方面的技能和知识,需要耐心和细心地进行实验和调试,才能取得良好的效果和贡献。同时也需要注意遵守相关的法律、道德和社会责任,为人工智能的发展做出积极的贡献。

 

参考文献

1  Abadi, M., Barham, P., Chen, J., Chen, Z., Davis, A., Dean, J., et al. (2016). Tensorflow: a system for large-scale machine learning. In OSDI (Vol. 16, pp. 265-283).

2  TensorFlow HomePage   .TensorFlow

3  Jack Clark. Google turning its lucrative web search over to AI machines   .Bloomberg News.

4  Collobert, R., Bengio, S., & Mariéthoz, J. (2002). Torch: a modular machine learning software library (No. EPFL-REPORT-82802). Idiap.

5  TensorFlow - 编程人员指南 - TensorFlow 版本兼容性   .TensorFlow.

6 TensorFlow官网.

 

...全文
103 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,370

社区成员

发帖
与我相关
我的任务
社区描述
加入“谷歌开发者”社区,一起“共码未来。
android 企业社区
社区管理员
  • 谷歌开发者
  • 开发者大赛发布
  • 活动通知
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧