Tensorflow进阶

一、合并与分割

1、合并

合并是指将多个张量在某个维度上合并为一个张量。可以使用拼接和堆叠操作实现。拼接操作不会产生新的维度,仅在原始维度上合并,而堆叠会产生新的维度。

拼接:tf.concat(tensors,axis)

a=tf.random.normal([4,35,8])
b=tf.random.normal([6,35,8])
tf.concat([a,b],axis=0)

拼接后的张量shape为[10,35,4]

堆叠:tf.stack(tensors,axis)。当aixs≥0时在axis之前插入新维度,当axis<0时,在axis后插入新维度。

a=tf.random.normal([35,8])
b=tf.random.normal([35,8])
tf.stack([a,b],axis=0)

堆叠后的张量的shape为[2,35,8]。堆叠需要所有待合并张量shape完全一致。

2、分割

合并操作的逆过程就是分割,将一个张量分割为多个张量。
通过tf.split(x,num_or_size_split,axis)可以完成张量的分割操作。参数意义,x参数代表待分割张量。num_or_size_split代表切割方案。如shape为[10,35,8]的张量,num_or_size_split为单个数值10时biao’shi分割为10等份;当num_or_size_split为List时,如[2,4,2,2],表示切割为4份,每份的长度为2,4,2,2;axis指定分割的维度索引号。特别地,如果希望在某个维度上全部按长度为1的方式分割,还可以使用tf.unstack(x,axis)。这种方式切割长度固定为1。如:

x=tf.random.normal([10,35,8])
resulet=tf.unstack(x,axis=0)

len(result)=10。

二、数据统计

1、向量范数

在神经网络中,向量范数常用来表示权值大小,梯度大小等。常用的三种向量范数为:
L1范数:向量x所有元素绝对值之和。
L2范数:向量x所有元素的平方和,再开根号。
∞-范数:向量x所有元素绝对值中的最大值。
在tensorflow中,可以通过tf.norm(x,ord)求解张量的L1、L2∞等范数。
如:

x=tf.ones([2,2])
tf.norm(x,ord=1)
tf.norm(x,ord=2)
tf.norm(x,ord=np.inf)

2、最值、均值、和

通过tf.reduce_max、tf.reduce_min、tf.reduce_mean、tf.reduce_sum函数求解张量在某个维度上的最大、最小、均值、和。
考虑shape为[4,10]的张量,4表示样本数量,10表示当前样本分别属于10个类别的概率。要求每个样本的概率的最大值,可通过tf.reduce_max函数实现,axis=0按列求最值,axis=1按行求最值。

x=tf.random.normal([4,10])
tf.reduce_max(x,axis=1) #统计概率上的最大值

三、张量比较

通过tf.equal()函数比较,返回布尔类型的张量。
此外还有其他的比较函数如表所示

函数 比较逻辑
tf.math.greater a>b
tf.math.less a
tf.math.reater_equal a≥b
tf.math.less_equal a≤b
tf.math.not_equal a≠b
tf.math.is_nan a=nan

四、填充与复制

1、填充

在需要补充长度的数据开始或结束处填充足够数量的特定数值,这些特定数值一般代表了无效意义,例如0。通过tf.pad(x,paddings)函数实现,参数paddings包含了多个嵌套方案。如[[0,0],[2,1],[1,2]]表示第一个维度不填充,第二个维度左边填充两个单位,右边填充一个单位,第三个维度左边填充一个单位,右边填充二个单位。
如:

a=tf.constant([1,2,3,4,5,6])
b=tf.constant([7,8,1,6])
b=tf.pad(b,[[0,2]])

填充后张量b的shape为(6,)。

2、复制

通过tf.tile()函数可以在任意维度将数据重复复制多份,如shape为[4,32,32,3]的数据,复制方案为[2,3,3,1]。
具体代码如下:

x=tf.random.normal([4,32,32,3])
tf.tile(x,[2,3,3,1])

复制后的shape为[8,96,96,3]。

五、数据限幅

在Tensorflow中,可以通过tf.maximum(x,a)实现数据的下限辐,tf.minimum(x,a)实现数据的上限幅。

x=tf.range(9)
tf.maximum(x,2)
x=tf.minimum(x,7)

可得[2,2,2,3,4,5,6,7,8],[0,1,2,3,4,5,6,7,7]。

