【Pytorch神经网络实战案例】06 逻辑回归拟合二维数据

简介: 【Pytorch神经网络实战案例】06 逻辑回归拟合二维数据

d2a65a549b404eec874e50053efb401a.png


1 逻辑回归与拟合过程


1.1 准备数据-code_01_moons.py(第1部分)


import sklearn.datasets
import torch
import numpy as np
import matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,plot_losses,predict,plot_decision_boundary
# 1.1 准备数据
np.random.seed(0) #设置随机种子
X,Y = sklearn.datasets.make_moons(200,noise=0.2)#生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) #获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) #获取第2组数据索引
plt.title("moons data") #设置可视化标题
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label='data1') #显示第一组数据索引
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label='data2')#显示第二组数据索引
plt.legend() #显示图例
plt.show()

7180fb4c9e384dc4a0a82307980fe189.png



1.2 定义网络模型-LogicNet_fun.py(第1部分)


# 1.2 定义网络模型
class LogicNet(nn.Module): #继承nn.Module类,构建网络模型
    def __init__(self,inputdim,hiddendim,outputdim): #初始化网络结构 ===》即初始化接口部分
        super(LogicNet,self).__init__()
        self.Linear1 = nn.Linear(inputdim,hiddendim) #定义全连接层
        self.Linear2 = nn.Linear(hiddendim,outputdim) #定义全连接层
        self.criterion = nn.CrossEntropyLoss() #定义交叉熵函数
    def forward(self,x):# 搭建用两个全连接层组成的网络模型 ===》 即正向接口部分:将网络层模型结构按照正向传播的顺序搭建
        x = self.Linear1(x)# 将输入传入第一个全连接层
        x = torch.tanh(x)# 将第一个全连接层的结果进行非线性变化
        x = self.Linear2(x)# 将网络数据传入第二个全连接层
        return x
    def predict(self,x):# 实现LogicNet类的预测窗口 ===》 即预测接口部分:利用搭建好的正向接口,得到模型预测结果
        #调用自身网络模型,并对结果进行softmax()处理,分别的出预测数据属于每一个类的概率
        pred = torch.softmax(self.forward(x),dim=1)# 将正向结果进行softmax(),分别的出预测结果属于每一个类的概率
        return torch.argmax(pred,dim=1)# 返回每组预测概率中最大的索引
    def getloss(self,x,y):# 实现LogicNet类的损失值接口 ===》 即损失值计算接口部分:计算模型的预测结果与真实值之间的误差,在反向传播时使用
        y_pred = self.forward(x)
        loss = self.criterion(y_pred,y)# 计算损失值的交叉熵
        return loss


1.3 实例化网络模型-code_01_moons.py(第2部分)


# 1.3 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=3,outputdim=2) #实例化模型 输入数据的维度、隐藏节点的数量、模型最终结果的分类数
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器 在反向传播时使用


1.4 神经网络的训练模型-code_01_moons.py(第3部分)


#1.4 训练模型
xt = torch.from_numpy(X).type(torch.FloatTensor) #将数据转化为张量形式
yt = torch.from_numpy(Y).type(torch.LongTensor)
epochs = 10000 #训练次数
losses = [] # 损失值列表
for i in range(epochs):
    loss = model.getloss(xt,yt)
    losses.append(loss.item())
    optimizer.zero_grad() #梯度清零
    # loss.backword()  写错了 # 反向传播
    loss.backward()# 反向传播的损失值
    optimizer.step()# 更新参数


1.5 训练结果的可视化实现


1.5.1 定义可视化函数-LogicNet_fun.py(第2部分)


# 1.5 训练可视化
def moving_average(a,w=10): #计算移动平均损失值
    if len(a) < w:
        return a[:]
    return [val if idx < w else sum(a[(idx - w):idx]) / w for idx, val in enumerate(a)]
def moving_average_to_simp(a,w=10): #
    if len(a) < w:
        return a[:]
    val_list = []
    for idx, val in enumerate(a):
        if idx < w:# 如果列表 a 的下标小于 w, 直接将元素添加进 xxx 列表
            val_list.append(val)
        else:#  向前取 10 个元素计算平均值, 添加到 xxx 列表
            val_list.append(sum(a[(idx - w):idx]) / w)
def plot_losses(losses):
    avgloss = moving_average(losses)#获得损失值的移动平均值
    plt.figure(1)
    plt.subplot(211)
    plt.plot(range(len(avgloss)),avgloss,'b--')
    plt.xlabel('step number')
    plt.ylabel('Training loss')
    plt.title('step number vs Training loss')
    plt.show()


1.5.2 调用可视化函数-code_01_moons.py(第4部分)


#1.5 训练可视化
plot_losses(losses)

27f803ae5b7241f2ad8bed6cdfb2840f.png


