基于Pytorch深度学习——多层感知机

本文章来源于对李沐动手深度学习代码以及原理的理解,并且由于李沐老师的代码能力很强,以及视频中讲解代码的部分较少,所以这里将代码进行尽量逐行详细解释
并且由于pytorch的语法有些小伙伴可能并不熟悉,所以我们会采用逐行解释+小实验的方式来给大家解释代码

大家可能对多层感知机这个名字还比较陌生,但是它还有一个让我们比较熟悉的名字全连接神经网络,我们后面还会讲解其他形式的神经网络,如卷积神经网络、循环神经网络等等

导入模块以及数据集

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)

在这里我们仍然fashion_mnist数据集来进行本次的demo

随机初始化参数

# 由于输入的是图片,图片计算机读取的时候是按照像素读取而不是张数
# 所以inputs和outputs和hiddens都会比较大,因为它们是以像素作为基本单元的
# 模型的训练和预测的速率也会比较慢
num_inputs = 784
num_outputs = 10
num_hiddens = 256W1 = nn.Parameter(torch.randn(num_inputs,num_hiddens,requires_grad = True))
b1 = nn.Parameter(torch.zeros(num_hiddens,requires_grad=True))
W2 = nn.Parameter(torch.randn(num_hiddens,num_outputs,requires_grad = True))
b2 = nn.Parameter(torch.zeros(num_outputs,requires_grad=True))
params = [W1,b1,W2,b2]

这里的随机初始化参数在我们前面已经讲解过了,但是我们需要的是注意这些参数的维度,我们可以根据李沐老师的课程,得到多层感知机的一个很重要的讲解图片

小实验/参数的维度

我们就随便用上面初始化的一个参数举例子,我们这里就拿W1进行举例

W1 = nn.Parameter(torch.randn(num_inputs,num_hiddens,requires_grad = True))

W1的维度为(num_inputs × num_hiddens)的一个张量,所以针对于这样初始化维度的一个矩阵,我们后面如果要进行线形层运算的话,根据矩阵运算的性质,我们应该将W1左乘输入X矩阵才可以,即
Y = X W + B Y=XW+B Y=XW+B

激活函数

为了让整个模型不是完全线性的模型,我们要引入一个非线性的激活函数,比如Sigmoid函数,但是我们这里采用另一种函数,名字叫做ReLU函数,函数的图像如下:
在这里插入图片描述
这个激活函数可以让我们在模型的训练过程中收敛速度加快
tips:其实每个激活函数的作用都相差不大,我们没有很大的必要把它当一个重要的超参数去看待

模型的实现

# 实现模型
def net(X):X = X.reshape((-1,num_inputs))H = relu(X @ W1 + b1)return (H @ W2 + b2)loss = nn.CrossEntropyLoss(reduction='none')

在这个代码里面,我们采用逐行讲解的方式来进行

逐行讲解

X = X.reshape((-1,num_inputs))

首先,为了完成矩阵的乘法,我们需要先把输入的X给reshape为一个二维的矩阵,并且我们一定需要指定的是这个矩阵的第二个维度的参数,因为我们需要把它和一个(num_inputs × num_hiddens)维度的矩阵右乘

H = relu(X @ W1 + b1)

对于初学者而言,可能这一句话有一点难理解,这里我们是将矩阵的结果进行了一次relu函数,这个过程和我们多层感知机的运作过程相关,多层感知机的运作过程李沐老师的课里面有提到过,我这里可以用两个公式来进行概括
H = X W + B Y = R e L U ( H ) H = XW+B\\ Y = ReLU(H) H=XW+BY=ReLU(H)
利用这两个公式,我们可以看出先利用输入和权重算出X,再利用我们的激活函数来算出输出(也就是下一层的输入)

优化器

num_epochs = 10
lr = 0.1
updater = torch.optim.SGD(params,lr=lr)

在这个代码里面,我们采用了训练轮数为10轮,学习率为0.1,然后优化器我们还是采用前面的随机梯度下降的方法

模型的训练

train_ch3(net,train_iter,test_iter,loss,num_epochs,trainer)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word域代码学习(简单使用)-【SEQ】

Word域代码学习(简单使用)-【SEQ】 快捷键 序号快捷键操作1 Ctrl F9 插入域代码花括号2 F9 显示域代码结果3 Shift F9 切换为域代码4 Windows Alt F9 切换全部域代码 域代码说明 域代码不区分大小写在word中,依次选择插入➡文档部件➡域即可选择插入…

Go 泛型函数中的 ~ 符号 的意义 -- 用于指定类型的底层类型

本文通过 slices.Clone 泛型函数介绍了 Go 是如何使用类型推断完成参数类型的解构。简单来说,如果第一个类型参数是一个复合类型,则可以通过第二、第三或更多的类型参数约束复杂类型中的类型参数,而类型推断则可以通过第一个参数推断出后续类…

Linux 学习 --- 编辑 vi 命令

1、vi 基本概念(了解) 基本上 vi 可以分为三种状态,分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模式 (last line mode),各模式的功能区分如下: 命令行模式 command mode)  控制屏幕光标的移动&a…

PotatoPie 4.0 实验教程(31) —— FPGA实现摄像头图像高斯滤波

什么是高斯滤波 高斯滤波是一种常见的图像处理技术,用于去除图像中的噪声和平滑图像。它的原理基于统计学中的高斯分布(也称为正态分布)。 在高斯滤波中,一个二维的高斯核函数被用来对图像中的每个像素进行加权平均。这个高斯核…

jvm 马士兵 01

01.JVM是什么 JVM是一个跨平台的标准 JVM只识别class文件,符合JVM规范的class文件都可以被识别

Java中异常的处理方式之二:throws详解

