【Pytorch】系统学习Pytorch(一)——tensor维度理解和取行列值操作

Pytorch最核心的数据类型是tensor(张量),实际上我个人觉得形式上张量就是个高维数组。但是tensor的维度如何理解,比如高维tensor我们取[:,:,:,…:,3]的时候我们取的是那些数?这涉及到对tensor维度的理解

tensor生成

x=torch.zeros(5,3)

输出:
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])

zero表示0矩阵输出为五行三列矩阵。值得注意的是,形状为(5,3)。并不是每5个数字组成一个数组,3个数组组成一个二维矩阵,而是3个数字组成一个数组,5个数组组成一个矩阵。
因此,我们可以推断出如果形状为(5,3,6),则是6个数字组成一个数组,3个数组组成一个二维矩阵,5个矩阵组成第三个中括号。

x=torch.rand(5,3,6)
输出
tensor([[[0.7082, 0.4651, 0.0062, 0.1272, 0.7605],
         [0.5940, 0.5157, 0.6533, 0.5600, 0.0796],
         [0.4875, 0.9800, 0.6824, 0.2140, 0.0257]],

        [[0.0359, 0.4448, 0.2103, 0.2563, 0.6658],
         [0.6536, 0.5420, 0.4873, 0.0294, 0.0229],
         [0.3487, 0.1674, 0.4722, 0.9263, 0.9484]],

        [[0.4078, 0.0509, 0.2812, 0.3428, 0.0808],
         [0.2130, 0.3733, 0.8707, 0.3242, 0.7457],
         [0.8664, 0.1015, 0.7702, 0.2946, 0.4089]],

        [[0.9480, 0.9742, 0.1043, 0.5440, 0.3058],
         [0.0629, 0.8556, 0.6327, 0.6300, 0.5363],
         [0.6271, 0.1860, 0.5853, 0.7823, 0.2174]],

        [[0.8960, 0.5037, 0.5756, 0.3715, 0.7940],
         [0.9994, 0.7644, 0.1792, 0.4904, 0.0357],
         [0.3241, 0.5176, 0.5344, 0.5197, 0.6703]],

        [[0.4445, 0.0174, 0.8888, 0.9323, 0.3574],
         [0.5473, 0.9295, 0.8365, 0.8500, 0.8291],
         [0.8582, 0.1999, 0.3006, 0.6864, 0.5285]]])

tensor维度

tensor一些操作需要涉及到维度dim参数,比如

torch.cat([x,asd],dim=0)

向量拼接操作,后面的dim表示维度,那么加入dim=0,也就是第一个维度,到底是那个维度呢
这里我们做一个实验:

tensor1=torch.ones(5,3,6)
tensor2=torch.zeros(5,3,6)
print(torch.cat([tensor2,tensor1],dim=0))

我最开始猜的是最内部的中括号是第一个维度,因此如果dim=0则应该是一行12个值。然而并不是哈哈哈哈哈。

tensor([[[0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.]],

        [[0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.]],

        [[0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.]],

        [[0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.]],

        [[0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0.]],

        [[1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.]],

        [[1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.]],

        [[1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.]],

        [[1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.]],

        [[1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.]]])

可以看出,是拆掉最外面的中括号,然后把两个tensor拼在一起,再加上中括号换句话说,(5,3,6)中 5 才是第一个维度,最外面是第一个维度。

tensor取行、列等

我们依旧拿三维tensor来举例子,因为二维太常见了,不利于理解。

