BP神经网络(Python代码实现)基于pytorch

这篇具有很好参考价值的文章主要介绍了BP神经网络(Python代码实现)基于pytorch。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 BP(Back Propagation)神经网络是一种按误差逆传播算法训练的多层前馈网络,它的学习规则是使用梯度下降法通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hiddenlayer)和输出层(output layer)。BP网络的学习过程,由信息的正向传播和误差的反向传播两个过程组成。

BP神经网络结构

BP神经网络(Python代码实现)基于pytorch

数据集

采用鸢尾花数据集:

BP神经网络(Python代码实现)基于pytorch

超参数设置

lr        = 0.02 # 学习率
epochs    = 300  # 训练轮数 
n_feature = 4    # 输入特征(鸢尾花四个特征)
n_hidden  = 20   # 隐含层
n_output  = 3    # 输出(鸢尾花三种类别)

准备数据 

将数据分成训练集80%和测试集20%,并对数据进行归一化,测试集的数据归一化必须使用训练集上得到的最大最小值。最后将数据转化为Tensor类型,以便能够进行训练。

#1.准备数据
iris=datasets.load_iris() #下载数据集

#设置训练集数据80%,测试集20%
x_train0,x_test0,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
#归一化(也就是所说的min-max标准化)通过调用sklearn库的标准化函数
min_max_scaler = preprocessing.MinMaxScaler()
x_train = min_max_scaler.fit_transform(x_train0)
x_test = min_max_scaler.fit_transform(x_test0)

#将数据类型转换为tensor方便pytorch使用
x_train=torch.FloatTensor(x_train)
y_train=torch.LongTensor(y_train)
x_test=torch.FloatTensor(x_test)
y_test=torch.LongTensor(y_test)

定义BP神经网络

#2.定义BP神经网络
class BPNetModel(torch.nn.Module):
    def __init__(self,n_feature,n_hidden,n_output):
        super(BPNetModel, self).__init__()
        self.hiddden=torch.nn.Linear(n_feature,n_hidden)#定义隐层网络
        self.out=torch.nn.Linear(n_hidden,n_output)#定义输出层网络
    def forward(self,x):
        x=Fun.relu(self.hiddden(x)) #隐层激活函数采用relu()函数
        out=Fun.softmax(self.out(x),dim=1) #输出层采用softmax函数
        return out

定义优化器和损失函数

#3.定义优化器和损失函数
net=BPNetModel(n_feature=n_feature,n_hidden=n_hidden,n_output=n_output) #调用网络
optimizer=torch.optim.Adam(net.parameters(),lr=lr) #使用Adam优化器,并设置学习率
loss_fun=torch.nn.CrossEntropyLoss() #对于多分类一般使用交叉熵损失函数

训练数据

#4.训练数据
loss_steps=np.zeros(epochs) #构造一个array([ 0., 0., 0., 0., 0.])里面有epochs个0
accuracy_steps=np.zeros(epochs)

for epoch in range(epochs):
    y_pred=net(x_train) #前向传播
    loss=loss_fun(y_pred,y_train)#预测值和真实值对比
    optimizer.zero_grad() #梯度清零
    loss.backward() #反向传播
    optimizer.step() #更新梯度
    loss_steps[epoch]=loss.item()#保存loss
    running_loss = loss.item()
    print(f"第{epoch}次训练,loss={running_loss}".format(epoch,running_loss))
    with torch.no_grad(): #下面是没有梯度的计算,主要是测试集使用,不需要再计算梯度了
        y_pred=net(x_test)
        correct=(torch.argmax(y_pred,dim=1)==y_test).type(torch.FloatTensor)
        accuracy_steps[epoch]=correct.mean()
        print("测试鸢尾花的预测准确率", accuracy_steps[epoch])

绘制损失函数和精度函数图像

#5.绘制损失函数和精度
fig_name="Iris_dataset_classify_BPNet"
fontsize=15
fig,(ax1,ax2)=plt.subplots(2,figsize=(15,12),sharex=True)
ax1.plot(accuracy_steps)
ax1.set_ylabel("test accuracy",fontsize=fontsize)
ax1.set_title(fig_name,fontsize="xx-large")
ax2.plot(loss_steps)
ax2.set_ylabel("train lss",fontsize=fontsize)
ax2.set_xlabel("epochs",fontsize=fontsize)
plt.tight_layout()
plt.savefig(fig_name+'.png')
plt.show()

