tensorflow2.0学习笔记——张量

创建张量

#by numpy,list
tf.convert_to_tensor(np.ones([2,3])) #喂进去一个numpy或者list

#by zeros,ones,fill
tf.zeros([22]) #喂进去一个shape,返回一个相应shape的全0 Tensor
tf.zeros_like(a) #喂进去一个张量,返回一个a.shape的全0 Tensor
tf.ones([2,2]) #喂进去一个shape,返回一个相应shape的全1 Tensor
tf.ones_like(a) #喂进去一个张量,返回一个a.shape的全1 Tensor
tf.fill([2,2],0) #喂进去一个shape和一个num,返回一个shape的全num Tensor

#by分布
tf.random.normal([2,2],mean=1,stddev=1) #喂进去shape,均值和方差,正态分布初始化
tf.random.truncated_normal([2,2],mean=0,stddev=1) #截断正态分布,截断两端,避免sigmoid的饱和区
tf.random.uniform([2,2],minval=0,maxval=1) #均匀分布初始化


'''创建常量'''

a=tf.constant(2.2,dtype=tf.double) #数值和指定类型(如果不指定类型就会自动识别)

------自动识别-------
a=tf.constant(1)  #int常数型
a=tf.constant(1.) #float常数型,类型会自动识别
a=tf.constant([True,False]) #布尔型常量
a=tf.constant('hello world') #字符型常量

'''创建变量'''

tf.Variable(a) #a本身是个张量,Variable包装一下就成了变量,具有变量的功能(求导等)
a.trainable #是否参与训练

张量自身属性

a.device  #张量的创建环境/设备情况 (cpu还是gpu等)
a.gpu() #若张量是cpu环境创建的,此命令返回gpu下的tensor
a.cpu() #若张量是gpu环境创建的,此命令返回cpu下的tensor

a.numpy() #返回张量的numpy对象
int(a)/float(a) #转换成标量,和numpy()效果相同
a.ndim #返回张量的维度
a.shape #返回张量的shape
tf.rank(a) #返回张量的维度,类型为tensor
a.dtype #返回张量的数据类型

张量相关功能函数

isinstance(a,tf.Tensor) #判断a是不是张量,返回True or False。不推荐使用,
tf.is_tensor(a) #同上
tf.cast(a,dtype=tf.float32) #将张量a的数据类型转换成float32
tf.shuffle(idx) #顺序打乱
tf.gather(a,index) #安装index序列顺序提取a中数据
tf.one_hot(a,depth=10) #将张量a独热编码,depth为编码长度

张量的索引和切片

'''索引'''
#----普通索引法----
a[index1][index2]...... #按维度索引选取
a[index1,index2,...] #功能同上,写到一个括号中

#----利用tf.gather索引特定index----
#假定一个tensor的shape为[4,35,8]
tf.gather(a,axis=0,indices=[2,3]) #取第一维度的第三个和第四个,取出来tensor.shape为[2,35,8],相当于a[2:4]。如果想取多个维度,重复多次即可。
tf.gather(a,axis=0,indices=[2,1,4,0])#相当于将第一维度乱序了,新序列就是原来的2140

