搭建一个简易神经网络(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