张量的一些数学操作
一 、标量运算
加减乘除乘方,以及三角函数,指数,对数等常见函数,逻辑比较运算符
import tensorflow as tf
import numpy as np
##定义两个常量
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[5,6],[7,8]])
#基本的操作符如下
#+ - * /** % // >=
#(a>=2)&(a<=3) (a>=2)|(a<=3) a==5 #tf.equal(a,5)
#a%3 mod的运算符重载,等价于m = tf.math.mod(a,3)
tf.sqrt(a)#开方 sqrt
1 maximum 与 minimum
#Returns the max of x and y (i.e. x > y ? x : y) element-wise.
tf.maximum(a,b)
#Returns the min of x and y (i.e. x < y ? x : y) element-wise.
tf.minimum
2 幅值裁剪clip_by_value 与 clip_by_norm
x = tf.constant([2.6,-2.7])
tf.print(tf.math.round(x)) #保留整数部分,四舍五入[3 -3]
tf.print(tf.math.floor(x)) #保留整数部分,向下归整[2 -3]
tf.print(tf.math.ceil(x)) #保留整数部分,向上归整[3 -2]
clip_by_value 与 clip_by_norm
#tf.clip_by_value(t, clip_value_min, clip_value_max, name=None)
#小于小的 设置为小的 大于大的设置为大的
x = tf.constant([0.9,-0.8,100.0,-20.0,0.7])
y = tf.clip_by_value(x,clip_value_min=-1,clip_value_max=1)#[0.9 -0.8 1 -1 0.7]
#将张量值剪裁为最大L2范数。
z = tf.clip_by_norm(x,clip_norm = 3)
#[0.0264732055 -0.0235317405 2.94146752 -0.588293493 0.0205902718]
二、 向量运算
向量运算符都以reduce开头
1 reduce_sum、mean、max、min
#张量指定维度进行reduce
b = tf.reshape(a,(3,3))
#<tf.Tensor: shape=(3, 3), dtype=int32, numpy=
#array([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])>
tf.print(tf.reduce_sum(b, axis=1, keepdims=True))#
tf.print(tf.reduce_sum(b, axis=0, keepdims=True))
a = tf.range(1,10)
tf.print(tf.reduce_sum(a))#45
tf.print(tf.reduce_mean(a))#5
tf.print(tf.reduce_max(a))#9
tf.print(tf.reduce_min(a))#1
2 reduce_prob 乘积
指定axis 时 就是该维度的相乘 没有指定就是所有元素连乘法
#向量reduce
a = tf.range(1,10)
tf.print(tf.reduce_prod(a))#326880 指定axis 时 就是该维度的相乘 没有指定就是所有元素连乘法
3 reduce_all 与 reduce_any [逻辑符and or】
reduce_all
tf.math.logical_and
数学逻辑_和
reduce_any
tf.math.logical_or
数学元素在张量维度上的逻辑_或`。
4 foldr 实现匿名函数
#利用tf.foldr实现tf.reduce_sum
s = tf.foldr(lambda a,b:a+b,tf.range(10)) #45
5 cum累计
#cum扫描累积
a = tf.range(1,10)
tf.print(tf.math.cumsum(a))#累加
tf.print(tf.math.cumprod(a))#累乘
6 argmax 与 argmmin 极值索引
返回最大值最小值索引
7 top_k 排序
#tf.math.top_k可以用于对张量排序
a = tf.constant([1,3,7,5,4,8])
values,indices = tf.math.top_k(a,3,sorted=True)
tf.print(values)
tf.print(indices)
#利用tf.math.top_k可以在TensorFlow中实现KNN算法
三、 矩阵运算
矩阵运算包括:矩阵乘法,矩阵转置,矩阵逆,矩阵求迹,矩阵范数,矩阵行列式,矩阵求特征值,矩阵分解等运算
1 矩阵乘法@、转置、逆、范数、行列式
a@b #等价于
tf.matmul(a,b)
矩阵乘法 | a@b #等价于tf.matmul(a,b) |
---|---|
矩阵转置 | tf.transpose(a) |
矩阵逆 | tf.linalg.inv(a) |
矩阵求trace迹 | tf.linalg.trace(a) |
矩阵求范数 | tf.linalg.norm(a) |
矩阵行列式 | tf.linalg.det(a) |
矩阵特征值 | tf.linalg.eigvals(a) |
2 矩阵分解
1.矩阵正交三角(QR)分解
#矩阵QR分解, 将一个方阵分解为一个正交矩阵q和上三角矩阵r
#QR分解实际上是对矩阵a实施Schmidt正交化得到q
a = tf.constant([[1.0,2.0],[3.0,4.0]],dtype = tf.float32)
q,r = tf.linalg.qr(a)
tf.print(q)
tf.print(r)
tf.print(q@r)
2.矩阵SVD分解
#矩阵svd分解
#svd分解可以将任意一个矩阵分解为一个正交矩阵u,一个对角阵s和一个正交矩阵v.t()的乘积
#svd常用于矩阵压缩和降维
a = tf.constant([[1.0,2.0],[3.0,4.0],[5.0,6.0]], dtype = tf.float32)
s,u,v = tf.linalg.svd(a)
tf.print(u,"\n")
tf.print(s,"\n")
tf.print(v,"\n")
tf.print(u@tf.linalg.diag(s)@tf.transpose(v))
#利用svd分解可以在TensorFlow中实现主成分分析降维
四、 广播机制
广播规则和numpy是一样的原理,使得维度相同 从而进行相关操作
tf.broadcast_to
#计算广播后计算结果的形状,动态形状,Tensor类型参数
c = tf.constant([1,2,3])
d = tf.constant([[1],[2],[3]])
tf.broadcast_dynamic_shape(tf.shape(c),tf.shape(d))
#广播效果
c+d #等价于 tf.broadcast_to(c,[3,3]) + tf.broadcast_to(d,[3,3])