在Java中,除了使用try-catch语句块来直接处理异常外,还有另一种处理异常的方式:通过在方法签名中使用throws关键字声明该方法可能抛出的异常,从而将异常的处理责任传递给调用该方法的代码。这种方式对于某些情况下无法直接处理异常…

AI智能名片商城小程序:引领企业迈向第三增长极

随着数字化浪潮的席卷,私域流量的重要性逐渐凸显,为企业增长提供了全新的动力。在这一背景下,AI智能名片商城系统崭露头角,以其独特的优势,引领企业迈向第三增长极。 私域流量的兴起,为企业打开了一扇新的销…

【codeforces】Immobile Knight

Immobile Knight 我感觉自己不太适合写codeforces,简单题也比较考验思维,当时这题看了半天以为是搜索,写了20分钟暴力交了,还好对的,20个人19个人5分钟不到速通第一题,唯留我一人在第一题凌乱。下来看看这…

Ubuntu下安装并配置DNSMASQ服务器:轻松搭建自己的DNS解析和DHCP服务

今天我要给大家介绍一篇关于在Ubuntu下安装并配置DNSMASQ服务器的技术博客。废话不多说,我们直接进入正题吧! 首先,我要夸夸三丰云的免费服务器。哇唔,三丰云的免费云服务器真是不错啊!配置简直就是一级棒&#xff01…

【Jenkins】持续集成与交付 (十四):在Jenkins中使用Pipeline Script从SCM管理项目流水线

🟣【Jenkins】持续集成与交付 (十四):在Jenkins中使用Pipeline Script从SCM管理项目流水线 1、在项目根目录创建Jenkinsfile2、将Jenkinsfile上传到Gitlab3、在项目中引用该Jenkinsfile文件4、构建项目5、访问测试6、结论总结💖The Begin💖点点关注,收藏不迷路💖 在…

深度学习中的归一化:BN,LN,IN,GN的优缺点

目录 深度学习中归一化的作用常见归一化的优缺点 深度学习中归一化的作用 加速训练过程 归一化可以加速深度学习模型的训练过程。通过调整输入数据的尺度,归一化有助于改善优化算法的收敛速度。这是因为归一化后的数据具有相似的尺度,使得梯度下降等优化…

密码学基础练习五道 RSA、elgamal、elgamal数字签名、DSA数字签名、有限域(GF)上的四则运算

1.RSA #include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#include <time.h>#define PRIME_MAX 200 //生成素数范围#define EXPONENT_MAX 200 //生成指数e范围#define Element_Max 127 //加密单元的…

Flink on k8s 入门实战

Flink on k8s 入门实战 背景 最近一直在学习flink on k8s,踩了不少坑,折腾了好几天,终于是达到了自己想要的效果。 首先说一下,我要实现的效果是什么?Application模式下,ip和端口保持不变,根据不同的路径访问不同的任务。 环境部署 这一步也是我遇到问题最多的一步…

dockerfile 搭建lamp 实验模拟

一 实验目的 二 实验 环境 1, 实验环境 192.168.217.88一台机器安装docker 并做mysql nginx php 三台容器 2&#xff0c; 大致框架 3&#xff0c; php php:Nginx服务器不能处理动态页面&#xff0c;需要由 Nginx 把动态请求交给 php-fpm 进程进行解析 php有三…

Matlab基本语法

基本语法 x pi %使用等号创建变量 y sin(-5) %使用括号提供函数输入桌面管理 save %将当前工作区保存到MAT文件 load %将MAT文件中的变量加载到工作区 clear %清空工作区的所有变量 clc %清除命令行窗口的所有文本 format %更改数值输出的显示方式数字类型 4 %标量 …

LT6911UXB HDMI2.0 至四端口 MIPI DSI/CSI,带音频 龙迅方案

1. 描述LT6911UXB 是一款高性能 HDMI2.0 至 MIPI DSI/CSI 转换器&#xff0c;适用于 VR、智能手机和显示应用。HDMI2.0 输入支持高达 6Gbps 的数据速率&#xff0c;可为4k60Hz视频提供足够的带宽。此外&#xff0c;数据解密还支持 HDCP2.2。对于 MIPI DSI / CSI 输出&#xff0…

van-cascader(vant2)异步加载的bug

问题描述&#xff1a;由于一次性返回所有的级联数据的话&#xff0c;数据量太大&#xff0c;接口响应时间太久&#xff0c;因此采用了异步加载的方案&#xff0c;看了vant的官方示例代码&#xff0c;照着改了下&#xff0c;很轻松地实现了功能。正当我感叹世界如此美好的时候&a…

【C++ —— 多态】

C —— 多态 多态的概念多态的定义和实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变&#xff1a;析构函数的重写 C11 override和final重载、覆盖(重写)、隐藏(重定义)的对比 抽象类概念接口继承和实现继承 多态的继承虚函数表多态的原理动态绑定和静态绑定 单继…

区块链 | IPFS:Merkle DAG

Merkle DAG&#xff08;Merkle Directed Acyclic Graph&#xff09;是IPFS&#xff08;InterPlanetary File System&#xff09;系统中使用的一种创新的数据结构&#xff0c;用于组织和存储数据。它基于默克尔树&#xff08;Merkle Tree&#xff09;的概念&#xff0c;通过有向…

中科大研二:字节实习半年的感悟和求职经验

在科技巨头字节跳动的实习经历无疑是一段难忘之旅。我有幸作为中科大软件学院研二学生&#xff0c;获得了这样的机会。实习的总时长超过半年&#xff0c;让我深刻体会到了字节跳动对实习生的重视与培养。 在这里&#xff0c;我不仅技术能力得到了锤炼&#xff0c;更在mentor的…