Pytorch笔记汇总-基本神经网络搭建

本文介绍了梯度在SGD和动量优化中的作用,学习率对模型的影响,以及Sigmoid、tanh和ReLU等激活函数的特性。涵盖了MSE损失函数、softmax归一化和PyTorch的求导API。实例演示了多分类任务的实现,包括Adam优化器和交叉熵损失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、梯度与算法及超参数

梯度是一个向量,其方向是函数值增长的方向。

1.SGD更新:\Theta _{t+1} = \Theta _{t} - \alpha \triangledown \Theta _{t} 这种方法的更新很可能卡在局部极小值上,用Res-net可解决

还有一种情况是取到鞍点:一个参数取到极大/小值,而另一个参数取与之相反的极点。

2.learning rate \alpha:影响收敛速度和精度

3.动量:冲出局部极小值

二、激活函数

1.Sigmoid Logistic: torch.sigmoid(z) = F.sigmoid(z)

\sigma (x) = \frac{1}{1+e^{-x}} \epsilon (0,1)

sigmoid的一个最大缺陷是其左右两端的梯度过小 

2.tanh(x): torch.tanh(x) = F.tanh(a)

tanh(x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}\epsilon (-1,1)

3.Relu: torch.relu(a) = F.relu(a)

Relu = \left\{\begin{matrix} 0 for x<0\\ x for x\geq 0 \end{matrix}\right.

三、loss function

1.均方差 MSE(mean squared error)

\sum (y-\tilde{y})^{2}: torch.normal((y-pred),2).pow(2) = F.mse_loss(pred, lable)

2.softmax (soft version of max, 把logits大的变得概率更大一些, 是一种归一化)

softmax(x) = \frac{e^{x_{j}}}{\sum _{j}e^{x_{j}}}        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()

七、细节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值