tensor属性:
1,.device(当前tensor在哪个设备上)
2,.gpu/.cpu(对于tensor互换gpu或者cpu)
3,.numpy(把tensor转换成numpy类型)
5,.ndim(判断参数的维度)==.rank(用的少)
6,.is_tensor(判断参数是不是tensor)
7, .dtype(判断类型)
8,.trainable(判断是否可求导)
类型转换:
1,tf.convert_to_tensor(a,dtype=tf.)(数据转换为tensor)
2,tf.cast(a,dtype=tf.)(tf内类型互相转换)
3,tf.Variable(a,name='')
4,int(a)/float(a)标量tensor转换为整型浮点型
创建tensor:
1, tf.zeros([1,2,3])创建的为维度为1,2,3的值为0的三维tensor//ones等同
2,tf.zeros_like(a)==tf.zeros(a.shape)//ones等同
3,tf.fill([2,2,3],9)初始化维度为2,2,3,每个数字都初始化为9的tensor
4, tf.random.normal([2,2],mean=1,stddev=1)随机初始化均值为1,方差为1的2维的tensor(不指定的化默认是0,1分布)
5, tf.random.truncated_normal([2,2],mean=0,stddev=1)截断分布(避免梯度弥散)
6,tf.random.uniform([2,2],maxval=10,dtype=tf.)(创建采样自[0,10)均匀分布的矩阵,类型默认为浮点型)
7,tf.range(1,5,delta=1)(可创建[1,5)之间,步长为1的整型序列
索引与切片:
1,基本索引:a[0][1](取a的tensor的第一维0索引和第二维1索引)(用的很少,不方便)
2,取类似于numpy的索引 a[0,1](和1结果相同)
3,切片a[2:4,5:9]
4, 隔步长采样:start:end:step[1:4:1](1,2,3,4)
5, 逆序采:a[::-1](从最后一个元素采到第一个元素)
6,a=[0,1,2,3] ,a[2::-2](2,0)
7, ...(好像很牛逼)可以省略任意连续的:(但是:号的位置必须能从逻辑上推断出来)
8,tf.gather(a,axis=0,indices=[2,3])(第一个维度索引第二和第三个)
9,tf.gather_nd(a.shape=[4,35,8];tf.gather_nd(a,[0,1,2])([]);tf.gather_nd(a,[[0,1,2]])([1]))([[]])内层括号为联合索引
10,tf.boolean_mask
a=tf.ones([2,3,4])
tf.boolean_mask(a,mask=[[True,False,False],[False,True,True]])(shape=(3,4))
维度变换:
1,tf.reshape:不同view对数据存储是不影响的。
2,tf.transpose(a,perm=[0,1,3,2]):转置(对数据存储有影响)
3,tf.expand_dims(a,axis=0),在0号轴之前位置添加一个维度
4,tf.expand_dims(a,axis=-2),在-2轴之后添加一个维度
5,tf.squeeze(a,axis=-2)去掉当前axis为-2,维度为1的轴,如果不指定axis,则去掉tensor中所有维度为1的轴
数学运算:
1,//整除; %余除; tf.math.log()log; tf.exp()e^x; tf.math.log(2)/tf.math.log(10)log2以10为底;
2,b**3==tf.pow(b,3)(b的三次方); tf.sqrt(b)(根号下b)
3, 矩阵简单相乘 a@b
4,矩阵有batch相乘(tf.matmul() 和@都可以)
tensor合并与分割:
1,tf.concat([a,b],axis=0)把a,b的0轴进行拼接
2, tf.stack([a,b],axis=0)在0轴之前添加一个新的维度
3,tf.unstack(c,axis=0)把0轴拆开分为维度为1的tensor
4,tf.split(c,axis=3,num_or_size_splits=2)若3轴有8个,则分为4,4
tf.split(c,,axis=3,num_or_size_splits=[2,2,4])按三轴分为2,2,4
tensor的数据统计:
1,tf.norm(a,ord=1,axis=1)在1轴上求第一范式,不设置ord参数的话默认为2范式
2,tf.reduce_min(a,axis=1),在1轴上求最小值,不设定axis的话则认为在全局求最小值
3,tf.argmax(a)返回最大值的位置
4,tf.equal(a,b)逐元素比较
5,tf.reduce_sum(tf.cast(tf.equal(a,b),dtype=tf.int32))确认a,b相等的个数
6,tf.unique(a)返回不重复tensor,并返回重复列表在不重复列表中的位置输入:[4,2,2,4,3],返回:[0,11,0,2]
还原:tf.gather(unique,idx)
[4,2,3],[0,11,0,2]([4,2,2,4,3])
tensor排序:
1,tf.sort(a,direction='DESCENDING')返回降序排列后的结果,不写direction参数是默认升序排列
2,tf.argsort(a,direction='DESCENDING')返回降序排列后的位置结果
3,tf.math.top_k(a,2)返回升序排列后的前两个值,对其返回的tuple进行.indices操作可得到排序的索引,.values可得到其排序值
tensor填充与复制:
1,tf.pad(a,[1,2],[2,2])在2维的a上边加一行,下边加两行,左边加两行,右边加两行
2,tf.tile(a,[1,2])表示a的第一个维度不变,第二个维度复制一倍
3,tf.broadcast_to和tf.tile使用方法一致,但是实际上不增加存储,所以推荐使用
tensor限幅:
1,tf.clip_by_value(a,2,8)当a<2时,取2,当a>8时,取8
2,tf.nn.relu(a)=tf.maximum(a,0)
3, tf.clip_by_norm ()等比例放缩,且不会影响梯度的方向
4,tf.clip_by_global_norm()可以进行多参数的缩放,避免梯度弥散和梯度爆炸
tensor高阶操作:
1,tf.where a=random.normal([3,3]);mask=a>0;(tf.boolean_mask(a,mask);)==(indices=tf.where(mask);tf.gather_nd(a.indices);)
2,tf.where(mask,a,b)true从a采,false从b采
3,scatter_nd(indices,updates,shape)在全0的shape上更新indices位置为updates)
4, meshgrid 返回x,y两个tensor存着设定的坐标