pytorch学习笔记一:张量的操作与线性回归

本文介绍了PyTorch中的张量基本概念和属性,包括张量的创建、操作,以及线性回归模型的构建。张量是深度学习的基础,文章详细阐述了张量的创建方式,如直接创建、依数值创建和依概率创建,并讨论了张量的拼接、切分、索引和变换等操作。最后,文章简单介绍了线性回归模型的求解步骤。

一、张量的简介

1、张量的基本概念

张量是一个【多维数组】,它是一个标量、向量、矩阵的高维拓展。
在这里插入图片描述

2、张量的属性

在 PyTorch 0.4.0 之前,torch.autograd 包中存在 Variable 这种数据类型,主要是用于封装 Tensor,进行自动求导。Variable 主要包含下面几种属性。
在这里插入图片描述
● data: 被包装的 Tensor。
● grad: data 的梯度。
● grad_fn: 创建 Tensor 所使用的 Function,是自动求导的关键,因为根据所记录的函数才能计算出导数。
● requires_grad: 指示是否需要梯度,并不是所有的张量都需要计算梯度。
● is_leaf: 指示是否叶子节点(张量)。

在 PyTorch 0.4.0 之后,Variable 并入了 Tensor。在之后版本的 Tensor 中,除了具有上面 Variable 的 5 个属性,还有另外 3 个属性。
在这里插入图片描述

  • dtype:张量的数据类型
    在这里插入图片描述
    每种类型都有CPU和GPU两个版本,张量运算必须发生在相同类型的数据之间。
  • shape:张量的形状,如(1, 3, 64, 64)
  • device:张量所在的设备,CPU/GPU,决定张量的计算在哪里进行,张量放在GPU上才能使用加速。

二、张量的创建

1、直接创建

torch.tensor():从data创建Tensor

torch.tensor(data, 
             dtype=None, 
             device=None, 
             requires_grad=False, 
             pin_memory=False) -> Tensor
  • data:数据,可以是list,也可以是numpy
  • dtype:数据类型,默认和data一致
  • device:tensor所在的设备
  • requires_grad:是否需要梯度,默认False,在搭建神经网络时需要将求导的参数设为True
  • pin_memory:是否存于锁页内存,默认False

示例:

arr = np.ones((3, 3))
print('ndarray的数据类型:',arr.dtype)

tensor_arr = torch.tensor(arr)
print(tensor_arr)

#result
ndarray的数据类型: float64
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)

.from_numpy() 将ndarray转换成tensor,两者共享内存,当修改一个数据时另一个也会被修改

array_b = np.array([1, 2, 3, 4])
tensor_b = torch.from_numpy(array_b)
print(array_b)
print(tensor_b)
#result
[1 2 3 4]
tensor([1, 2, 3, 4], dtype=torch.int32)

array_b[0] = 5
print(array_b)
print(tensor_b)
#result
[5 2 3 4]
tensor([5, 2, 3, 4], dtype=torch.int32)

tensor_b[0] = 10
print(array_b)
print(tensor_b)
#result
[10  2  3  4]
tensor([10,  2,  3,  4], dtype=torch.int32)

2、依数值创建

torch.zeros()依size创建全0的张量,torch.ones()依据size创建值全为1的张量

torch.zeros(*size, 
            out=None, 
            dtype=None, 
            layout=torch.strided, 
            device=None, 
            requires_grad=False) -> Tensor
  • size:张量的形状,如(3,3)
  • layout :这个是内存中的布局形式,有strided和sparse_coo等
  • out:表示输出张量,就是再把这个张量赋值给别的一个张量,但是这两个张量时一样的,指的同一个内存地址
  • device:所在的设备,gpu/cpu
  • requires_grad:是否需要梯度
    示例:
out_t = torch.tensor([2])
t = torch.zeros((3, 3), out=out_t)
print(out_t)
print(t)
print(id(t), id(out_t), id(out_t)==id(t))
# result
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
140531404201664 140531404201664 True

torch.eye()创建对角线为1的张量

