深度学习与PyTorch笔记20

激活函数

深度学习与PyTorch笔记20_第1张图片
深度学习与PyTorch笔记20_第2张图片

  • sigmoid
    • 压缩0到1,特别适合probability和RGB的像素重建。 容易存在梯度离散。
  • tanh
    • sigmoid函数的缩放平移,压缩-1到1,中间的梯度范围更大。也会存在梯度离散现象,但是在RNN中用的较多。
  • relu
    • 在一定程度上解决了sigmoid函数的梯度离散现象。大于0时梯度为1,计算方便。有时也会出现梯度离散,这时需要弥补小于0的部分, x < 0 , y = α x x<0,y=\alpha x x<0,y=αx α \alpha α非常小,泄漏leaky。
        self.model = nn.Sequential(
            nn.Linear(784, 200),
            nn.LeakyReLU(inplace=True),#默认α为0.02
            nn.Linear(200, 200),
            nn.LeakyReLU(inplace=True),
            nn.Linear(200, 10),
            nn.LeakyReLU(inplace=True),
        )

深度学习与PyTorch笔记20_第3张图片
深度学习与PyTorch笔记20_第4张图片

GPU accelerated

老版本切换.cpu().cuda(),新版本切换.to(device),对模块是搬到gpu上原地更新,对tensor,返回的是完全不一样的东西。

device = torch.device('cuda:0')#8块是0~7
net = MLP().to(device)
optimizer = optim.SGD(net.parameters(), lr=learning_rate)
criteon = nn.CrossEntropyLoss().to(device)

for epoch in range(epochs):

    for batch_idx, (data, target) in enumerate(train_loader):
        data = data.view(-1, 28*28)
        data, target = data.to(device), target.cuda()

测试

argmax()取最大值所在位置。
直接对logits做argmax和先对logits做softmax再做argmax的结果是一样的,因为softmax不改变单调性。
torch.eq()返回相同shape的tensor,类型为bytetensor,相等为1,不等为0。
计算accuracy的基本流程:

import torch
import torch.nn.functional as F
logits=torch.rand(4,10)
pred=F.softmax(logits,dim=1)
print(pred.shape)
pred_label=pred.argmax(dim=1)
print(pred_label)
print(logits.argmax(dim=1))
label=torch.tensor([9,3,2,4])#假设真实label为[9,3,2,4]
correct=torch.eq(pred_label,label)#计算预测对的数量
print(correct)
print(correct.sum().float().item()/4)

深度学习与PyTorch笔记20_第5张图片

When to test

  • test once per several batch
  • test once per epoch
  • epoch V.S. step?

test:

    #train结束后
    test_loss = 0
    correct = 0
    #把test_loader中的数据集送到网络里面去
    for data, target in test_loader:
        data = data.view(-1, 28 * 28)
        data, target = data.to(device), target.cuda()
        logits = net(data)
        test_loss += criteon(logits, target).item()#一般可以不计算

        pred = logits.data.max(1)[1]
        correct += pred.eq(target.data).sum()

    test_loss /= len(test_loader.dataset)
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

你可能感兴趣的:(深度学习与PyTorch笔记20)