1.6 网络模型评估即预测精度计算-code_01_moons.py(第5部分)


#1.6 模型评估
from sklearn.metrics import accuracy_score
print(accuracy_score(model.predict(xt),yt))


1.7 预测结果模型可视化


1.7.1 可视化函数构建--LogicNet_fun.py(第3部分)


# 1.7 数据可视化模型
def predict(x): #封装支持Numpy的预测接口
    x = torch.from_numpy(x).type(torch.FloatTensor)
    model = LogicNet(inputdim=2, hiddendim=3, outputdim=2)
    ans = model.predict(x)
    return ans.numpy()
def plot_decision_boundary(pred_func,X,Y): #在直角模型中实现预测结果的可视化
    #计算范围
    x_min ,x_max = X[:,0].min()-0.5 , X[:,0].max()+0.5
    y_min ,y_max = X[:,1].min()-0.5 , X[:,1].max()+0.5
    h=0.01
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    #根据数据输入进行预测
    Z = pred_func(np.c_[xx.ravel(),yy.ravel()])
    Z = Z.reshape(xx.shape)
    #将数据的预测结果进行可视化
    plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral)
    plt.title("Linear predict")
    arg = np.squeeze(np.argwhere(Y==0),axis=1)
    arg2 = np.squeeze(np.argwhere(Y==1),axis=1)
    plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+')
    plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o')
    plt.show()


1.7.2 可视化函数调用--code_01_moons.py(第6部分)


# 1.7 数据预测可视化模型
plot_decision_boundary(lambda x:predict(x),xt.numpy(),yt.numpy())

820646781c9c475fb742946148f2ea37.png


2 总结与回顾


2.1 深度学习的步骤


准备数据、搭建网络模型、训练模型、使用及评估模型


2.1.1 概述步骤


将任务中的数据进行收集整理,通过建立合适的网络模型进行预测,在构建过程中通过一定次数的迭代学习数据特征来行程可用的数据模型,最后就是使用构建好的模型来解决实际问题。


2.2 训练模型


8ed8eeac28c14855b35602d82b2abb84.png


2.3 模型是如何训练的


a6d7f21cdfb64107b0f3e561f268fc74.png

b7a1593fc8e54dbba9859e9f3cc99978.png

30d39799a7484e559d8ab357c553ee8e.png


3 代码汇总


3.1 code_01_moons.py


import sklearn.datasets
import torch
import numpy as np
import matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,plot_losses,predict,plot_decision_boundary
# 1.1 准备数据
np.random.seed(0) #设置随机种子
X,Y = sklearn.datasets.make_moons(200,noise=0.2)#生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) #获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) #获取第2组数据索引
plt.title("moons data") #设置可视化标题
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label='data1') #显示第一组数据索引
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label='data2')#显示第二组数据索引
plt.legend() #显示图例
plt.show()
# 1.3 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=3,outputdim=2) #实例化模型 输入数据的维度、隐藏节点的数量、模型最终结果的分类数
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器 在反向传播时使用
#1.4 训练模型
xt = torch.from_numpy(X).type(torch.FloatTensor) #将数据转化为张量形式
yt = torch.from_numpy(Y).type(torch.LongTensor)
epochs = 10000 #训练次数
losses = [] # 损失值列表
for i in range(epochs):
    loss = model.getloss(xt,yt)
    losses.append(loss.item())
    optimizer.zero_grad() #梯度清零
    # loss.backword()  写错了 # 反向传播
    loss.backward()# 反向传播的损失值
    optimizer.step()# 更新参数
#1.5 训练可视化
plot_losses(losses)
#1.6 模型评估
from sklearn.metrics import accuracy_score
print(accuracy_score(model.predict(xt),yt))
# 1.7 数据预测可视化模型
plot_decision_boundary(lambda x:predict(x),xt.numpy(),yt.numpy())


3.2 LogicNet_fun.py


import torch.nn as nn #引入torch网络模型库
import torch
import numpy as np
import matplotlib.pyplot as plt
# 1.2 定义网络模型
class LogicNet(nn.Module): #继承nn.Module类,构建网络模型
    def __init__(self,inputdim,hiddendim,outputdim): #初始化网络结构 ===》即初始化接口部分
        super(LogicNet,self).__init__()
        self.Linear1 = nn.Linear(inputdim,hiddendim) #定义全连接层
        self.Linear2 = nn.Linear(hiddendim,outputdim) #定义全连接层
        self.criterion = nn.CrossEntropyLoss() #定义交叉熵函数
    def forward(self,x):# 搭建用两个全连接层组成的网络模型 ===》 即正向接口部分:将网络层模型结构按照正向传播的顺序搭建
        x = self.Linear1(x)# 将输入传入第一个全连接层
        x = torch.tanh(x)# 将第一个全连接层的结果进行非线性变化
        x = self.Linear2(x)# 将网络数据传入第二个全连接层
        return x
    def predict(self,x):# 实现LogicNet类的预测窗口 ===》 即预测接口部分:利用搭建好的正向接口,得到模型预测结果
        #调用自身网络模型,并对结果进行softmax()处理,分别的出预测数据属于每一个类的概率
        pred = torch.softmax(self.forward(x),dim=1)# 将正向结果进行softmax(),分别的出预测结果属于每一个类的概率
        return torch.argmax(pred,dim=1)# 返回每组预测概率中最大的索引
    def getloss(self,x,y):# 实现LogicNet类的损失值接口 ===》 即损失值计算接口部分:计算模型的预测结果与真实值之间的误差,在反向传播时使用
        y_pred = self.forward(x)
        loss = self.criterion(y_pred,y)# 计算损失值的交叉熵
        return loss
