当前位置: 首页 > article >正文

【PyTorch】张量操作与线性回归

张量的操作

Tensor Operation

拼接与切分

1.1 torch.cat()

torch.cat(tensors, dim=0, out=None)

功能:将张量按维度dim进行拼接

  • tensors:张量序列
  • dim:要拼接的维度

1.2 torch.stacok()

torch.stack(tensors, dim=0, out=None)

功能:在新创建的维度dim上进行拼接

  • tensors:张量序列
  • 要拼接的维度

1.3 torch.chunk()

torch.chunk(input, chunks, dim=0)

功能:将张量按维度dim进行平均切分
返回值:张量列表
注意事项:若不能整除,最后一份张量小于其他张量

  • input:要切分的张量
  • chunks:要切分的份数
  • dim:要切分的维度

1.4 torch.split()

torch.chunk(input, chunks, dim=0)

功能:将张量按维度dim进行切分
返回值:张量列表

  • tensor:要切分的张量
  • split_size_or_sections:为int时,表示每一份的长度;为list时,按list元素切分
  • dim:要切分的维度

索引

2.1 torch.index_select()

torch.index_select(input, dim, index, out=None)

功能:在维度dim上,按index索引数据返回值(依index索引数据拼接的张量)

  • input:要索引的张量
  • dim:要索引的维度
  • index:要索引数据的序号

2.2 torch.masked_select()

torch.masked_select(input, mask, out=None)

功能:按mask中的True进行索引
返回值:一维张量

  • input:要索引的张量
  • mask:与input同形状的布尔类型张量

变换

3.1 torch.reshape()

torch.reshape(input, shape)

功能:变换张量形状
注意事项:当张量在内存中是连续时,新张量与input共享数据内存(改变一个变量时,另一个变量也会被改变)。

  • input:要变换的张量
  • shape:新张量的形状

3.2 torch.transpose()

torch.transpose(input, dim0, dim1)

功能:交换张量的两个维度

  • input:要变换的张量
  • dim0:要交换的维度
  • dim1:要交换的维度

3.3 torch.t()

功能:2维张量转置,对矩阵而言,等价于

torch.transpose(input, 0, 1)

3.4 torch.squeeze()

torch.squeeze(input, dim=None, out=None)

功能:压缩长度为1的维度(轴)

  • dim:若为None,移除所有长度为1 的轴;若指定维度,当且仅当该轴长度为1时,可以被移除

3.5 torch.unsqueeze()

torch.unsqueeze(input, dim)

功能:依据dim扩展维度

  • dim:扩展的维度

张量的数学运算

Tensor Math Operations

加减乘除

torch.add()
torch.addcidv()
torch.addcmul()
torch.sub()
torch.div()
torch.mul()

对数、指数、幂函数

torch.log(input, out=None)
torch.log10(input, out=None)
torch.log2(input, out=None)
torch.exp(input, out=None)
torch.pow()

三角函数

torch.abs(input, out=None)
torch.acos(input, out=None)
torch.cosh(input, out=None)
torch.cos(input, out=None)
torch.asin(input, out=None)
torch.atan(input, out=None)
torch.atan2(input, other, out=None)

实例

torch.add()

torch.add(input, other, out=None)
torch.add(input, other, *, alpha=1, out=None)

功能:逐元素计算 input + alpha × other

  • input:第一个张量
  • alpha:乘项因子
  • other:第二个张量

Pythonic:
torch.addcdiv()

torch.addcdiv(input, tensor1, tensor2, *, value=1, out=None)

在这里插入图片描述

torch.addcmul()

torch.addcmul(input, tensor1, tensor2, *, value=1, out=None)

在这里插入图片描述

线性回归

Linear Regression

基本概念

线性回归是分析一个变量与另外一(多)个变量之间关系的方法。

因变量:y
自变量:x
关系:线性

y = wx + b

分析:求解w,b

