搭建一个简易神经网络(PyTorch)

就是通过对 权重参数(w1,w2) 的更新来优化模型。

一个批次的数据从输入到输出的完整过程是:

  • 先输入 100 个具有 1000 个特征的数据;
  • 经过隐藏层后变成 100 个具有 100 个特征的数据;
  • 再经过输出层后输出 100 个具有 10 个分类结果值的数据;
  • 在得到输出结果之后计算损失并进行后向传播,这样一次模型的训练就完成了。
'''导入必要的包,然后定义 4 个整型变量'''
import torch
batch_n = 100       #在一个批次中输入 100 个数据
labels = 1000   #每个数据的数据特征是 1000 个
hidden_layer = 100  #经过隐藏层后保留的数据特征的个数是 100 个
                    #有几层隐藏层就定义几个隐藏层的参数。本模型只考虑一层隐藏层,所以在代码中仅定义了一个隐藏层的参数
output_data = 10    #最后要得到 10 个分类结果值

'''定义从输入层到隐藏层、从隐藏层到输出层对应的权重参数'''
x = torch.randn(batch_n, labels)  #100*1000,随机生成参数作为初始化参数
y = torch.randn(batch_n, output_data)  #100*10,随机生成真实值y

w1 = torch.randn(labels, hidden_layer)  #1000*100
w2 = torch.randn(hidden_layer, output_data)  #100*10

这是关于输入层、隐藏层、输出层的整体概念图:
在这里插入图片描述


然后循环这个流程就可以完成指定次数的训练,并达到优化模型参数的目的。这是训练模型、优化参数的流程:

在这里插入图片描述

'''明确训练的总次数和学习速率(会使用梯度下降的方法来优化神经网络的参数)'''
epoch_n = 20  #后向传播的次数,需要通过循环的方式让程序进行 20 次训练,来完成对初始化权重参数的优化和调整
learning_rate = 1e-6  #梯度下降使用的学习速率

'''对模型进行正式训练并对参数进行优化'''
for epoch in range(epoch_n):
    h1 = torch.mm(x, w1)  #矩阵乘法,100*100
    h1 = h1.clamp(min = 0)  #自定义裁剪,将小于零的值全部重新赋值为 0 。类似于加上了激活函数的功能。
    y_pred = h1.mm(w2)  #同torch.mm(h1, w2),100*10
    
    loss = (y_pred - y).pow(2).sum()  #损失函数(均方误差)
    print("Epoch:{}, Loss:{:.4f}".format(epoch, loss))
    
    grad_y_pred = 2*(y_pred - y)  #100*10
    grad_w2 = torch.mm(h1.t(), grad_y_pred)  #h1.t()表示转置
    
    grad_h = grad_y_pred.clone()  #克隆,100*10
    grad_h = torch.mm(grad_h, w2.t())  #(100,10)*(100,10)^T=(100,100)
    grad_h.clamp_(min=0)  #clamp后面加了个_表示替换原有的值,相当于grad_h = grad_h.clamp(min=0)
    grad_w1 = torch.mm(x.t(), grad_h)  #(100,1000)^T * (100,100)=(1000,100)
    
    w1 -= learning_rate * grad_w1  #参数更新
    w2 -= learning_rate * grad_w2
Epoch:0, Loss:56620832.0000
Epoch:1, Loss:140514880.0000
Epoch:2, Loss:485577568.0000
Epoch:3, Loss:622250880.0000
Epoch:4, Loss:16694890.0000
Epoch:5, Loss:8489046.0000
Epoch:6, Loss:5131008.0000
Epoch:7, Loss:3511614.5000
Epoch:8, Loss:2651232.2500
Epoch:9, Loss:2155895.7500
Epoch:10, Loss:1846978.3750
Epoch:11, Loss:1637783.5000
Epoch:12, Loss:1484509.5000
Epoch:13, Loss:1364426.0000
Epoch:14, Loss:1265589.1250
Epoch:15, Loss:1181176.5000
Epoch:16, Loss:1107270.6250
Epoch:17, Loss:1041433.1250
Epoch:18, Loss:982092.4375
Epoch:19, Loss:928178.1250