pytorch 实现简单二元分类器以及可视化
这个文章是用pytorch和matplotlib实现一个二元分类器并且可视化。
思路
- 自己生成两团数据。
- 定义自己的神经网络类。
- 训练网络
- 打印出边界。
先放效果图
关于可视化
定义网络、训练网络主要没什么好说的啦其实,毕竟有pytorch这么好的框架,已经提供了如此简单的代码工作。
主要是可视化的技巧。
主要是matplotlib中有个contourf,本身是画等高线用的,就是地理中那个三维图投射到二维图的那种图。
我们可以把这个用到可视化上来(当然只是3维的,如果是更高维度就没法用这个可视化了)。
具体怎么可视化的?
首先,先自己生成200个训练数据(这步对应getData函数),然后把属于不同类别的数据染上不同颜色;
然后,进行网络的训练(对应run函数);
然后,用同样的数据让网络进行预测。因为二元分类器最后预测的结果要么是0,要么是1,所以可以利用matplotlib中的画等高线的函数,来近似画出决策边界。这一步主要对应showBoundary函数。
使用conturf函数
这个函数我自己在用的时候有点懵逼,使用这个要先meshgrid,mesh合并的意思,grid网格的意思,要把两个列表先合成一个网格,这个形式我也不是很喜欢。
勉勉强强参考了一些博客才写了出来。具体我也没办法一一讲述,还请各位原谅。
不过其中,cmap是画出来的图的风格参数,可以是camp=plt.cm.hot等等,alpha是透明度。
用了conturf这个函数,就可以有颜色的区别了。
最后放代码
import torch import torch.nn.modules import torch.nn import numpy as np from torch.autograd import Variable #torch的基本变量 import torch.nn.functional as F #里面有很多torch的函数 import matplotlib.pyplot as plt #定义自带forward propagation的神经网络。 class Net(torch.nn.Module): def __init__(self,n_features,n_hiddens,n_outputs): super(Net,self).__init__() self.hidden=torch.nn.Linear(n_features,n_hiddens) self.predict=torch.nn.Linear(n_hiddens,n_outputs) def forward(self, x): x=F.relu(self.hidden(x)) predict=F.softmax(self.predict(x)) return predict class MyNet: def __init__(self,n_features,n_hiddens,n_outputs,times): self.NeuronalNet=Net(n_features,n_hiddens,n_outputs) self.realX=None self.realY=None self.opitimizer=None self.lossFunc=None self.times=times #训练集 def getData(self): temp = torch.ones(100, 2) B = torch.normal(2 * temp, 1) By = torch.ones(100) A = torch.normal(-2 * temp, 1) Ay = torch.zeros(100) self.realX = Variable(torch.cat([A, B], 0)) self.realY = Variable(torch.cat([Ay, By]).type(torch.LongTensor)) # plt.scatter(realX.data.numpy()[:,0],realX.data.numpy()[:,1],c=realY) # plt.show() def run(self): self.opitimizer=torch.optim.SGD(self.NeuronalNet.parameters(),lr=0.01) self.lossFunc=torch.nn.CrossEntropyLoss() for i in range(self.times): out=self.NeuronalNet(self.realX) loss=self.lossFunc(out,self.realY) self.opitimizer.zero_grad() loss.backward() self.opitimizer.step() #可视化 def showBoundary(self): x_min, x_max = self.realX[:, 0].min() - 0.1, self.realX[:, 0].max() + 0.1 y_min, y_max = self.realX[:, 1].min() - 0.1, self.realX[:, 1].max() + 0.1 xx, yy = np.meshgrid(np.linspace(x_min, x_max, 101), np.linspace(y_min, y_max, 101)) cmap = plt.cm.Spectral X_test = torch.from_numpy(np.c_[xx.ravel(), yy.ravel()]).float() y_pred = self.NeuronalNet(X_test) _, y_pred = y_pred.max(dim=1) y_pred = y_pred.reshape(xx.shape) plt.contourf(xx, yy, y_pred, cmap=plt.cm.Spectral, alpha=0.8) plt.scatter(self.realX[:, 0], self.realX[:, 1], c=self.realY, s=40, cmap=plt.cm.RdYlBu) plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.title("binary classifier") plt.show() def predict(self,inputData): #inputData should be a 1x2 matrix data=torch.from_numpy(np.array(inputData)).int() return self.NeuronalNet(data.float()) if __name__=="__main__": myNet =MyNet(2,18,2,1000) myNet.getData() myNet.run() myNet.showBoundary() probabilitys=list(myNet.predict([3, 3]).data.numpy()) print("是第{0}类".format(1+probabilitys.index(max(probabilitys))))
原文地址:https://segmentfault.com/a/1190000022166909
相关推荐
-
卷积神经网络(CNN)反向传播算法 人工智能机器学习
2019-7-2
-
Kaggle比赛San Francisco Crime Classification分析 人工智能机器学习
2019-8-26
-
特征工程之特征表达,特征工程之特征选择 人工智能机器学习
2019-7-2
-
Tensorflow学习之调优 人工智能机器学习
2019-7-21
-
语义分割丨PSPNet源码解析「测试阶段」 人工智能机器学习
2019-7-24
-
「圣诞特辑」纯前端实现人脸识别自动佩戴圣诞帽 人工智能机器学习
2020-7-5
-
用Flink取代Spark Streaming!知乎实时数仓架构演进 人工智能机器学习
2019-9-7
-
论文笔记:Do We Really Need Multiplications in Deep Learning? 人工智能机器学习
2020-7-5
-
opencv图像直方图均衡化及其原理 人工智能机器学习
2019-8-19
-
集成学习原理小结 人工智能机器学习
2019-7-2