dl学习笔记:(5)深度神经网络的正向传播

news/2025/1/21 16:46:03/

这小节的任务不多,使用封装好的torch.nn模块来实现一个完整的多层神经网络的正向传播。假设我们有500条数据,20个特征,标签为3分类。我们现在要实现一个三层神经网络,这个神经网络的架构如下:第一层有13个神经元,第二层有8个神经元,第三层是输出层。其中,第一层的激活函数是relu,第二层是sigmoid。

(1)导库

import torch
import torch.nn as nn
from torch.nn import functional as F

(2)定义数据张量

torch.manual_seed(250)
x = torch.rand((500,20),dtype = torch.float32)
y = torch.randint(low = 0,high = 3,size = (500,1),dtype = torch.float32)

由于是500条数据,20个特征,所以x是(500,20)

由于是3分类任务,所以这里的y取到的是0,1,2,这里的函数是左闭右开,所以参数是0和3

(3)定义model类

class model(nn.Module):def __init__(self,in_features = 20,out_features = 3):super(model,self).__init__()self.linear1 = nn.Linear(in_features,13,bias = True)self.linear2 = nn.Linear(13,8,bias = True)self.output = nn.Linear(8,out_features,bias = True)def forward(self,x):z1 = self.linear1(x)sigma1 = torch.relu(z1)z2 = self.linear2(sigma1)sigma2 = torch.sigmoid(z2)z3 = self.output(sigma2)sigma3 = F.softmax(z3,dim = 1)return sigma3

首先定义__init__,由于开始的传入和最后的输出和模型没什么关系,取决于你的数据和任务,所以这里作为参数传入in_features和out_features

  • super(model, self):这里的 super() 表示调用父类 nn.Module 的方法,第一个参数 model 是当前子类的名称,第二个参数 self 是当前实例对象。super(model, self) 返回父类 nn.Module 的代理对象。
  • super(model, self).__init__():调用父类 nn.Module 的构造函数(__init__()),这样就可以在子类中正确地初始化父类的部分。

nn.Module 中有许多有用的功能和初始化机制,比如管理模型的参数、注册模型的子模块、以及其他自动化的功能。如果你不调用父类的构造函数,就会失去这些功能。因此,必须调用 super().__init__() 来确保父类的构造方法被正确地执行,避免遗漏父类中的初始化代码。

后面定义linear的函数在上一节已经介绍过了,里面的参数按照具体的任务来就行。

 当然nn.Module中的init函数还有很多其他的东西,如下图我们用到具体某一个的时候会提及:

同理下面的前向传播也是一样,在前面的小节中已经介绍过了,这里也只是简单调用

这里我们简单拓展一下python中的self:

Python 中的 self 确实与 C++ 中隐式的 this 指针有类似的作用。它们都是用于引用当前对象的机制。

  • 设计哲学:Python 选择显式地使用 self,符合 Python 的设计哲学 "Explicit is better than implicit"(明确优于隐式)。这种做法让代码的意图更加清晰,易于理解。当你看到方法定义时,明确知道 self 是指向当前对象的引用,而不需要隐式的规则来推断。

  • 避免歧义:通过显式地使用 self,Python 避免了像 C++ 中的 this 可能引起的歧义。例如,在 C++ 中,如果某个方法名称和类成员变量相同,this 指针可能会引发混淆,而在 Python 中,self 的明确存在避免了这种问题。

  • C++

    • 在实例化对象时,编译器首先为对象分配内存(根据类的大小计算),然后调用构造函数。
    • 构造函数会初始化对象的状态(如成员变量)。
    • 对象在创建时,this 指针就指向该对象的内存地址,所以实例方法可以使用 this 来访问成员变量和方法。
  • Python

    • 在实例化时,Python 会动态为对象分配内存,内存大小由 Python 的对象模型决定。
    • 在 Python 中,self 是显式传递的,代表当前对象实例的引用。每当你调用实例方法时,Python 会将 self(即当前对象)作为第一个参数传递给方法。
    • 因为 Python 对象是动态管理的,所以内存的分配、垃圾回收等过程都由 Python 运行时来处理。

