基础的 Tensor 操作
- 矩阵与向量的乘法
torch.mul()是矩阵的点乘,即对应的位相乘,要求shape一样, 返回的还是个矩阵
torch.mm() 是矩阵正常的矩阵相乘,(a, b)* ( b, c ) = ( a, c )
torch.dot()类似于mul(),它是向量(即只能是一维的张量)的对应位相乘再求和,返回一个tensor数值
torch.mv() 是矩阵和向量相乘,类似于torch.mm() # 第一个参数是矩阵,第二个参数只能是一维向量- mv, 我的理解: m,是matrix, v 是 vector
保存模型, 加载模型,state_dict()
- 保存模型 torch.save(model.state_dict(), “my_model.pth”)
- 加载自己的模型
model = myModel().to(device) #
model.load_state_dict(torch.load(“model.pth”)) - 加载 预定义的模型 vgg16
import torchvision.models as models
model = models.vgg16(weights=‘IMAGENET1K_V1’) - 也可以把 模型的 class 架构和 模型参数都进行保存和加载
torch.save(model, ‘model.pth’)
model = torch.load(‘model.pth’)
grad 使用的问题
- optimizer.zero_grad()
- 清除参数的梯度,语法上如果设置为None, 那么容易报错。
- 此时处于一个轮次,一个阶段的开始,如果前面有梯度,那么就清除。如果没有, 那么初始化为0
- 每个 batch, 也需要清除之前的梯度
- 降低对硬件的压力,减少显存的使用。
- with torch.set_grad_enabled(True) 上下文管理器,设置是否计算更新梯度。
- with torch.no_grad() 关闭梯度计算, 一般用于 eval 模型评估阶段
torch 函数以及用法
- pytorch 中, model.eval() 和 model.train() 的区别
- 仅仅是设置模式,set mode,
- 有些层 Dropout, BatchNorm 在不同模式下,表现不同。
- view() 就是 reshape(), x.view(-1) 就是展平
- optimizer.step() 更新所有参数
- loss.backward() 反向传播计算梯度
- loss = cost(outputs, y_train) 计算当前损失
- outputs=model(inputs) 前向传播计算预测值
- scheduler.step()
- 调整学习率 lr, 通常是每个 epoch 调整一次。
- 而且是在 optimizer.step() 之后才使用,否则会改变 optimizer 中的参数。