在了解了反向传播的过程之后,让我们开始看看如何使用PyTorch实现深度神经网络。实现深度神经网络的过程类似于感知器模型的实现。在实现过程中,我们需要执行以下步骤。

步骤1:

在第一步中,我们将导入所有所需的库,如torch、numpy、datasets和matplotlib.pyplot。

import torch  
import numpy as np  
import matplotlib.pyplot as plt  
from sklearn import datasets  

步骤2:

在第二步中,我们定义数据点的数量,然后使用make_blobs()函数创建一个数据集,该函数将创建一个数据点的集群。

no_of_points=500  
datasets.make_blobs()  

步骤3:

现在,我们将创建我们的数据集,并将数据点存储到变量x中,同时将值存储到变量y中,我们将使用标签作为稍后的参考。

x,y=datasets.make_blobs()  

步骤4:

现在,我们将make_blobs()更改为make_circle(),因为我们希望数据集呈圆形。我们在make_circle()函数中传递适当的参数。第一个参数表示样本点的数量,第二个参数是随机状态,第三个参数是噪声,它将引用Gaussian噪声的标准偏差,第四个参数是因子,它将引用相对于较大的内部圆形区域的较小区域的大小。

x, y = datasets.make_circles(n_samples=no_of_points, random_state=123, noise=0.1, factor=0.2)

步骤4:

在根据需要定制数据集后,我们可以使用plt.scatter()函数绘制并可视化它。我们定义每个标签数据集的x和y坐标。让我们从标签为0的数据集开始。它绘制了我们数据的顶部区域。标签为0的数据集的scatter函数定义如下:

plt.scatter(x[y==0,0],x[y==0,1])  

05-1.png

步骤5:

现在,我们在我们数据的底部区域绘制点。标签为1的数据集的scatter函数定义如下:

plt.scatter(x[y==1,0],x[y==1,1])  

05-2.png

单一线无法对上述数据集进行分类。要对这个数据集进行分类,将需要一个更深层次的神经网络。

我们将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])  

步骤6:

在这一步中,我们将创建我们的模型类,就像我们在线性回归和感知器模型中实现的那样。不同之处在于,这里我们在输入和输出层之间还使用了隐藏层。在init()方法中,我们将传递一个额外的参数h1作为隐藏层,我们的输入层连接到隐藏层,然后隐藏层连接到输出层。

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  

现在,我们必须在我们的forward函数中添加这个额外的隐藏层,以便任何输入都必须通过整个深度的神经网络进行预测。因此:

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  

我们的初始化已经完成,现在我们准备使用它。请记住,为了训练模型,x和y坐标都应该是numpy数组。因此,我们将改变我们的x和y值,使其成为张量:

xdata=torch.Tensor(x)  
ydata=torch.Tensor(y)  

步骤7:

我们将使用DeepNeuralNetwork()构造函数初始化一个新的线性模型,并传递input_size、output_size和hidden_size作为参数。现在,我们打印分配给它的随机权重和偏置值:

print(list(model.parameters()))  

在此之前,为了确保我们的随机结果的一致性,我们可以使用torch的手动种子torch.manual_seed()进行随机数生成器的种子化,并且我们可以设置种子为2:

torch.manual_seed(2)  

步骤8:

我们将计算模型错误的标准是交叉熵。我们的损失函数将根据二元交叉熵损失(BCELoss)进行测量,因为我们只处理两个类别。它是从nn模块中导入的。

criterion=nn.BCELoss()  

现在,我们更新参数使用优化器。因此,我们定义使用梯度下降算法的优化器,这里我们将使用Adam优化器。Adam优化器是许多优化算法中的一种。Adam优化算法是随机梯度下降的两个其他扩展的组合,例如Adagrad和RMSprop。学习率在优化中起着重要作用。

optimizer=torch.optim.Adam(model.parameters(),lr=0.01)   

如果选择最小的学习率,它会导致非常缓慢地收敛到最小值,如果选择非常大的学习率可能会阻碍收敛。Adam优化算法最终计算每个参数的自适应学习率。

步骤9:

现在,我们将训练我们的模型一定的epochs,就像我们在线性模型和感知器模型中所做的那样。因此,代码将与感知器模型类似:

epochs=1000  
losses=[]  
For i in range (epochs):  
    ypred=model.forward(x)  #Prediction of y  
    loss=criterion(ypred,y)   #Find loss  
    losses.append()     # Add loss in list   
    optimizer.zero_grad()   # Set the gradient to zero  
    loss.backward()    #To compute derivatives   
    optimizer.step()    # Update the parameters  

05-3.png

标签: Pytorch, Pytorch教程, Pytorch安装, Pytorch入门, Pytorch下载, Pytorch指南, Pytorch编程, Pytorch入门教程, Pytorch初级教程, Pytorch进阶, Pytorch高级教程, Pytorch学习, Pytorch库