torch.eye(n, m=None, 
    out=None, 
    dtype=None, 
    layout=torch.strided, 
    device=None, 
    requires_grad=False) -> Tensor

torch.zeros_like()创建与input同shape的值全为0张量,torch.ones_like()创建与input同shape的值全为1的张量

#创建与input同shape的全1张量
torch.ones_like(input, 
          dtype=None, 
          layout=None, 
          device=None, 
          requires_grad=False, 
          memory_format=torch.preserve_format) -> Tensor
out_t = torch.tensor([1, 2, 3])
print('out_t:', out_t)

t = torch.ones((3,1), out=out_t)
print('\n')
print('t:',t)
print('out_t:', out_t)
print('id(t:):', id(t), 'id(out_t):', id(out_t), id(t)==id(out_t))

inputs = torch.tensor([[1, 2], [3, 4]])
out_ = torch.ones_like(inputs)
print('\n')
print('out_:', out_)

###result
out_t: tensor([1, 2, 3])


t: tensor([[1],
        [1],
        [1]])
out_t: tensor([[1],
        [1],
        [1]])
id(t:): 2564793927864 id(out_t): 2564793927864 True


out_: tensor([[1, 1],
        [1, 1]])

torch.full()自定义数值张量

torch.full(size, 
           fill_value,
           out=None, 
           dtype=None, 
           layout=torch.strided, 
           device=None, 
           requires_grad=False) -> Tensor
# fill_value:自定义的数值
torch.full_like(input, 
                fill_value, 
                dtype=None, 
                layout=torch.strided, 
                device=None, 
                requires_grad=False, 
                memory_format=torch.preserve_format) -> Tensor
full_t = torch
08-20
张量(Tensor)是数学、物理和工程学等多个领域中的个重要概念,它是种多维数组结构,能够表达和处理标量、向量、矩阵以及更高维度数据之间的线性关系。张量的核心特性在于其变换规则,这些规则描述了在坐标变换下张量分量如何变化,同时保持其内在的物理或几何意义不变[^2]。 ### 张量的定义 从代数角度来看,张量可以看作是数量(标量)、向量和矩阵的自然推广。具体来说: - **0阶张量(标量)**:没有方向的量,仅包含大小,例如温度或质量。 - **1阶张量(向量)**:具有大小和方向的量,通常表示为维数组。 - **2阶张量(矩阵)**:可以理解为二维数组,用于描述线性变换或二元线性关系。 - **高阶张量**:超过两个维度的张量,例如3阶张量可以被想象为个立方体数组,4阶及以上则更难直观可视化,但在深度学习等领域中非常常见[^4]。 ### 张量深度学习中的应用 在深度学习框架(如TensorFlow、PyTorch)中,张量是数据表示的基本形式。图像、文本、音频等数据都可以转换为张量的形式进行处理。例如: - 张灰度图像通常表示为个2阶张量(矩阵),其中每个元素代表个像素的亮度。 - 张彩色图像则表示为个3阶张量,其三个维度分别对应图像的高度、宽度和颜色通道(如RGB)。 - 在视频处理中,视频可以被表示为4阶张量,增加了个时间维度。 张量的运算(如张量积、张量分解等)在构建神经网络模型时起着关键作用,能够高效地进行大规模并行计算[^1]。 ### 张量的编程实现 在编程中,张量通常通过多维数组来实现。例如,在Python中使用NumPy库可以创建和操作张量: ```python import numpy as np # 创建个1阶张量(向量) vector = np.array([1, 2, 3]) # 创建个2阶张量(矩阵) matrix = np.array([[1, 2], [3, 4]]) # 创建个3阶张量 tensor_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) ``` 类似地,在MATLAB中也可以使用多维数组来表示张量,并进行张量运算[^4]。 ### 张量的变换规则 张量个关键特性是其变换规则。在坐标变换时,张量的各个分量会按照特定的方式变化,以保持其物理或几何意义不变。这种特性使得张量在物理学中被广泛用于描述如应力、应变、电磁场等具有方向依赖性的现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值