一:线性回归
线性网络简洁表示为,其中为预测值,w为权重,b为偏置。在得到预测值之后,需要通过某一函数来确定预测值相较于真实值的拟合程度,这个函数就是损失函数L,数值越小表示损失越小,我们的目标就是寻找一组参数,使得:
我们需要不断地在损失函数递减的方向上更新参数来降低误差,名为随机梯度下降。步骤如下:
(1)初始化模型参数的值。
(2)从数据集中随机抽取小批量样本且在负梯度的方向上更新参数
线性回归的实现:
import numpy as np
import torch
from torch import nn
net = nn.Sequential(nn.Linear(2, 1)) #定义线性层的输入和输出大小
loss = nn.MSELoss()
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
num_epochs = 3
for epoch in range(num_epochs):
for X, y in data_iter:
l = loss(net(X) ,y)
trainer.zero_grad()
l.backward()
trainer.step()
l = loss(net(features), labels)
二:多层感知机(MLP)
多层感知机:在输入层和输出层之间引入一个或多个隐藏层,能处理更普遍的函数关系,例如最经典的异或问题。
例如图示的多层感知机有4个输入,3个输出,引入一个隐藏层包含5个隐藏单元。
在引入隐藏层之后还需要对每个隐藏单元应用非线性的激活函数,以此来保证模型由线性向非线性的变换。常用的激活函数包括:
(1)RELU函数,(2)sigmoid函数,(3)tanh函数
目前最常用的非线性激活函数为RELU函数。
多层感知机的实现:采用Fashion-MNIST数据集,每个输入为28*28=784,输出为10类,引入一个包含256个隐藏单元的隐藏层。
import torch
from torch import nn
from d2l import torch as d2l
#构建模型
net = nn.Sequential(nn.Flatten(),
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10))
#初始化线性层的权重参数
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights);
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
三:性能优化
欠拟合通常表现为训练误差和验证误差都很大的情况,可能由于模型过于简单引起,通常可以选择更复杂的模型降低训练误差。而过拟合通常表现为训练误差明显低于验证误差,通常可以使用权重衰退和Dropout来减小过拟合。
1.权重衰退
引入正则化常数来防止过拟合和权值震荡,使得原来的损失函数变为:
对于,我们恢复了原来的损失函数。 对于,我们限制‖w‖的大小。与未加权重衰减之前 的参数迭代相比,w的系数乘以了。
实现权重衰减是直接通过指定weight decay这个超参数,其中偏置b并没有设置衰减。
trainer = torch.optim.SGD([
{"params":net[0].weight,'weight_decay': wd},
{"params":net[0].bias}], lr=lr)
2.暂退法(Dropout)
暂退法就是在计算下一层之前随即将将当前层中的一些节点置零,通常应用于隐藏层中。假设以p的概率将隐藏单元置为零,随机将h2,h5这两个节点置为0:
实现Dropout也非常简单,只需在每个全连接层之后添加一个Dropout层, 将暂退概率作为唯一的参数传递给它。
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential(nn.Flatten(),
nn.Linear(784, 256),
nn.ReLU(),
# 添加dropout层
nn.Dropout(dropout1),
nn.Linear(256, 256),
nn.ReLU(),
# 添加dropout层
nn.Dropout(dropout2),
nn.Linear(256, 10))
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights);
trainer = torch.optim.SGD(net.parameters(), lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
CSDN-Ada助手: 恭喜您撰写了这么一篇涉及神经网络与深度学习的博客!您对RNN,GRU,LSTM,GAN,Transformer这几个重要的概念进行了深入的讨论,让读者受益匪浅。希望您能继续保持创作的热情和努力,不断分享更多有趣、有深度的内容。或许下一步可以尝试结合实际案例或者应用场景,让读者更好地理解这些概念在实际工程中的应用。期待您的更多精彩文章!
ha_lydms: 我很感激作者为我们提供了这么多宝贵的知识,让我觉得自己变得更加丰富和有智慧。
CSDN-Ada助手: 恭喜用户写出了第三篇博客,题目涉及线性回归、多层感知机以及性能优化,内容涵盖了神经网络与深度学习中的重要主题。希望用户能够继续保持创作的热情和努力,探索更多深度学习领域的知识。建议用户在下一篇博客中可以尝试结合实际案例或者应用场景,展示对神经网络和深度学习的深入理解和应用能力。期待您更多优质的内容分享! CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3
CSDN-Ada助手: 很棒的博客内容!看得出你对Pytorch的使用已经有了很深入的了解。希望你能继续分享更多关于深度学习和GPU加速训练的经验。此外,如果想要进一步提高模型的性能,可以考虑使用数据增强技术来增加数据集的多样性,同时也可以尝试使用Pytorch Lightning等深度学习框架来简化训练过程。期待看到更多精彩的内容! 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2
CSDN-Ada助手: 恭喜您开始博客创作!标题看起来非常有趣,将图像转化成鸟瞰图听起来很有技术含量。希望您能分享一些关于OpenCV的基础知识,帮助读者更好地理解您的文章。另外,如果您能提供一些实际应用场景或者示例代码,将会让读者更加受益。期待您在下一篇博客中的创新内容!加油! 推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1