主要涉及的了基础下标索引"[]",逗号",",冒号":",省略号"..."操作,以及gather,gather_nd和boolean_mask的相关使用方法。
import tensorflow as tf
import numpy as np
tf.__version__
tensor = tf.random.uniform([1,5,5,3], minval=10, maxval=30, dtype=tf.int32)
print(tensor)
#最基础的索引方式,类似访问数组
print("========tensor[0]:========\n", tensor[0])
print("========tensor[0][1]:========\n", tensor[0][1])
print("========tensor[0][0][1]:========\n", tensor[0][0][1])
print("========tensor[0][0][0][1]:========\n", tensor[0][0][0][1])
#数据切片[start:end]方式,从start开始,end结束,注意切片方式总是返回一个vector
tensor = tf.range(10)
#取所有元素
print(tensor[:])
#取倒数1个元素
print(tensor[-1:])
#取倒数2个元素
print(tensor[-2:])
#取前两个元素
print(tensor[:2])
#取倒数第一个元素之前的所有元素
print(tensor[:-1])
#倒序采样
print(tensor[::-1])
#倒序间隔采样,倒序步长为2
print(tensor[::-2])
#从第8个元素开始,倒序采样,倒序步长为2
print(tensor[8::-2])
#从第6个元素开始,到第2个元素,倒序采样,倒序步长为1
print(tensor[6:2:-1])
#多维数据切片示例,生成一个随机数组,模拟4张5*5*3的图片数据,这里用整型数据做示例
tensor = tf.random.uniform([4,5,5,3], minval=0, maxval=256, dtype=tf.int32)
#取所有元素
print("=======tensor[:]========\n", tensor[:])
#取第一个维度,相当于取第一张图片
print("========tensor[0,:,:,:].shape========\n", tensor[0,:,:,:].shape)
#取第二个维度的所有信息
print("========tensor[0,1,:,:].shape========\n", tensor[0,1,:,:].shape)
#取最后一个维度的第一个维度信息,假设是RGB图像数据的话,就是取R通道的值
print("========tensor[:,:,:,0].shape========\n", tensor[:,:,:,0].shape)
#print(tensor[:,:,:,0])
#取最后一个维度的第二个维度信息,假设是RGB图像数据的话,就是取G通道的值
print("========tensor[:,:,:,1].shape========\n", tensor[:,:,:,1].shape)
#print(tensor[:,:,:,1])
#取所有图片的第1行
print("========tensor[:,0,:,:].shape========\n", tensor[:,0,:,:].shape)
print(tensor[:,0,:,:])
#间隔取数据,start:end:step,表示从start开始,end结束,每隔step取一个数据
#还是以前面的4张5*5*3的“图片”数据为例
#取前两张图片
print("========tensor[0:2,:,:,:].shape=========\n", tensor[0:2,:,:,:].shape)
#取所有图片的1,2,4行,1,2,4列的所有RGB数据
print("========tensor[:,0:5:2,0:5:2,:].shape=======\n", tensor[:,0:5:2,0:5:2,:].shape)
#取所有图片的1,3行,1,3列的所有RGB数据
print("========tensor[:,::3,::3,:].shape=======\n", tensor[:,::3,::3,:].shape)
#去掉图片上下的一行,左右的一列的所有RGB数据
print("========tensor[:,1:4:1,1:4:1,:].shape=======\n", tensor[:,0:5:2,0:5:2,:].shape)
#省略号方式索引,"...",表示取所有未指定维度的所有信息,可以结合","一起使用
tensor = tf.random.normal([2,4,5,5,3])
#取第0个元素的所有信息
print("========tensor[0,...].shape=========\n", tensor[0,...].shape)
#所有元素取最后一个维度某个数据,假设[2,4,5,5,3]表示的数据是2行数据,每一行数据由4张5*5*3大小的图片组成
#则下面的表达式取的是所有图片的R通道数据
print("========tensor[...,0].shape=========\n", tensor[...,0].shape)
#省略号在中间,还是以图片为例,取第0行元素的B通道数据
print("========tensor[0,...,2].shape=======\n", tensor[0,...,2].shape)
#selective索引方式,通过指定采样哪些维度的哪些数据来采样
#tf.gather,通过指定的索引和维度(axis)来收集数据
#假设下面的tensor表示的是4个班级,每个班级53个学生,5科的成绩
tensor = tf.random.normal([4,35,5])
#收集2号和3号班级的所有学生的成绩,等价于tensor[2:4].shape
print("========gather(axis=0,indices=[2,3])==========\n", tf.gather(tensor, axis=0, indices=[2,3]).shape)
#依次罗列班级2,1,3,0的所有学生的所有成绩
print("========gather(axis=0,indices=[2,1,3,0])==========\n", tf.gather(tensor, axis=0, indices=[2,1,3,0]).shape)
#收集每个班级的2,5,8,10,13号学生的所有成绩
print("========gather(axis=1,indices=[2,5,8,10,13])==========\n", tf.gather(tensor, axis=1, indices=[2,5,8,10,13]).shape)
#收集所有班级的第2门,第3门和第4门科目的成绩信息(以0为下标开始的序号)
print("========gather(axis=2,indices=[2,3,4])==========\n", tf.gather(tensor, axis=2, indices=[2,3,4]).shape)
#tf.gather_nd,更加高级的gather,可指定多个维度
#假设下面的tensor表示的是4个班级,每个班级53个学生,5科的成绩
tensor = tf.random.normal([4,35,5])
#假设我们想取1号班级5号学生的所有5科成绩
print("========gather_nd([1,5])==========\n", tf.gather_nd(tensor, [1,5]).shape)
#取0号班级,1号学生的第2门成绩,结果为标量
print("========gather_nd([0,1,2])==========\n", tf.gather_nd(tensor, [0,1,2]).shape)
#还是取0号班级,1号学生的第2门成绩,但是将标量放到一个向量中,注意中括号和结果的区别
print("========gather_nd([[0,1,2]])==========\n", tf.gather_nd(tensor, [[0,1,2]]).shape)
#取0号班级1号学生,2号班级5号学生和3号班级13号学生的所有5科成绩
print("========gather_nd([[0,1],[2,5],[3,13]])==========\n", tf.gather_nd(tensor, [[0,1],[2,5],[3,13]]).shape)
#boolean_mask索引,类似与opencv的mask概念,当对应mask为True时取对应元素,为False不取
#假设下面的tensor表示4张5*5*3的图片数据
tensor = tf.random.normal([4,5,5,3])
#不指定axis, 默认为0,表示第一个维度
#取第0张图片和第2张图片数据
print("========booean_mask(mask=[True,False,True,False])==========\n", tf.boolean_mask(tensor, mask=[True,False,True,False]).shape)
#指定axis=3,取所有图片的R,B通道数据
print("========booean_mask(mask=[True,False,True],axis=3)==========\n", tf.boolean_mask(tensor, mask=[True,False,True], axis=3).shape)
#指定多个维度
tensor = tf.random.uniform([2,3,4], minval=0, maxval=20, dtype=tf.int32)
print(tensor)
print("========tensor[0,1,:]====\n", tensor[0,0,:])
print("========tensor[0,2,:]====\n", tensor[0,2,:])
print("========tensor[1,1,:]====\n", tensor[1,1,:])
#取[0,0,:],[0,2,:],[1,1,:]
t = tf.boolean_mask(tensor, mask=[[True,False,True],[False,True,False]])
print("========booean_mask(mask=[[True,False,True],[False,True,False]])==========\n", t.shape)
print(t)
运行结果:
....