Tensorflow高阶操作——合并与分割

本文介绍了TensorFlow中的tf.concat用于拼接张量,要求拼接轴上的尺寸可以不等,但其他维度必须相等。tf.stack则在指定轴上增加维度,所有维度需相等。tf.unstack按指定轴进行分割,分割后的每个部分保持原有维度。tf.split允许指定分割数量或大小,灵活地对张量进行分割操作。
摘要由CSDN通过智能技术生成

合并与分割

tf.concat  #拼接
tf.split  # 分割
tf.stack  # 堆叠
tf.unstack #分割,unstack是split中的一种 

concat 拼接

a = tf.ones([4, 35, 8])
b = tf.ones([2, 35, 8])
c = tf.concat([a, b], axis=0)
c.shape

a = tf.ones([4, 32, 8])
b = tf.ones([4, 3, 8])
tf.concat([a, b], axis=1).shape

c.shape代码结果
tf.concat([a, b], axis=1).shape代码结果

[6,35,8]其实可以理解为[4+2,35,8],下一段代码结果同理
这里需要注意的是,为什么可以理解为相加,一是因为代码中的axis=0指定了轴,二是除指定轴之外的其他轴数字都相等
从而可以得到concat的一个条件:

需要拼接的维度可以数字不等,但其他维度的数字必须相等

concat合并,但不增加维度

这可以与下面的stack有所区分

stack堆叠

a = tf.ones([4, 35, 8])
b = tf.ones([4, 35, 8])

tf.concat([a, b], axis=-1).shape   # out:TensorShape([4, 35, 16])
tf.stack([a, b], axis=-1).shape  #out:TensorShape([4, 35, 8, 2])
tf.stack([a, b],axis=0).shape  #out:TensorShape([2, 4, 35, 8])

在这三个代码的输出结果,可以很直观感受出代码的作用不同
concat实际是指定轴数字相加,其余维度数字不变(但必须相同),但维度的数目没有增加或减少
stack实际是在指定处加上一个维度,增加了一个维度

由于是复习,此时我又有了一个疑问,为什么可以直接增加,有没有条件?
翻开笔记,发现stack是有一个条件的,比concat更加严苛的条件

stack要求所有维度相等

最后总结一下两个“合并”代码总结一下:

concat需要拼接的维度可以数字不等,但其他维度的数字必须相等

concat合并,但不增加维度

stack要求所有维度数字都相等,才可以堆叠

stack堆叠,增加维度

unstack分割

a = tf.ones([4, 35, 8])
b = tf.ones([4, 35, 8])

c = tf.stack([a, b])
c.shape  #TensorShape([2, 4, 35, 8])
aa,bb=tf.unstack(c,axis=0)
aa.shape,bb.shape  #(TensorShape([4, 35, 8]), TensorShape([4, 35, 8]))

如果不明显,不太看得出来,换一个

res = tf.unstack(c,axis=3)
res[0].shape # TensorShape([2, 4, 35])
len(res)  # 8

[2, 4, 35, 8]
在unstack中axis=0时为[4, 35, 8]
在unstack中axis=3时为[2, 4, 35]

可以很容易看出,当指定维度时,该维度直接“没了”,其实就是被分割掉了
axis=0时此时维度上数为2,就是被分割成了两段,每一段为[4, 35, 8],下一个同理(res长度可以看出为8)

split分割

res=tf.split(c,axis=3,num_or_size_splits=2)
len(res)  # 2

与unstack相比其实就是多了一个num_or_size_splits

split可以指定打散的数量

res[0].shape #TensorShape([2, 4, 35, 4])
res=tf.split(c,axis=3,num_or_size_splits=[2,2,4])
res[0].shape  #TensorShape([2, 4, 35, 2])
res[2].shape # TensorShape([2, 4, 35, 4])

res=tf.split(c,axis=3,num_or_size_splits=[2,2,4])
是指在第4个维度上,分成三个,分别为2,2,4
即[2, 4, 35, 8]被分成[2, 4, 35, 2],[2, 4, 35, 2],[2, 4, 35, 4]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值