# 1.5 训练可视化
def moving_average(a,w=10): #计算移动平均损失值
    if len(a) < w:
        return a[:]
    return [val if idx < w else sum(a[(idx - w):idx]) / w for idx, val in enumerate(a)]
def moving_average_to_simp(a,w=10): #
    if len(a) < w:
        return a[:]
    val_list = []
    for idx, val in enumerate(a):
        if idx < w:# 如果列表 a 的下标小于 w, 直接将元素添加进 xxx 列表
            val_list.append(val)
        else:#  向前取 10 个元素计算平均值, 添加到 xxx 列表
            val_list.append(sum(a[(idx - w):idx]) / w)
def plot_losses(losses):
    avgloss = moving_average(losses)#获得损失值的移动平均值
    plt.figure(1)
    plt.subplot(211)
    plt.plot(range(len(avgloss)),avgloss,'b--')
    plt.xlabel('step number')
    plt.ylabel('Training loss')
    plt.title('step number vs Training loss')
    plt.show()
# 1.7 数据可视化模型
def predict(x): #封装支持Numpy的预测接口
    x = torch.from_numpy(x).type(torch.FloatTensor)
    model = LogicNet(inputdim=2, hiddendim=3, outputdim=2)
    ans = model.predict(x)
    return ans.numpy()
def plot_decision_boundary(pred_func,X,Y): #在直角模型中实现预测结果的可视化
    #计算范围
    x_min ,x_max = X[:,0].min()-0.5 , X[:,0].max()+0.5
    y_min ,y_max = X[:,1].min()-0.5 , X[:,1].max()+0.5
    h=0.01
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    #根据数据输入进行预测
    Z = pred_func(np.c_[xx.ravel(),yy.ravel()])
    Z = Z.reshape(xx.shape)
    #将数据的预测结果进行可视化
    plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral)
    plt.title("Linear predict")
    arg = np.squeeze(np.argwhere(Y==0),axis=1)
    arg2 = np.squeeze(np.argwhere(Y==1),axis=1)
    plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+')
    plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o')
    plt.show()


目录
相关文章
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
这篇文章介绍了如何使用PyTorch框架,结合CIFAR-10数据集,通过定义神经网络、损失函数和优化器,进行模型的训练和测试。
80 2
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
|
13天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
57 6
|
1月前
|
机器学习/深度学习 数据可视化 测试技术
YOLO11实战:新颖的多尺度卷积注意力(MSCA)加在网络不同位置的涨点情况 | 创新点如何在自己数据集上高效涨点,解决不涨点掉点等问题
本文探讨了创新点在自定义数据集上表现不稳定的问题,分析了不同数据集和网络位置对创新效果的影响。通过在YOLO11的不同位置引入MSCAAttention模块,展示了三种不同的改进方案及其效果。实验结果显示,改进方案在mAP50指标上分别提升了至0.788、0.792和0.775。建议多尝试不同配置,找到最适合特定数据集的解决方案。
245 0
|
14天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
39 4
|
14天前
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
36 1
|
15天前
|
网络协议 安全 NoSQL
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
|
15天前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
|
13天前
|
网络协议 调度 开发者
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第27天】本文介绍了Python网络编程中的Twisted框架,重点讲解了其异步IO处理机制。通过反应器模式,Twisted能够在单线程中高效处理多个网络连接。文章提供了两个实战示例:一个简单的Echo服务器和一个HTTP服务器,展示了Twisted的强大功能和灵活性。
28 0
|
15天前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9-2):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
|
1月前
|
SQL 安全 算法
网络安全的盾牌与剑:漏洞防御与加密技术的实战应用
【9月更文挑战第30天】在数字时代的浪潮中,网络安全成为守护信息资产的关键防线。本文深入浅出地探讨了网络安全中的两大核心议题——安全漏洞与加密技术,并辅以实例和代码演示,旨在提升公众的安全意识和技术防护能力。

热门文章

最新文章