Tensorflow基础知识之张量操作

TensorFlow基础

  • 什么是张量
  • 张量的基本操作
  • 张量的维度变换
  • 张量的部分采样
  • 张量运算

什么是张量

TensorFlow中的Tensor表示张量,其实就是多维数组。在Python中,张量通常存储在NunPy数组中,仅作输入输出来使用;在TensorFlow中,所有的运算都是在张量之间进行。

名称 区别
Python列表(list) 元素可使用不同的数据类型,可以嵌套运用;在内存中离散存放,是一个动态的指针数组,读写效率低,占用内存,且不适合做数值计算
NumPy数组(ndarray) 元素数据类型相同,在内存中连续存放,存储空间小,读写速度快
TensorFlow张量(Tensor) 高速运行于GPU和CPU上,支持CPU、嵌入式等多种计算环境,高速的实现神经网络和深度学习的复杂算法

张量概念的引入是为了方便数据输入,例如将字符串文本,图像、视频等数据数字化,以便后续更容易的处理。可以通俗的作如下理解:

数学实例 Pyhton例子
0阶张量 标量 a=512
1阶张量 矢量(大小和方向) v = [1, 2, 3]
2阶张量 矩阵 n = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
3阶张量 t = [ [ [1], [2], [3] ], [ [4], [5], [6] ], [ [7], [8], [9] ] ]
n阶张量

张量的基本操作

  • tf.constant(value,dtype,shape)函数:创建张量
    其中,value值一般是数字、Python列表和NymPy数组,也可以是布尔型等

  • tf.convert_to_tensor()函数:将数组、列表、数字、布尔型、字符串转换为张量。

  • 判断张量

    • tf.is_tensor()函数:判断数据对象是否为张量(tf方法)
    • isinstance()函数:判断数据对象是否为张量(Python方法)
  • tf.cast(x,dtype)函数:张量数据类型转换

  • 张量元素的数据类型

数据类型 说明 数据类型 说明
tf.int8 8位有符号整数 tf.int16 16位有符号整数
tf.int32 32位有符号整数 tf.int 64位有符号整数
tf.unit8 8位无符号整数 tf.complex64 复数的实部和虚部分别为32位浮点型
tf.float32 32位浮点数 tf.float64 64位浮点数
tf.string 字符串 tf.bool 布尔型
  • 张量相关语法
函数 说明
tf.constant(value,dtype,shape) 创建张量
tf.convert_to_tensor() 转换为张量
tf.zeros(shape,dtype=tf.float32) 创建全0张量
tf.ones(shale,dtype=tf.float32) 创建全1张量
tf.fill(shape,value) 创建元素相同的张量
tf.random.normal() 创建元素值符合正太分布的张量
tf.normal.trunvated_normal(shape,mean,stddev) 创建元素值符合截取正太分布的张量
tf.normal.uniform(shape,minval,maxval,dtype) 创建元素值为整数序列的张量
tf.random.shuffle() 随机打乱
tf.range(start,limit,delta) range函数创建序列

张量的维度变换

  1. 改变张量的形状
    tf.reshape(tensor,shape)函数
tf.reshape(tf.reshape(tf.range(24),[2,3,4]),[4,-1])

表示把0-23这24个数转换成3行4列的二维数组,[4, -1] 表示把二维数组转换成第一维长度为4,-1表示第二维长度根据张量元素总个数和其他维度长度自动推导出来


此操作只改变张量数组的视图,在NumPy数组中的存储数据并没有改变。

  1. 多维张量的轴(维度)

张量中轴的用法和NumPy数组中的一样,如图所示:
Tensorflow基础知识之张量操作_第1张图片轴也可以是负数,表示往后向前索引,例如上图中三维张量的axis的值为也可以是-3,-2,-1

  1. 增加维度
    tf.expand_dlim(tensor,axis),axis表示增加的维度,axis可负
x=tf.expand_dims(tf.constant([1,2]),axis=1)
x

将 shape = (2, ) 的一维张量增加1个维度后 shape = (2, 1)


  1. 删除维度
    tf.squeeze(tensor,axis),只能删除长度为1的维度,axis省略时删除所有长度为1的维度
y=tf.squeeze(x,axis=1)
y

增加维度和删除维度只改变了张量的视图,不会改变张量的存储。

  1. 交换维度
    tf.transpose(a,perm),perm表示轴的顺序,值空时表示转置。
tf.transpose(tf.reshape(tf.range(24),[2,3,4]),perm=[1,0,2])

将 shape = (2, 3, 4) 的三维张量变成 shape = (3, 2, 4) 的三维张量:


交换维度不仅改变了张量的视图,也改变了张量的存储顺序。

  1. 拼接张量
    tf.concat(tensors,axis),axis表示在哪个轴上进行拼接。
tf.concat([tf.constant([[1,2],[3,4]]),tf.constant([[5,6],[7,8]])],1)

在轴1上将 t2 拼接到 t1:


  1. 分割张量
    tf.split(value,x,axis),当x为数字时,表示切割成x个张量;当x为数组时,按数组值进行切割。
tf.split(tf.reshape(range(12),[3,4]),[1,3],1)

将24个数形状定义为4×6的张量,再将分量以2:4的比例分割

[,
 ]

图像的分割与拼接,改变了张量的视图,但没有改变存储顺序。

  1. 堆叠张量
    tf.stack(values,axis),合并张量时创建一个新的维度。
