文章目录
- 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()
=> 针对某个维度 # 根据提供的 indices 在 axis 这个轴上对 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,使其等比例缩小