求解步骤

  1. 确定模型
    Model:y = wx + b
  2. 选择损失函数
    MSE
    在这里插入图片描述
  3. 求解梯度并更新w,b
    w = w - LR * w.grad
    b = b - LR * w.grad

完整代码

import torch
import matplotlib.pyplot as plt
torch.manual_seed(10)

lr = 0.05  # 学习率

# 创建训练数据
x = torch.rand(20, 1) * 10  # x data (tensor), shape=(20, 1)
# torch.randn(20, 1) 用于添加噪声
y = 2*x + (5 + torch.randn(20, 1))  # y data (tensor), shape=(20, 1)

# 构建线性回归参数
w = torch.randn((1), requires_grad=True) # 设置梯度求解为 true
b = torch.zeros((1), requires_grad=True) # 设置梯度求解为 true

# 迭代训练 1000 次
for iteration in range(1000):

    # 前向传播,计算预测值
    wx = torch.mul(w, x)
    y_pred = torch.add(wx, b)

    # 计算 MSE loss
    loss = (0.5 * (y - y_pred) ** 2).mean()

    # 反向传播
    loss.backward()

    # 更新参数
    b.data.sub_(lr * b.grad)
    w.data.sub_(lr * w.grad)

    # 每次更新参数之后,都要清零张量的梯度
    w.grad.zero_()
    b.grad.zero_()

    # 绘图,每隔 20 次重新绘制直线
    if iteration % 20 == 0:

        plt.scatter(x.data.numpy(), y.data.numpy())
        plt.plot(x.data.numpy(), y_pred.data.numpy(), 'r-', lw=5)
        plt.text(2, 20, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color':  'red'})
        plt.xlim(1.5, 10)
        plt.ylim(8, 28)
        plt.title("Iteration: {}\nw: {} b: {}".format(iteration, w.data.numpy(), b.data.numpy()))
        plt.pause(0.5)

        # 如果 MSE 小于 1,则停止训练
        if loss.data.numpy() < 1:
            break

参考链接

PyTorch 学习笔记


http://www.kler.cn/news/321152.html

相关文章:

  • 【学习笔记】网络设备(华为交换机)基础知识7——查看硬件信息 ① display device 命令详解
  • 【Redis入门到精通七】详解Redis持久化机制(AOF,RDB)
  • UBUNTU20.04安装CH384串口卡驱动
  • 【ARM】SOC的多核启动流程详解
  • 关于在vue2中给el-input等输入框的placeholder加样式
  • 【2024】前端学习笔记9-内部样式表-外部导入样式表-类选择器
  • MCUboot 和 U-Boot区别
  • 元宇宙的未来趋势:Web3的潜在影响
  • 二分查找算法(2) _在排序数组中查找元素的第一个和最后一个_模板
  • 前端Vue学习笔记02
  • 音视频入门基础:FLV专题(3)——FLV header简介
  • 【算法精解】逆序对受限的方案数
  • NLP-transformer学习:(7)evaluate实践
  • ??实验——完全使用Ansible部署多台服务器的服务
  • MedPrompt:基于提示工程的医学诊断准确率优化方法
  • GS-SLAM论文阅读笔记--GEVO
  • nodejs基于vue+express度假村旅游管理系统设计与实现7t82p
  • 【C++ 学习】多态的基础和原理(10)
  • Unity3D 中构建行为树插件详解
  • AI论文写作网站哪个最好用?亲测完推荐这款!
  • 【数据库】
  • 学习篇 | 5步安装 npm node(homebrew 简洁版)
  • Interaction to Next Paint 指标
  • STL之vector篇(下)(手撕底层代码,从零实现vector的常用指令,深度剖析并优化其核心代码)
  • 第18周 3-过滤器
  • 如何进行SQL调优?
  • 黑龙江亿林自研等保一体机深度解析
  • Vue Devtools -----一条龙安装教程 + 解决安装使用过程的一些问题
  • EdgeRoute_镜像烧录
  • 通过 Java Vector API 利用 SIMD 的强大功能