zoukankan      html  css  js  c++  java
  • Tensorflow2.0笔记04——Tensorflow常用函数

    Tensorflow2.0笔记

    本博客为Tensorflow2.0学习笔记,感谢北京大学微电子学院曹建老师

    3 Tensorflow2.0 基本概念与常见函数

    3.2 常用函数

    (1) 利用 tf.cast (张量名,dtype=数据类型)强制将 Tensor 转换为该数据类型; 利用tf.reduce_min (张量名)计算张量维度上元素的最小值;利用tf.reduce_max (张量名)计算张量维度上元素的最大值。举例如下:

    x1 = tf.constant ([1., 2., 3.], dtype=tf.float64) 
    print(x1)
    x2 = tf.cast (x1, tf.int32)
    print(x2)
    print (tf.reduce_min(x2), tf.reduce_max(x2))
    

    ​ 输出结果:

    tf.Tensor([1. 2. 3.], shape=(3,), dtype=float64)
    tf.Tensor([1 2 3], shape=(3,), dtype=int32) 
    tf.Tensor(1, shape=(), dtype=int32) 
    tf.Tensor(3, shape=(), dtype=intt32)
    

    (2) 可用 tf.reduce_mean (张量名,axis=操作轴)计算张量沿着指定维度的平均值;可用 f.reduce_sum (张量名,axis=操作轴)计算张量沿着指定维度的和,如不指定 axis,则表示对所有元素进行操作。其中维度可按图 3.1 理解。

    image-20210621234535813

    ​ 由上图可知对于一个二维张量,如果 axis=0 表示纵向操作(沿经度方向) ,axis=1 表示横向操作(沿纬度方向)。举例如下:

    x=tf.constant( [ [ 1, 2,3],[2, 2, 3] ] ) 
    print(x)
    print(tf.reduce_mean( x )) 
    print(tf.reduce_sum( x, axis=1 ))
    

    ​ 输出结果:

    tf.Tensor([[1 2 3] [2 2 3]], shape=(2, 3), dtype=int32)
    tf.Tensor(2, shape=(), dtype=int32)     ( 对 所 有 元 素 求 均 值 ) 
    tf.Tensor([6 7], shape=(2,), dtype=int32) (横向求和,两行分别为 6 和 7)
    

    ​ (3) 可利用 tf.Variable(initial_value,trainable,validate_shape,name)函数可以将变量标记为“可训练”的,被它标记了的变量,会在反向传播中记录自己的梯度信息。其中 initial_value 默认为 None,可以搭配 tensorflow 随机生成函数来初始化参数;trainable 默认为 True,表示可以后期被算法优化的,如果不想该变量被优化,即改为 False;validate_shape 默认为 True,形状不接受更改,如果需要更改,validate_shape=False;name 默认为 None,给变量确定名称。举例如下:

    ​ w = tf.Variable(tf.random.normal([2, 2], mean=0, stddev=1)),表示首先随机生成正态分布随机数,再给生成的随机数标记为可训练,这样在反向传播中就可以通过梯度下降更新参数 w 了。

    ​ (4) 利用 TensorFlow 中函数对张量进行四则运算。利用 tf.add (张量 1,张量2)实现两个张量的对应元素相加;利用 tf.subtract (张量 1,张量 2)实现两个张量的对应元素相减;利用 tf.multiply (张量 1,张量 2)实现两个张量的对应元素相乘; 利用 tf.divide (张量 1,张量 2)实现两个张量的对应元素相除。注:只有维度相同的张量才可以做四则运算,举例如下:

    a = tf.ones([1, 3])
    b = tf.fill([1, 3], 3.) 
    print(a)
    print(b) 
    print(tf.add(a,b)) 
    print(tf.subtract(a,b))
    print(tf.multiply(a,b))
    print(tf.divide(b,a))
    

    输出结果:

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

    ​ (5) 利用 TensorFlow 中函数对张量进行幂次运算。可用 tf.square (张量名)计算某个张量的平方;利用 tf.pow (张量名,n 次方数)计算某个张量的 n 次方;利用 tf.sqrt (张量名)计算某个张量的开方。举例如下:

    a = tf.fill([1, 2], 3.) 
    print(a) 
    print(tf.pow(a, 3))
    print(tf.square(a)) 
    print(tf.sqrt(a))
    

    输出结果:

    tf.Tensor([[3. 3.]], shape=(1, 2), dtype=float32)
    tf.Tensor([[27. 27.]], shape=(1, 2), dtype=float32)
    tf.Tensor([[9. 9.]], shape=(1, 2), dtype=float32)
    tf.Tensor([[1.7320508 1.7320508]], shape=(1, 2), dtype=float32)
    

    ​ (6) 可利用 tf.matmul(矩阵 1,矩阵 2)实现两个矩阵的相乘。举例如下:

    a = tf.ones([3, 2])b = tf.fill([2, 3], 3.)print(tf.matmul(a, b))
    

    ​ 输出结果:

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

    即 a为一个 3 行 2 列的全 1 矩阵,b 为 2 行 3 列的全 3 矩阵,二者进行矩阵相乘。

    ​ (7) 可利用 tf.data.Dataset.from_tensor_slices((输入特征, 标签))切分传入张量的第一维度,生成输入特征/标签对,构建数据集,此函数对 Tensor 格式与 Numpy 格式均适用,其切分的是第一维度,表征数据集中数据的数量,之后切分 batch 等操作都以第一维为基础。举例如下:

    features = tf.constant([12,23,10,17])labels = tf.constant([0, 1, 1, 0])dataset = tf.data.Dataset.from_tensor_slices((features, labels)) print(dataset)for element in dataset: print(element)
    

    ​ 输出结果:

    <TensorSliceDataset shapes: ((),()),  types: (tf.int32, tf.int32))>(<tf.Tensor: id=9, shape=(), dtype=int32, numpy=12>, <tf.Tensor: id=10, shape=(), dtype=int32, numpy=0>)(<tf.Tensor: id=11, shape=(), dtype=int32, numpy=23>, <tf.Tensor: id=12, shape=(), dtype=int32, numpy=1>)(<tf.Tensor: id=13, shape=(), dtype=int32, numpy=10>, <tf.Tensor: id=14, shape=(), dtype=int32, numpy=1>)(<tf.Tensor: id=15, shape=(), dtype=int32, numpy=17>, <tf.Tensor: id=16, shape=(), dtype=int32, numpy=0>)
    

    即将输入特征 12 和标签 0 对应,产生配对;将输入特征 23 和标签 1 对应,产生配对……

    ​ (8) 可利用 tf.GradientTape( )函数搭配 with 结构计算损失函数在某一张量处的梯度,举例如下:

    with tf.GradientTape( ) as tape:	w = tf.Variable(tf.constant(3.0))	loss = tf.pow(w,2)grad = tape.gradient(loss,w)print(grad)
    

    输出结果:

    tf.Tensor(6.0, shape=(), dtype=float32) 
    

    在上例中,损失函数为 w^2 ,w 当前取值为 3,故计算方式为

    ​ (9) 可利用 enumerate(列表名)函数枚举出每一个元素,并在元素前配上对应的索引号,常在 for 循环中使用。举例如下:

    seq = ['one', 'two', 'three']for i, element in enumerate(seq): 	print(i, element)
    

    输出结果:

    0 one1     two2     three
    

    ​ (10) 可用 tf.one_hot(待转换数据,depth=几分类)函数实现用独热码表示标签, 在分类问题中很常见。标记类别为为 1 和 0,其中 1 表示是,0 表示非。如在鸢尾花分类任务中,如果标签是 1,表示分类结果是 1 杂色鸢尾,其用把它用独热码表示就是 0,1,0,这样可以表示出每个分类的概率:也就是百分之 0 的可能是 0 狗尾草鸢尾,百分百的可能是 1 杂色鸢尾,百分之 0 的可能是弗吉尼亚鸢尾。举例如下:

    classes = 3labels = tf.constant([1,0,2])output = tf.one_hot( labels, depth=classes ) print(output)
    

    输出结果:

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

    索引从 0 开始,待转换数据中各元素值应小于 depth,若带转换元素值大于等于depth,则该元素输出编码为 [0, 0 … 0, 0]。即 depth 确定列数,待转换元素的个数确定行数。举例如下:

    classes = 3abels = tf.constant([1,4,2])       # 输入的元素值 4 超出 depth-1 output = tf.one_hot(labels,depth=classes)print(output)
    

    输出结果:

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

    即元素 4 对应的输出编码为[0. 0. 0.]。

    ​ (11) 可利用 tf.nn.softmax( )函数使前向传播的输出值符合概率分布,进而与独热码形式的标签作比较,其计算公式为

    image-20210622000359381

    在前一部分,我们得到了前向传播的输出值,分别为 1.01、2.01、-0.66,通过上述计算公式,可计算对应的概率值:

    image-20210622000428822

    上式中,0.256 表示为 0 类鸢尾的概率是 25.6%,0.695 表示为 1 类鸢尾的概率是69.5%,0.048 表示为 2 类鸢尾的概率是 4.8%。程序实现如下:

    y = tf.constant ( [1.01, 2.01, -0.66] )y_pro = tf.nn.softmax(y)print("After softmax, y_pro is:", y_pro)
    

    输出结果:After softmax, y_pro is:

    tf.Tensor([0.25598174 0.69583046 0.0481878], shape=(3,), dtype=float32)与上述计算结果相同。

    ​ (12) 可利用 assign_sub 对参数实现自更新。使用此函数前需利用 tf.Variable定义变量 w 为可训练(可自更新),举例如下:

    w = tf.Variable(4) w.assign_sub(1) print(w)
    

    输出结果:<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=3> 即实现了参数w 自减 1。注:直接调用 tf.assign_sub 会报错,要用 w.assign_sub。

    ​ (13) 可利用 tf.argmax (张量名,axis=操作轴)返回张量沿指定维度最大值的索引,维度定义与图 3.1 一致。举例如下:

    import numpy as nptest = np.array([[1, 2, 3], [2, 3, 4], [5, 4, 3], [8, 7, 2]])print(test)print( tf.argmax (test, axis=0))  # 返回每一列(经度)最大值的索引print( tf.argmax (test, axis=1))  # 返回每一行(纬度)最大值的索引
    

    输出结果:

    [[1 2   3]  [2  3 4]       [5  4   3]  [8  7   2]]
    tf.Tensor([3 3 1], shape=(3,), dtype=int64)
    tf.Tensor([2 2 0 0], shape=(4,), dtype=int64)
    
  • 相关阅读:
    Sqlserver 实际开发中表变量的用法
    Python Day 20 面向对象 (面向对象的组合用法,面向对象的三大特性
    Python Day 19 面向对象(初识面向对象)
    Python Day 18 常用模块(模块和包)
    Python Day 17 常用模块(常用模块一 时间模块,random模块,os模块,sys模块,序列化模块)
    Python Day 15 函数(递归函数、二分查找算法)
    Python Day 14 函数(内置函数,匿名函数(lambda表达式))
    Python Day 13 函数(迭代器,生成器,列表推导式,生成器表达式)
    Python Day 11 + Python Day 12 函数(函数名的应用,闭包,装饰器)
    Python Day 10 函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)
  • 原文地址:https://www.cnblogs.com/wind-and-sky/p/14916577.html
Copyright © 2011-2022 走看看