📅  最后修改于: 2020-11-11 00:55:16             🧑  作者: Mango
我们将使用精确的决策边界来绘制数据集,这将区分我们的分类结果。在此,我们还将测试模型。有以下步骤来训练我们的模型:
步骤1:
第一步,我们定义一个函数plot_decision_boundary(),其中包含两个参数,即训练数据x和输出标签y。该函数将返回决策边界的轮廓图。
def plot_decision_boundary(x, y):
第2步:
在此步骤中,我们定义一个可以正确跨越数据的网格。该过程首先定义数据集中x和y坐标的范围。 x_span和y_span将被定义为50个等距点
x_span=np.linspace(min(x[:,0]),max(x[:,0]))
y_span=np.linspace(min(y[:,1]),max(y[:,1]))
第三步:
在下一步中,我们将定义xx和yy变量。 xx和yy变量都存储一个方形二维数组,该数组将从numpy的meshgrid()函数获得。
xx,yy=np.meshgrid(x_span,y_span)
meshgrid()函数同时使用向量x_span和y_span作为参数。两个向量均包含50个元素,并且此函数将返回二维的50 * 50矩阵。新添加的行将是x_span向量中原始行的重复副本,并将返回到xx变量。 y_span的过程相同;它将返回二维的50 * 50矩阵,其中新添加的列将是y_span向量中原始列的重复副本。该矩阵将返回yy变量。
第四步:
借助这些新创建的矩阵xx和yy,我们将创建一个覆盖整个数据集的笛卡尔网格。为此,我们首先必须使用ravel()方法将xx和yy矩阵一维转换。
print(xx.ravel(),yy.ravel())
步骤5:
现在,我们将有50个x坐标,并且要定义网格,我们必须将这些数组以y列的形式连接起来。这将在c_ []的帮助下完成。
grid=np.c_[xx.ravel(),yy.ravel()]
现在,我们将使用torch.Tensor()将它们转换为张量。这会将50 * 50网格转换为张量数据。
grid=torch.Tensor(np.c_[xx.ravel(),yy.ravel()])
步骤5:
现在,最终,我们可以使用带有网格作为唯一参数的.forward()模型。通过将整个网格张量输入到model.forward()函数,经过训练的模型将测试我们的50 * 50网格内的所有点,这将返回一个预测张量。
model.forward(grid)
这个预测表明任何给定点被标记为1的概率,我们将把这个张量存储在变量pred_func中。
pred_func=model.forward(grid)
步骤5:
现在,我们将把pred_func重塑为与原始xx和yy尺寸相同的尺寸形状。
z=pred_func.view(xx.shape).numpy()
这将产生一个错误;我们将使用分离方法,该方法从梯度计算中排除任何子图,该子图将与pred_fun中的值相关联。
z=pred_func.view(xx.shape).detach().numpy()
步骤6:
现在,我们的下一步是将我们的预测结果链接到相应的坐标副本。为此,我们将使用plt.contourf(),它将使用xx,yy和z创建预测结果的轮廓图
plt.contourf(xx, yy,z)
步骤7:
现在,我们将首先调用plot_decision_boundary()方法,然后将调用我们先前定义的scatter_plot()方法。这将使我们的数据可视化为
plot_decision_boundary(x,y)
scatter_plot()
步骤8
我们将重新绘制拟合模型,为此,我们必须对将初始化的随机点进行预测。我们将通过两点来更好地理解
p1=torch.Tensor(0.25,0.25])
步骤9
现在,下一步是绘制该点以进行可视化,以便我们可以确定该点位于1类还是0类中。
plt.plot(p1[0],p1[1],marker='o',markersize=5,color='red')
p1点最初是张量的形式,因此我们通过类型转换将此点更改为numpy。
plt.plot(p1.numpy()[0],p1.numpy()[1],marker='o',markersize=5,color='red')
步骤9
我们可以对这一点做出预测。我们将预测该点属于2类正区域的概率。我们知道所有橙色点都标记为1,所有蓝色点都标记为0。因此,概率确定为
print("Red point positive probability={}".format(model.forward(p1).item()))
第10步
现在,我们将返回到类初始化,并创建一个称为predict的方法,该方法具有一个参数。我们使用self.forward(x)来找到概率。如果概率大于0.5,则返回1类,否则返回0。
def predict(self,x):
pred=self.forward(x)
if pred>=0.5:
return 1
else:
return 0
步骤11
最后,我们将添加print语句,该语句使用predict方法将类告诉我们。
print("Red point in calss={}".format(model.predict(p1)))
显然,我们的模型可以正常工作,并使用随机数据为我们提供准确的结果。
import torch
import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
from sklearn import datasets
no_of_points=500
x,y=datasets.make_circles(n_samples=no_of_points,random_state=123,noise=0.1,factor=0.2)
xdata=torch.Tensor(x)
ydata=torch.Tensor(y)
def scatter_plot():
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()
class Deep_neural_network(nn.Module):
def __init__(self,input_size, h1, output_size):
super().__init__()
self.linear=nn.Linear(input_size, h1) # input layer connect with hidden layer
self.linear1=nn.Linear(h1, output_size) # hidden layer connect with output layer
def forward(self,x):
x=torch.sigmoid(self.linear(x)) # Return the prediction x
x=torch.sigmoid(self.linear1(x)) # Prediction will go through the next layer.
return x # Returning final outputs
def predict(self,z):
pred=self.forward(z)
if pred>=0.5:
return 1
else:
return 0
torch.manual_seed(2)
model= Deep_neural_network(2,4,1) # 2 input nodes, 4 hidden nodes and 1 output node
print(list(model.parameters()))
criterion=nn.BCELoss()
optimizer=torch.optim.Adam(model.parameters(),lr=0.1)
epochs=1000
losses=[]
for i in range(epochs):
ypred=model.forward(xdata)
loss=criterion(ypred,ydata)
print("epoch:",i,"loss:",loss.item())
losses.append(loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
def plot_decision_boundary(x, y):
x_span=np.linspace(min(x[:,0]),max(x[:,0]))
y_span=np.linspace(min(x[:,1]),max(x[:,1]))
xx,yy=np.meshgrid(x_span,y_span)
grid=torch.Tensor(np.c_[xx.ravel(),yy.ravel()])
pred_func=model.forward(grid)
z=pred_func.view(xx.shape).detach().numpy()
plt.contourf(xx,yy,z)
z1=0.25
z2=0.25
p1=torch.Tensor([z1,z2])
plt.plot(p1.numpy()[0],p1.numpy()[1],marker='o',markersize=5,color='red')
print("Red point positive probability={}".format(model.forward(p1).item()))
print("Red point in calss={}".format(model.predict(p1)))
plot_decision_boundary(x,y)
scatter_plot()
输出: