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

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()

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 xdef 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)

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.5y_min ,y_max = X[:,1].min()-0.5 , X[:,1].max()+0.5h=0.01xx, 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())

2 总结与回顾

2.1 深度学习的步骤

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

2.1.1 概述步骤

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

2.2 训练模型

2.3 模型是如何训练的 

 

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 xdef 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.5y_min ,y_max = X[:,1].min()-0.5 , X[:,1].max()+0.5h=0.01xx, 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将Win10包含中文的用户名改为英文的,同时解决Anaconda navigator无法运行jupyter的问题

Win10用户名包含中文字符导致无法在Anaconda navigator直接运行jupyter的问题 本篇文章内容包含&#xff1a; WIN10如何修改"C:\Users\用户名"中的用户名执行1后&#xff0c;也就是用户名修改为英文名后&#xff0c;在Anaconda navigator启动之前无法启动的jupyter…

linux dd使用记录

dd if/dev/sda of/dev/sdb bs10M Linux下显示dd命令的进度&#xff1a;dd if/dev/zero of/tmp/zero.img bs10M count100000想要查看上面的dd命令的执行进度&#xff0c;可以使用下面几种方法&#xff1a; 比如&#xff1a;每5秒输出dd的进度 方法一&#xff1a;watch -n 5 pkil…

【Pytorch神经网络理论篇】 01 Pytorch快速上手(一)概述+张量

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络理论篇】 02 Pytorch快速上手(二)GPU与CPU张量切换+具有随机值的张量+张量的数学运算

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

解读Android 4.0 Camera原生应用程序的设计思路

解读Android 4.0 Camera原生应用程序的设计思路 一篇很不错的文章&#xff1a; http://my.oschina.net/jerikc/blog/907911. 设置摄像头方向 2. 打开线程与预览线程 3. 设置参数 4. Camera外设按键 5. 自动对焦与触摸对焦 6. 拍照 7. 人脸检测 8. 位置管理 9. 旋转管理 10. 变…

【Pytorch神经网络理论篇】 03 Pytorch快速上手(三)张量的数据操作

1 张量的数据操作 1.1 torch.reshape()实现数据维度变化 import torch a torch.tensor([[1,2],[3,4]]) print(torch.reshape(a,(1,-1))) # 将其转化为只有1行数据的张量,参数-1表示自动计算 # tensor([[1, 2, 3, 4]]) print(a.reshape((1,-1))) # # 将其转化为只有1行数据的…

写一个包含多个事件四则运算的留存SQL ——impala hive

在实现一个留存业务需求时&#xff0c;碰到了一个难题&#xff0c;我需要提供展示一个按照如下图格式的数据&#xff0c; day 1 ~ day n的第一行是留存用户数量&#xff0c;第二行是一个由多个事件组合执行四则算术运算得到的复合数值&#xff0c;这里碰到的难点主要是第二行的…

V4L2用户空间和kernel层driver的交互过程

这篇文章详细分析了V4L2用户空间和kernel层driver的交互过程&#xff0c;目的只有一个&#xff1a;更清晰的理解V4L2视频驱动程序的系统结构&#xff0c;驱动编程方法&#xff0c;为以后开发视频驱动打好基础既然从用户层出发探究驱动层&#xff0c;这里先贴出应用层code&#…

【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

php 对象赋值后改变成员变量影响赋值对象

话不多说看代码 <?php class obj {}$obj1new obj();//实例化对象 $obj2$obj1;//赋值新对象 $obj1->name"test";//改变老对象的成员变量属性 var_dump($obj1); var_dump($obj2); $obj2->name"name";//改变新对象的成员变量属性 var_dump($obj1); …

Android Camera 通过V4L2与kernel driver的完整交互过程

原文地址&#xff1a;Android Camera 通过V4L2与kernel driver的完整交互过程 作者&#xff1a;xinyuwuxian Android Camera 通过V4L2与kernel driver的完整交互过程之前在 Android Camera 的执行流程http://blog.chinaunix.net/uid-26765074-id-3499537.html这篇文章中已经详细…

【Pytorch神经网络理论篇】 05 Module类的使用方法+参数Parameters类+定义训练模型的步骤与方法

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

BZOJ 2822: [AHOI2012]树屋阶梯 [Catalan数 高精度]

2822: [AHOI2012]树屋阶梯 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 779 Solved: 453[Submit][Status][Discuss]Description 暑假期间&#xff0c;小龙报名了一个模拟野外生存作战训练班来锻炼体魄&#xff0c;训练的第一个晚上&#xff0c;教官就给他们出了个难题。由…

【Pytorch神经网络理论篇】 06 神经元+神经网络模型+全连接网络模型

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

面试题:N皇后问题,思路和python解题笔记

n皇后问题算法思路和python解法 问题描述 n皇后问题&#xff0c;在nn的棋盘上&#xff0c;解出n个皇后所有不能互相攻击的摆法&#xff0c; 皇后在数组中用“Q”表示&#xff0c;空地用“.”表示 返回的数据结构格式要求&#xff1a;[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…

【Pytorch神经网络理论篇】 07 激活函数+Sigmoid+tanh+ReLU+Swish+Mish+GELU

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络理论篇】 08 Softmax函数(处理分类问题)

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

Python套接字编程Socket Progaming——1

本篇文章是Network And Web Programing-Socket Programing分类中的第一篇文章&#xff0c;内容主要包含 Socket概念理解Socket programing介绍一个简单的TCP协议的server-client程序支持同时处理多个客户端简单server-client连接程序socket的常用选项使用 理解socket概念 一…

【Pytorch神经网络理论篇】 09 神经网络模块中的损失函数

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络理论篇】 10 优化器模块+退化学习率

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…