【深度学习实验】线性模型(五):使用Pytorch实现线性模型:基于鸢尾花数据集,对模型进行评估(使用随机梯度下降优化器)

2023-09-18 08:53:14

目录

一、实验介绍

 二、实验环境

1. 配置虚拟环境

2. 库版本介绍

三、实验内容

0. 导入库

1. 线性模型linear_model

2. 损失函数loss_function

3. 鸢尾花数据预处理

4. 初始化权重和偏置

5. 优化器

6. 迭代

7. 测试集预测

8. 实验结果评估

9. 完整代码


一、实验介绍

        线性模型是机器学习中最基本的模型之一,通过对输入特征进行线性组合来预测输出。本实验旨在展示使用随机梯度下降优化器训练线性模型的过程,并评估模型在鸢尾花数据集上的性能。

 二、实验环境

        本系列实验使用了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

三、实验内容

0. 导入库

import torch
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import metrics
  • PyTorch
    • 优化器模块(optim
  • scikit-learn
    • 数据模块(load_iris)
    • 数据划分(train_test_split)
    • 评估指标模块(metrics

1. 线性模型linear_model

        该函数接受输入数据x,使用随机生成的权重w和偏置b,计算输出值output。这里的线性模型的形式为 output = x * w + b

def linear_model(x):
    return torch.matmul(x, w) + b

2. 损失函数loss_function

      这里使用的是均方误差(MSE)作为损失函数,计算预测值与真实值之间的差的平方。

def loss_function(y_true, y_pred):
    loss = (y_pred - y_true) ** 2
    return loss

3. 鸢尾花数据预处理

  • 加载鸢尾花数据集并进行预处理

    • 将数据集分为训练集和测试集

    • 将数据转换为PyTorch张量

iris = load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
x_train = torch.tensor(x_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
x_test = torch.tensor(x_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)

4. 初始化权重和偏置

w = torch.rand(1, 1, requires_grad=True)
b = torch.randn(1, requires_grad=True)

5. 优化器

        使用随机梯度下降(SGD)优化器进行模型训练,指定学习率和待优化的参数w, b。

optimizer = optim.SGD([w, b], lr=0.01) # 使用SGD优化器

        

6. 迭代

num_epochs = 100
for epoch in range(num_epochs):
    optimizer.zero_grad()       # 梯度清零
    prediction = linear_model(x_train, w, b)
    loss = loss_function(y_train, prediction)
    loss.mean().backward()      # 计算梯度
    optimizer.step()            # 更新参数

    if (epoch + 1) % 10 == 0:
        print(f"Epoch {epoch+1}/{num_epochs}, Loss: {loss.mean().item()}")
  • 在每个迭代中:

    • 将优化器的梯度缓存清零,然后使用当前的权重和偏置对输入 x 进行预测,得到预测结果 prediction

    • 使用 loss_function 计算预测结果与真实标签之间的损失,得到损失张量 loss

    • 调用 loss.mean().backward() 计算损失的平均值,并根据计算得到的梯度进行反向传播。

    • 调用 optimizer.step() 更新权重和偏置,使用优化器进行梯度下降更新。

    • 每隔 10 个迭代输出当前迭代的序号、总迭代次数和损失的平均值。

7. 测试集预测

        在测试集上进行预测,使用训练好的模型对测试集进行预测

with torch.no_grad():
    test_prediction = linear_model(x_test, w, b)
    test_prediction = torch.round(test_prediction) # 四舍五入为整数
    test_prediction = test_prediction.detach().numpy()

8. 实验结果评估

  • 使用 metrics 模块计算分类准确度(accuracy)、精确度(precision)、召回率(recall)和F1得分(F1 score)。
  • 输出经过优化后的参数 w 和 b,以及在测试集上的评估指标。
accuracy = metrics.accuracy_score(y_test, test_prediction)
precision = metrics.precision_score(y_test, test_prediction, average='macro')
recall = metrics.recall_score(y_test, test_prediction, average='macro')
f1 = metrics.f1_score(y_test, test_prediction, average='macro')
print("The optimized parameters are:")
print("w:", w.flatten().tolist())
print("b:", b.item())

print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)

        本实验使用随机梯度下降优化器训练线性模型,并在鸢尾花数据集上取得了较好的分类性能。实验结果表明,经过优化后的模型能够对鸢尾花进行准确的分类,并具有较高的精确度、召回率和F1得分。

9. 完整代码

import torch
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import metrics

def linear_model(x, w, b):
    return torch.matmul(x, w) + b

def loss_function(y_true, y_pred):
    loss = (y_pred - y_true) ** 2
    return loss

# 加载鸢尾花数据集并进行预处理
iris = load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
x_train = torch.tensor(x_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
x_test = torch.tensor(x_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)

w = torch.rand(x_train.shape[1], 1, requires_grad=True)
b = torch.randn(1, requires_grad=True)
optimizer = optim.SGD([w, b], lr=0.01) # 使用SGD优化器

num_epochs = 100
for epoch in range(num_epochs):
    optimizer.zero_grad()       # 梯度清零
    prediction = linear_model(x_train, w, b)
    loss = loss_function(y_train, prediction)
    loss.mean().backward()      # 计算梯度
    optimizer.step()            # 更新参数

    if (epoch + 1) % 10 == 0:
        print(f"Epoch {epoch+1}/{num_epochs}, Loss: {loss.mean().item()}")

# 在测试集上进行预测
with torch.no_grad():
    test_prediction = linear_model(x_test, w, b)
    test_prediction = torch.round(test_prediction) # 四舍五入为整数
    test_prediction = test_prediction.detach().numpy()

accuracy = metrics.accuracy_score(y_test, test_prediction)
precision = metrics.precision_score(y_test, test_prediction, average='macro')
recall = metrics.recall_score(y_test, test_prediction, average='macro')
f1 = metrics.f1_score(y_test, test_prediction, average='macro')
print("The optimized parameters are:")
print("w:", w.flatten().tolist())
print("b:", b.item())

print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)

更多推荐

ActiveMQ、RabbitMQ、RocketMQ、Kafka区别

一、消息中间件的使用场景消息中间件的使用场景总结就是六个字:解耦、异步、削峰1.解耦如果我方系统A要与三方B系统进行数据对接,推送系统人员信息,通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整,或者推送过程中B系统网络进行了调整,又或者后续过程中我们需要推送信息到三方C系统中,这样的话就需要我们进行频繁的

数据结构与算法:排序算法(2)

目录堆排序使用步骤代码实现计数排序适用范围过程代码实现排序优化桶排序工作原理代码实现堆排序二叉堆的特性:1.最大堆的堆顶是整个堆中的最大元素2.最小堆的堆顶是整个堆中的最小元素以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶

Ae 效果:CC Wide Time

时间/CCWideTimeTime/CCWideTimeCCWideTime(CC宽泛时间)能够将前后不同时间的帧叠加在一起,从而创建移动物体的运动轨迹,实现重影、运动模糊、光影跟随等效果。可以配合其它的效果使得本效果有更多的可控性。比如,“CCComposite”效果可使得原始内容清晰可见。“色调”Tint效果可改变

Kotlin Android中错误及异常处理最佳实践

KotlinAndroid中错误及异常处理最佳实践Kotlin在Android开发中的错误处理机制以及其优势Kotlin具有强大的错误处理功能:Kotlin提供了强大的错误处理功能,使处理错误变得简洁而直接。这个特性帮助开发人员快速识别和解决错误,减少了调试代码所需的时间。Kotlin的错误处理特性:Kotlin具有一

Windows下,快速部署开发环境,第三方库管理,以及项目迁移工具介绍

对于在windows下做c++开发的同学,你是否有以下痛点?:1.每次构建c++项目,搭配第三方库环境,都要不停的include,lib,dll等配置,如果4-5个还好,要是10几个...人都麻了...2.一个环境也无所谓,问题x64/32位系统,Debug,Release都要配置一遍..每次配置完成后,还要运行检测.

Hadoop初识及信息安全(大数据的分布式存储和计算平台)

目录什么是HadoopHadoop的特点Hadoop优点Hadoop的缺点Hadoop的重要组成信息安全什么是HadoopHadoop是一个适合大数据的分布式存储和计算平台。Hadoop的广义和狭义区分:狭义的Hadoop:指的是一个框架,Hadoop是由三部分组成:HDFS:分布式文件系统--》存储;MapReduc

虚拟IP技术

1.说明虚拟IP(VirtualIPAddress,简称VIP)是一个未分配给真实弹性云服务器网卡的IP地址。弹性云服务器除了拥有私有IP地址外,还可以拥有虚拟IP地址,用户可以通过其中任意一个IP(私有IP/虚拟IP)访问此弹性云服务器。同时,虚拟IP地址拥有私有IP地址同样的网络接入能力,包括VPC内二三层通信、V

【面试经典150 | 双指针】判断子序列

文章目录写在前面Tag题目来源题目解题解题思路方法一:双指针方法二:动态规划写在最后写在前面本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:Tag:介绍本题牵涉到的知识点、

zookeeper —— 分布式服务协调框架

zookeeper——分布式服务协调框架一、Zookeeper概述1、Zookeeper的基本概念2、Zookeeper的特点3、Zookeeper的数据结构二、Zookeeper的安装部署1、Zookeeper的下载2、Zookeeper的安装本地模式(单机模式standalone)安装部署分布式(集群模式clust

【结构型】代理模式(Proxy)

目录代理模式(Proxy)适用场景代理模式实例代码(Java)代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。Proxy模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候。适用场景远程代理(RemoteProxy)为一个对象在不同地址空间提供局部代表。虚代理(VirtualProxy)根据

设计模式:享元模式

享元模式(FlyweightPattern)是一种用于效率的优化模式,主要用于减少创建对象的数量,以减少内存占用和提高性能。它适用于那些需要大量使用相似对象,但又不需要每个对象都拥有完全独立的状态的情况。在享元模式中,我们将对象分为两个部分:内部状态和外部状态。内部状态是存储在享元对象中的,并且可以被多个享元对象共享。

热文推荐