首页 > 其他分享 >《动手学深度学习 Pytorch版》 4.2 多层感知机的从零开始实现

《动手学深度学习 Pytorch版》 4.2 多层感知机的从零开始实现

时间:2023-08-31 12:11:14浏览次数:38  
标签:True nn 4.2 grad torch 感知机 Pytorch num Parameter

import torch
from torch import nn
from d2l import torch as d2l

# 经典数据集与batch size
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

4.2.1 初始化模型

为什么不直接使用 Tensor 而是用 nn.Parameter 函数将其转换为 parameter呢?

nn.Parameter 函数会向宿主模型注册参数,从而在参数优化的时候可以自动一起优化。

此外,由于内存在硬件中的分配和寻址方式,选择2的若干次幂作为层宽度会使计算更高效。

num_inputs, num_outputs, num_hiddens = 784, 10, 256

# 输入层参数
W1 = nn.Parameter(torch.randn(
    num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
# 隐藏层参数
W2 = nn.Parameter(torch.randn(
    num_hiddens, num_outputs, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))

params = [W1, b1, W2, b2]

4.2.2 激活函数

def relu(X):  # 自定义 ReLU 函数
    a = torch.zeros_like(X)
    return torch.max(X, a)

4.2.3 模型

由于忽略了空间结构,我们调用 reshape 函数将每个二维图像转换成长度为 num_inputs 的向量。

def net(X):
    X = X.reshape((-1, num_inputs))
    H = relu(X@W1 + b1)  # 输入层运算+激活 这里“@”代表矩阵乘法
    return (H@W2 + b2)  # 隐藏层运算

4.2.4 损失函数

loss = nn.CrossEntropyLoss(reduction='none')  # 使用交叉熵损失函数

4.2.5 训练

num_epochs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr=lr)  # 优化算法
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

image

d2l.predict_ch3(net, test_iter)  # 在一些测试集上运行一下这个模型

image

练习

(1)在所有其他参数保持不变的情况下,更改超参数 num_hiddens 的值,并查看此超参数值的变化对结果有何影响。确定此超参数的最佳值。

num_epochs, lr = 10, 0.1

for num_hiddens in [32, 64, 128, 256, 512, 1024, 2048]:
    num_inputs, num_outputs = 784, 10
    # 输入层参数
    W1 = nn.Parameter(torch.randn(
        num_inputs, num_hiddens, requires_grad=True) * 0.01)
    b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
    # 隐藏层参数
    W2 = nn.Parameter(torch.randn(
        num_hiddens, num_outputs, requires_grad=True) * 0.01)
    b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
    params = [W1, b1, W2, b2]

    updater = torch.optim.SGD(params, lr=lr)
    d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

image

image

image

image

image

image

image

num_hiddens 越大训练效果越好


(2)尝试添加更多的隐藏层,并查看对结果有何影响。

def net2(X):
    X = X.reshape((-1, num_inputs))
    H1 = relu(X@W1 + b1)  # 输入层运算+激活 这里“@”代表矩阵乘法
    H2 = relu(H1@W2 + b2)
    return (H2@W3 + b3)  # 隐藏层运算

num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 64
# 输入层参数
W1 = nn.Parameter(torch.randn(
    num_inputs, num_hiddens1, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens1, requires_grad=True))
# 隐藏层1参数
W2 = nn.Parameter(torch.randn(
    num_hiddens1, num_hiddens2, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_hiddens2, requires_grad=True))
# 隐藏层2参数
W3 = nn.Parameter(torch.randn(
    num_hiddens2, num_outputs, requires_grad=True) * 0.01)
b3 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
params = [W1, b1, W2, b2, W3, b3]

num_epochs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net2, train_iter, test_iter, loss, num_epochs, updater)

image

咋加了一层效果还差了一点点


(3)改变学习率会如何影响结果?保持模型架构和其他超参数(包括轮数)不变,学习率设置为多少会带来最佳结果?

num_epochs = 10

for lr in [0.05, 0.1, 0.2, 0.3, 0.4, 0.5]:
    num_inputs, num_outputs, num_hiddens = 784, 10, 256
    # 输入层参数
    W1 = nn.Parameter(torch.randn(
        num_inputs, num_hiddens, requires_grad=True) * 0.01)
    b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
    # 隐藏层参数
    W2 = nn.Parameter(torch.randn(
        num_hiddens, num_outputs, requires_grad=True) * 0.01)
    b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
    params = [W1, b1, W2, b2]

    updater = torch.optim.SGD(params, lr=lr)
    d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

image

image

image

image

image

image


(4)通过对所有超参数(学习率、轮数、隐藏层数、每层的隐藏单元数)进行联合优化,可以得到的最佳结果是什么?

def net2(X):
    X = X.reshape((-1, num_inputs))
    H1 = relu(X@W1 + b1)  # 输入层运算+激活 这里“@”代表矩阵乘法
    H2 = relu(H1@W2 + b2)
    return (H2@W3 + b3)  # 隐藏层运算

num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 128
# 输入层参数
W1 = nn.Parameter(torch.randn(
    num_inputs, num_hiddens1, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens1, requires_grad=True))
