PyTorch入坑(一)~(三): Tensor的概念,基本操作和线性回归

PyTorch 入坑一:数据类型与Tensor的概念

PyTorch数据类型

pytorch提供了九种数据类型,主要分为三大类;
第一类是float浮点数,有16位(16-bit floating point)、32位(32-bit floating point)、64位(64-bit floating point);
第二类是整型,有8位(8-int integer(unsigned),8-int integer(signed)),32位(32-bit integer(signed)),64-bit integer(signed);
第三类是布尔型数据(Boolean)。

用得最多的是32-bit floating point(卷积神经网络或者图片处理使用到)和64-bit integer(signed)(图像的标签通常用长整型进行表示)

tensor有八个属性,其中四个属性与数据相关,4个属性与梯度求导相关。

Tensor的概念

Tensor(张量)是一个多维数组,它是标量、向量、矩阵的高维拓展。

  • 标量是一个零维张量,是没有方向的,是一个数。
  • 一维张量只有一个维度,是一行或者一列
  • 二维张量是一个矩阵,有两个维度,灰度图片就是一个二维张量
  • 当图像是彩色图像(RGB)的时候,就得使用三维张量了

Tensor与Variable

Variable
  • variable是pytorch 0.4.0以前的版本中一个重要的数据类型,从pytorch0.4.0开始,variable并入到tensor 中

  • variable是torch.autograd中的数据类型,主要用于封装tensor,进行自动求导。variable主要由以下几个部分组成

      - data: 被包装的tensor
      - grad: data的梯度
      - grad_fn: 表明该变量是怎么来的,用于指导反向传播,例如loss = a+b,则loss.gard_fn为<AddBackward0 at 0x7f2c90393748>,表明loss是由相加得来的,这个grad_fn可指导怎么求a和b的导数
      - requires_grad: 指示是否需要梯度
      - is_leaf: 指示是否是叶子结点(张量)
    

在这里插入图片描述
在这里插入图片描述

Tensor
  • pytorch自0.4.0版本后将variable并入tensor中

  • 在tensor中有8个部分,其中有5个部分在前面的variable中已经介绍了。剩余的3个部分分别为dtype,shape,device

      - dtype: 张量的数据类型,如torch.FloatTensor, torch.cuda.FloatTensor,cuda表示数据是放到GPU上的
      - shape: 张量的形状,如(64,3,224,224)
      - device:张量所在设备,GPU/CPU,是加速的关键
    

Tensor的创建

张量的创建有三大方法,第一类是直接创建,第二类是依据数值创建,第三类是依据概率创建
未完待续

https://blog.csdn.net/qq_37388085/article/details/102504334

PyTorch 入坑二:Tensor切分

Tensor的拼接

Tensor的切分

Tensor的索引

Tensor的变换

torch.reshape()

torch.transpose()

torch.t()

torch.squeeze()

torch.unsqueeze()

张量的数学运算

加减乘除

  • torch.add()
  • torch.addcdiv()
  • 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)

PyTorch 入坑三:线形回归与计算图

线性回归

求解步骤

1、确定模型 model: y = wx + b
2、选择损失函数 MSE,均方误差
3、求解梯度并更新w,b

计算图

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)  rand是生成均匀分布的20个点,再乘于10,范围就是0-10之间
y = 1*x + (5 + torch.randn(20, 1))  # y data (tensor), shape=(20, 1),torch.randn(20, 1)是噪声,符合正态分布

# 构建线性回归参数
w = torch.randn((1), requires_grad=True)  #线性函数中只有一个w,先随机初始化一个w
b = torch.zeros((1), requires_grad=True)  #线性回归中只有一个b,先随机初始化b的值为0

for iteration in range(1000):

    # 前向传播
    wx = torch.mul(w, x)  #将w和x的值相乘
    y_pred = torch.add(wx, b)   #计算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)
    b.grad.zero_()    #将张量梯度清零
    w.grad.zero_()    #将张量梯度清零

    # 绘图
    if iteration % 20 == 0:   #每迭代20次进行一次输出

        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)

        if loss.data.numpy() < 1:   #如果损失函数的值小于0.8则停止循环
            break
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值