一、模型的保存与加载
实现训练过程中模型的保存,以及在预训练的基础上继续训练模型
①保存和加载整个模型

# 保存和加载整个模型
torch.save(model_object, 'model.pkl')
model = torch.load('model.pkl')

②只保存模型中的参数

# 仅保存和加载模型参数(推荐使用)
torch.save(model_object.state_dict(), 'params.pkl')
model_object.load_state_dict(torch.load('params.pkl'))

二、关于计算准确率的常用函数
1.torch.mean()函数
函数原型:torch.mean(input, dim, out=None)
功能:返回输入张量给定维度dim上每行的均值,输出形状与输入相同,除了给定维度上为1.。
参数:
input (Tensor) – 输入张量
dim (int) – the dimension to reduce
out (Tensor, optional) – 结果张量

>>> a = torch.randn(4, 4)
>>> a

-1.2738 -0.3058  0.1230 -1.9615
 0.8771 -0.5430 -0.9233  0.9879
 1.4107  0.0317 -0.6823  0.2255
-1.3854  0.4953 -0.2160  0.2435
[torch.FloatTensor of size 4x4]

>>> torch.mean(a, 1)

-0.8545
 0.0997
 0.2464
-0.2157
[torch.FloatTensor of size 4x1]

2.torch.eq()函数
比较两向量是否,两个向量的维度必须一致,如果相等,对应维度上的数为1,若果不相等则对应位置上的元素为0.

import torch
import torch.nn as nn

output = torch.FloatTensor([[0.91,0,0.9,0,0],
							[1.0,0,0.98,0,0.9],
							[0,0,0,1.0,0],
							[1.0,0,1.0,0,0],
							[0.9,1.0,0.98,0.89,0.60]])
_, pred = output.topk(1,1,True,True)
# print(pred)
pred = pred.t()#转置
target = torch.FloatTensor([[0, 0, 2, 2, 1]])
# print(target.view(1, -1))
exp_t = target.view(1, -1).expand_as(pred)#b.expand_as(a)就是将b进行扩充,扩充到a的维度,需要说明的是a的低维度需要比b大,例如b的shape是31,如果a的shape是32不会出错,
correct = pred.eq(exp_t.long())#注意这里的eq函数的参数必须为LongTensor类型,这里利用了long()的方法将其转化为LongTensor类型。
correct_k = correct[:1].view(-1).float().sum(0)
top1_acc = correct_k.mul_(100.0 / 5)
print("top1_acc:",top1_acc)

关于Tensor的类型梳理见该文章 关于Tensor的维度操作梳理见该文章 三.论文代码函数补充
1、torch.mm(a, b)函数
对矩阵mat1和mat2进行相乘。 如果mat1 是一个n×m张量,mat2 是一个 m×p 张量,将会输出一个 n×p 张量out。

import torch

a = torch.rand(1, 2)
b = torch.rand(1, 2)
c = torch.rand(2, 3)

print(torch.mul(a, b))  # 返回 1*2 的tensor
print(torch.mm(a, c))   # 返回 1*3 的tensor
print(torch.mul(a, c))  # 由于a、b维度不同,报错
#以下两个式子等价
d = torch.mm(a, c)
d = a.mm(c)

参数 :
mat1 (Tensor) – 第一个相乘矩阵
mat2 (Tensor) – 第二个相乘矩阵
out (Tensor, optional) – 输出张量

2、torch.mul(a, b)函数
张量a和b对应的位置进行相乘,必须保证张量a和b必须维度相同。

3、torch.clamp(min=0, max=1)
对张量进行上溢和下溢的处理,把小于min的值置为min,把大于max的值置为max

4.torch.cat函数
torch.cat(tensors, dim=0, out=None) → Tensor

Parameters:
tensors (sequence of Tensors) – any python sequence of tensors of the same type. Non-empty tensors provided must have the same shape, except in the cat dimension.
dim (int, optional) – the dimension over which the tensors are concatenated
out (Tensor, optional) – the output tensor

x = torch.randn(2, 3)
x
tensor([[ 0.6580, -1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497]])
torch.cat((x, x, x), 0)
tensor([[ 0.6580, -1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497],
[ 0.6580, -1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497],
[ 0.6580, -1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497]])
torch.cat((x, x, x), 1)
tensor([[ 0.6580, -1.0969, -0.4614, 0.6580, -1.0969, -0.4614, 0.6580,
-1.0969, -0.4614],
[-0.1034, -0.5790, 0.1497, -0.1034, -0.5790, 0.1497, -0.1034,
-0.5790, 0.1497]])

总结关于dim到底指的是哪个维度?
首先我们有必要了解一些在pytorch中通道数、长、宽在元组排列顺序方式,如果是4维的张量其排列顺序为(n,c,h,w).其中n一般为batch_size的大小,c为feature map的channel数量,h为feature map的高,w为feature map的宽。
对于张量的拼接来讲,如果是一个4维的张量(n,c,h,w)
dim=0,就是张量顺序元组中从左往右的第0个维度,即n对应的维度
dim=1,就是张量顺序元组中从左往右的第1个维度,即c维度
(对两个张量的某一个维度进行拼接的时候必须保证其他维度是一致的)