深度学习与PyTorch笔记20
**函数
- sigmoid
- 压缩0到1,特别适合probability和RGB的像素重建。 容易存在梯度离散。
- tanh
- sigmoid函数的缩放平移,压缩-1到1,中间的梯度范围更大。也会存在梯度离散现象,但是在RNN中用的较多。
- relu
- 在一定程度上解决了sigmoid函数的梯度离散现象。大于0时梯度为1,计算方便。有时也会出现梯度离散,这时需要弥补小于0的部分,,非常小,泄漏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),
)
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)
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)))