pytorch softmax_使用pytorch 训练是如何增加时间的

pytorch softmax_使用pytorch 训练是如何增加时间的_第1张图片

分享 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)

你可能感兴趣的:(pytorch,softmax,pytorch,transforms)