02 简单的多层感知机
2.1 多层感知机的定义
理论知识可以参考此篇博客(里面的推导过程十分详细)
https://blog.csdn.net/xholes/article/details/78461164
2.2 多层感知机用Pytorch实现
(1)导入必要的第三方模块
import torch as t
import torch.nn as nn
from torch.autograd import Variable
(2)初始化多层感知机的输入层,隐藏层,输出层
Input_Layer = 5
Hidden_Layer = 20
Output_Layer = 10
(3)随机初始化数据集,并将其展示出来
Input = t.rand(1000,5)
Output = t.rand(1000,10)
print('Input=', Input.data)
print()
print('Output=', Output.data)
结果如下所示:
(4) 搭建神经网络(必备套路,请记下这个模板)
class MLPNet(nn.Module):
def __init__(self,input_size,hidden_size,output_size):
super(MLPNet,self).__init__()
self.linear1 = t.nn.Linear(input_size,hidden_size)
self.relu = t.nn.ReLU()
self.linear2 = t.nn.Linear(hidden_size,output_size)
def forward(self,x):
z1 = self.linear1(x)
a1 = self.relu(z1)
y = self.linear2(a1)
return y
结构分析:
1) 必须继承nn模块,即class MLPNet(nn.Module)
2) 多层感知机类的构造函数使用super(参考了许多博客都必须写这一个,我摸清楚它的规律,它是这样的一个模板:super(类名,self).init())
3) 构造输入层与隐藏层之间的连接权值矩阵(调用Linear类,构造连接权值的矩阵,初始化的参数分别为输入层结点个数以及隐藏层结点个数)
4) 定义激活函数这里使用relu函数
5) 构造隐藏层与输出层之间的连接权值矩阵(调用Linear类,构造连接权值的矩阵,初始化的参数分别为隐藏层结点个数以及输出层结点个数)
6) 前向传播 def forward(self,x):,使用当前神经网络的权值计算出一个预测值
(5) 初始化神经网络,其中包括初始初始的神经网络连接权值参数,定义损失函数,以及选择优化器
# 初始化神经网络
Model = MLPNet(Input_Layer,Hidden_Layer,Output_Layer)
# 定义损失函数
loss_function = nn.MSELoss()
# 定义学习率
learning_rate = 0.01
# 选择优化器
optimizer = t.optim.SGD(Model.parameters(), lr=learning_rate)
(6)训练模型
# 训练模型
import matplotlib.pyplot as plt
import numpy as np
X = []
Y = []
# 设定迭代次数
EPOCHS = 100000
for epoch in range(EPOCHS):
y_pred = Model(Input)
loss = loss_function(y_pred,Output)
X.append(epoch)
Y.append(loss.item())
if epoch%50==0:
print('epoch = %d, loss = %.8f'%(epoch,loss.item()))
#清零梯度
optimizer.zero_grad()
# 计算梯度
loss.backward()
# 更新梯度
optimizer.step()
plt.plot(X,Y)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
结果如图所示:
- 部分迭代结果
- 结果可视化(损失函数结果变化)
2.3 参考文献
【1】机器学习 清华大学出版社 周志华
【2】 视频:https://morvanzhou.github.io/tutorials/machine-learning/torch/