【深度学习实验】前馈神经网络(四):自定义逻辑回归模型:前向传播、反向传播算法

2023-09-21 11:10:43

目录

一、实验介绍

 二、实验环境

1. 配置虚拟环境

2. 库版本介绍

三、实验内容

0. 导入必要的工具包

1. 逻辑回归Logistic类

a. 构造函数__init__

b. __call__(self, x)方法

c. 前向传播forward

d. 反向传播backward

2. 模型训练

3. 代码整合


一、实验介绍

  • 实现逻辑回归模型(Logistic类)
    • 实现前向传播forward
    • 实现反向传播backward

 二、实验环境

    本系列实验使用了PyTorch深度学习框架,相关操作如下:

1. 配置虚拟环境

conda create -n DL python=3.7 
conda activate DL
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
conda install matplotlib
 conda install scikit-learn

2. 库版本介绍

软件包本实验版本目前最新版
matplotlib3.5.33.8.0
numpy1.21.61.26.0
python3.7.16
scikit-learn0.22.11.3.0
torch1.8.1+cu1022.0.1
torchaudio0.8.12.0.2
torchvision0.9.1+cu1020.15.2

三、实验内容

ChatGPT:

        前馈神经网络(Feedforward Neural Network)是一种常见的人工神经网络模型,也被称为多层感知器(Multilayer Perceptron,MLP)。它是一种基于前向传播的模型,主要用于解决分类和回归问题。

        前馈神经网络由多个层组成,包括输入层、隐藏层和输出层。它的名称"前馈"源于信号在网络中只能向前流动,即从输入层经过隐藏层最终到达输出层,没有反馈连接。

以下是前馈神经网络的一般工作原理:

  1. 输入层:接收原始数据或特征向量作为网络的输入,每个输入被表示为网络的一个神经元。每个神经元将输入加权并通过激活函数进行转换,产生一个输出信号。

  2. 隐藏层:前馈神经网络可以包含一个或多个隐藏层,每个隐藏层由多个神经元组成。隐藏层的神经元接收来自上一层的输入,并将加权和经过激活函数转换后的信号传递给下一层。

  3. 输出层:最后一个隐藏层的输出被传递到输出层,输出层通常由一个或多个神经元组成。输出层的神经元根据要解决的问题类型(分类或回归)使用适当的激活函数(如Sigmoid、Softmax等)将最终结果输出。

  4. 前向传播:信号从输入层通过隐藏层传递到输出层的过程称为前向传播。在前向传播过程中,每个神经元将前一层的输出乘以相应的权重,并将结果传递给下一层。这样的计算通过网络中的每一层逐层进行,直到产生最终的输出。

  5. 损失函数和训练:前馈神经网络的训练过程通常涉及定义一个损失函数,用于衡量模型预测输出与真实标签之间的差异。常见的损失函数包括均方误差(Mean Squared Error)和交叉熵(Cross-Entropy)。通过使用反向传播算法(Backpropagation)和优化算法(如梯度下降),网络根据损失函数的梯度进行参数调整,以最小化损失函数的值。

        前馈神经网络的优点包括能够处理复杂的非线性关系,适用于各种问题类型,并且能够通过训练来自动学习特征表示。然而,它也存在一些挑战,如容易过拟合、对大规模数据和高维数据的处理较困难等。为了应对这些挑战,一些改进的网络结构和训练技术被提出,如卷积神经网络(Convolutional Neural Networks)和循环神经网络(Recurrent Neural Networks)等。

本系列为实验内容,对理论知识不进行详细阐释

(咳咳,其实是没时间整理,待有缘之时,回来填坑)

977468b5ae9843c6a88005e792817cb1.png

0. 导入必要的工具包

import torch

1. 逻辑回归Logistic

a. 构造函数__init__

 def __init__(self):
        self.inputs = None
        self.outputs = None
        self.params = None

         初始化了类的成员变量self.inputsself.outputsself.params,它们分别用于保存输入、输出和参数。

b. __call__(self, x)方法

    __call__(self, x)方法使得该类的实例可以像函数一样被调用。它调用了forward(x)方法,将输入的x传递给前向传播方法。

 def __call__(self, x):
        return self.forward(x)

c. 前向传播forward

  def forward(self, inputs):
        outputs = 1.0 / (1.0 + torch.exp(-inputs))
        self.outputs = outputs
        return outputs

    forward(self, inputs)方法执行逻辑回归的前向传播。它接受输入inputs作为参数,并通过逻辑回归的公式计算输出值outputs。最后,将计算得到的输出保存在self.outputs中,并返回输出值。

d. 反向传播backward

    def backward(self, outputs_grads=None):
        if outputs_grads is None:
            outputs_grads = torch.ones(self.outputs.shape)
        outputs_grad_inputs = torch.multiply(self.outputs, (1.0 - self.outputs))
        return torch.multiply(outputs_grads, outputs_grad_inputs)

    backward(self, outputs_grads=None)方法执行逻辑回归的反向传播。

  • 接受一个可选的参数outputs_grads,用于传递输出的梯度。
  • 如果没有提供outputs_grads,则默认为全1的张量,表示对输出的梯度都为1。
  • 根据逻辑回归的导数公式,可以将输出值与(1-输出值)相乘,然后再乘以传入的梯度值,得到输入的梯度。
  • 返回计算得到的输入梯度。