全部代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import preprocessing
from sklearn.model_selection import train_test_split #训练集,测试集划分函数
import torch
import torch.nn.functional as Fun

#设置超参数
lr=0.02 #学习率
epochs=300 #训练轮数
n_feature=4 #输入特征
n_hidden=20 #隐层节点数
n_output=3 #输出(鸢尾花三种类别)

#1.准备数据
iris=datasets.load_iris() #下载数据集

#设置训练集数据80%,测试集20%
x_train0,x_test0,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
#归一化(也就是所说的min-max标准化)通过调用sklearn库的标准化函数
min_max_scaler = preprocessing.MinMaxScaler()
x_train = min_max_scaler.fit_transform(x_train0)
x_test = min_max_scaler.fit_transform(x_test0)

#将数据类型转换为tensor方便pytorch使用
x_train=torch.FloatTensor(x_train)
y_train=torch.LongTensor(y_train)
x_test=torch.FloatTensor(x_test)
y_test=torch.LongTensor(y_test)

#2.定义BP神经网络
class BPNetModel(torch.nn.Module):
    def __init__(self,n_feature,n_hidden,n_output):
        super(BPNetModel, self).__init__()
        self.hiddden=torch.nn.Linear(n_feature,n_hidden)#定义隐层网络
        self.out=torch.nn.Linear(n_hidden,n_output)#定义输出层网络
    def forward(self,x):
        x=Fun.relu(self.hiddden(x)) #隐层激活函数采用relu()函数
        out=Fun.softmax(self.out(x),dim=1) #输出层采用softmax函数
        return out
#3.定义优化器和损失函数
net=BPNetModel(n_feature=n_feature,n_hidden=n_hidden,n_output=n_output) #调用网络
optimizer=torch.optim.Adam(net.parameters(),lr=lr) #使用Adam优化器,并设置学习率
loss_fun=torch.nn.CrossEntropyLoss() #对于多分类一般使用交叉熵损失函数

#4.训练数据
loss_steps=np.zeros(epochs) #构造一个array([ 0., 0., 0., 0., 0.])里面有epochs个0
accuracy_steps=np.zeros(epochs)

for epoch in range(epochs):
    y_pred=net(x_train) #前向传播
    loss=loss_fun(y_pred,y_train)#预测值和真实值对比
    optimizer.zero_grad() #梯度清零
    loss.backward() #反向传播
    optimizer.step() #更新梯度
    loss_steps[epoch]=loss.item()#保存loss
    running_loss = loss.item()
    print(f"第{epoch}次训练,loss={running_loss}".format(epoch,running_loss))
    with torch.no_grad(): #下面是没有梯度的计算,主要是测试集使用,不需要再计算梯度了
        y_pred=net(x_test)
        correct=(torch.argmax(y_pred,dim=1)==y_test).type(torch.FloatTensor)
        accuracy_steps[epoch]=correct.mean()
        print("测试鸢尾花的预测准确率", accuracy_steps[epoch])

#print("测试鸢尾花的预测准确率",accuracy_steps[-1])

#5.绘制损失函数和精度
fig_name="Iris_dataset_classify_BPNet"
fontsize=15
fig,(ax1,ax2)=plt.subplots(2,figsize=(15,12),sharex=True)
ax1.plot(accuracy_steps)
ax1.set_ylabel("test accuracy",fontsize=fontsize)
ax1.set_title(fig_name,fontsize="xx-large")
ax2.plot(loss_steps)
ax2.set_ylabel("train lss",fontsize=fontsize)
ax2.set_xlabel("epochs",fontsize=fontsize)
plt.tight_layout()
plt.savefig(fig_name+'.png')
plt.show()



损失和精度变化图像

BP神经网络(Python代码实现)基于pytorch文章来源地址https://www.toymoban.com/news/detail-510570.html