六、高级操作

1、tf.gather

tf.gather可以实现根据索引号收集数据集的目的。
如:

x=tf.random.uniform([4,35,8],maxval=100,dtype=tf.int32)

tf.gather(x,[0,3,8,11,12,26],axis=1)

2、tf.gather_nd

通过tf.gather_nd函数,可以指定每次采样点的多维坐标来实现采样多个点的目的。如:

x=tf.random.uniform([4,35,8],maxval=100,dtype=tf.int32)

希望抽查第二个班的第二个同学的所有科目,第三个班的第三个同学的所有科目,第四个班的第四个同学的所有科目。通过tf.gather_nd函数实现如下:

tf.gather_nd(x,[[1,1],[2,2],[3,3]])

若希望采样第i个班,第j个学生,第k门成绩,则可以表达为[…,[i,j,k],…]。

3、tf.boolean_mask

除了上述给定索引号的方式采样,还可以通过给定掩码的方式进行采样。
如采样第1、4、5、8门科目,则可以实现为:

x=tf.random.uniform([4,35,8],maxval=100,dtype=tf.int32)
tf.boolean_mask(x,mask=[True,False,False,True,True,False,False,True],axis=2)

4、tf.where

通过tf.where(cond,a,b)操作可以根据cond条件的真假从A或B中读取数据。
如:

a=tf.ones([3,3])
b=zeros([3,3])
cond=tf.constant([[True,False,False],[False,True,False],[True,True,False]])
cond=tf.where(cond,a,b)

对应的cond为真时,从A中对应位置提取,为假时,从B中对应位置提取。当参数a=b=None时,即a与b参数不指定,tf.where函数会返回cond张量中所有True的元素的索引坐标。

5、scatter_nd

通过tf.scatter_nd(indices,updates,shape)函数可以在全零白板张量上执行刷新操作。
如:

indices=tf.constant([[4],[3],[1],[7]])
updates=tf.constant([4.4,3.3,1.1,7.7])
tf.scatter_nd(indices,updates,[8])

考虑三维张量的刷新:

indices=tf.constant([[1],[3]])
updates=tf.constant([
		[5,5,5,5],[6,6,6,6],[7,7,7,7],[8,8,8,8]],
		[[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
		])
		tf.scatter_nd(indices,updates,[4,4,4])

6、meshgrid

通过tf.meshgrid函数可以方便地生成二维网格的采样坐标点

如下代码:

x=tf.linspace(-8.,8,100) #设置x轴的采样点
y=tf.linspace(-8.,8,100) #设置y轴的采样点
x,y=tf.meshgrid(x,y) #生成网格点,然后内部拆分后返回

可以返回两个shape都为[100,100]的张量。

七、经典数据集加载

1、随即打散

通过Dataset.shuffle(buffer_size)工具可以设置Dataset对象随即打散数据之间的顺序,防止出现每次训练时数据按照固定顺序产生,导致模型尝试“记忆”信息的现象。代码实现如下:
train_db=trrain_db.shuffle(10000)

2、批训练

比如一句代码 train_db=train_db.batch(128),表明计算机一次并行计算128个样本的数据。

3、预处理

从keras.datasets中加载的数据集的格式大部分都不能满足模型的输入要求,因此需要跟据用户的逻辑自行实现预处理步骤,实现代码如下:
train_db=train_db.map(preprocess)
考虑MNIST手写数据集,对加载的数据进行预处理。
预处理函数实现在preprocess函数当中。如:

def preprocess(x,y):
x=tf.cast(x,dtype=tf.float32)/255.
x=tf.reshape(x,[-1,28*28])
y=tf.cast(y,dtype=tf.int32)
y=tf.one_hot(y,depth=10)
return x,y

4、循环处理

完成一个Batch的数据训练,称为一个step,通过多个step来完成整个训练集的一次迭代,称为一个Epoch。在实际训练中,通常需要对数据集迭代多个Epoch才能取得较好的训练效果。例如,固定训练20个Epoch,实现如下:

for epoch in range(20):
	for step,(x,y) in enumerate(train_db):
		#training

此外,也可以通过trian_db=train_db.repeat(20)来实现对数据集对象内部遍历多次。

你可能感兴趣的:(深度学习,tensorflow)