pytorch tutorials
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_figure
将matplotlib
的figure进行记录writer.add_scalar("training_loss",aver_loss,step+epoch*(len(dataloader)))
Assessing trained models with tensorboard。使用tensorboard来plot precision-recall精确度-召回率曲线