文章目录

  • 1、自动求导 *gradient*
  • 2、Tensor
  • 2.1 数据类型
  • 2.2 *tensor* 属性
  • 2.3 类型转换
  • 3、*Tensor* 创建
  • 4、索引和切片
  • 4.1 索引选择相关函数
  • 4.2 维度变换
  • 4.3 维度拓展
  • 4.4 维度压缩
  • 5、合并与分割
  • 5.1 合并
  • 5.2 分割
  • 6、数据统计
  • 6.1 范数
  • 6.2 最值|均值
  • 6.3 比较是否相等
  • 7、张量排序
  • 8、数据的填充与复制
  • 9、张量限幅



本人也是小菜,记录下 学习知识点。


目前tensorflow与pytorch都比较流行,我觉得两者都应该掌握,但是应该选择一门主修。tensorflow2.0修复了tensorflow1.0好多缺点,现在用起来比较方便。

1、自动求导 gradient

x = tf.ones((2,2))
    # 需要计算梯度的操作
    with tf.GradientTape() as t:
        t.watch(x)
        y = tf.reduce_sum(x)
        z = tf.multiply(y,y)
    # 计算z关于x的梯度
    dz_dx = t.gradient(z, x)
    print(dz_dx)
    tf.Tensor(
    [[8. 8.]
     [8. 8.]], shape=(2, 2), dtype=float32)

2、Tensor

2.1 数据类型

Tensor

Eg

scalar

dim=0 ,标量,eg:1.1,

vector

dim=1,[1.],[1.1,2.2,]

matrix

dim=2,[1.],[1.1,2.2,]

tensor

???? > 2

2.2 tensor 属性

属性

功能

tensor.device

返回所有的设备名称cpu0/Gpu0

tensor.gpu

返回GPU

tensor.numpy

tensor => numpy

tensor.ndim

返回维度 <==>tf.rank(tensor)

tensor.shape

返回tensor的形状信息

tensor.dtype

返回数据类型

tf.is_tensor(x)

判断x是否是tensorflow类型

2.3 类型转换

numpy 默认float32
tensor 默认 int64

tf.convert_to_tensor (x,dtype=tf.int332)
# 将 x 转换成 int32 位tensor,若不指定dtype,会默认转化为 int64

tf.cast() 非常 常用 !!!!!

tf.cast(x,dtype = 要转化的类型)
tf.variable(x)
# variable 型变量,梯度信息会记录,可导

tensor运行在GPU上面,要想进行一些具体的控制 逻辑(在CPU)必须将tensor返回一些具体数据。
eg.tensor.numpy() 或者 int(tensor)float(tensor)tensor
scalar 时成立

3、Tensor 创建

▪ from numpy

tf.conver_to_tensor(np.ones([2,3])) 
# 创建shape=(2,3),dtype=float64的全一tensor

▪ from list

tf.conver_to_tensor([1,2]) 
# 创建shape=(2,),dtype =int32,numpy=array([1,2])的tensor

▪ zeros, ones

tf.ones([shape])
tf.zeros([shape])
tf.zeros_like(a) <=> tf.zeros(a.shape)
tf.ones_like(b)  <=> tf.ones(b.shape)

▪ fill

tf.fill([2,3],3)    # 向2行3列的tensor全部写入3

▪ random

tf.random.narmal([2,2],mean =1, stddev=1)              # 正态分布
tf.random.truncated_normal([2,2],mean =0, stddev=1)    # 避免均值为0
tf.random.uniform([2,2],minval=0,maxval=1)             # 0~1均匀分布

▪ constant

tf.constant(x)  # 创建常量

4、索引和切片

  • 索引从0开始
  • [start : end] <=> 索引编号 [0,1,2,…,-3,-2,-1]
  • [start : end :step] => 他们的默认值依次是 0,-1,1
  • [::-1] => 倒序
  • => 任意可推断出的冒号,a[0,…] =>第0维所有
4.1 索引选择相关函数

tf.gather() => 针对某个维度 # 根据提供的 indicesaxis 这个轴上对 params 进行索引,拼接成一个新的张量。

tf.gather()         # 针对单个维度
tf.gather_nd()      # 针对多个维度
tf.boolean_mask()
4.2 维度变换
tf.reshape()
  tf.tranpose()
4.3 维度拓展
tf.expand_dim()
   tf.broadcast_to()  # 内存没有复制,速度快
4.4 维度压缩
tf.squeeze()

5、合并与分割

5.1 合并
tf.concat([a,b],axis=0)  
# 将a,b在axis=0的维度上面合并,其他维度不变
tf.stack([a,b],axis=0)
# 创建一个新的维度,a,b的 shape 必须相同
5.2 分割
tf.unstack(c, axis=0)
# 返回axis=0所在维度上的tensor个数的tensor,其shape都相同
tf.split(c, axis=0,num_or_size_splits=2)  
# 与tf.unstack()类似,用来打散tensor,但是其可指定打散个数
# 此处表示,将 axis=3维 均分成2份

6、数据统计

6.1 范数
tf.norm()
# 求范数,默认2-范数
6.2 最值|均值
tf.reduce_min(a,axis=0)
tf.reduce_max(a,axis=0)
tf.reduce_mean(a,axis=0)
# 求指定维度的op,若不指定,默认求全局值op
tf.argmax()
tf.argmin()
# 返回最值的 索引
6.3 比较是否相等
unique,idx = tf.unique(a)
# 找到不同的元素,并返回元素与索引
res = tf.equal(a,b)
# 比较a,b对应元素,返回布尔值,一般将res转化成int32,方便计算精度

tf.reduce_sum(tf.cast(res,dtype=tf.int32))
一般用来比较 预测值 与 真值

7、张量排序

tf.sort(a, direction='DESCENDING')
  # 返回 a 的降序排列,升序为 ASCENDING
tf.argsort(a, direction='DESCENDING')
 # 返回排序后的索引index
tf.math.top_k(k)
  # 返回前 k 大的值及其索引

8、数据的填充与复制

tf.pad()
  tf.tile()

9、张量限幅

tf.clip_by_value(a,2,8)  <=> tf.minimum(tf.maximun(a,2),8)
# 将a限制到一个 2~8 的范围
tf.clip_by_norm() # 按照比例进行放缩
tf.clip_by_global_norm()
# 实现全局不同梯度下降方向的等比例缩放,方向不变

将学习率 lr 设置的较大,则可能出现gradient vanish/explore ,使 norm大,故需要裁剪norm,使其等比例缩小