tf.stack((tf.constant([1,2]),tf.constant([3,4])),axis=1)

  1. 分解张量
    tf.unstack(values,axis),将张量分解为多个张量,分解后得到的张量和原张量维数都少了一维。
tf.unstack(tf.constant([[1,2,3],[4,5,6]]),axis=0)
[,
 ]

张量的部分采样

  1. 索引和切片:

  索引:和Python中列表的使用方法类似,以MNIST为例(60000, 28, 28)表示有6万张图片,28表示二维图片中每个像素的灰度值。mnist[0][1][2]表示取第1张图片中的第2行的第3列。
  切片:对象名[起始位置:结束位置:步长],三个参数都可以省略,起始位置到结束位置前闭后开。
  采用切片的方式,只能进行连续的、或者有规律的采样。

  1. 数据提取:根据索引,抽取出没有规律的、特定的数据

  gether(tensors,indices),用一个索引列表,将给定张量中对应索引值的元素提取处来。

tf.gather(tf.range(1,5),indices=[0,2,3])

  gather(tensors,axis,indices),一次只能对一个维度进行索引。

tf.gather(tf.reshape(tf.range(20),[4,5]),axis=1,indices=[0,2,3])

  gather_nd(),通过指定坐标,同时采样多个点,可以同时对多个维度进行索引。

tf.gather_nd(tf.reshape(tf.range(20),[4,5]),[[0,0],[1,1],[2,3]])

  1. 选择采样维度
# 三维张量采样——彩色图片lena(512,512,3)
import tensorflow as tf
from PIL import Image
import numpy as np

path='./pic/lena.tiff'
img=Image.open(path)
lena=np.array(img)    # 图像数据化

tf.gather_nd(lena,[[0,0],[1,1],[2,3]])

张量运算

  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逐元素取模
tf.add(tf.constant([0,1,2]),tf.constant([3,4,5]))

  1. 幂指对数运算
算数操作 说明
tf.pow(x,y) 对x求y的幂次方
tf.square(x) 对x逐元素求计算平方
tf.sqrt(x) 对x逐元素开平方根
tf.exp(x) 计算e的x次方
tf.math.log(x) 计算自然对数,底数为e
# 二维张量幂运算
tf.pow(tf.reshape(tf.range(4),[2,2]),tf.reshape(tf.range(1,5),[2,2]))

# 平方
tf.square(tf.constant([1,2,3,4]))

# 开方:开方元素必须是浮点数
tf.sqrt(tf.constant([[1.,4.],[9.,16.]]))

# 自然指数:张量的元素必须是浮点数类型
tf.exp(3.)

# 对数运算
tf.math.log(tf.constant([[1.,9.],[16.,100.]]))/tf.math.log(tf.constant([[2.,3.],[2.,10.]]))

  1. 其他运算
算数操作 说明
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中的最小值
  1. 三角函数和反三角函数运算
算数操作 说明
tf.cos(x) 三角函数cos
tf.sin(x) 三角函数sin
tf.tan(x) 三角函数tan
tf.acos(x) 反三角函数arccos
tf.asin(x) 反三角函数arcsin
tf.atan(x) 反三角函数arctan
  1. 重载运算符

方法和前面的类似,创建a=tf.constant()后,可以直接直接对 a 使用运算符。

运算符 构造方法 运算符 构造方法
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 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()
a=tf.constant([[0,1,2,3],[0,-1,-2,-3]])
a//2  #整除

  1. 广播机制

  两个不同维度的张量相加,两个张量最后一个维度的长度必须相等。一个数字和多维张量进行算法操作时,这个数字对张量中的每一个元素进行相应的算法操作;一维张量和多维张量进行运算时,一维张量和多维张量的每一行进行运算操作;以此类推。

a=tf.constant([1,2,3])
b=tf.constant([np.arange(12).reshape(2,2,3)])
a*b

  1. 张量和NumPy数组
  • NumPy数组转化为张量:tf.constant(); tf.convert_to_tensor
  • 张量转换为NumPy数组:Tensor.numpy()

  执行TensorFlow操作,TensorFlow将自动的把NumPy数组转换为张量;执行NumPy操作, NumPy将自动的张量转换为NumPy数组;只要操作数中有一个Tensor对象,就把所有 的操作数都转化为张量, 然后再进行运算。

  1. 向量乘法运算
  • 张量乘法运算:tf.multiply()*运算符
    Tensorflow基础知识之张量操作_第2张图片
  • 向量乘法运算:tf.matmul()@运算符
    Tensorflow基础知识之张量操作_第3张图片

以四维张量来举例:

a=tf.constant(np.arange(24).reshape(2,2,2,3))
b=tf.constant(np.arange(24).reshape(2,2,3,2))
a@b

前面二维相同,后面二维(2,3)×(3,2)→(2,2)→广播→(2,2,2,2)


  1. 数据统计:求张量在某个维度上、或者全局的统计值
算数操作 说明
tf.reduce_sum(tensor,axis) 求axis轴上值的和
tf.reduce_mean(tensor,axis) 求axis轴平均值
tf.reduce_max(tensor,axis) 求axis轴最大值
tf.reduce_min(tensor,axis) 求axis轴最小值
tf.argmax() 最值索引
tf.argmin() 最值索引

你可能感兴趣的:(python,numpy,数据分析,算法,tensorflow)