PyTorch 教程-感知器模型

了解感知器模型及一些关键术语如交叉熵、Sigmoid梯度下降等是很重要的。那么,什么是感知器模型,它是如何工作的呢?
让我们通过一个例子来理解感知器模型。想象一家每年都会为数千名患者进行手术的医院,请你创建一个预测模型,能够准确判断某人是否可能患癌症。
借助以前确定的数据,我们根据年龄(沿x轴)和吸入的烟草数量(沿y轴)来预测某人是否可能患癌症。
因此,年龄和吸烟量较大的人患癌症的可能性较高,而年龄和吸烟量较小的人患癌症的可能性较小。
每个绿色点表示癌症的可能性较高,最初被分配标签零;每个蓝色点表示癌症的可能性较低,最初被分配标签一。
因此,我们将从一个无法正确分类我们的数据的随机模型开始,然后通过某种优化算法对模型进行训练。该模型将通过多次迭代进行训练,直到达到能够正确分类数据点的参数值。我们使用之前标记的数据,这里所有的数据都标记为零,这里所有的数据都标记为一。
我们使用这些标记的数据来建立一个预测模型,将我们的数据分类为两个离散的类别。利用该模型,我们现在可以对没有标签的新输入数据进行预测,判断该点是在直线下方还是上方。我们将训练一个模型,该模型能够确定这个人属于类别一,即他们很可能是健康的。
现在,最大的问题是计算机如何知道如何得出这个线性模型。为此,我们将计算与该模型相关的误差,然后调整模型的参数以最小化误差并正确分类数据点。我们将使用 交叉熵 (cross-entropy) 函数来找到误差,使用 Sigmoid梯度下降 (Sigmoid gradient descent) 来优化参数。让我们开始实现代码,在其中我们将看到交叉熵函数和Sigmoid梯度下降如何被使用。
因此,我们将在上一节中创建的数据集上工作。现在,借助这个数据集,我们将开始实现代码并创建一个基本的感知器模型。
首先,我们将 plt.scatter(x[y==0,0],x[y==0,1])
和 plt.scatter(x[y==1,0],x[y==1,1])
放入一个函数中以备将来使用,如下所示:
def Scatter():
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
为了创建基本的感知器模型,我们需要按照以下步骤进行:
步骤1
首先,我们要创建一个线性模型。为此,我们必须创建我们的模型类,就像我们在线性回归模型中使用 init()
方法和 forward()
方法一样。init()
方法与以前相似,但 forward()
方法与线性回归模型有很大不同。我们定义 forward()
与以前相似,只是将第一个参数替换为 self
,然后我们需要传递输入 x
。
之后,我们通过将我们的数据 x
传递到我们的线性模型中来进行预测。
Class Perceptron_model(nn.Module):
def __init__(self,input_size,output_size):
super().__init__()
self.linear=nn.Linear(input_size,output_size)
def forward(self,x):
pred=self.linear(X)
return pred
这还不够,我们必须通过应用 sigmoid()
方法将值转换为概率,如下所示:
def forward(self,x):
pred=torch.sigmoid(self.linear(x))
return pred
我们的初始化已经完成,现在我们准备好使用它了。
步骤2
我们将使用 Perceptron_model()
构造函数初始化一个新的线性模型,并将 input_size
和 output_size
作为参数传递。现在,打印随机权重和偏置值,这些值被分配给它,如下所示:
model= Perceptron_model(2,1)
print(list(model.parameters()))
在此之前,为了确保我们的随机结果的一致性,我们可以使用 torch
手动设置随机数生成器的种子,并设置种子为2,如下所示:
torch.manual_seed(2)
步骤3
我们的下一步是通过解压模型提取模型参数。这些参数以包含两个元素的列表的形式提取,即 A
、B
,并打印两个值,如下所示:
[A,b]=model.parameters()
A1,A2=A.view(2)
B1=B[0]
print(A1.item(), A2.item(),B1.item())
在这里,A
是权重,B
是偏置。
为了清晰起见,我们使用函数将值 A1.item()
、A2.item()
和 B1[0].item()
返回如下:
def get_perameters():
return(A1.item(),A2.item(),B[0].item())
步骤4
现在,我们使用以列表形式提取的模型参数绘制我们的线性模型。我们使用标题、线性方程等。我们创建一个用户定义的函数来绘制我们的数据。看看绘制线性模型的代码。
def plotfit(title):
plt.title=title
A1, A2, B1 = get_perameters()
x1=np.array([-2.0,2.0])
y1=((A1*x1)+B1)/-A2
plt.plot(x1,y1,'r')
Scatter()
plotfit('Initial Model')