Pytorch使用全连接层实现鸢尾花分类——roc、loss、accuracy

刚刚学习了pytorch框架,尝试着使用框架完成实验作业,其中对roc和loss曲线的作图可能有些问题,请大家指出。


题目要求

1. 完成数据集的划分(可尝试多种划分方法)
2. 完成建立鸢尾花分类模型(可尝试使用 K 近邻、决策树、SVM 等不同算法)(这里使用的神经网络)
3. 对建立的模型进行评估
4. 画出loss曲线、ROC曲线,accuracy曲线


一、网络搭建

pytorch实现了众多层,只需要组装起来即可

代码如下:

import torch
import torch.nn as nn
class mynet(torch.nn.Module):
    def __init__(self):
        super(mynet,self).__init__()
        self.features=nn.Sequential(
            torch.nn.Linear(4, 19),
            nn.ReLU(inplace=True),
            torch.nn.Linear(19, 3)
        )
    def forward(self,x):
        y=self.features(x)
        return y

二、数据处理

1.引入库

代码如下(示例):

import torch.onnx
import torch.nn as nn
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
import  matplotlib.pyplot as plt
import numpy as np
from net import mynet
from sklearn.datasets import load_iris
import torch.utils.data as Data
from sklearn.metrics import roc_curve,auc

2.数据导入和处理

代码如下(示例):

data=load_iris()
X,Y = shuffle(data['data'],data['target'], random_state=20)
train,test,train_label,test_label=train_test_split(X, Y,
                                                    test_size=0.3,
                                                    random_state=1)
train_label=train_label.reshape(-1,1)
test_lable=test_label.reshape(-1,1)


batch=15
module=mynet()#输入特征为4,输出标签为3
train_dataset = Data.TensorDataset(torch.from_numpy(train).float(),torch.from_numpy(train_label).long())

train_loader = Data.DataLoader(dataset=train_dataset,batch_size=batch,shuffle=True)
acc=[]
loss_all=[]
train_acc=[]

三、训练以及保存accuracy和loss数据

loss_fun = nn.CrossEntropyLoss()  # 设置交叉熵损失函数
optimizer = torch.optim.SGD(params=module.parameters(), lr=0.01)  # 设置随机梯度下降,步长为0.01
for epoch in range (1000):
    step = 0
    loss_one = 0
    for step, (x, y) in enumerate(train_loader):
        y = torch.reshape(y, [batch])
        out=module.forward(x)
        loss = loss_fun(out, y)
        loss_one+=loss.item()/batch
        optimizer.zero_grad()  # 梯度清零
        loss.backward()  # 计算梯度
        optimizer.step()  # 更新参数
        if epoch % 20 == 0:
            print('Epoch: ', epoch, '| Step: ', step, '| batch y: ', y.numpy())
    loss_all.append(loss_one/(step+1))
    output = module.forward(torch.from_numpy(test).float())
    prediction = torch.max(output, 1)[1]
    pred_y = prediction.data.numpy()
    test_y = test_label.reshape(1, -1)
    target_y = torch.from_numpy(test_y).long().data.numpy()
    acc.append(float((pred_y == target_y).astype(int).sum()) / float(target_y.size))
    output_train = module.forward(torch.from_numpy(train).float())
    prediction_y = torch.max(output_train, 1)[1]
    pred_train = prediction_y.data.numpy()
    train_y = train_label.reshape(1, -1)
    target_train = torch.from_numpy(train_y).long().data.numpy()
    train_acc.append(float((pred_train == target_train).astype(int).sum()) / float(target_train.size))

四、作图

#roc
fpr,tpr,thersholds=roc_curve(test_lable,pred_y,pos_label=2)
for i, value in enumerate(thersholds):
    print("%f %f %f" % (fpr[i], tpr[i], value))
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr,color='darkorange',  label='ROC (area = {0:.2f})'.format(roc_auc), lw=2)
plt.xlim([-0.05, 1.05])  # 设置x、y轴的上下限,以免和边缘重合,更好的观察图像的整体
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')  # 可以使用中文,但需要导入一些库即字体
plt.title('ROC Curve')
plt.legend(loc="lower right")
plt.show()
#accuracy
x=np.linspace(1,100,1000)
plt.xlabel("Iterations")
plt.ylabel("accuracy")
l1=plt.plot(x,acc,label='test',color="r")
l2=plt.plot(x,train_acc,label='train',color="b")
plt.legend(loc='lower right')
plt.show()
#loss
x=np.linspace(1,1000,1000)
plt.xlabel("Iterations")
plt.ylabel("loss")
plt.plot(x,loss_all,color="r")
plt.show()
print("鸢尾花预测准确率", acc[-1])

总结

刚刚学习了pytorch,尝试使用pytorch完成实验作业。这个实验只是用到了全连接层,激活函数使用了ReLu函数,整体上网络结构简单到不能再简单了。但是存在一定的问题,中间有几次的代码的准确率达到了1.00,还是希望大佬们能够指出问题所在,感谢大家。
参考了部分博客的文章,但是因为时间线有点长,找不到是那几个博主的文章了,还是非常感谢他们的文章,帮助我解决了众多的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值