关于张量(tensor)的理解

在深度学习中经常会碰到一个词,“张量”(tensor)。但对于一维,二维,三维还好理解,那么更多维度的时候呢?特别是当增加了批次(batch_size)这个维度,我们应该如何理解张量。

以pytorch为例,tensorflow也是一样的。

我们先来看这几个维度:

一维:

a = torch.tensor([1,2,3])

输出:tensor([1, 2, 3])

shape:torch.Size([3])

输出只有一个维度,所以是一维

二维:

 a = torch.tensor([[1,2,3]])

输出:tensor([[1, 2, 3]])

shape:torch.Size([1, 3])

a = torch.tensor([[1,2,3],[4,5,6],[7,8,9]])

tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])

shape:torch.Size([3, 3])

以上输出有行和列,所以上二维张量,就是一个二维矩阵。

在来看一个矩阵:

torch.ones(1,3,3)

tensor([[[1., 1., 1.],
         [1., 1., 1.],
         [1., 1., 1.]]])

 我们注意到这个张量是有三个维度的,前面多了一个维度1。但貌似没看出这个1体现在哪里,我们再来看一个张量,进一步看一下这个最前面的维度体现在哪里:

torch.ones(3,3,3)

tensor([[[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.]]])

这回能看出来这个最前面的维度体现在哪里了么?相当于第一个3,是分了3大行每一大行,又分了三行小行,每行又分了三列,所以是3*3*3,最后一个维度永远是列的维度。 

如果你将上面的张量类比成图像,就相当于上面是3通道,每个通道的大小又是三行三列。。。

然后我们在看一个张量:

torch.ones(2,3,3,3)

tensor([[[[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.]]]])

上面的输出我专门用一个水平线分开了,这样更明显,上面一部分是一个维度,下面又是一个维度,所以是两个维度,再说的大白话点,就是整个张量,两大行,每大行又分了三行,每行又分了三行,然后又分了三列。

这个最前面的维度2,其实就是batchsize,就相当于这个张量是输入了两张图像,每个图像的大小是3通道,大小3*3。这样就应该比较好理解了。

再附一张图来说明一下:

 希望能够说明白~~让大家更好的理解张量

### 使用张量进行基础练习 #### 创建不同类型的张量 创建张量是使用PyTorch的基础之一。下面展示了如何利用不同的方法来初始化张量。 ```python import torch # 创建全为0的张量,形状为 (2, 3) zeros_tensor = torch.zeros((2, 3)) print(zeros_tensor) # 创建全为1的张量,形状同样为 (2, 3),并指定了数据类型为 float64 ones_tensor = torch.ones((2, 3), dtype=torch.float64) print(ones_tensor) # 根据现有张量创建新张量,保持相同特性但填充随机数 random_tensor_like_ones = torch.rand_like(ones_tensor, dtype=torch.float) print(random_tensor_like_ones) ``` #### 修改张量属性 了解如何改变张量的尺寸和其他属性对于灵活应用非常重要。 ```python # 改变张量的形状而不改变其内容 reshaped_tensor = random_tensor_like_ones.view(-1) # 将多维张量展平成一维 print(f"Reshaped Tensor:\n{reshaped_tensor}") # 更改张量的数据类型 casted_tensor = reshaped_tensor.type(torch.int8) print(casted_tensor.dtype) ``` #### 执行简单的算术运算 掌握基本的操作有助于更深入理解张量之间的交互方式。 ```python a = torch.tensor([1., 2., 3.]) b = torch.tensor([4., 5., 6.]) addition_result = a + b # 加法 multiplication_result = a * b # 逐元素乘法 dot_product_result = torch.dot(a, b) # 向量点积 print(addition_result) print(multiplication_result) print(dot_product_result) ``` #### 计算梯度 当涉及到优化算法时,能够追踪和更新参数是非常重要的技能。 ```python x = torch.tensor([1., 2., 3., 4.], requires_grad=True) y = x.sum() y.backward() print(x.grad) # 应该打印出 [1., 1., 1., 1.] 表明每个位置上的偏导数值均为1[^2] # 清除之前累积的梯度以便于下次计算 if x.grad is not None: x.grad.zero_() ``` 通过上述例子可以看出,张量不仅支持多种创建方式,还提供了丰富的接口来进行各种各样的变换与操作。这些基础知识构成了后续复杂任务实现的前提条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃肉的鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值