手机网站建设ppt网站建设所需要的技能

当前位置: 首页 > news >正文

手机网站建设ppt,网站建设所需要的技能,智慧团建网站进不去,商标查询系统多层感知机理论部分 本文系统的讲解多层感知机的pytorch复现#xff0c;以及详细的代码解释。 部分文字和代码来自《动手学深度学习》#xff01;#xff01; 目录多层感知机理论部分隐藏层多层感知机数学逻辑激活函数1. ReLU函数2. sigmoid函数3. tanh函数多层感知机的从零…多层感知机理论部分 本文系统的讲解多层感知机的pytorch复现以及详细的代码解释。 部分文字和代码来自《动手学深度学习》 目录多层感知机理论部分隐藏层多层感知机数学逻辑激活函数1. ReLU函数2. sigmoid函数3. tanh函数多层感知机的从零开始实现数据集初始化参数模型激活函数模型定义损失函数训练多层感知机的pytorch实现pytorch实现神经网络的流程1. 数据集模型定义及参数初始化损失函数优化器和超参数的定义tensorboard的初始化训练预测模型的保存与获取隐藏层 上两节我们使用的网络都是线性的即只有输入层和输出层两层但生活中线性模型有很大的限制。例如如何对猫和狗的图像进行分类呢 增加位置处像素的强度是否总是增加或降低图像描绘狗的似然 对线性模型的依赖对应于一个隐含的假设 即区分猫和狗的唯一要求是评估单个像素的强度。 在一个倒置图像后依然保留类别的世界里这种方法注定会失败。 所以我们在网络中加入隐藏层来克服线性模型的限制使其能更普遍的处理函数关系模型。 要做到这一点最简单的方法是将许多全连接层堆叠在一起。 每一层都输出到上面的层直到生成最后的输出。 我们可以把前层看作表示把最后一层看作线性预测器。 这种架构通常称为多层感知机multilayer perceptron通常缩写为MLP。像下面的图示 这个多层感知机有4个输入3个输出其隐藏层包含5个隐藏单元。 输入层不涉及任何计算因此使用此网络产生输出只需要实现隐藏层和输出层的计算。 因此这个多层感知机中的层数为2。 注意这两个层都是全连接的。 每个输入都会影响隐藏层中的每个神经元 而隐藏层中的每个神经元又会影响输出层中的每个神经元。 多层感知机数学逻辑 多层感知机Multilayer Perceptron, MLP是一种基于多个全连接层的前馈神经网络其公式如下 假设输入为 x∈Rd\boldsymbol{x} \in \mathbb{R}^dx∈Rd第 iii 个全连接层的权重和偏差参数为 Wi∈Rhi−1×hi\boldsymbol{W}i \in \mathbb{R}^{h{i-1}\times h_i}Wi∈Rhi−1×hi​ 和 bi∈R1×hi\boldsymbol{b}_i \in \mathbb{R}^{1\times h_i}bi​∈R1×hi​激活函数为 ϕi(⋅)\phi_i(\cdot)ϕi​(⋅)。输出为 o∈Rq\boldsymbol{o} \in \mathbb{R}^{q}o∈Rq则有 h0xhiϕi(hi−1Wibi),i1,2,…,n−1ohn−1Wnbn\begin{aligned} \boldsymbol{h}_0 \boldsymbol{x} \ \boldsymbol{h}i \phii(\boldsymbol{h}{i-1} \boldsymbol{W}i \boldsymbol{b}i), \quad i1,2,\ldots,n-1\ \boldsymbol{o} \boldsymbol{h}{n-1} \boldsymbol{W}_n \boldsymbol{b}_n \end{aligned} h0​hio​xϕi​(hi−1​Wi​bi),i1,2,…,n−1hn−1​Wn​bn​​ 其中 nnn 表示全连接层数hi\boldsymbol{h}_ihi​ 表示第 iii 层的输出h0\boldsymbol{h}_0h0​ 为输入Wn∈Rhn−1×q\boldsymbol{W}n \in \mathbb{R}^{h{n-1}\times q}Wn∈Rhn−1×q 和 bn∈R1×q\boldsymbol{b}_n \in \mathbb{R}^{1\times q}bn​∈R1×q 是输出层的权重和偏差参数。hih_ihi​ 表示第 iii 层的输出维度也就是该层的神经元个数。最后一层的激活函数一般不加也可以视为 ϕn(⋅)identity(⋅)\phi_n(\cdot) \mathrm{identity}(\cdot)ϕn​(⋅)identity(⋅)。 激活函数 激活函数将非线性特性引入到神经网络中。在下图中输入的 inputs 通过加权求和后还被作用了一个函数f这个函数f就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后无非还是个矩阵相乘罢了。 为什么使用激活函数 如果不用激活函数每一层输出都是上层输入的线性函数无论神经网络有多少层输出都是输入的线性组合这种情况就是最原始的感知机Perceptron。如果使用的话激活函数给神经元引入了非线性因素使得神经网络可以任意逼近任何非线性函数这样神经网络就可以应用到众多的非线性模型中。 1. ReLU函数 最受欢迎的激活函数是修正线性单元Rectified linear unitReLU 因为它实现简单同时在各种预测任务中表现良好。 ReLU提供了一种非常简单的非线性变换。 给定元素xReLU函数被定义为该元素与的0最大值 ReLU(x)max(x,0)ReLU(x) max(x, 0)ReLU(x)max(x,0) 通俗地说ReLU函数通过将相应的活性值设为0仅保留正元素并丢弃所有负元素。 为了直观感受一下我们可以画出函数的曲线图。 正如从图中所看到激活函数是分段线性的。 x torch.arange(-8.0, 8.0, 0.1, requires_gradTrue) y torch.relu(x) d2l.plot(x.detach(), y.detach(), x, relu(x), figsize(5, 2.5))、 当输入为负时ReLU函数的导数为0而当输入为正时ReLU函数的导数为1。 注意当输入值精确等于0时ReLU函数不可导。 在此时我们默认使用左侧的导数即当输入为0时导数为0。 我们可以忽略这种情况因为输入可能永远都不会是0。 观察其求导图像 y.backward(torch.ones_like(x), retain_graphTrue) d2l.plot(x.detach(), x.grad, x, grad of relu, figsize(5, 2.5))观察图像可知它求导表现得特别好要么让参数消失要么让参数通过。 这使得优化表现得更好并且ReLU减轻了困扰以往神经网络的梯度消失问题 2. sigmoid函数 sigmoid函数是一种常用的激活函数是早期深度学习和神经网络研究比较常用的激活函数但在现在使用较少其常用于神经网络的输出层将输入的值映射到[0, 1]区间内公式如下 sigmoid(x)11exp(−x)sigmoid(x)\frac{1}{1exp(-x)}sigmoid(x)1exp(−x)1​ 图像为
其中x为输入值。sigmoid函数的输出值范围在(0, 1)之间当x为0时sigmoid函数的值为0.5。sigmoid函数的导数可以用其自身表示 σ(x)11e−xddxσ(x)e−x(1e−x)211e−x⋅e−x1e−xσ(x)(1−σ(x))\begin{aligned}\sigma(x) \frac{1}{1e^{-x}} \ \frac{d}{dx} \sigma(x) \frac{e^{-x}}{(1e^{-x})^2}\frac{1}{1e^{-x}}\cdot \frac{e^{-x}}{1e^{-x}} \ \sigma(x)(1-\sigma(x))\end{aligned}σ(x)​1e−x1​ dxd​σ(x)​(1e−x)2e−x​1e−x1​⋅1e−xe−x​ ​σ(x)(1−σ(x))​ sigmoid函数具有连续可导、单调递增、输出值在(0, 1)之间等特点但其缺点也比较明显如当输入值过大或过小时其导数趋于0容易出现梯度消失的问题。 感兴趣的同学可以参照上面的代码自行绘制sigmoid函数导数的图像 3. tanh函数 tanh函数是双曲正切函数hyperbolic tangent function的缩写数学表达式为tanh(x)1−e−2x1e−2x\text{tanh}(x) \frac{1 - e^{-2x}}{1 e^{-2x}}tanh(x)1e−2x1−e−2x​ 图像为
与sigmoid函数类似tanh函数也是一种常用的激活函数。它的取值范围为 (−1,1)(-1, 1)(−1,1)且在原点处取值为0。相比于sigmoid函数在输入接近0的时候tanh函数的函数值变化更为明显可以使得模型更快地学习到特征。同时tanh函数在原点两侧的函数值的变化也更加平缓避免了在输入较大或较小的时候出现梯度消失的问题。 其导数为 ddxtanh⁡(x)1−tanh⁡2(x)\frac{d}{dx}\operatorname{tanh}(x) 1 - \operatorname{tanh}^2(x) dxd​tanh(x)1−tanh2(x) 多层感知机的从零开始实现 数据集 我们同样使用fashion-MNIST数据集为了与上一节softmax回归做对比理解线性和非线性之间的差别。 import torch from torch import nn from d2l import torch as d2lbatch_size 256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)注load_data_fashion_mnist函数在上一节实现过这里我们直接调用李沐大佬做的d2l包中的函数源码在上一节。 初始化参数模型 回想一下Fashion-MNIST中的每个图像由784个灰度像素值组成。 所有图像共分为10个类别。 忽略像素之间的空间结构 我们可以将每个图像视为具有784个输入特征 和10个类的简单分类数据集。 首先我们将实现一个具有单隐藏层的多层感知机 它包含256个隐藏单元。 注意我们可以将这两个变量都视为超参数。 通常我们选择2的若干次幂作为层的宽度。 因为内存在硬件中的分配和寻址方式这么做往往可以在计算上更高效。 为了简化代码我们实现三层的感知机故参数为输入层到隐藏层的W1b1和隐藏层到输出层的W2b2 num_inputs, num_outputs, num_hiddens 784, 10, 256W1 nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_gradTrue) * 0.01) b1 nn.Parameter(torch.zeros(num_hiddens, requires_gradTrue)) W2 nn.Parameter(torch.randn(num_hiddens, num_outputs, requires_gradTrue) * 0.01) b2 nn.Parameter(torch.zeros(num_outputs, requires_gradTrue))params [W1, b1, W2, b2]Parameter 是一个 Tensor 的子类在定义神经网络时常用于将需要优化的参数包裹在其中。与普通的 Tensor 不同 Parameter 会被自动添加到模型的参数列表中以便在反向传播过程中自动求导更新参数。当我们在使用优化算法训练模型时我们只需要调用模型的 parameters() 方法即可获得所有需要优化的参数。 torch.randn(num_inputs, num_hiddens, requires_gradTrue) 生成了一个大小为 (num_inputs, num_hiddens) 的张量表示输入和隐藏层之间的权重。由于该张量是需要被优化的因此 requires_gradTrue 表示该张量的导数需要被计算和存储以便在反向传播中计算梯度。 生成的随机数乘以 0.01 的目的是将其缩小从而避免初始参数值过大导致神经网络训练过程中出现梯度消失或爆炸的问题。 激活函数 def relu(X):a torch.zeros_like(X)return torch.max(X, a)模型定义 def net(X):X X.reshape((-1, num_inputs))H relu(XW1 b1) # 这里“”代表矩阵乘法return (HW2 b2)损失函数 我们采用交叉熵作为损失函数 loss nn.CrossEntropyLoss(reductionnone)训练 batch_size, lr, num_epochs 256, 0.1, 10 loss nn.CrossEntropyLoss(reductionnone) trainer torch.optim.SGD(net.parameters(), lrlr)train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)其中train_ch3的实现部分在上一节 多层感知机的pytorch实现pytorch实现神经网络的流程

  1. 数据集 import torch from torch import nn from d2l import torch as d2l import torchvision from torch.utils import data from torchvision import transforms def get_dataloader_workers(): #save使用4个进程来读取数据return 4def load_data_fashion_mnist(batch_size, resizeNone): #save下载Fashion-MNIST数据集然后将其加载到内存中trans [transforms.ToTensor()]if resize:trans.insert(0, transforms.Resize(resize))trans transforms.Compose(trans)mnist_train torchvision.datasets.FashionMNIST(root../data, trainTrue, transformtrans, downloadTrue)mnist_test torchvision.datasets.FashionMNIST(root../data, trainFalse, transformtrans, downloadTrue)return (data.DataLoader(mnist_train, batch_size, shuffleTrue,num_workersget_dataloader_workers()),data.DataLoader(mnist_test, batch_size, shuffleFalse,num_workersget_dataloader_workers()))模型定义及参数初始化 net nn.Sequential(nn.Flatten(),nn.Linear(784, 256),nn.ReLU(),nn.Linear(256, 10))def initweights(m):if type(m) nn.Linear:nn.init.normal(m.weight, std0.01)net.apply(init_weights);损失函数优化器和超参数的定义 loss torch.nn.CrossEntropyLoss()#损失函数 lr 0.01#学习率 optim torch.optim.SGD(net.parameters(),lrlr)#优化器 epoch 10 batch_size256tensorboard的初始化 tensorboard用于存储和可视化损失函数和精确度等数据 from torch.utils.tensorboard import SummaryWriter log_dir
    writer SummaryWriter(log_dir)训练 train_iter, test_iter load_data_fashion_mnist(batch_size) train_step 0 #每轮训练的次数 net.train()#模型在训练状态 for i in range(epoch):print(第{}轮训练.format(i1))train_step 0total_loss 0.0#总损失total_correct 0#总正确数total_examples 0#总训练数for X,y in train_iter:# 前向传播outputnet(X)lloss(output,y)# 反向传播和优化optim.zero_grad()l.backward()optim.step()#记录/输出损失和精确率total_loss l.item()total_correct (output.argmax(dim1) y).sum().item()total_examples y.size(0)# 记录训练损失和准确率到 tensorboardwriter.add_scalar(train/loss, l.item(), epoch * len(train_iter) i)writer.add_scalar(train/accuracy, total_correct/total_examples, epoch * len(train_iter) i)train_step1if(train_step%1000):#每训练一百组输出一次损失print(第{}轮的第{}次训练的loss:{}.format((i1),train_step,l.item()))# 在测试集上面的效果net.eval() #在验证状态total_test_correct 0total_test_examples 0with torch.no_grad(): # 验证的部分不是训练所以不要带入梯度for X,y in test_iter:outputs net(X)test_result_lossloss(outputs,y)total_test_correct (outputs.argmax(1)y).sum()total_test_examples y.size(0)print(第{}轮训练在测试集上的准确率为{}.format((i1),(total_test_correct/total_test_examples)))这段代码是用于训练和测试深度学习模型的代码。首先使用 load_data_fashion_mnist(batch_size) 函数载入了Fashion-MNIST数据集并将训练数据和测试数据分别封装成 train_iter 和 test_iter 迭代器。 然后将模型设置为训练状态net.train()。接下来开始训练模型。epoch 表示要迭代的轮数外层循环控制训练轮数。内层循环遍历 train_iter 迭代器中的所有数据并通过前向传播和反向传播更新模型参数。 在训练过程中通过 total_loss、total_correct 和 total_examples 分别记录总的损失值、总的正确预测数量和总的样本数量用于计算训练过程中的损失值和精确度。同时将训练损失和准确率写入 tensorboard 中以便后续可视化分析。 每训练一百次将当前训练的损失值输出显示。 在训练完一轮后使用 net.eval() 将模型转换为测试状态。在 with torch.no_grad() 的上下文管理器中遍历 test_iter 迭代器中的所有测试数据并通过模型进行预测计算总的正确预测数量和总的样本数量以计算测试准确率。最后输出该轮训练在测试集上的准确率。 结果
    预测 def predict(net, test_iter, n6): #savefor X, y in test_iter:breaktrues d2l.get_fashion_mnist_labels(y)preds d2l.get_fashion_mnist_labels(net(X).argmax(axis1))titles [true \n pred for true, pred in zip(trues, preds)]d2l.show_images(X[0:n].reshape((n, 28, 28)), 1, n, titlestitles[0:n])predict(net, test_iter)结果如下
    模型的保存与获取 torch.save(net,这里填保存地址) modlue torch.load(这里填模型地址)