2. 模型训练

act = Logistic()
x = torch.tensor([3,3,4,2])
y = act(x)

z = act.backward()
print(z)
  • 创建一个Logistic的实例act;
  • 传入张量x进行前向传播,得到输出张量y;
  • 调用act.backward()进行反向传播,得到输入x的梯度;
  • 将结果打印输出。
tensor([0.0452, 0.0452, 0.0177, 0.1050])

3. 代码整合

# 导入必要的工具包
import torch

class Logistic():
    def __init__(self):
        self.inputs = None
        self.outputs = None
        self.params = None

    def __call__(self, x):
        return self.forward(x)

    def forward(self, inputs):
        outputs = 1.0 / (1.0 + torch.exp(-inputs))
        self.outputs = outputs
        return outputs

    def backward(self, outputs_grads=None):
        if outputs_grads is None:
            outputs_grads = torch.ones(self.outputs.shape)
        outputs_grad_inputs = torch.multiply(self.outputs, (1.0 - self.outputs))
        return torch.multiply(outputs_grads, outputs_grad_inputs)

act = Logistic()
x = torch.tensor([3,3,4,2])
y = act(x)

z = act.backward()
print(z)

注意:

        本实验仅实现了逻辑回归的前向传播和反向传播部分,缺少了模型的参数更新和训练部分。完整的逻辑回归,需要进一步编写训练循环、损失函数和优化器等部分,欲知后事如何,请听下回分解。

更多推荐

激活函数总结(四十):激活函数补充(AHAF、SERLU)

激活函数总结(四十):激活函数补充1引言2激活函数2.1AHAF激活函数2.2SERLU激活函数3.总结1引言在前面的文章中已经介绍了介绍了一系列激活函数(Sigmoid、Tanh、ReLU、LeakyReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、Softplus、Mish、Maxout

MySQL使用Xtrabackup备份到AWS存储桶

1.安装Xtrabackupcd/tmpwgethttps://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.33-28/binary/redhat/7/x86_64/percona-xtrabackup-80

【山河送书第十二期】:《巧用ChatGPT快速搞定数据分析》参与活动,送书两本!!

【山河送书第十二期】:《巧用ChatGPT快速搞定数据分析》参与活动,送书两本!!关键亮点内容简介作者简介购买链接参与方式往期赠书回顾关键亮点用ChatGPT颠覆数据分析,1分钟生成数据分析结果!30多个精心挑选的ChatGPT数据分析案例+50多种ChatGPT数据分析策略涵盖从数据预处理到高级分析的全过程助你在竞争

【Python】pyecharts 模块 ② ( 命令行安装 pyecharts 模块 | PyCharm 安装 pyecharts 模块 )

文章目录一、命令行安装pyecharts模块1、安装过程2、命令行验证pyecharts模块是否安装成功二、PyCharm安装pyecharts模块1、通过错误提示安装2、在Settings设置界面安装pyecharts画廊网站:https://gallery.pyecharts.org/#/在该网站可查看官方示例一、

SAP服务器文件管理

SAP服务器文件管理文件说明:对于SAP服务器的文件管理,系统给出3个事物码,分别是显示目录的AL11,下载文件的CG3Y和上传文件的CG3Z。AL11显示目录:以查找系统参数文件为例,在前台执行事物码AL11进入,如图所示,这里显示的是根目录列表,在此找到DIR_SETUPS条目。右边显示相应目录,用鼠标点击进入。此

操作系统之——中断

一.概念铺垫1.操作系统在了解中断之前,我们先来了解一下操作系统.🫡首先,操作系统是一种软件,它控制和管理计算机硬件和软件资源,为用户和应用程序提供统一的接口和环境。它负责管理计算机的内存、文件系统、输入输出设备、进程调度、网络通信等功能。操作系统使得计算机可以高效地运行各种应用程序,并提供了用户与计算机之间的交互界

《C++标准库第2版》3.2 虽旧犹新的语言特性 笔记

3.2虽旧犹新的语言特性非类型模板参数1.除了类型参数之外,我们也可以为template使用nontypeparamatter.2.非类型参数看作是template类型的一部分bitset<32>flags32;bitset<50>flags50;//这两个看作是两个不同类型的template模板参数默认值classt

详解junit

目录1.概述2.断言3.常用注解3.1.@Test3.2.@Before3.3.@After3.4.@BeforeClass3.5.@AfterClass4.异常测试5.超时测试6.参数化测试1.概述什么是单元测试:单元测试,是针对最小的功能单元编写测试代码,在JAVA中最小的功能单元是方法,单元测试针对JAVA就是单

Blender批量修改名称

假如在Blender里按顺序添加了多个mesh,名字后缀按照数字1,2,3…编号,此时又要插入一个新的mesh,那么这个mesh之后的其它mesh名字都要加1,此时该怎么办呢?比较简单的办法是把新mesh后面的mesh名称一个一个手动加1,如果数量少还可以,如果很多就有点浪费时间了。Blender自身也提供了批量修改的

多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码实现💥1概述多旋翼无人机已被广泛应用于军事与民用领域。导航系统

C++中string对象之间比较、char*之间比较

#include<cstring>//char*使用strcmp#include<string>//string使用compare#include<iostream>usingnamespacestd;intmain(){stringstringStr1="42";stringstringStr2="42";strin

热文推荐