PyTorch使用教程-PyTorch构建神经网络(下)

PyTorch使用教程-PyTorch构建神经网络(下)

前言

上节我们使用了PyTorch自己组建了一个线性回归模型,并且我们自己实现了一个网络优化,如果这些你都了解了那这节我们就能顺其自然的使用PyTorch给我们的封装来实现一个简单的DNN模型了

网络模型

一个简单的DNN应该有这三部分组成输入,隐藏,输出
在这里插入图片描述
有个好玩的游乐场
在这里插入图片描述
可以自己组件DNN来拟合数据,其中的超参数有:
Learning rate:学习率,上节有讲到
Activation:激活函数,其作用让模型具有拟合非线性数据的能力
Regularization:正则化非常著名的有l1正则和l2正则,l1用于生成稀疏矩阵,而l2可以用来防止过拟合
Regularization rate:正则化的超参数
Problem type:选择模型是分类模型,还是回归模型

模型构建

  1. 模型定义
import torch
from torch import nn
import torch.nn.functional as F
import torch.optim as optim
class DNN(nn.Module):
    def __init__(self):
        super(DNN, self).__init__()
        self.fc1 = nn.Linear(in_features=1,out_features=128)
        self.fc2 = nn.Linear(in_features=128,out_features=1)
    def forward(self, inputs):
        x = F.relu(self.fc1(inputs))
        x = self.fc2(x)
        return x

类继承nn.Module类,这样我们的类就变成一个模型了,forward前向计算,并返回结果
2. 数据的准备(依然使用上节例子方便画出图像)

x = torch.rand(100, 1)
real_out = torch.tensor(10.) * x + torch.tensor(8) + torch.rand(100,1)
  1. 准备优化器,计算损失,循环优化到最优值
dnn = DNN() #实例化模型,每实例化一个模型,那么参数是不相互共享的,是单独存在的
mse = nn.MSELoss() #实例化均方误差
adam = optim.Adam(lr=0.00001, params=dnn.parameters())
# 需要将需要优化的参数传入params中
for i in range(100000):
    pre_out = dnn(x) # 输入值,计算到预测值
    adam.zero_grad() # 清除梯度,为什要清除上节我们有讲到
    loss = mse(pre_out, real_out) # 计算均方误差
    loss.backward() # 自动求grad并累积到可训练参数中
    adam.step() # 执行最小化
    if (i+1) % 1000==0:
        print(loss)

上节自定义的优化,可以对比学习

for i in range(100000):
    pre_out = w * x + b
    loss = ((pre_out-real_out)**2).mean()
    loss.backward() # 自动求grad并累积到可训练参数grad中
    w.data = w.data - lr*w.grad.data # 执行最小化
    b.data = b.data - lr*b.grad.data # 执行最小化
    w.grad.data = torch.tensor(0.) # 清除梯度
    b.grad.data = torch.tensor(0.) # 清除梯度
    if (i+1) % 10000==0:
        print(loss)

拟合效果的展示

import matplotlib.pyplot as plt
pre_out = dnn(x)
plt.scatter(x.detach().numpy(), pre_out.detach().numpy(), c='r')
plt.scatter(x.detach().numpy(), real_out.detach().numpy(), c='b')
plt.show()

在这里插入图片描述

总结

这节我们使用了,torch自带的函数帮助我们实现梯度下降,找梯度的最小值,是不是非常顺利的就可以理解了呢?

上节回顾

PyTorch使用教程-PyTorch构建神经网络(上)

预习

小试牛刀实现手写数字识别器

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值