1.2常用函数
本节目标:掌握在建立和操作神经网络过程中常用的函数
# 常用函数 import tensorflow as tf import numpy as np # 强制Tensor的数据类型转换 x1 = tf.constant([1,2,3],dtype = tf.float64) print(x1) x2 = tf.cast(x1,tf.int32) print(x2) # 计算张量中最小的元素 print(tf.reduce_min(x2)) # 计算张量中最大的元素 print(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=int32)
# 理解axis,在一个二位张量或者数组中,可以通过调整axis等于0或者1控制执行维度 # axis=0代表跨行(经度,down),而axis=1跨列(纬度,across) # 不指定axis,则所有元素参与计算 x = tf.constant([[1,2,3], [4,5,6]]) print(x) print(tf.reduce_mean(x)) # 求平均[2,5],平均为3 print(tf.reduce_sum(x,axis = 1)) # 求总和按行操作
输出结果:
tf.Tensor( [[1 2 3] [4 5 6]], shape=(2, 3), dtype=int32) tf.Tensor(3, shape=(), dtype=int32) tf.Tensor([ 6 15], shape=(2,), dtype=int32)
# tf.Variable()将变量标记为可训练,被标记的变量会在反向传播中被记录梯度信息 w = tf.Variable(tf.random.normal([2,2],mean= 0,stddev =1)) print(w)
输出结果:
<tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy= array([[ 0.47072804, -0.7259878 ], [-1.6562318 , 0.15564619]], dtype=float32)>
# 常用的运算函数 # 加法 a = tf.constant([1,2,3],dtype = tf.float32) b = tf.constant([4,5,6],dtype = tf.float32) print(tf.add(a,b)) # 减法 print(tf.subtract(a,b)) # 乘法 print(tf.multiply(a,b)) # 除法 print(tf.divide(b,a)) # 平方 print(tf.square(a)) # 次方 print(tf.pow(a,3)) # 开放 print(tf.sqrt(a)) # 矩阵乘法 c = tf.ones([3,2]) d = tf.fill([2,3],6.) print(tf.matmul(c,d))
输出结果:
tf.Tensor([5. 7. 9.], shape=(3,), dtype=float32) tf.Tensor([-3. -3. -3.], shape=(3,), dtype=float32) tf.Tensor([ 4. 10. 18.], shape=(3,), dtype=float32) tf.Tensor([4. 2.5 2. ], shape=(3,), dtype=float32) tf.Tensor([1. 4. 9.], shape=(3,), dtype=float32) tf.Tensor([ 1. 8. 27.], shape=(3,), dtype=float32) tf.Tensor([1. 1.4142135 1.7320508], shape=(3,), dtype=float32) tf.Tensor( [[12. 12. 12.] [12. 12. 12.] [12. 12. 12.]], shape=(3, 3), dtype=float32)
# 切分传入张量的第一维度,生成输入特征/标签配对,构成数据集 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=286, shape=(), dtype=int32, numpy=12>, <tf.Tensor: id=287, shape=(), dtype=int32, numpy=0>) (<tf.Tensor: id=288, shape=(), dtype=int32, numpy=23>, <tf.Tensor: id=289, shape=(), dtype=int32, numpy=1>) (<tf.Tensor: id=290, shape=(), dtype=int32, numpy=10>, <tf.Tensor: id=291, shape=(), dtype=int32, numpy=1>) (<tf.Tensor: id=292, shape=(), dtype=int32, numpy=17>, <tf.Tensor: id=293, shape=(), dtype=int32, numpy=0>)
# 求导数运算 with tf.GradientTape() as tape: w= tf.Variable(tf.constant(3.0)) loss = tf.pow(w,2) # 对w2求w的倒数 grad = tape.gradient(loss,w) print(grad)
输出结果:
tf.Tensor(6.0, shape=(), dtype=float32)
# 求导数运算 with tf.GradientTape() as tape: w= tf.Variable(tf.constant(3.0)) loss = tf.pow(w,2) # 对w2求w的倒数 grad = tape.gradient(loss,w) print(grad)
输出结果:
0 one 1 two 2 three
# 独热编码:将张量中的每个元素按照规律独立编码,编码中0为否1为是 labels = tf.constant([0,1,2,3]) classes = 4 output = tf.one_hot(labels,depth = classes) print(output)
输出结果:
tf.Tensor( [[1. 0. 0. 0.] [0. 1. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 1.]], shape=(4, 4), dtype=float32)
# 用softmax函数使得输出符合概率分布,将输出用e为底y为指数,求出每个输出的概率 # 对概率进行归一化操作 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)
# 用assign_sub函数对参数进行自更新,赋值操作(更新参数为可训练) w = tf.Variable(4) # 对w进行自减一操作w = w -1 w.assign_sub(1) print(w)
输出结果:
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=3>
# 返回张量沿指定维度最大值的索引 test = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]]) print(test) print(tf.argmax(test,axis = 0)) print(tf.argmax(test,axis = 1)) # 判断两个数是否相等,bool类型 correct = tf.equal(1,1) print(correct)
输出结果:
[[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] tf.Tensor([3 3 3], shape=(3,), dtype=int64) tf.Tensor([2 2 2 2], shape=(4,), dtype=int64) tf.Tensor(True, shape=(), dtype=bool)
本节对各个函数运用,对神经网络搭建和操作十分重要,请大家务必掌握。