刚刚学习了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,还是希望大佬们能够指出问题所在,感谢大家。
参考了部分博客的文章,但是因为时间线有点长,找不到是那几个博主的文章了,还是非常感谢他们的文章,帮助我解决了众多的问题。