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

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

BP神经网络结构

数据集

采用鸢尾花数据集:

超参数设置

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



损失和精度变化图像

  • 89
    点赞
  • 803
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
BP神经网络是一种常用的人工神经网络,用于解决各种分类和预测问题。Python是一门流行的编程语言,它提供了一个灵活的环境,可以轻松地构建和实现BP神经网络。 在Python实现BP神经网络代码可以分为三个主要部分:输入层、隐藏层和输出层。输入层用来接收数据,隐藏层用于处理数据并生成预测,输出层用于将预测结果输出。 以下是一个简单的BP神经网络Python代码实现: ``` python import numpy as np class BP: def __init__(self, in_dim, out_dim, hidden_dim): self.in_dim = in_dim self.out_dim = out_dim self.hidden_dim = hidden_dim self.weights1 = np.random.rand(self.in_dim, self.hidden_dim) self.biases1 = np.random.rand(self.hidden_dim) self.weights2 = np.random.rand(self.hidden_dim, self.out_dim) self.biases2 = np.random.rand(self.out_dim) def sigmoid(self, x): return 1/(1 + np.exp(-x)) def forward(self, X): self.Z1 = np.dot(X, self.weights1) + self.biases1 self.A1 = self.sigmoid(self.Z1) self.Z2 = np.dot(self.A1, self.weights2) + self.biases2 self.A2 = self.sigmoid(self.Z2) def derivative_sigmoid(self, x): return x*(1-x) def backward(self, X, y, lr): error = y - self.A2 delta2 = error*self.derivative_sigmoid(self.A2) self.weights2 += lr*np.dot(self.A1.T, delta2) self.biases2 += lr*np.sum(delta2, axis=0) delta1 = np.dot(delta2, self.weights2.T)*self.derivative_sigmoid(self.A1) self.weights1 += lr*np.dot(X.T, delta1) self.biases1 += lr*np.sum(delta1, axis=0) def train(self, X, y, lr=0.01, epochs=1000): for i in range(epochs): self.forward(X) self.backward(X, y, lr) def predict(self, X): self.forward(X) return self.A2 ``` 在上述Python代码中,我们通过使用NumPy库来创建一个BP神经网络。与其他神经网络相似,我们有一些参数,如输入维度,隐藏维度和输出维度等等。我们使用NumPy来生成随机权重和偏置。我们使用sigmoid函数作为激活函数。前向传递使用dot函数来计算权重和输入的乘积,使用sigmoid激活函数计算输出,反向传递使用误差来反向调整权重和偏差。在训练神经网络时,我们通过迭代来调整权重和偏差并降低误差。通过对BP神经网络的训练和预测,我们可以处理各种分类和预测问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值