pytorch拼接函数:torch.stack()和torch.cat()详解

pytorch中,常见的拼接函数主要是两个,分别是:stack()cat()
torch.stack()函数的意义:使用stack可以保留两个信息:[1. 序列] 和 [2. 张量矩阵] 信息,属于【扩张再拼接】的函数。

形象的理解:假如数据都是二维矩阵(平面),它可以把这些一个个平面按第三维(例如:时间序列)压成一个三维的立方体,而立方体的长度就是时间序列长度。该函数常出现在自然语言处理(NLP)和图像卷积神经网络(CV)中。

stack()官方解释:沿着一个新维度对输入张量序列进行连接。 序列中所有的张量都应该为相同形状。
浅显说法:把多个2维的张量凑成一个3维的张量;多个3维的凑成一个4维的张量…以此类推,也就是在增加新的维度进行堆叠。

outputs = torch.stack(inputs, dim=?) → Tensor

1 参数
inputs : 待连接的张量序列。
注:python的序列数据只有list和tuple。
dim : 新的维度, 必须在0到len(outputs)之间。
注:len(outputs)是生成数据的维度大小,也就是outputs的维度值。

2 重点
函数中的输入inputs只允许是序列;且序列内部的张量元素,必须shape相等。
举例:[tensor_1, tensor_2,…]或者(tensor_1, tensor_2,…),且必须tensor_1.shape == tensor_2.shape

dim是选择生成的维度,必须满足0<=dimlen(outputs)是输出后的tensor的维度大小
不懂的看例子,再回过头看就懂了。

3 例子
准备2个tensor数据,每个的shape都是[3,3]。

# 假设是时间步T1的输出
T1 = torch.tensor([[1, 2, 3],
        		[4, 5, 6],
        		[7, 8, 9]])
# 假设是时间步T2的输出
T2 = torch.tensor([[10, 20, 30],
        		[40, 50, 60],
        		[70, 80, 90]])
T1:
 tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
T2:
 tensor([[10, 20, 30],
        [40, 50, 60],
        [70, 80, 90]])

测试stack函数

R0 = torch.stack((T1, T2), dim=0)
print("R0:\n", R0)
print("R0.shape:\n", R0.shape)
"""
R0:
 tensor([[[ 1,  2,  3],
         [ 4,  5,  6],
         [ 7,  8,  9]],

        [[10, 20, 30],
         [40, 50, 60],
         [70, 80, 90]]])
R0.shape:
 torch.Size([2, 3, 3])
"""

R1 = torch.stack((T1, T2), dim=1)
print("R1:\n", R1)
print("R1.shape:\n", R1.shape)
"""
R1:
 tensor([[[ 1,  2,  3],
         [10, 20, 30]],

        [[ 4,  5,  6],
         [40, 50, 60]],

        [[ 7,  8,  9],
         [70, 80, 90]]])
R1.shape:
 torch.Size([3, 2, 3])

"""

R2 = torch.stack((T1, T2), dim=2)
print("R2:\n", R2)
print("R2.shape:\n", R2.shape)
"""
R2:
 tensor([[[ 1, 10],
         [ 2, 20],
         [ 3, 30]],

        [[ 4, 40],
         [ 5, 50],
         [ 6, 60]],

        [[ 7, 70],
         [ 8, 80],
         [ 9, 90]]])
R2.shape:
 torch.Size([3, 3, 2])

"""

R3 = torch.stack((T1, T2), dim=3)
print("R3:\n", R3)
print("R3.shape:\n", R3.shape)
"""
IndexError: Dimension out of range (expected to be in range of [-3, 2], but got 3)
"""

注意:拼接后的tensor形状,会根据不同的dim发生变化。
pytorch拼接函数:torch.stack()和torch.cat()详解_第1张图片
4 重点
函数作用:
函数stack()对序列数据内部的张量进行扩维拼接,指定维度由程序员选择、大小是生成后数据的维度区间。

存在意义:
在自然语言处理和卷及神经网络中, 通常为了保留–[序列(先后)信息] 和 [张量的矩阵信息] 才会使用stack

函数存在意义举例?

循环神经网络RNN中输出数据是:一个list,该列表插入了seq_len个形状是[batch_size, output_size]tensor,不利于计算,需要使用stack进行拼接,保留[1.seq_len这个时间步][2.张量属性[batch_size, output_size]]

二、torch.cat()
一般torch.cat()是为了把函数torch.stack()得到tensor进行拼接而存在的。torch.cat() 和python中的内置函数cat(), 在使用和目的上,是没有区别的,区别在于前者操作对象是tensor
2.1 cat()函数目的: 在给定维度上对输入的张量序列seq进行连接操作。

// An higoutputs = torch.cat(inputs, dim=0) → Tensor
hlighted block
var foo = 'bar';

2.2 参数
inputs : 待连接的张量序列,可以是任意相同Tensor类型的python 序列。
dim : 选择的扩维, 必须在0到len(inputs[0])之间,沿着此维连接张量序列。
2.3 重点
输入数据必须是序列,序列中数据是任意相同的shape的同类型tensor
维度不可以超过输入数据的任一个张量的维度
2.4 例子
准备数据,每个的shape都是[2,3]。

x1 = torch.tensor([[11, 21, 31], [21, 31, 41]], dtype=torch.int)
print("x1:\n", x1)
print("x1.shape:\n", x1.shape)
'''
x1:
 tensor([[11, 21, 31],
        [21, 31, 41]], dtype=torch.int32)
x1.shape:
 torch.Size([2, 3])
'''
x2 = torch.tensor([[12, 22, 32], [22, 32, 42]])
print("x2:\n", x2)
print("x2.shape:\n", x2.shape)
'''
x2:
 tensor([[12, 22, 32],
        [22, 32, 42]])
x2.shape:
 torch.Size([2, 3])
'''

合成inputs

inputs = [x1, x2]
print("inputs:\n", inputs)
'''
inputs:
 [tensor([[11, 21, 31],
        [21, 31, 41]], dtype=torch.int32), tensor([[12, 22, 32],
        [22, 32, 42]])]
'''

查看结果, 测试不同的dim拼接结果

R0 = torch.cat(inputs, dim=0)
print("R0:\n", R0)
print("R0.shape:\n", R0.shape)
'''
R0:
 tensor([[11, 21, 31],
        [21, 31, 41],
        [12, 22, 32],
        [22, 32, 42]])
R0.shape:
 torch.Size([4, 3])
'''

R1 = torch.cat(inputs, dim=1)
print("R1:\n", R1)
print("R1.shape:\n", R1.shape)
'''
R1:
 tensor([[11, 21, 31, 12, 22, 32],
        [21, 31, 41, 22, 32, 42]])
R1.shape:
 torch.Size([2, 6])
'''

R2 = torch.cat(inputs, dim=2)
print("R2:\n", R2)
print("R2.shape:\n", R2.shape)
'''
IndexError: Dimension out of range (expected to be in range of [-2, 1], but got 2)
'''

你可能感兴趣的:(Python,pytorch,深度学习,python)