前言
MLP是一种常用的前馈神经网络,使用了BP算法的MLP可以被称为BP神经网络。MLP的隐节点采用输入向量与权向量的内积作为激活函数的自变量,激活函数采用Relu函数。各参数对网络的输出具有同等地位的影响,因此MLP是对非线性映射的全局逼近。除了使用Sklearn提供的MLPRegressor
函数以外,我们可以通过Pytorch建立自定义程度更高的人工神经网络。本文将不再对MLP的理论基础进行赘述,而将介绍MLP的具体建立方法。
一、网络主体构建
通过继承nn.Moudule类对MLP进行逐层建立
1.网络构建
该网络输入维度为8(即八个参量),输出为一个batch,即一个批训练的样本量,并在最后对Tensor进行展平。隐藏层分比为20,20,5,输出层为1,即预测值。
import torch.nn as nn
import torch.nn.functional as F
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.hidden1 = nn.Linear(in_features = 8, out_features = 20, bias = True)
self.hidden2 = nn.Linear(20,20)
self.hidden3 = nn.Linear(20,5)
self.predict = nn.Linear(5,1)
def forward(self,x):
x = F.relu(self.hidden1(x))
x = F.relu(self.hidden2(x))
x = F.relu(self.hidden3(x))
output = self.predict(x)
out = output.view(-1)
return out
1.网络结构可视化
使用Graphviz对这个简单的MLP进行可视化。
这里输入了一个64X8的张量,即代表一次性输入了64个8参量数据
import torch
from net import MLP
from torchviz import make_dot
tensor = torch.zeros(64,8).requires_grad_(True)
model = MLP()
net = model(tensor)
net_strc = make_dot(net, params = dict(list(model.named_parameters()) + [('tensor',tensor)]))
net_strc.view()
网络结构如图:
二、数据集构建与网络训练
1.数据集构建
这里使用了sklearn提供的fetch_california_housing
数据集,该数据集输入参量为8,与网络第一层输入对应。
通过sklearn提供的StandardScaler
和train_test_split
函数,对输入数据进行正则化与数据集分割。
def dataset():
house_data = fetch_california_housing()
x_train,