【深度学习】1.手动LogisticRegression模型的训练和预测

2024-05-27 05:44

本文主要是介绍【深度学习】1.手动LogisticRegression模型的训练和预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通过这个示例,可以了解逻辑回归模型的基本原理和训练过程,同时可以通过修改和优化代码来进一步探索机器学习模型的训练和调优方法。

步骤:

  1. 生成了一个模拟的二分类数据集:通过随机生成包含两个特征的数据data_x,并基于一定规则生成对应的二分类标签数据data_y
  2. 创建了一个手动实现的逻辑回归模型LogisticRegressionManually,其中包括:
    • 初始化函数__init__:初始化模型的权重参数w和偏置参数b
    • 前向传播函数forward:计算给定输入数据的预测值。
    • 损失函数loss_func:定义了交叉熵损失函数,用于评估模型的预测性能。
    • 训练函数train:在每个epoch中,遍历数据集的每个样本,计算预测值、损失值、梯度,并利用梯度下降法更新模型参数。
  3. 实例化LogisticRegressionManually类,然后调用train方法对模型进行训练。
  4. 在训练过程中,打印每个epoch的损失值。

演示:

# 生成模拟的二分类数据集,其中X数据是随机生成的,Y数据根据一定规则生成。import torch
import torch.nn.functional as Fn_items = 1000
n_features = 2
learning_rate = 0.001
epochs = 100# 置了随机种子,以确保每次运行代码时生成的随机数相同,从而使结果具有可重现性。
torch.manual_seed(123) 
# 生成了一个大小为(1000, 2)的张量data_x,其中包含1000个样本,每个样本具有2个特征。这里使用torch.randn生成标准正态分布的随机数作为数据,并将数据类型转换为float。
data_x = torch.randn(size=(n_items, n_features)).float()
# 成了标签数据data_y,通过对第一个特征乘以0.5和第二个特征乘以1.5的差值进行判断,如果差值大于0就将标签设为1,否则为0。这样生成了一个二分类标签数据集,同样将数据类型转换为float。
data_y = torch.where(torch.subtract(data_x[:, 0]*0.5, data_x[:, 1]*1.5) > 0, 1., 0.).float()# print(data_x)
# print(data_y)

# 在每个epoch中,遍历数据集的每个样本,计算预测值、损失值、梯度,利用梯度下降法更新模型参数。通过这种方式训练模型可以逐渐优化模型参数,以达到更好的预测效果。class LogisticRegressionManually(object):# 初始化函数__init__def __init__(self):# w是一个大小为(n_features, 1)的张量,用于存储权重参数,并且设置了requires_grad=True表示需要计算梯度;self.w = torch.randn(size=(n_features, 1), requires_grad=True)# b是一个大小为(1, 1)的张量,用于存储偏置参数,并且设置了requires_grad=Trueself.b = torch.zeros(size=(1, 1), requires_grad=True)# 前向传播函数forwarddef forward(self, x):# 过矩阵乘法计算预测值y_hat:将参数w转置后与输入数据x相乘,并加上偏置b后通过F.sigmoid函数进行激活,最终返回激活后的预测值。y_hat = F.sigmoid(torch.matmul(self.w.transpose(0, 1), x) + self.b)return y_hat# 损失函数loss_func@staticmethoddef loss_func(y_hat, y):# 定义了交叉熵损失函数。通过计算实际标签y和预测值y_hat之间的交叉熵损失来评估模型的预测性能。return -(torch.log(y_hat)*y + (1-y)*torch.log(1-y_hat))# 训练函数traindef train(self):# 在每个epoch中,遍历数据集中的每个样本for epoch in range(epochs):for step in range(n_items):# 利用模型的前向传播函数forward计算当前样本的预测值y_hat。y_hat = self.forward(data_x[step])# 获取当前样本的真实标签yy = data_y[step]# 调用损失函数loss_func计算预测值与真实标签之间的损失。loss = self.loss_func(y_hat, y)# 利用反向传播计算损失对模型参数的梯度loss.backward()# 进入torch.no_grad()上下文管理器,保证在该范围内的操作不会被记录用于自动微分。with torch.no_grad():# 更新权重参数w和偏置参数b,通过梯度下降法更新参数,learning_rate是学习率。self.w.data -= learning_rate * self.w.gradself.b.data -= learning_rate * self.b.grad# 清零梯度,以便进行下一次参数更新时重新计算梯度。self.w.grad.data.zero_()self.b.grad.data.zero_()print("Epoch: %03d, Loss: %.3f" % (epoch, loss.item()))

lrm = LogisticRegressionManually()
lrm.train()

结果:

这篇关于【深度学习】1.手动LogisticRegression模型的训练和预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006638

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示