#----利用gather_nd----
#假定一个tensor的shape为[4,35,8]
tf.gather_nd(a,[[0,0],[1,1]] #取第一维度0第二维度0、第一维度1第二维度1,返回的shape为[2,8]
tf.gather_nd(a,[0,0,0],[1,1,1],[2,2,2]) #取第一维度0第二维度0第三维度0、第一维度1第二维度1第三维度1、第一维度3第二维度3第三维度3的数据,返回的shape为[3]
tf.gather_nd(a,[0,0,0]) #返回一个标量,没有维度
tf.gather_nd(a,[[0,0,0]]) #相当于标量外面有个方括号接收它,shape为[1]
tf.gather_nd(a,[[[0,0,0],[1,1,1],[2,2,2]]] #相当于[[x,x,x]]

#----利用boolean_mask----
#假定一个tensor的shape为[4,28,28,3]
tf.boolean_mask(a,mask=[True,True,False,False]) #默认操作第一维度,第一维度有4个值就得有4个布尔
tf.boolean_mask(a,mask=[True,True,False],axis=3) #指定维度操作
#假设张量a的shape为[2,3,4]
tf.boolean_mask(a,mask[[True,False,False],[False,True,True]]) #布尔值是两行三列,操作的就是前两个维度。

'''切片'''
a[:,:] #和numpy.array取法一样
a[::,::] #双冒号多一个step,每隔几个取一个(start:end:step)
a[::-1] #逆序
a[0,:,:,:]等价于a[0,...] #不管后面有几个维度,都是三个点的省略号,可代表任意长的冒号,只要可以从逻辑上推理出来代表了几个冒号即可
a[0,:,:,0]等价于a[0,...,0]
a[0,:,:,0,:,0]不能用a[0,...,0,...,0]代替 #因为推理不出每个省略号代表几个冒号

张量的维度变换

'''----利用reshape改变view----'''
#假设张量a的shape为[4,28,28,3]
tf.reshape(a,[4,784,3]) #在里面输入新的shape,保证数据总量不变即可
tf.reshape(a,[4,-1.3]) #和上一步结果相同,可自动计算,但不可有两个-1,因为无法分配
tf.reshape(a,[4,784*3] #也可将运算写进去,可自动计算
#[4,784,3]=>[4,28,28,3]容易出问题,中间俩容易搞反

'''----利用tf.transpose改变content---'''
#默认图片的格式为[b,h,w,c],仅限tf中
#假定张量a的shape为[4,3,2,1]
tf.transpose(a) #如果不传参数,就全部转置,变成[1,2,3,4]
tf.transpose(a,perm=[0,1,3,2]) #其中0132代表原来维度现在的位置,变成[4,3,1,2]

'''----利用expand_dims增加维度----'''
#假设张量a的shape为[4,35,8]
tf.expand_dims(a,axis=0) #代表在第一维度增加维度,shape变为[1,4,35,8]
tf.expand_dims(a,axis=3) #代表在第四维度增加维度,shape变为[4,35,8,1]
#axis这个数字表示的是现有维度之间的空隙,a的shape为[4,35,8],共三个维度,那么?4?35?8?共4个空隙,
#0代表第一个?的地方,以此类推。也可以用负数,-1代表最后一个?的地方

'''----利用squeeze删除维度----'''
#假设张量a的shape为[1,2,1,1,3]
tf.squeeze(a) #去掉所有为1的维度,shape变为[2,3]
#假设张量a的shape为[1,2,1,3]
tf.squeeze(a,axis=0) #去掉第一个,shape变为[2,1,3]
tf.squeeze(a,axis=-2) #去掉倒数第二个,shape变为[1,2,3]

'''---利用broadcast、tile对齐shape----'''
#从右边对齐,扩张成相同的shape。(并不是真正的复制扩展,是在计算时达到相同的效果,优化了内存占用)
#扩张得到的新维度的数值,都是原来低维的复制。比如[1,4]阔成二维,[[1,4],[1,4]]
#例子1:[4,32,14,14]      [1,32,1,1]扩张成[4,32,14,14],这样就可以做运算
#例子2:[4,32,14,14]      [14,14]右边对齐,扩张成[4,32,14,14]
#例子3:[4,32,14,14]      [2,32,14,14]由于第一维不是1,无法扩张对齐

#假设张量x的shape为[4,32,32,3]
x+tf.random.normal([3]) #会自动触发broadcast,运算结果的shape为[4,32,32,3]
b=tf.broadcast_to(tf.random.normal([4,1,1,1],[4,32,32,3]) #也可以主动扩展,结果的shape为[4,32,32,3]

#broadcast和tile的对比
#broadcast
a=tf.ones([3,4])
a1=tf.broadcast_to(a,[2,3,4])
#tile
a=tf.ones([3,4])
a2=tf.expand_dims(a,axis=0)
a2=tf.tile(a2,[2,1,1]) #代表在第一维度复制两次,第二、三维度复制一次(相当于没复制)。真正占用了内存空间,未对内存进行优化。

张量的常用运算

'''----元素层面----'''
#+-*/  加减乘除  //整除  %求余
#tf.math.log() 取log,tf里只支持以e为底  tf.exp() 求e的几次方
#tf.pow(b,3) b**3 b的3次方     tf.sqrt()  开方
'''----矩阵层面----'''
#tf.matmul  @   矩阵相乘 
#当遇到高维,例如a.shape=[4,2,5] b.shape=[4,3,5],会将第一位当作batch,后面的维度进行矩阵相乘

猜你喜欢

转载自blog.csdn.net/zhaojc1995/article/details/100928056