到了这里,关于BP神经网络(Python代码实现)基于pytorch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于改进莱维飞行和混沌映射的粒子群优化BP神经网络分类研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 基于改

    2024年02月10日
    浏览(34)
  • 算法介绍及实现——基于遗传算法改进的BP神经网络算法(附完整Python实现)

    目录 一、算法介绍 1.1 遗传算法 1.2 为什么要使用遗传算法进行改进 二、算法原理 三、算法实现 3.1 算子选择 3.2 代码实现          遗传算法是受启发于自然界中生物对于自然环境 “适者生存”的强大自适应能力,通过对生物演化过程模拟和抽象,构建了以自然界生物演

    2024年02月03日
    浏览(31)
  • Python深度学习实战-基于class类搭建BP神经网络实现分类任务(附源码和实现效果)

    实现功能 上篇文章介绍了用Squential搭建BP神经网络,Squential可以搭建出上层输出就是下层输入的顺序神经网络结构,无法搭出一些带有跳连的非顺序网络结构,这个时候我们可以选择类class搭建封装神经网络结构。 第一步:import tensorflow as tf:导入模块 第二步:制定输入网络

    2024年02月08日
    浏览(43)
  • BP神经网络优化 | MATLAB基于遗传算法优化BP神经网络(GA-BP)的预测模型(含完整代码)

    文章目录 前言 一、遗传算法描述 二、优化思路 三、完整代码 预测结果  首先需要安装一下遗传算法工具箱,可参考这篇博客 MATLAB遗传算法工具箱安装包及安装方法(图解)_周杰伦今天喝奶茶了吗的博客-CSDN博客_matlab遗传算法工具箱安装 本模型可以结合自己的数据集进行

    2024年02月02日
    浏览(36)
  • 基于蝠鲼觅食优化的BP神经网络(分类应用) - 附代码

    摘要:本文主要介绍如何用蝠鲼觅食算法优化BP神经网络,利用鸢尾花数据,做一个简单的讲解。 本案例利用matlab公用的iris鸢尾花数据,作为测试数据,iris数据是特征为4维,类别为3个类别。数据格式如下: 特征1 特征2 特征3 类别 单组iris数据 5.3 2.1 1.2 1 3种类别用1,2,3表

    2024年02月07日
    浏览(32)
  • 基于人工水母优化的BP神经网络(分类应用) - 附代码

    摘要:本文主要介绍如何用人工水母算法优化BP神经网络,利用鸢尾花数据,做一个简单的讲解。 本案例利用matlab公用的iris鸢尾花数据,作为测试数据,iris数据是特征为4维,类别为3个类别。数据格式如下: 特征1 特征2 特征3 类别 单组iris数据 5.3 2.1 1.2 1 3种类别用1,2,3表

    2024年02月07日
    浏览(31)
  • 基于食肉植物优化的BP神经网络(分类应用) - 附代码

    摘要:本文主要介绍如何用食肉植物算法优化BP神经网络,利用鸢尾花数据,做一个简单的讲解。 本案例利用matlab公用的iris鸢尾花数据,作为测试数据,iris数据是特征为4维,类别为3个类别。数据格式如下: 特征1 特征2 特征3 类别 单组iris数据 5.3 2.1 1.2 1 3种类别用1,2,3表

    2024年02月07日
    浏览(28)
  • 基于水基湍流优化的BP神经网络(分类应用) - 附代码

    摘要:本文主要介绍如何用水基湍流算法优化BP神经网络,利用鸢尾花数据,做一个简单的讲解。 本案例利用matlab公用的iris鸢尾花数据,作为测试数据,iris数据是特征为4维,类别为3个类别。数据格式如下: 特征1 特征2 特征3 类别 单组iris数据 5.3 2.1 1.2 1 3种类别用1,2,3表

    2024年02月07日
    浏览(28)
  • 基于野狗算法优化的BP神经网络(预测应用) - 附代码

    摘要:本文主要介绍如何用野狗算法优化BP神经网络并应用于预测。 本案例数据一共2000组,其中1900组用于训练,100组用于测试。数据的输入为2维数据,预测的输出为1维数据 2.1 BP神经网络参数设置 神经网络参数如下: 2.2 野狗算法应用 野狗算法原理请参考:https://blog.csdn.

    2024年02月11日
    浏览(30)
  • 基于材料生成算法优化的BP神经网络(预测应用) - 附代码

    摘要:本文主要介绍如何用材料生成算法优化BP神经网络并应用于预测。 本案例数据一共2000组,其中1900组用于训练,100组用于测试。数据的输入为2维数据,预测的输出为1维数据 2.1 BP神经网络参数设置 神经网络参数如下: 2.2 材料生成算法应用 材料生成算法原理请参考:

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包