• Pytorch常用操作


    创建tensor

    x = torch.empty(*sizes)  #创建一个未初始化的tensor(后面用torch.nn.init中的一些函数进行初始化)

    >>> torch.empty(2, 3)
    tensor(1.00000e-08 *
           [[ 6.3984,  0.0000,  0.0000],
            [ 0.0000,  0.0000,  0.0000]])

    x = torch.rand(5, 3)  #返回一个范围为[0,1)、size为5*3的矩阵

    tensor([[0.3380, 0.3845, 0.3217],
            [0.8337, 0.9050, 0.2650],
            [0.2979, 0.7141, 0.9069],
            [0.1449, 0.1132, 0.1375],
            [0.4675, 0.3947, 0.1426]])

    x = torch.zeros(5, 3, dtype=torch.long)

    tensor([[0, 0, 0],
            [0, 0, 0],
            [0, 0, 0],
            [0, 0, 0],
            [0, 0, 0]])

    x = torch.ones(5, 3, dtype=torch.double)

    tensor([[1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.],
            [1., 1., 1.]], dtype=torch.float64)

    x = torch.tensor([5.5, 3])  #Construct a tensor directly from data

    tensor([5.5000, 3.0000])

    tensor运算

    torch.mm(tensor1, tensor2, out=None)  #tensor的矩阵乘法matrix multiplication 

    torch.mul(tensor1, tensor2, out=None)  #tensor的点乘Hadamard product

    tensor相关操作

    x.size()  #取tensor的size,返回的是tuple

    z = x.view(-1, 8)  #和reshape功能一样,只是参数少了一层括号

    x = x.clamp(min, max)  #取最大最小值,和numpy.clip(a, a_min, a_max, out=None)类似

    torch.max()

      torch.max(Tensor)  #对所有元素,取最大值,返回只有一个数的tensor

      torch.max(input, dim, keepdim=False, out=None)  #对dim维度上的元素取最大值,返回两个tensor,第一个是dim上的最大值,第二个是最大值所在的位置(argmax)

    torch.cat(seq, dim=0, out=None)  #concatenate,功能和numpy.concatenate((a1, a2, ...), axis=0, out=None)一样,格式也恰好一样

      一个技巧:inputs = torch.cat(inputs).view(len(inputs), 1, -1)  #先cat再view(reshape)

    torch.stack( (a,b,c) ,dim = 2)  #建立一个新的维度,然后再在该纬度上进行拼接

      torch.stack VS torch.cat:cat是在已有的维度上拼接,而stack是建立一个新的维度,然后再在该纬度上进行拼接。

      用其实现 x.append(in_tensor) 的功能:先构造已经append好的x(此时x为list),然后x = torch.stack(x, dim = 0)

      可参考 https://blog.csdn.net/Teeyohuang/article/details/80362756

    torch.unsqueeze(input, dim, out=None)  #给input(一个tensor)在dim维度上增加一个维度

    >>> x = torch.tensor([1, 2, 3, 4])
    >>> torch.unsqueeze(x, 0)
    tensor([[ 1,  2,  3,  4]])
    >>> torch.unsqueeze(x, 1)
    tensor([[ 1],
            [ 2],
            [ 3],
            [ 4]])

    b = a.numpy()  #torch tensor转numpy array

    b = torch.from_numpy(a)  #numpy array转torch tensor(两种转都是没有复制,而是直接引用的)

    tensor_a , idx_sort = torch.sort(tensor_a, dim=0, descending=True)  #tensor排序,返回排序后的tensor和下标

    tensor求导

    x = torch.ones(2, 2, requires_grad=True)  #创建时设置requires_grad为True,将x看成待优化的参数(权重)

    model.zero_grad()  #将每个权重的梯度清零(因为梯度会累加)

    optimizer.zero_grad()  #当optimizer=optim.Optimizer(model.parameters())时,其与model.zero_grad()等效

    loss.backward()  #求导,即对loss进行back propagation

    optimizer.step()  #在back propagation后更新参数

    定义神经网络:

    1. 定义网络架构(模型的forward,通常用一个继承自torch.nn.Module的类)

      __init__():将nn实例化(每一个nn都是一个类),参数自己定义

      forward(self, x):模型的forward,参数x为模型输入

      self.add_module("conv", nn.Conv2d(10, 20, 4))  # self.conv = nn.Conv2d(10, 20, 4) 和这个增加module的方式等价

      torch.nn.Embedding(num_embeddings, embedding_dim, ...)  #是一个矩阵类,里面初始化了一个随机矩阵,矩阵的长是字典的大小,宽是用来表示字典中每个元素的属性向量,向量的维度根据你想要表示的元素的复杂度而定。类实例化之后可以根据字典中元素的下标来查找元素对应的向量。 

    2. 定义输入输出

    3. 定义loss(如果用nn需要实例化才定义,否则用functional直接在训练中用)

    4. 定义优化器

    训练:

    1. 初始化,如model.zero_grad()将一些参数初始化为0

    2. 准备好输入

    3. 将模型设置为train模式

    4. 将模型forward

    5. 计算loss和accuracy

    6. back propagation并计算权重的梯度

    7. 做validation

    8. 打印Epoch、loss、acc、time等信息

    (不一定所有步骤都有,可以看情况省略部分)

    验证或测试:

    1. 准备好输入

    2. 将模型设置为eval模式

    3. 将模型forward

    4. 计算loss和accuracy

    5. 打印loss、acc等信息

    (train和test相比,主要多了bp相关的,包括zero_grad()和backward()等)

    torch.max(inputdimkeepdim=Falseout=None) 

  • 相关阅读:
    [RxJS] defer() lazy evaluation
    [React] as component prop
    [Compose] Compose exercises
    MAC开发NDK非常的简单
    Android之zip包换肤(极力推荐)
    Android之获取sdcard卡的信息
    Android之Volley使用
    Android之与当前连接的wifi进行文件夹的浏览与传输
    android之获得当前连接wifi的名字
    android之截屏(包括截取scrollview与listview的)
  • 原文地址:https://www.cnblogs.com/sbj123456789/p/9483760.html
Copyright © 2020-2023  润新知