(4)实例化model

先定义输入和输出参数:

input_features = x.shape[1]
output_features = len(y.unique())

实例化:

torch.manual_seed(250)
net = model(in_features = input_features,out_features = output_features)
net.forward(x)

至此一个完整的前向传播就已经完成了,结果如下:

下一步我们可以查看一下层的各种属性:

可以看到输出是500条数据,对于三个类别的概率,这也和最后的softmax层输出结果一致

同样的我们也可以查看,对应层的权重和b:

下面我们将每一层的形状输出来:

我们会发现,这里面的每一层权重的形状都是下一层的神经元个数和上一层神经元个数,是反过来的。例如这里的第一层,输入是20个特征第一层有13个神经元,这里却是(13,20)。这是因为为了矩阵乘法的维度匹配,整个流程的形状变化过程如下:

1.先将输入的特征矩阵转置变成(20,500)

2.第一层:(13,20)*(20,500) = (13,500)

3.第二层:(8,13)*(13,500)= (8,500)

4.输出层:(3,8)*(8,500) = (3,500)

5.最后softmax函数输出的时候会再次转置调回来,得到输出(500,3)


http://www.ppmy.cn/news/1565002.html

相关文章

回归算法、聚类算法、决策树、随机森林、神经网络

这也太全了!回归算法、聚类算法、决策树、随机森林、神经网络、贝叶斯算法、支持向量机等十大机器学习算法一口气学完!_哔哩哔哩_bilibili 【线性回归、代价函数、损失函数】动画讲解_哔哩哔哩_bilibili 14分钟详解所有机器学习算法:…

C++学习第五天

创作过程中难免有不足,若您发现本文内容有误,恳请不吝赐教。 提示:以下是本篇文章正文内容,下面案例可供参考 一、构造函数 问题1 关于编译器生成的默认成员函数,很多童鞋会有疑惑:不实现构造函数的情况下…

基于.NetCore+Vue的贫困地区儿童资助系统

1.业务需求 1.1 业务角色分析 贫困地区儿童资助系统分为用户和管理员两个角色。管理员具有用户管理、贫困儿童信息管理、儿童参与项目管理、资助项目管理、社会资助记录管理、发放记录、统计分析功能;用户具有贫困儿童登记(代填)、通知公告…

ubuntu 系统 ,docker建的服务 ,其他局网机器可以通过IP:端口的方式访问。不是docker的不行。

根据您的描述,docker 建的服务可以通过 IP:端口的方式被局网其他机器访问,而非 docker 的服务不行,以下是可能的原因及解决方法: 网络配置方面 • 检查非 docker 服务的网络监听配置:确保非 docker 服务是…

Docker:基于自制openjdk8镜像 or 官方openjdk8镜像,制作tomcat镜像

一、制作openjdk8基础镜像【基于自定义alpine-3.18.0:v1 】 docker pull maven:3.5.0-jdk-8-alpine 78.56 MB https://hub.docker.com/_/maven/tagspage8&namealpine openjdk二进制下载地址 https://blog.csdn.net/fenglllle/article/details/124786948 https://adoptope…

RabbitMQ集群安装rabbitmq_delayed_message_exchange

1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章: rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后,start_app 就会报错了 (CaseC…

封装svg图片展示及操作组件——svgComponent——js技能提升

template部分 <template><div class"canvas-wrapper" ref"canvasWrapper"><svg:viewBox"computedViewBox"ref"svgCanvas"xmlns"http://www.w3.org/2000/svg"xmlns:xlink"http://www.w3.org/1999/xlink…

UDP/TCP ②-三次握手 || 四次挥手 || 确认应答 || 超时重传

这里是Themberfue 在讲完了UDP协议后&#xff0c;我们进入更为重要也是更为复杂的TCP协议&#xff0c;探究其是如何让数据可靠传输的。 TCP协议报文格式 关于TCP协议的一些特点我也不过多赘述了&#xff0c;详情请见&#xff1a;TCP✨TCP&#xff1a;有连接、可靠传输、面向字…