一、梯度与算法及超参数
梯度是一个向量,其方向是函数值增长的方向。
1.SGD更新: 这种方法的更新很可能卡在局部极小值上,用Res-net可解决
还有一种情况是取到鞍点:一个参数取到极大/小值,而另一个参数取与之相反的极点。
2.learning rate :影响收敛速度和精度
3.动量:冲出局部极小值
二、激活函数
1.Sigmoid Logistic: torch.sigmoid(z) = F.sigmoid(z)
sigmoid的一个最大缺陷是其左右两端的梯度过小
2.tanh(x): torch.tanh(x) = F.tanh(a)
tanh(x) =
3.Relu: torch.relu(a) = F.relu(a)
Relu =
三、loss function
1.均方差 MSE(mean squared error)
: torch.normal((y-pred),2).pow(2) = F.mse_loss(pred, lable)
2.softmax (soft version of max, 把logits大的变得概率更大一些, 是一种归一化)
softmax(x) = F.softmax(a, dim)
tips:这里dim=1 表示对行进行softmax,即行和为1;若dim=0 则表示对列进行softmax,即列和为1.
3.交叉熵CrossEntropy和信息论里的熵定义一致
四、求导的API函数
1.grad = torch.autograd.grad(loss, [w1,w2]) ,结果存储在grad数组中
2.loss.backward() 结果存在w1.grad, w2.grad中, 调用一次后自动释放动态图,可以设置retain_graph=True来保存动态图
3.记住要求导的Tensor需要设置requires_grad = True
有两种设置方式,
第一种: a = torch.randn(3, requires_grad=True),
第二种: a = torch.randn(3), a.requires_grad_()
4.梯度是累加的,所以可以用x.grad.data.zero_()来删除以前的梯度
五、梯度下降
六、多分类任务实战!(不全)
import torch
import torch.nn.functional as F
import torch.nn as nn
import torch.optim as optim
#pytorch 默认第一个维度为channel_out, 第二个维度为channel_in
w1 = torch.randn(200, 784, requires_grad=True)
b1 = torch.zeros(200, requires_grad=True)
w2 = torch.randn(200, 200, requires_grad=True)
b2 = torch.zeros(200, requires_grad=True)
w3 = torch.randn(10,200, requires_grad=True)
b3 = torch.zeros(10, requires_grad=True)
#更牛的初始化方法:
# torch.nn.init.kaiming_normal_(w1)
# torch.nn.init.kaiming_normal_(w2)
# torch.nn.init.kaiming_normal_(w3)
def forward(x):
x = x@w1.t() + b1
x = F.relu(x)
x = x@w2.t() + b2
x = F.relu(x)
x = x@w3.t() + b3
x = F.relu(x)
return x
optimizer = optim.Adam([w1,b1,w2,b2,w3,b3], lr=learning_rate)
criteon = nn.CrossEntropyLoss()
for epoch in range(epochs):
for batch_idx, (data,target) in enumerate(train_loader):
data = data.view(-1, 28*28)
logits = forward(data)
loss = criteon(logits, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()