Tensorflow进阶之合并与分割|数据统计|填充与复制|高级操作

目录

一、合并与分割

1、合并

(1)拼接

(2)堆叠

2、分割

二、数据统计

1、向量范数

2、最值、均值、和

三、填充与复制

四、高级操作

1、tf.gather

2、tf.gather_nd

3、tf.where


一、合并与分割

1、合并

张量的合并可通过拼接和堆叠操作实现,拼接并不会产生新的维度,而堆叠操作会创建新的维度。

(1)拼接

tf.concat(tensors,axis) tensors保存了所有需要合并的张量序列,axis代表所需要合并的张量维度索引。

注意在使用拼接时,要注意非合并维度的长度必须相等,否则会报错。

#合并,例如一个专业有两个班级,每个班级30名学生,共学7门课。
a = tf.random.normal([1,30,7])
b = tf.random.normal([1,30,7])
tf.concat([a,b],0)  # shape=(2, 30, 7)
(2)堆叠

tf.stack(tensors,axis)   参数tensors保存了所有需要合并的张量序列,参数axis指定新维度插入的位置。

#堆叠,例如需要合并两个班级,且班级维度插在最前面。
a = tf.random.normal([30,7])
b = tf.random.normal([30,7])
tf.stack([a,b],0) #shape=(2, 30, 7)

2、分割

合并张量的逆过程就是分割操作

tf.split(x,num_or_size_splits,axis)  其中,x为待分割张量,num_or_size_splits代表切割方案,可以为标量或张量,axis指定分割的维度索引号。

#创建张量
x = tf.random.normal([10,35,8])
#等长划分,在索引为0的维度,分割成10份。
result = tf.split(x,10,0)
result  #shape=(1,35,8)
len(result) #共有10个张量

#按照不等长划分为四个张量
result = tf.split(x,[4,2,2,2],0)
result #shape=(4, 35, 8),shape=(2, 35, 8),shape=(2, 35, 8),shape=(2, 35, 8)

二、数据统计

1、向量范数

向量范数(Vector Norm)是表征向量长度的一种度量方法,在神经网络中,常用来表示张量权值大小、梯度等。

import numpy as np
#计算范数
x = tf.ones([2,2]) 
tf.norm(x,ord = 1)      #numpy=4.0
tf.norm(x,ord = 2)      #numpy=2.0
tf.norm(x,ord = np.inf) #numpy=1.0

2、最值、均值、和

#最值、均值、和
x = tf.random.normal([4,10])

#统计概率维度上的最大值
print(tf.reduce_max(x,axis = 1))

#统计概率维度上的最小值
tf.reduce_min(x,axis = 1)
 
#统计概率维度上的均值
tf.reduce_mean(x,axis = 1) 


#实例,以一个两个样本10分类问题为例,实际预测时往往会选择概率值最大的索引号作为样本的预测值
out = tf.random.normal([2,10])
#将10维度上的数据转化为概率值
out = tf.nn.softmax(out,axis = 1)
out
#读取最大概率值所对应的索引
max = tf.argmax(out,axis = 1)
max

三、填充与复制

1、填充

填充就是在需要补充长度的数据开始或结束填充足够数量的特定数值,但这些特定数值一般代表了无效的意义。通常情况下,重复使用复制数据会破坏原有的数据结构。

#填充
#第一个句子
a = tf.constant([1,2,3,4,5,6])

#第二个句子
b = tf.constant([7,8,1,6])

#在第二个句子末尾添加两个0
b = tf.pad(b,[[0,2]])
b #shape=(6,)

#堆叠合并
tf.stack([a,b],axis = 0) #shape=(2,6)

 2、复制

通过tf.tile()函数可以在任意维度将数据复制多分

#复制多份
x = tf.random.normal([4,28,28,3])
tf.tile(x,[2,3,3,1]) #shape=(8, 84, 84, 3)

四、高级操作

1、tf.gather

可以实现根据索引号收集数据的目的,相比于切片,它更适用于不规则的索引方式。

#tf.gather便可根据索引号收集数据一共有四个班级,每个班级28人,每个人修7门课
x = tf.random.uniform([4,28,7],maxval = 100,dtype = tf.int32)

#收集第1个和第2个班级的数据
tf.gather(x,[0,1],axis = 0)

#收集第二个维度上第0,3,4,8,9,25号同学的数据
tf.gather(x,[0,3,4,8,9,25],axis = 1)

2、tf.gather_nd

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

#根据多维坐标收集数据,查看2班第2个同学,查看3班第3个同学,查看4班第4个同学的数据
tem = tf.gather_nd(x,[[1,1],[2,2],[3,3]])
tem #shape=(3, 7)

3、tf.where

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

#tf.where
a = tf.ones([3,3])
b = tf.zeros([3,3])
cond = tf.constant([[True,False,False],[False,True,False],[True,True,False]])
tf.where(cond,a,b) #返回值张量为1的位置全部来自张量a,返回的张量中为0的位置全部来自张量b。

  • 21
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值