TensorFlow 是一个由 Google 开发的开源机器学习框架
,可以用于构建各种类型的人工智能应用程序,例如图像识别、语音识别、自然语言处理等。它通过数据流图的方式
来描述计算任务
,使得开发者可以轻松地搭建
和训练
各种复杂的模型
。TensorFlow 支持分布式计算
,可以在多个CPU
或GPU
上运行,从而加快模型的训练速度。同时,TensorFlow 社区
也提供了丰富的文档和示例代码,方便开发者学习和使用。
TensorFlow 由两个主要组件组成:图(Graph)
和会话(Session)
。
图(Graph)
是 TensorFlow 的核心概念
,它描述
了各种计算任务
之间的依赖关系
,可以看作是一个有向无环图(DAG)
。在 TensorFlow 中,每个节点(Node)
表示一种操作(Operation)
,每条边(Edge)
表示数据(Tensor)的传递
。开发者通过创建图
来定义模型
的结构
和计算流程
。
会话(Session)
则负责执行图中的计算任务
。它可以将计算任务分配到不同的设备上
,并管理计算过程中的资源分配和释放。开发者通过创建会话来运行模型
并获取结果。
数据模型
:TensorFlow 中的基本数据单位
是张量(Tensor)
,它可以看作是一个多维数组
,支持各种数值类型。在 TensorFlow 中,所有的中间结果和参数都以张量的形式存在,开发者可以通过操作张量
来定义模型的计算流程
。
编程模型
:TensorFlow 提供了一种类似于数据流图的编程模型,开发者需要先构建一个计算图(Graph)
,图中的节点(Node)
表示各种计算操作(Operation)
,边(Edge)
表示数据(Tensor)的依赖
关系。然后,开发者可以创建一个会话(Session),将计算任务分配到各种设备上并执行计算。TensorFlow 还提供了灵活的控制流和函数定义方式,方便开发者实现各种复杂的模型。
执行模型
:TensorFlow 的计算过程主要由两个阶段组成,即构建阶段
和执行阶段
。在构建阶段,开发者通过定义计算图
来描述模型的计算流程
,并设置各种参数和超参数。在执行阶段,开发者创建一个会话并运行计算图,通过输入不同的数据来获取计算结果。同时,TensorFlow 还支持异步计算和分布式计算,可以加快模型的训练速度。
在实际开发中,我们会经常与这些名词打交道,主要有:张量、常量、操作、占位符、变量、数据流图、计算图、多cpu或者GPU训练等。这些耳熟能详的名词概念,是我们构造更高级的TensorFlow模块的重要基石。
有个大致感觉
import tensorflow as tf
#TODO 创建一个会话
test = tf.Session()
#TODO 创建一个常数张量
hello = tf.constant("hello word")
#TODO 运行
print(test.run(hello))
在TensorFlow中有两种会话:Session()和InteractiveSession(),在上面的例子中使用方式一样,但是在实际开发中我使用Session()更多。
张量
是tf进行计算的基本元素
和基本数据结构
,基本上我们只用弄清楚这一个数据结构就能熟练使用tf。张量
是一个n维数据集合
,有秩
、形状
和类型
来标识。秩
是张量
的维数
;二维张量
,也就是一个包含 4 个元素的行向量(row vector)标量的秩为 0
,向量的秩为 1
,矩阵的秩为 2
,以此类推。import tensorflow as tf
#一个包含 4 个元素的行向量(row vector)
x = tf.constant([[1, 2, 3, 4]])
print(x.shape) # 输出 (1, 4)
在例如:
[8,] 表示一个形状为 (8,) 的一维张量,也就是一个包含 8 个元素的向量(vector)。在 TensorFlow 中,可以用以下代码创建一个形状为 (8,) 的张量:
import tensorflow as tf
x = tf.constant([8])
print(x.shape) # 输出 (1,)
一般创建张量比较常用的手段有:
张量
是一个n维数据集合
,由秩
、形状
和类型
来标识。
tf.constant() 源代码
@tf_export(v1=["constant"])
def constant_v1(
value,
dtype=None,
shape=None,
name="Const",
verify_shape=False):
完美贴合概念…
看下实践代码:
import tensorflow as tf
#TODO value, dtype=None, shape=None, name="Const", verify_shape=False
test1 = tf.constant(5,name='test')
print("test1:(name=test)",test1)
最后的打印结果,对照张量
是一个n维数据集合
,由秩
、形状
和类型
来标识。
如果运行结果的话:需要创建会话,然后执行运算:
import tensorflow as tf
#TODO 创建一个会话
test = tf.Session()
#TODO value, dtype=None, shape=None, name="Const", verify_shape=False
test1 = tf.constant(5,name='test')
print("test1:(name=test)",test1)
print("run test1:",test.run(test1))
#TODO 创建一个会话
test = tf.Session()
#TODO value, dtype=None, shape=None, name="Const", verify_shape=False
test1 = tf.constant(5,name='test1')
test2 = tf.constant(8,name="test1")
'''
tf中有很多运算函数,这里仅仅是一个代表。可以看tf社区
'''
op1 = tf.add(test1,test2) #执行加法
print("op1:",op1) #打印张量信息
print("run op1:",test.run(op1)) #运算结果
这个是很重要的,因为在实际构建模型中会经常用到这个.
tf.placeholder() #来看下源代码
@tf_export(v1=["placeholder"])
def placeholder(dtype, shape=None, name=None):
#构造的时候要定义函数中信息
例如:
import tensorflow as tf
#TODO 创建一个会话
test = tf.Session()
#TODO
test1 = tf.placeholder(tf.float32,shape=(1,),name='test1')
test2 = tf.placeholder(tf.float32,shape=(1,),name='test2')
op1 = tf.add(test1,test2)
print('tensor test1:',test1)
print('tensor test1:',test2)
print('tensor op1:',op1)
print('run tensor op1:',test.run(op1,feed_dict={test1:[5],test2:[8]})) #占位符号运算需要传值
'''
传值使用的run()操作中的 feed_dict参数,指定字典
'''
上面有说到:特别的 将数组,列表等数据类型转换为张量
主要使用的函数就是, tf.convert_to_tensor()
该函数可以将如:列表,数组等转换为张量
@tf_export(v1=["convert_to_tensor"])
def convert_to_tensor(value,
dtype=None,
name=None,
preferred_dtype=None,
dtype_hint=None):
创建0维张量
import tensorflow as tf
#TODO 创建一个会话
test = tf.Session()
#TODO value,dtype=None,name=None,preferred_dtype=None,dtype_hint=None):
test1 = tf.convert_to_tensor(9.0,dtype=tf.float32)
print('test1:',test1)
print('run test1:',test.run(test1))
通过列表,数组来定义1维张量
import tensorflow as tf
import numpy as np
from pprint import pprint
#TODO 创建一个会话
test = tf.Session()
#TODO value,dtype=None,name=None,preferred_dtype=None,dtype_hint=None):
data = np.array([1,5,8,9,65]) #创建数组
print('data shape:',data.shape)
test1 = tf.convert_to_tensor(data,dtype=tf.float32)
print('test1:',test1)
print('run test1:',test.run(test1))
通过矩阵定义2维
#TODO 创建一个会话
test = tf.Session()
#TODO value,dtype=None,name=None,preferred_dtype=None,dtype_hint=None):
data = np.array([[5,8,8,8,8],[5,6,6,6,6],[5,5,5,5,5]])
print('data shape:',data.shape)
test1 = tf.convert_to_tensor(data,dtype=tf.float32)
print('test1:',test1)
print('run test1:',test.run(test1))
创建3维,这个在nlp中会经常用到
import tensorflow as tf
import numpy as np
from pprint import pprint
#TODO 创建一个会话
test = tf.Session()
#TODO value,dtype=None,name=None,preferred_dtype=None,dtype_hint=None):
data = np.array([[[1,5,8,9,65],
[1,5,8,9,65]],
[[1,5,8,9,65],
[1,5,8,9,65]],
[[1,5,8,9,65],
[1,5,8,9,65]]]) #创建数组
print('data shape:',data.shape)
test1 = tf.convert_to_tensor(data,dtype=tf.float32)
print('test1:',test1)
print('run test1:',test.run(test1))
无缝转换
注意
:TensorFlow可以将numpy的ndarray无缝转换为TensorFlow张量,反之亦然。
import tensorflow as tf
import numpy as np
#将 NumPy 数组转换为 TensorFlow 张量
a = np.array([1, 2, 3])
b = tf.convert_to_tensor(a)
print(b) # 输出 Tensor("Const:0", shape=(3,), dtype=int64)
# 将 TensorFlow 张量转换为 NumPy 数组
c = b.numpy()
print(c) # 输出 [1 2 3]
但是:NumPy 数组和 TensorFlow 张量的类型必须一致,例如都是浮点型或者整型。如果类型不一致,则需要进行类型转换。
下次咱们一起讨论,重要概念:变量以及通过定义变量来创建张量,以及如何过去变量