Tensorflow2.0 基础
一:TensorFlow特性
1.TensorFlow
An end-to-end open source machine learning platform
- end-to-end:端到端
- open source:开放源代码,开放设计和实现框架
- TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems. Wide & Deep Learning for Recommender Systems. The YouTube Video Recommendation System
- machine learning:机器学习生态系统
TensorFlow1.x ——延迟执行机制(deferred execution)/静态图机制
- 代码运行效率高,便于优化
- 程序不够简洁
- 重复、冗余的API
- 构建神经网络:tf.slim,tf.layers,tf.contrib.layers,tf.keras混乱,不利于程序共享,维护的成本高
TensorFlow2.0 ——动态图机制(Eager Execution)
- 无需首先创建静态图,可以立刻执行计算,并返回结果
- 能够快速的建立和调试模型
- 执行效率不高
- 清理、整合了重复的API,将tf.keras作为构建和训练模型的标准高级API
TensorFlow2.0 兼顾易用性和执行效率
- 在程序调试阶段使用动态图,快速建立模型、调试程序;
- 在部署阶段,采用静态图机制,从而提高模型的性能和部署能力
2.TensorFlow2.0架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-daZ1UqYE-1597245690388)(attachment:image.png)]
TensorFlow框架特性
- 多种环境支持
- 可运行于移动设备、个人计算机、服务器、集群等云端、本地、浏览器、移动设备、嵌入式设备
- 支持分布式模式
- TensorFlow会自动检测GPU和CPU,并充分利用它们并行、分布的执行
- 简洁高效
- 构建、训练、迭代模型:Eager Execution,Keras ,部署阶段:转化为静态图,提高执行效率。
- 社区支持
二:创建张量
1.更新版本
查看版本号:
import tensorflow as tf
print("tensorflow version:",tf.__version__)
tensorflow version: 2.0.0-beta0
更新到最新版本,在jupyter notebook中运行cmd命令
# !pip install --upgrade tensorflow
在TensorFlow2.0的环境中,运行TensorFlow1.x代码,常常会出现错误提示
在TensorFlow2.0的环境中,运行TensorFlow1.x,需要执行以下操作
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
2.Python列表&Numpy数组#TensorFlow张量
Python列表(list):
- 元素可以使用不同的数据类型,可以嵌套
- 在内存中不是连续存放的,是一个动态的指针数组
- 读写效率低,占用内存空间大
- 不适合做数值计算
NumPy数组 (ndarray) :
- 元素数据类型相同
- 每个元素在内存中占用的空间相同,存储在一个连续的内存区域中
- 存储空间小,读取和写入速度快
- 不能够主动检测利用GPU进行运算
TensorFlow张量 (Tensor) :
- 可以高速运行于GPU和TPU之上,实现神经网络和深度学习中的复杂算法
3.创建Tensor对象
张量由Tensor类实现,每个张量都是一个Tensor对象
tf.constant()函数:创建张量
tf.constant(value, dtype, shape)
-
value:数字/Python列表/NumPy数组
-
dtype: 元素的数据类型
-
shape: 张量的形状
-
参数为Python列表
tf.constant([[1,2],[3,4]])
<tf.Tensor: id=6, shape=(2, 2), dtype=int32, numpy=
array([[1, 2],
[3, 4]])>
-
TensorFlow2.0中的所有的张量,都可以通过.numpy()方法,得到它对应的数组.
-
TensorFlow创建浮点数张量时,默认是32位浮点数
-
numpy创建浮点数数组时,默认的浮点型是64位浮点数。当使用NumPy数组创建张量时,TensorFlow会接受数组元素的数据类型,使用64位浮点数保存数据。
改变张量中元素的数据类型
tf.cast(x,dtype)
- 在进行数据类型转换时,一般是将低精度的数据类型向高精度转换,否则可能发生数据溢出,得到错误的结果。
4.创建张量&转换张量
类型 | 函数 | 功能 |
---|---|---|
常量 | tf.constant(value, dtype, shape) | 创建张量 |
常量 | tf.convert_to_tensor() | 创建张量 |
常量 | tf.zeros(shape, dtype = tf.float32) | 创建全0张量 |
常量 | tf.ones(shape, dtype = tf.float32) | 创建全1张量 |
常量 | tf.fill(shape, value) | 创建元素值全部相同的张量 |
随机量 | tf.random.normal() | 创建元素取值符合正态分布的张量 |
随机量 | tf.random.truncated_normal( shape, mean, stddev, dtype ) | 创建元素取值符合截断正态分布的张量 |
随机量 | tf.random.uniform(shape,minval,maxval, dtype) | 创建元素取值符合均匀分布的张量 |
序列 | tf.range(起始数字,结束数字,步长) | 创建元素取值为整数序列的张量 |
Tensor对象的属性 ——ndim、shape、dtype
- 张量名.属性->维度;形状;类型
获得Tensor对象的形状、元素总数和维度
- tf.shape/size/rank(张量名)
二:维度变换
1.张量的存储和视图
多维张量在物理上以一维的方式连续存储;通过定义维度和形状,在逻辑上把它理解为多维张量
当对多维张量进行维度变换时,只是改变了逻辑上索引的方式,没有改变内存中的存储方式
2.改变张量的形状
tf.reshape (tensor, shape)
- 没有封装到Tensor对象中,前缀是tf,而不是张量对象
- shape参数=-1:自动推导出长度
3.多维张量的轴 :张量的维度
张量中的轴的概念和用法,和NumPy数组是完全一样的
轴也可以是负数,表示从后向前索引
4.增加和删除维度
增加维度
- tf.expand_dims(input,axis)
删除维度
- tf.squeeze( input, axis=None )
- 只能删除长度为 1 的维度,省略时删除所有长度为1的维度
增加维度和删除维度,只是改变了张量的视图,不会改变张量的存储
5.交换维度
tf.transpose( a, perm )
- 对二维张量交换维度,就是矩阵的转置
- 交换维度,不仅改变了张量的视图,同时也改变了张量的存储顺序
6.拼接和分割
拼接张量tf.concat( tensors, axis )
- 将多个张量在某个维度上合并
- 拼接并不会产生新的维度
分割张量tf.split( value, num_or_size_splits, axis=0 )
- 将一个张量拆分成多个张量,分割后维度不变
- 是一个数值时,表示等长分割,数值是切割的份数;
- 是一个列表时,表示不等长切割,列表中是切割后每份的长度
- 举例:2 :分割成2个张量;[1:2:1]:就表示分割成3个张量,长度分别是1,2,1
图像的分割与拼接,改变了张量的视图,张量的存储顺序并没有改变。
7.堆叠和分解
堆叠张量tf.stack( values, axis )
- 在合并张量时,创建一个新的维度
- 和NumPy中堆叠函数的功能完全一样
分解张量tf.unstack( values, axis )
- 是张量堆叠的逆运算
- 张量分解为多个张量
- 分解后得到的每个张量,和原来的张量相比,维数都少了一维
三:部分采样
1.索引和切片
起始位置:结束位置: 步长
- 起始位置:结束位置,是前闭后开的,切片中不包含结束位置
- 起始位置、结束位置、步长都可以省略
- 步长可以是负数,这时起始位置的索引号,应该大于结束位置
2. 数据提取
根据索引,抽取出没有规律的、特定的数据
一维张量采样
gather( params, indices )
- params输入张量,indices索引值列表
- 用一个索引列表,将给定张量中对应索引值的元素提取出来
对多维张量采样
gather()、gather_nd()函数
gather( params, axis, indices )
- gather()函数一次对一个维度进行索引
gather_nd()函数
- 通过指定坐标,同时采样多个点
- 可以同时对多个维度进行索引
四:张量运算
1.基本数学运算
加减乘除运算
算术操作 | 描述 |
---|---|
tf.add(x, y) | 将x和y逐元素相加 |
tf.subtract(x, y) | 将x和y逐元素相减 |
tf.multiply(x, y) | 将x和y逐元素相乘 |
tf.divide(x, y) | 将x和y逐元素相除 |
tf.math.mod(x, y) | 对x逐元素取模 |
2.幂指对数运算
算术操作 | 描述 |
---|---|
tf.pow(x, y) | 对x求y的幂次方 |
tf.square(x) | 对x逐元素求计算平方 |
tf.sqrt(x) | 对x逐元素开平方根 |
tf.exp(x) | 计算e的x次方 |
tf.math.log(x) | 计算自然对数,底数为e |
3.自然指数和自然对数运算
- TensorFlow中只有以e为底的自然对数,没有提供以其他数值为底的对数运算函数
- 要计算其他底数的对数,可以利用对数的换底公式,间接的通过 tf.math.log(x)函数来实现。
其他运算
算术操作 | 描述 |
---|---|
tf.sign(x) | 返回x的符号 |
tf.abs(x) | 对x逐元素求绝对值 |
tf.negative(x) | 对x逐元素求相反数,y = -x |
tf.reciprocal(x) | 取x的倒数 |
tf.logical_not(x) | 对x逐元素求的逻辑非 |
tf.ceil(x) | 向上取整 |
tf.floor(x) | 向下取整 |
tf.rint(x) | 取最接近的整数 |
tf.round(x) | 对x逐元素求舍入最接近的整数 |
tf.maximum(x, y) | 返回两tensor中的最大值 |
tf.minimum(x, y) | 返回两tensor中的最小值 |
4.三角函数和反三角函数运算
算术操作 | 描述 |
---|---|
tf.cos(x) | 三角函数cos |
tf.sin(x) | 三角函数sin |
tf.tan(x) | 三角函数tan |
tf.acos(x) | 反三角函数arccos |
tf.asin(x) | 反三角函数arcsin |
tf.atan(x) | 反三角函数arctan |
5.重载运算符
运算符 | 构造方法 | 运算符 | 构造方法 |
---|---|---|---|
x+y | tf.add( ) | x&y | tf.logical_and( ) |
x-y | tf.subtract( ) | x|y | tf.logical_or( ) |
x*y | tf.multiply( ) | x^y | tf.logical_xor( ) |
x/y(python2.0) | tf.divide( ) | ~x | tf.logical_not() |
x/y(python3.0) | tf.truediv( ) | x<y | tf.less( ) |
X//y(python3.0) | tf.floordiv( ) | x<=y | tf.less_equal( ) |
x%y | tf.math.mod( ) | x>y | tf.greater( ) |
x**y | tf.pow( ) | x>=y | tf.greater_equal( ) |
-x | tf.neg( ) | ||
abs(x) | tf.abs() |
6.张量乘法
- 元素乘法 :tf.multiply(), *运算符
- 向量乘法 :tf.matmul(),@运算符
7.数据统计
求张量在某个维度上、或者全局的统计值
函 数 |描 述
tf.reduce_sum(input_tensor,axis) |求和
tf.reduce_mean(input_tensor,axis) |求平均值
tf.reduce_max(input_tensor,axis) |求最大值
tf.reduce_min(input_tensor,axis) |求最小值
8.求最大值、最小值函数
tf.max(), tf.min()
五:张量和NumPy 数组之间的相互转换
NumPy数组转化为张量: tf.constant(); tf.convert_to_tensor
张量转换为NumPy数组 :Tensor.numpy()
当张量和NumPy数组共同参与运算时:
- 执行TensorFlow操作,TensorFlow将自动的把NumPy数组转换为张量
- 执行NumPy操作,NumPy将自动的张量转换为NumPy数组
使用运算符操作
- 只要操作数中有一个Tensor对象,就把所有的操作数都转化为张量,然后再进行运算