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

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

  1. Tensorflow基本开发步骤——以逻辑回归拟合二维数据为例

    深度学习大概有如下四个步骤:准备数据,搭建模型,迭代训练和使用模型. 一.准备数据 使用y=2x作为主体,通过加入一些随机干扰噪声产生一组数据.代码如下: import tensorflow as t ...

  2. 深度学习之TensorFlow 第三章基本开发步骤--以逻辑回归拟合二维数据为例(转)

    深度学习有四个步骤: 准备数据  搭建模型   迭代训练   使用模型 import tensorflow as tf import numpy as np #数组 import matplotlib ...

  3. 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类

    Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...

  4. 【Pytorch神经网络实战案例】12 利用注意力机制的神经网络实现对FashionMNIST数据集图片的分类

    1.掩码模式:是相对于变长的循环序列而言的,如果输入的样本序列长度不同,那么会先对其进行对齐处理(对短序列补0,对长序列截断),再输入模型.这样,模型中的部分样本中就会有大量的零值.为了提升运算性能, ...

  5. 【Pytorch神经网络实战案例】18 最大化深度互信信息模型DIM实现搜索最相关与最不相关的图片

    图片搜索器分为图片的特征提取和匹配两部分,其中图片的特征提取是关键.将使用一种基于无监督模型的提取特征的方法实现特征提取,即最大化深度互信息(DeepInfoMax,DIM)方法. 1 最大深度互信信 ...

  6. 【Pytorch神经网络实战案例】13 构建变分自编码神经网络模型生成Fashon-MNST模拟数据

    1 变分自编码神经网络生成模拟数据案例说明 变分自编码里面真正的公式只有一个KL散度. 1.1 变分自编码神经网络模型介绍 主要由以下三个部分构成: 1.1.1 编码器 由两层全连接神经网络组成,第一 ...

  7. 【Pytorch神经网络实战案例】01 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-方法①

    import torch import torchvision from torch import nn from torch.utils.tensorboard import SummaryWrit ...

  8. 【Pytorch神经网络实战案例】02 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-方法②

    import torch import torchvision from torch import nn from torch.utils.tensorboard import SummaryWrit ...

  9. 【Pytorch神经网络实战案例】03 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-测试方法

    import torch import torchvision from PIL import Image from torch import nnimage_path="./test_im ...

最新文章

  1. 0x01.基本算法 — 位运算
  2. python class 初始化顺序
  3. java.net.SocketException: 断开的管道 (Write failed) 错误,数据库隔一段时间就断开的问题...
  4. textContent、innerHTML、innerText、outerText、outerHTML、nodeValue使用场景和区别
  5. 客户端访问https时应无浏览器(含终端)安全警告信息;_https和http有什么区别(内附详细分析)...
  6. mxnet基础到提高(40)-ndarray之运算(1)
  7. Java并发编程实战_真香!阿里P8耗时半年著作660页Java高并发与网络编程实战总结...
  8. python中bar的用法_python使用matplotlib绘图 -- barChart
  9. arraylist数据5万占内存_2021年北京市高考报名人数会超过5万吗?大数据告诉您结果...
  10. python更新_MacOS升级python版本
  11. JQuery的click、bind、delegate、off、unbind
  12. cisco 增强型内部网关路由协议EIGRP笔记
  13. 磁盘及网络测试工具(iperf hdparm dd)
  14. Spring之后处理器
  15. python中列表去重有哪几种方法_python列表里的字典元素去重
  16. 专家称米粒倒闭是个案 不必大惊小怪
  17. 计科实训 餐馆点菜系统
  18. WooCommerce可扩展性:如何扩大您的WooCommerce商店
  19. idea maven sss(Spring+Struts+SpringDataJpa)实现简单登录
  20. winServer2008下配置企业管理器

热门文章

  1. JAVA中的toString()方法的用法
  2. 【笔试记录】2021/3/13美团
  3. 静态html的ajax如何发请求,静态页面ajax - 冥焱的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. treelistview 所有节点失去焦点_垃圾询盘过滤,焦点科技的 Milvus 实践
  5. 清华大学《操作系统》(二十三):I/O子系统
  6. 58到家MySQL军规升级版
  7. 关于response格式转换
  8. 分别写出引入CSS的3种方式, 特点, 优先级
  9. 制作根文件系统时的错误解决
  10. 使用BusyBox制作根文件系统的操作步骤