分享 Aladdin Persson 总结的增加训练模型时间的方法。
1、pytorch 当使用 CrossEntropyLoss的时候,再次使用softemax
should-i-use-softmax-as-output-when-using-cross-entropy-loss-in-pytorch
import torch
from torch import nn
inputs, n_hidden0, n_hidden1, out = 784, 128, 64, 10
n_epochs = 500
model = nn.Sequential(
nn.Linear(inputs, n_hidden0, bias=True),
nn.Tanh(),
nn.Linear(n_hidden0, n_hidden1, bias=True),
nn.Tanh(),
nn.Linear(n_hidden1, out, bias=True),
nn.Softmax() # SHOULD THIS BE THERE? 要在此使用吗?
)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.5)
for epoch in range(n_epochs):
y_pred = model(X_train)
loss = criterion(y_pred, Y_train)
print('epoch: ', epoch+1,' loss: ', loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
正如文档所说 torch.nn.CrossEntropyLoss()
已经包含了softmax 和loss计算,因此在model里面不需要再次使用softmax函数作为输出层了。到是当你需要的时候,可以把输出结果再做一次softmax。
2、pytorch 进行评估的时候,忘记设置model.eval()
model.eval()
3、pytorch 忘记设置 optimizer.zero_grad()
这会导致每次的梯度下降幅度不是一样的,而是每次幅度越来越大,导致训练不够充分。
def train(model, iterator, optimizer, criterion, clip):
model.train()
epoch_loss = 0
for i, batch in enumerate(iterator):
src = batch.src.to(device)
trg = batch.trg.to(device)
optimizer.zero_grad()
output = model(src, trg)
# trg = [trg len, batch size]
# output = [trg len, batch size, output dim]
output_dim = output.shape[-1]
output = output[1:].view(-1, output_dim)
trg = trg[1:].view(-1)
# trg = [(trg len - 1) * batch size]
# output = [(trg len - 1) * batch size, output dim]
loss = criterion(output, trg)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), clip)
optimizer.step()
epoch_loss += loss.item()
return epoch_loss / len(iterator)
4、当使用 m = nn.BatchNorm2d(100) 忘记设置bias为False
5、错误的使用 x.view 用于变化向量转置
x=torch.tensor([[1,2,3],[4,5,6]])
x.view(3,2)
x.premute(1,0)
6、错误的使用data augmentation
比如在对图片进行翻转操作,在识别手写数字的时候,6和9进行翻转有可能就会导致结果一样的。
my_transforms=transforms.Compose([
transforms.RandomVerticalFlip(p=1.0),
transforms.RandomHoriziontalFlip(p=1.0),
transforms.ToTensor()
])
7、not shuffling the data不对数据打乱
8、没有 Normalize 数据
my_transforms=transforms.Compose([
transforms.RandomVerticalFlip(p=1.0),
transforms.RandomHoriziontalFlip(p=1.0),
transforms.ToTensor()
transform.Normalize(mean=(0.1307,),std=(0.3081,))
])
9、没有Clipping Gradients
torch.nn.utils.clip_grad_norm_(model.parameters(), 1)