【pytorch】简单BP神经网络用于通用分类任务的代码模板

概述

最近正在学习智能信息处理课程,接触到了一些有关深度学习pytorch的简单应用,pytorch作为python中最常见的深度学习任务工具应用也非常广泛。

如果小伙伴们对神经网络部分相关理论知识比较熟悉,但不知道代码具体怎么实现,可以参考本篇文章的代码部分,希望能够对大家有所帮助。

也是作为模板供自己和大家参考,主要是怕忘hhh(手动/doge

数据集

本篇代码使用的数据是sklearn中的鸢尾花数据集,训练集由120组鸢尾花的数据特征及其标签组成,另包含相同类型的数据30组用作测试集。

其中,鸢尾花的数据特征以小数形式保存,标签分为3类(0,1,2),代表其属于不同类别。

另附数据集下载地址:
https://download.csdn.net/download/weixin_52456426/86724498
在这里插入图片描述
(上图为部分训练集数据截图)

代码

本代码采用torch提供的框架,设定输入层特征数为4(即特征数量),隐藏层(hidden layer)神经元数为10,输出层维数为3(标签数量),激活函数选用sigmoid(当然可以用ReLU或者tanh等,经实际试验,在本次数据集上效果差不多的)
优化器选用Adam参数优化(也可以用SGD随机梯度下降等);由于是经典回归任务,loss损失函数设定为交叉熵损失函数。

设定训练轮数为2000,每10轮进行训练集上的accuracy(准确率)与loss值的计算,最终在测试集上运行我们的模型。

代码部分如下(关键部分给出注释):

# -*- coding: utf-8 -*-
# 2022/9/27
# Author:Jonathan_K_Wolf
import numpy as np
import torch
import pandas as pd
import torch.nn as nn
import torch.nn.functional as F

# 导入数据
data_train = pd.read_csv('./iris_training.csv')
# 训练集特征向量集合
train_x = np.array(data_train.iloc[:, 0:4])
# 训练集标签向量集合
train_y = np.array(data_train.iloc[:, 4])
# 转化为torch.Tensor形式
x_train = torch.FloatTensor(train_x)
y_train = torch.LongTensor(train_y)


# 定义网络结构
class Net(nn.Module):
    def __init__(self, n_features, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden = nn.Linear(n_features, n_hidden)
        self.out = nn.Linear(n_hidden, n_output)

    # 前向传播过程
    def forward(self, x):
        x = F.relu(self.hidden(x))
        x = self.out(x)
        return x


# 实例化网络
model = Net(n_features=4, n_hidden=10, n_output=3)
# 参数优化器,可以选用Adam或SGD
optimizer = torch.optim.Adam(model.parameters(), lr=0.06)
# 损失函数,分类用交叉熵,回归用均方误差MSELoss
loss_func = torch.nn.CrossEntropyLoss()


# 训练阶段
for i in range(1, 3001):
    output = model(x_train)
    loss = loss_func(output, y_train)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if i % 10 == 0:
        acc = 0
        prediction = torch.argmax(output, dim=1)
        pred_y = prediction.numpy()
        target_y = y_train.numpy()
        for item in range(len(pred_y)):
            if pred_y[item] == target_y[item]:
                acc += 1
        acc /= len(pred_y)
        acc = round(acc, 3)
        print('accuracy at {} epoch:{}, loss at {} epoch:{}'.format(i, acc, i, loss))

# 测试阶段
data_test = pd.read_csv('./iris_test.csv')
test_x = np.array(data_test.iloc[:, 0:4])
test_y = np.array(data_test.iloc[:, 4])

# 测试集转换成Tensor格式
x_test = torch.FloatTensor(test_x)
y_test = torch.LongTensor(test_y)

# 对测试集进行准确率评估
output_prediction = model(x_test)
output_pred = torch.argmax(output_prediction, dim=1)
output_pred = output_pred.numpy()
acc_test = 0
for item in range(len(test_y)):
    if output_pred[item] == test_y[item]:
        acc_test += 1
acc_test /= len(test_y)
acc_test = round(acc_test, 3)
print('test of acc:{}'.format(acc_test))

最终效果如下:
在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值