# 隐藏层1参数
W2 = nn.Parameter(torch.randn(
    num_hiddens1, num_hiddens2, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_hiddens2, requires_grad=True))
# 隐藏层2参数
W3 = nn.Parameter(torch.randn(
    num_hiddens2, num_outputs, requires_grad=True) * 0.01)
b3 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
params = [W1, b1, W2, b2, W3, b3]

num_epochs, lr = 10, 0.3
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net2, train_iter, test_iter, loss, num_epochs, updater)

image


(5)描述为什么涉及多个超参数更具挑战性。

高情商:更具挑战性

低情商:玄学


(6)如果想要构建多个超参数搜索方法,请设计一个聪明的策略。

笨笨的我想不出聪明的策略,智能上网搜了。

  1. 网格搜索(Grid Search):相当于利用穷举法自动调参。

  2. 随机搜索(Random Search):相交网格搜索会更快,但是也可能掠过最优解。

标签:True,nn,4.2,grad,torch,感知机,Pytorch,num,Parameter
From: https://www.cnblogs.com/AncilunKiang/p/17669241.html

相关文章

  • PyTorch多卡分布式训练DDP单机多卡
    前言因为课题组发的卡还没有下来,先向导师问了实验室的两张卡借用。之前都是单卡训练模型,正好在这个机会实践以下单机多卡训练模型的方法。关于DDP网上有很多资料,但都比较零碎(有些博客的代码甚至没办法run),Pytorch给出的官方文档看起来也比较吃力。因此这篇文章的主要目的是......
  • Pytorch环境搭建
     https://pytorch.org/ https://blog.csdn.net/weixin_43737866/article/details/127784768https://www.jianshu.com/p/4c7b9127cf83https://blog.csdn.net/m0_56945481/article/details/126998629第一次装Anaconda3最新版,报Solvingenvironment:failedwithinitialfro......
  • Lnton羚通视频分析算法平台【PyTorch】教程:torch.nn.maxpool2d
    torch.nn.MaxPool2d是PyTorch中的一个二维最大池化层。它用于在神经网络中执行最大池化操作,以减少特征图的空间尺寸并提取出主要特征。torch.nn.MaxPool2d的常用语法如下:torch.nn.MaxPool2d(kernel_size,stride=None,padding=0,dilation=1,return_indices=False,ceil_mode......
  • 小米2平板ubuntu22.04.2 BCM4356无线网卡驱动问题的解决
    以下为你提供在Linux操作系统中BCM4356无线网卡驱动问题的解决方案,针对Ubuntu18.04和Deepinlinux15.8等Linux发行版。 前言目前很多新笔记本电脑的用的是BCM的无线网卡和蓝牙模块集成模块,比如华为MateBook、神舟PcPad、联想多型号,但安装各种最新版的Linux都无法驱动,网......
  • DNGuard 4.11 4.12 4.20等企业旗舰版 安装包下载
    dnguard4.504.404.304.204.124.11企业旗舰版安装包dng加密.net代码混淆代码保护软件加壳企业版很强大,推荐官网购买 DNGuardHVM-.Netobfuscatorandcodeprotectiontool服务过期,忘记版本更新的可以下载,另外也可以尝试使用demo版本加密体验一下dng,dng从4.X版......
  • 【pytorch】从零开始,利用yolov5、crnn+ctc进行车牌识别
    笔者的运行环境:python3.8+pytorch2.0.1+pycharm+kaggle用到的网络框架:yolov5、crnn+ctc项目地址:GitHub-WangPengxing/plate_identification:利用yolov5、crnn+ctc进行车牌识别1.写在开始之前在学习过目标检测和字符识别后想用yolov5、crnn+ctc做一个车牌识别项目,本意是参......
  • UE4.27, Debug issues, "变量已被优化掉,因而不可用"
    调试时添加监控后,变量未被成功监控,显示"变量已被优化掉,因而不可用" 所使用的解决办法从解决方案配置的下拉菜单中选择DebugGameEditor  感谢阅读,敬请斧正......
  • [note] pytorch的几种维度操作方式比对
    pre今天看代码在想torch.unbind+torch.cat与torch.reshape的区别,直观上来看reshape似乎更便利。chatgpt问题xisatensorofthreedimension,whatisthedifferencebetweentorch.cat(torch.unbind(x,dim=1),dim=0)andtorch.reshape(x,(x.shape[0]*x.shape[1]......
  • Lnton羚通视频算法算力云平台【PyTorch】教程:torch.nn.ELU
    在PyTorch中,torch.nn.ELU代表指数线性单元(ExponentialLinearUnit),是一种激活函数。ELU函数可以用来增加神经网络的非线性表达能力,使其具备更强的适应性。ELU函数的定义如下:elu(x)=xifx>=0alpha*(exp(x)-1)ifx<0其中,x是输入,alpha是一个正数超参数,控制ELU......
  • pytorch nn.LSTM模块参数详解
    nn.LSTM模块参数input_size:输入的维度hidden_size:h的维度num_layers:堆叠LSTM的层数,默认值为1bias:偏置,默认值:Truebatch_first:如果是True,则input为(batch,seq,input_size)。默认值为:False(seq_len,batch,input_size)bidirectional:是否双向传播,默认值为False 输入(in......