pytorch tutorials

pytorch tutorials

Pytorch Documention

1.basic knowledge

  • tensor。pytorch的tensor类似numpy的array,但前者能够在GPU上进行加速。tensor同样可以进行科学计算,比如矩阵运算,函数运算或者在nn.functional上激活函数或者损失函数的运算以及在model上的运算。例如

    import torch
    torch.matmul(x,y)
    x@y
    import torch.nn.functional as F
    loss_f = F.cross_entropy(x,y)
    ...
  • torch.Autograd。pytorch自动跟踪tensor的计算,并在loss_backward()时为每个(requires_grad=True)的tensor计算梯度并存放字tensor.grad的属性上。并且梯度的计算是会累加的,所以在梯度更新的时候需要使用with torch.no_grad():来进行更新,即要求pytorch在更新tensor的时候不跟踪计算且在更新完后将梯度设置0

    ##backward()调用后才会计算每个每个可更新tensor的梯度
    loss.backward()
    #方法1: x为tensor
    with torch.no_grad():
        x -= x.grad*lr
        x.grad.zero_()
    #2:使用nn.Module
    with torch.no_grad():
        for p in model.parameters():
            p -= p.grad*lr
        model.zero_grad()
    #3 使用optimizer
    optimizer = torch.optim.SGD(model.parameters(),lr=lr)
    optimizer.step()
    optimizer.zero_grad()
  • torch.nn。

    • 在nn.functional上有已经定义好的各种损失函数和激活函数等;
    • 可继承nn.Modul来构建model,比如nn.Linear(),nn.Embedding(),nn.Dropout(),nn.LayerNorm(),就像是一个函数,但能够保存状态比如权重和偏置,并且能够计算这些参数的梯度和更新参数。
    • nn.Parameter用来封装tensor,并且告诉Module在反向传播是计算梯度
  • torch.optim上定义SGD,Adam等各种优化参数的优化器。在backward时计算Paramneter的梯度。

  • torch.utils.data。TensorDataset用来封装tensor的数据;DataLoader用来从TensorDataset实例化的dataset中自动取样batch_size的数据,并能够进行有效的迭代

2.visualization

Visualizing models,dat and training with tensorboard.

假设我们已经定义好了dataset,dataloader,model,loss_fucn,optimizer

  • setup TensorBoard

    from torch.utils.tensorboard import SummaryWriter
    #默认的'log_dir'为"./runs"
    writer = SummaryWriter("run/experiment_1")
  • Writing to tensorboard,通过访问localhost:6006得到相应的输出。使用add_images将图像写进tensorboard

    #2.writing to tensorboard
    # get some random training images
    dataiter = iter(trainloader)
    images, labels = dataiter.next()
    
    # create grid of images
    img_grid = torchvision.utils.make_grid(images)
    
    # show images
    matplotlib_imshow(img_grid, one_channel=True)
    
    # write to tensorboard
    writer.add_image('four_fashion_mnist_images', img_grid)
  • inspect model using tensorboar。使用add_graph将模型及其输入写进tnsorboard

    #3.inspect the model we built using tensorboard
    writer.add_graph(net,images)
    #net为模型,images为对应的输入tensor

    通过Graph模块查看模型,双击具体的模型可以查看详细图结构

  • add a "projector" to tensorboard。使用add_embedding来看dataset的分布。

    #4.add a "projector" to tensorboard
    def select_n_random(data, labels, n=100):
        '''
        Selects n random datapoints and their corresponding labels from a dataset
        '''
        assert len(data) == len(labels)
        print(data.shape) 
        perm = torch.randperm(len(data))  #随机打乱0-n-1的数字序列
        return data[perm][:n], labels[perm][:n]
    
    # select random images and their target indices
    images, labels = select_n_random(trainset.data, trainset.targets)
    # get the class labels for each image
    class_labels = [classes[lab] for lab in labels]
    
    # log embeddings
    features = images.view(-1, 28 * 28) #-1表示该位置不知道多少,需要torch自己算
    #add_embedding方法可以通过低维数据表示高维数据
    writer.add_embedding(features,
                        metadata=class_labels,
                        label_img=images.unsqueeze(1))

    可以通过查看dataset在三维空间的分布,如果刷新没出现Projector可以清楚浏览器缓存。

  • tracking model training with tensorboard。每100epoch,使用add_scalar记录running loss,可使用log_figurematplotlib的figure进行记录

    writer.add_scalar("training_loss",aver_loss,step+epoch*(len(dataloader)))
  • Assessing trained models with tensorboard。使用tensorboard来plot precision-recall精确度-召回率曲线