tensor1=torch.rand(5,3,6)
print("0:",x)
print("1:",x[0])#取出第零个元素,也就是第一个,把最外层中括号当成一个大数组,取第一个,也就是第一个二维矩阵
print("2:",x[0][0])#取第一个二维矩阵的第一个元素,也就是第一个长度为6的一维数组。
print("3:",x[0,0])#同上
print("4:",x[:,0])#冒号可以理解为取第一个维度的所有元素,在这里就是所有的二维矩阵,然后取出每个二维矩阵的第一个元素,也就是长度为6一维数组,再拼成一个二维数组。
print("5:",x[:,:,0])#如何理解?前两个维度都是冒号,也就是全部取出来。第一个冒号可以理解为取第一个维度的所有元素,在这里就是所有的二维矩阵。第二个冒号就是把二维矩阵取出所有元素,也就是所有的一维数组,然后再取一维数组的第一个元组(也就是单独一个值),拼接起来。
#另一个问题来了,再拼接之后是3*5还是5*3,倒着来,635故为3*5,从前往后拆,从后往前组。
print("6:",x[:,0,:])#这个跟4一样
输出如下:
0: tensor([[[0.7504, 0.0163, 0.1442, 0.2697, 0.5262, 0.7634],
         [0.3688, 0.5919, 0.2953, 0.1973, 0.0406, 0.2681],   
         [0.6594, 0.3670, 0.4670, 0.6504, 0.2137, 0.9301]],  

        [[0.2488, 0.9409, 0.9087, 0.9538, 0.8453, 0.9773],
         [0.6072, 0.7016, 0.0464, 0.2436, 0.0238, 0.7793],
         [0.7214, 0.6926, 0.7738, 0.7588, 0.0035, 0.5165]],

        [[0.3435, 0.9009, 0.1431, 0.4448, 0.0435, 0.4723],
         [0.6168, 0.9506, 0.5852, 0.2774, 0.9529, 0.0059],
         [0.0069, 0.1395, 0.8941, 0.4279, 0.0804, 0.2114]],

        [[0.3677, 0.3143, 0.8086, 0.5886, 0.3840, 0.6128],
         [0.4575, 0.2936, 0.0335, 0.4177, 0.3662, 0.9141],
         [0.3135, 0.9235, 0.2801, 0.4922, 0.8769, 0.7456]],

        [[0.4155, 0.9832, 0.0595, 0.9721, 0.5980, 0.8544],
         [0.3609, 0.6466, 0.2630, 0.5928, 0.3223, 0.3392],
         [0.3760, 0.7973, 0.2696, 0.1483, 0.9533, 0.0152]]])
1: tensor([[0.7504, 0.0163, 0.1442, 0.2697, 0.5262, 0.7634],
        [0.3688, 0.5919, 0.2953, 0.1973, 0.0406, 0.2681],
        [0.6594, 0.3670, 0.4670, 0.6504, 0.2137, 0.9301]])
2: tensor([0.7504, 0.0163, 0.1442, 0.2697, 0.5262, 0.7634])
3: tensor([0.7504, 0.0163, 0.1442, 0.2697, 0.5262, 0.7634])
4: tensor([[0.7504, 0.0163, 0.1442, 0.2697, 0.5262, 0.7634],
        [0.2488, 0.9409, 0.9087, 0.9538, 0.8453, 0.9773],
        [0.3435, 0.9009, 0.1431, 0.4448, 0.0435, 0.4723],
        [0.3677, 0.3143, 0.8086, 0.5886, 0.3840, 0.6128],
        [0.4155, 0.9832, 0.0595, 0.9721, 0.5980, 0.8544]])
5: tensor([[0.7504, 0.3688, 0.6594],
        [0.2488, 0.6072, 0.7214],
        [0.3435, 0.6168, 0.0069],
        [0.3677, 0.4575, 0.3135],
        [0.4155, 0.3609, 0.3760]])
6: tensor([[0.7504, 0.0163, 0.1442, 0.2697, 0.5262, 0.7634],
        [0.2488, 0.9409, 0.9087, 0.9538, 0.8453, 0.9773],
        [0.3435, 0.9009, 0.1431, 0.4448, 0.0435, 0.4723],
        [0.3677, 0.3143, 0.8086, 0.5886, 0.3840, 0.6128],
        [0.4155, 0.9832, 0.0595, 0.9721, 0.5980, 0.8544]])

来源:十了个九

物联沃分享整理
物联沃-IOTWORD物联网 » 【Pytorch】系统学习Pytorch(一)——tensor维度理解和取行列值操作

发表评论