TensorFlow深度学习之实现合并与分割的示例代码
作者:畅游星辰大海
写在前面
本文主要介绍了如下四个函数的参数意义及其函数用法,如有不恰当的地方,还请不吝指正!!!
- tf.concat( )
- tf.stack( )
- tf.unstack( )
- tf.split( )
一、tf.concat( )函数
( 1 )简单介绍
tf.concat() 函数是 TensorFlow 中用于连接张量的函数。它可以将多个张量沿指定的轴连接在一起,形成一个新的张量。
tf.concat(values, axis)
- values 是一个张量列表[tensor1, tensor2, tensor3, ...],表示需要连接的张量。
- axis 是一个整数,可正可负,表示连接轴的方向。
( 2 )学会使用
分别定义两个二维,形状 shape = (2, 3) 的张量,使它们在第一个维度上面拼接,
将第一个维度的中括号打开:
[ [1, 2, 3], [4, 5, 6] ] ——> [1, 2, 3], [4, 5, 6]
[ [7, 8, 9], [10, 11, 12] ] ——> [7, 8, 9], [10, 11, 12]
合并后中括号还原:
[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ——> [ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ]
import tensorflow as tf tensor1 = tf.constant([[1, 2, 3], [4, 5, 6]]) tensor2 = tf.constant([[7, 8, 9], [10, 11, 12]]) tensor = tf.concat([tensor1, tensor2], 0) print(tensor.shape) # (4, 3)
如果将上面的两个张量在第2个维度上面拼接,又该怎样做呢?
在第二个维度的拼接,不干扰第一个维度的张量,
将第二个维度的中括号打开:
[ [1, 2, 3], [4, 5, 6] ] ——> [ 1, 2, 3, 4, 5, 6]
[ [7, 8, 9], [10, 11, 12] ] ——> [ 7, 8, 9, 10, 11, 12]
将1, 2, 3与7, 8, 9对应,将4, 5, 6与10, 11, 12对应拼接,合并后中括号还原
[ 1, 2, 3, 7, 8, 9], [ 4, 5, 6, 10, 11, 12] ——> [ [ 1, 2, 3, 7, 8, 9], [ 4, 5, 6, 10, 11, 12] ]
再举一个例子,还是这个三维的张量理解成【班级,学生,科目】,axis 分别对应0, 1, 2,或-3, -2, -1
import tensorflow as tf # 收集4个班级35名学生的8个科目的成绩 tensor1 = tf.ones([4, 35, 8]) # 收集2个班级35名学生的8个科目的成绩 tensor2 = tf.ones([2, 35, 8]) # 在班级维度上拼接张量, tensor = tf.concat([tensor1, tensor2], axis=0) print(tensor.shape) # 输出:(6, 35, 8)
理解方式和上面的方法相同,如果单看结果还是很简单的
此函数操作后不产生新的维度,下面的stack()函数就会产生新的维度
二、tf.stack( )函数
( 1 )简单介绍
tf.stack() 函数用于沿新的维度堆叠张量。这个新维度将用于堆叠其他张量。
tf.stack(values, axis=0,)
- values: 是一个张量列表[tensor1, tensor2, tensor3, ...],表示需要连接的张量,它们将沿着新的维度堆叠在一起。这些张量应该有相同的形状。
- axis: 一个整数,可正可负,表示沿哪个维度堆叠张量。
( 2 )代码示例
import tensorflow as tf # 创建两个形状都为 [2, 3] 的张量 tensor1 = tf.constant([[1, 2, 3], [4, 5, 6]]) tensor2 = tf.constant([[7, 8, 9], [10, 11, 12]]) # 使用 tf.stack() 函数沿 axis = 0 将两个张量堆叠在一起 stacked_tensor = tf.stack([tensor1, tensor2], axis=0) print(stacked_tensor) # 输出 tf.Tensor( [[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]], shape=(2, 2, 3), dtype=int32)
三、tf.unstack( )函数
tf.unstack() 用于将输入的 Tensor 张量沿着指定的轴(axis)进行分解。将指定维度全部拆分,该维度的shape是多少就拆分多少个。
tf.unstack(value, axis)
- value: 一个多维 Tensor 张量。
- axis: 一个整数,表示要将输入 Tensor 张量沿哪个轴(axis)进行分解。如果 axis 的值为负数,则从反向轴(倒数轴)开始分解。如果同时提供了 axis 和 num 参数,则优先使用 axis 参数。
( 2 )重点理解
tf.unstack 的作用是将输入的 Tensor 张量沿着指定的轴(axis)分解成多个 Tensor 张量。例如,如果输入的 Tensor 张量形状为 [2, 4, 35, 8],沿轴 8(第四维)进行分解,则会得到8个形状为 [2, 4, 35] 的 Tensor 张量。
import tensorflow as tf tensor1 = tf.ones([4, 35, 8]) tensor = tf.unstack(tensor1, axis=2) print(tensor[0].shape, tensor[3].shape, tensor[7].shape) # 输出:(4, 35) (4, 35) (4, 35)
四、tf.split( )函数
tf.split() 用于将一个张量(tensor)沿着指定的轴(axis)拆分为多个子张量。对比于tf.unstack()函数将某个维度一个个拆分,tf.split()就能实现根据自己的需求拆分。
tf.split(value, num_or_size_splits, axis)
- value: 一个多维张量。
- num_or_size_splits: 要拆分的张量数量或每个拆分的大小。可以是一个整数(表示拆分的数量)或一个一维张量(表示每个拆分的大小)。
- axis: 一个整数,表示沿着哪个轴进行拆分。
1.num_or_size_splits为数字的情况
import tensorflow as tf tensor1 = tf.ones([2, 4, 35, 8]) # 拆分为2个形状为[2, 4, 35, 4]的张量 tensor = tf.split(tensor1, axis=3, num_or_size_splits=2) print(tensor[0].shape, tensor[1].shape) # 输出:[2, 4, 35, 4] [2, 4, 35, 4]
2.num_or_size_splits为一维向量的情况
import tensorflow as tf tensor1 = tf.ones([2, 4, 35, 8]) # 在第三个轴上,按照2 / 2 / 4 形状拆分的张量 tensor = tf.split(tensor1, axis=3, num_or_size_splits=[2, 2, 4]) print(tensor[0].shape, tensor[1].shape, tensor[2].shape) # 输出:(2, 4, 35, 2) (2, 4, 35, 2) (2, 4, 35, 4)
到此这篇关于TensorFlow深度学习之实现合并与分割的示例代码的文章就介绍到这了,更多相关TensorFlow合并 分割内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!