第五章 全连接神经网络


1.1 全连接神经网络

人工神经网络(Artificial Neural Network)可以对一组输入信号和一组输出信号之间的关系进行建模,是机器学习和认知科学中的一种模仿生物神经网络的结构和功能的数学模型。其灵感源于动物的神经中枢,由大量的人工神经元连接而成,能够根据外界环境改变内部结构,是一种自适应的系统。

全连接神经网络(Multi-Layer Perception)也称多层感知机,是一种连接方式较为简单的人共神经网络结构,属于前馈神经网络的一种。主要由输入层、隐藏层、输出层构成,并且在每个隐藏层中可以有多个神经元。

神经网络的学习能力主要来源于网络结构,根据层级数量的不同,每层神经元数量的多少,以及信息在层之间的传播方式,可以组合层多种神经网络模型。一般在隐层和输出层对信号进行加工处理,根据隐层的数量,MLP可分为单层或是多(隐)层。

针对单层MLP和多层MLP,每个隐层的神经元数量是可以变化的。通常没有一个很好的标准用于确定每层神经元的数量和隐层的个数。根据经验,更多的神经元会有更强的表示能力,同时也更容易造成网络的过拟合。

下面我们尝试用PyTorch搭建MLP回归与分类模型。

先导入需要的模块

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler,MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report
from sklearn.manifold import TSNE
import torch
import torch.nn as nn
from torch.optim import SGD,Adam
import matplotlib.pyplot as plt
import seaborn as sns
import torch.utils.data as Data
import hiddenlayer as hl

1.2 MLP分类模型

数据准备与探查

数据采用UCI机器学习库的垃圾邮件数据,下载网址为:https://archive.ics.uci.edu/ml/datasets.Spambase

# 读取数据集
spam=pd.read_csv(r"C:\Users\lenovo\Desktop\spambase.csv")
# 前五十七列是属性
# 最后一列是分类
x=spam.iloc[:,0:57].values
y=spam.tar.values
# 然后需要将数据分割为训练集和测试集
X_train,X_test,Y_train,Y_test=train_test_split(x,y,test_size=0.25,random_state=123)

数据预处理

# 为了消除量纲和减少离群点影响,需要对属性做标准化
# 可以用中心化或是归一化
# 对数据的前57列特征进行数据标准化处理
scales=MinMaxScaler(feature_range=(0,1))
X_train_s=scales.fit_transform(X_train)
X_test_s=scales.transform(X_test)

数据可视化

# 通过箱线图对数据进行可视化
colname=spam.columns.values[:-1]
plt.figure(figsize=(20,14))
for i in range(len(colname)):plt.subplot(7,9,i+1)sns.boxplot(x=Y_train,y=X_train_s[:,i])plt.title(colname[i])
plt.subplots_adjust(hspace=0.4)
plt.show()

创建一个多层感知机

class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.hidden1=nn.Sequential(nn.Linear(57,30,bias=True),nn.ReLU())self.hidden2 = nn.Sequential(nn.Linear(30, 10, bias=True),nn.ReLU())self.classifica = nn.Sequential(nn.Linear(10,2, bias=True),nn.Sigmoid())def forward(self,x):fc1=self.hidden1(x)fc2=self.hidden2(fc1)output=self.classifica(fc2)return fc1,fc2,output

数据载入与转换

# 需要将处理好的数据转化为张量进行使用
# 分类数据使用int64即可
x_train_nots=torch.from_numpy(X_train_s.astype(np.float32))
y_train_tar=torch.from_numpy(Y_train.astype(np.int64))
x_test_nots=torch.from_numpy(X_test_s.astype(np.float32))
y_test_tar=torch.from_numpy(Y_test.astype(np.int64))# 将其合并为一个数据集
train_data=Data.TensorDataset(x_train_nots,y_train_tar)
# 放入数据容器
train_data_loader=Data.DataLoader(dataset=train_data,shuffle=True,batch_size=64
)

优化器和损失函数

mlp=MLP()
# 定义优化器
opt=Adam(mlp.parameters(),lr=0.0003)
# 定义损失函数
loss_fn=nn.CrossEntropyLoss()
# 记录历史信息
history1=hl.History()
# 使用画布可视化
canvas=hl.Canvas()
# 中间过程
print_step=30

训练过程

for epoch in range(50):# 获取每一次的label和targetfor step,(bx,by) in enumerate(train_data_loader):_,_,out=mlp(bx)# 计算损失loss=loss_fn(out,by)# 梯度清零opt.zero_grad()# 反向传播loss.backward()# 更新参数opt.step()niter=epoch*len(train_data_loader)+step+1if niter%print_step==0:_,_,output=mlp(x_test_nots)# 查看_,pre_lab=torch.max(output,1)# 计算精度test_accuracy=accuracy_score(y_test_tar,pre_lab)# 添加epoch精度和损失history1.log(niter,train_loss=loss,test_accuracy=test_accuracy)with canvas:canvas.draw_plot(history1['train_loss'])canvas.draw_plot(history1['test_accuracy'])
_,_,output=mlp(x_test_nots)
_,pre_lab=torch.max(output,1)
test_accuracy=accuracy_score(y_test_tar,pre_lab)
print("Test_Accuracy",test_accuracy)

获取中间层输出

# 获取第二个隐层的输出
_,test_fc2,_=mlp(x_test_nots)
# TSNE降维
test_fc2_tsne=TSNE(n_components=2).fit_transform(test_fc2.data.numpy())
# 可视化特征
plt.figure(figsize=(8,6))
# 可视化前设置
plt.xlim([min(test_fc2_tsne[:,0]-1),max(test_fc2_tsne[:,0])+1])
plt.ylim([min(test_fc2_tsne[:,1]-1),max(test_fc2_tsne[:,1])+1])
plt.plot(test_fc2_tsne[Y_test==0,0],test_fc2_tsne[Y_test==0,1],"bo",label="0")
plt.plot(test_fc2_tsne[Y_test==1,0],test_fc2_tsne[Y_test==1,1],"rd",label="1")
plt.legend()
plt.title("test_fcc2_tsne")
plt.show()

通过Hook调用中间层信息

# 通过辅助函数来获取指定层名称的特征
activation={}
def get_activation(name):def hook(model,input,output):activation[name]=output.detach()return hookmlp.classifica.register_forward_hook(get_activation('classifica'))
_,_,_=mlp(x_test_nots)
classfica=activation['classifica'].data.numpy()
# 可视化特征
plt.figure(figsize=(8,6))
plt.plot(classfica[Y_test==0,0],classfica[Y_test==0,1],"bo",label="0")
plt.plot(classfica[Y_test==1,0],classfica[Y_test==1,1],"rd",label="1")
plt.legend()
plt.show()


1.3 MLP回归模型

回归模型的数据选择sklearn.datasets中的加利福尼亚房价数据。

模块准备

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error,mean_absolute_error
from sklearn.datasets import fetch_california_housingimport torch
import torch.nn as nn
import torch.nn.functional as F
from torch.optim import SGD
import torch.utils.data as Data
import matplotlib.pyplot as plt
import seaborn as sns

数据处理

housedata=fetch_california_housing()
X_train,X_test,y_train,y_test=train_test_split(housedata.data,housedata.target,test_size=0.3,random_state=42
)# 标准化
scale=StandardScaler()
X_train_s=scale.fit_transform(X_train)
X_test_s=scale.transform(X_test)

数据探查

# 转化为数据表,探查数据情况
housedatadf=pd.DataFrame(data=X_train_s,columns=housedata.feature_names)
housedatadf['target']=y_train
# 可视化热力图
datacor=np.corrcoef(housedatadf.values,rowvar=0)
datacor=pd.DataFrame(data=datacor,columns=housedatadf.columns,index=housedatadf.columns)
plt.figure(figsize=(8,6))
ax=sns.heatmap(datacor,square=True,annot=True,fmt=".3f",linewidths=.5,cmap="YlGnBu",cbar_kws={"fraction":0.046,"pad":0.03})
plt.show()

数据转化

# 转化为张量
train_xt=torch.from_numpy(X_train_s.astype(np.float32))
train_yt=torch.from_numpy(y_train.astype(np.float32))
test_xt=torch.from_numpy(X_test_s.astype(np.float32))
test_yt=torch.from_numpy(y_test.astype(np.float32))# 放到数据容器
train_data=Data.TensorDataset(train_xt,train_yt)
test_data=Data.TensorDataset(test_xt,test_yt)
train_loader=Data.DataLoader(dataset=train_data,shuffle=True,batch_size=64,
)

定义一个多层感知机

class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.hidden1=nn.Linear(8,100,bias=True)self.hidden2=nn.Linear(100,100)self.hidden3=nn.Linear(100,50)self.predict=nn.Linear(50,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)# output: [batch,1]# output[:,0]: [batch]return output[:,0]

训练参数定义

mlp=MLP()
optimizer=torch.optim.SGD(mlp.parameters(),lr=0.003)
loss_func=nn.MSELoss()
train_loss_all=[]

训练过程

for epoch in range(60):train_loss=0train_num=0for (bx,by) in train_loader:output=mlp(bx)loss=loss_func(output,by)optimizer.zero_grad()loss.backward()optimizer.step()train_loss+=loss.item()*bx.size(0)train_num+=bx.size(0)train_loss_all.append(train_loss/train_num)

结果可视化

plt.figure(figsize=(10,6))
plt.plot(train_loss_all,'ro-',label="Train Loss")
plt.legend()
plt.grid()
plt.xlabel("epoch")
plt.ylabel("loss")
plt.show()

预测测试集

# 对测试集进行预测
pre_y=mlp(test_xt)
pre_y=pre_y.data.numpy()
mae=mean_absolute_error(y_test,pre_y)
print("在测试集上的绝对值误差为: ",mae)

可视化差异

# 可视化差异
index=np.argsort(y_test)
plt.figure(figsize=(12,5))
plt.plot(np.arange(len(y_test)),y_test[index],'r',label="original Y")
plt.scatter(np.arange(len(pre_y)),pre_y[index],s=3,c="b",label="Prediction")
plt.legend(loc="upper left")
plt.grid()
plt.xlabel("Index")
plt.ylabel("Y")
plt.show()

第五章 全连接神经网络相关推荐

  1. 深蓝学院第二章:基于全连接神经网络(FCNN)的手写数字识别

    如何用全连接神经网络去做手写识别??? 使用的是jupyter notebook这个插件进行代码演示.(首先先装一个Anaconda的虚拟环境,然后自己构建一个自己的虚拟环境,然后在虚拟环境中安装ju ...

  2. PyTorch基础入门五:PyTorch搭建多层全连接神经网络实现MNIST手写数字识别分类

    )全连接神经网络(FC) 全连接神经网络是一种最基本的神经网络结构,英文为Full Connection,所以一般简称FC. FC的准则很简单:神经网络中除输入层之外的每个节点都和上一层的所有节点有连 ...

  3. 【深度学习】第二章:全连接神经网络

    文章目录 1. 什么是全连接神经网络? 2. 三要素 2.1 模型 2.2 准则 2.3 算法 3. 反向传播算法 3.1 为什么要使用反向传播算法的随机梯度下降法求最优化? 3.2 什么是反向传播算 ...

  4. 深度学习初级阶段——全连接神经网络(MLP、FNN)

    在前面的数学原理篇中,已经提到了各种深度学习的数学知识基本框架,那么从这篇文章开始,我将和大家一起走进深度学习的大门(部分图片和描述取自其他文章). 目录 一.首先我们需要知道什么是深度学习? 二.了 ...

  5. 第六节:Pytorch实现全连接神经网络

    第六节:Pytorch实现全连接神经网络 前面的五节中,我们讲解了使用PyTorch搭建一个神经网络中需要的需要各种技巧,包括:网络的搭建.选择不同的实践技巧(优化器选择.学习率下降等等)以及可视化训 ...

  6. 神经网络 测试集loss不下降_代码实践 | 全连接神经网络回归---房价预测

    学习目录 阿力阿哩哩:深度学习 | 学习目录​zhuanlan.zhihu.com 前面我们介绍了: 阿力阿哩哩:深度学习开端|全连接神经网络​zhuanlan.zhihu.com 4.7代码实践 & ...

  7. 全连接神经网络单层模型原理

    全连接神经网络单层模型原理 前言 单层MLP 1. 前向传播 2. 激活函数 2.1 Sigmoid函数 2.2 tanh函数 2.3 ReLu函数 2.4 Leaky ReLu函数 3. 损失函数 ...

  8. 深度学习3—用三层全连接神经网络训练MNIST手写数字字符集

    上一篇文章:深度学习2-任意结点数的三层全连接神经网络 距离上篇文章过去了快四个月了,真是时光飞逝,之前因为要考博所以耽误了更新,谁知道考完博后之前落下的接近半个学期的工作是如此之多,以至于弄到现在才 ...

  9. 【FPGA】基于HLS的全连接神经网络手写体识别

    目录 一 系统分析 1.1 全连接神经网络简介 二 通过HLS 编写全连接神经网络传入权重参数和偏置参数文件 2.1  获得图片.权重以及偏置的参数 2.2 编写C语言的全连接算子 2.3 Slave ...

最新文章

  1. Eclipse 代码提示功能设置
  2. 并发编程(四):也谈谈数据库的锁机制
  3. 后面的参数_常用的JVM参数,你现在就记好
  4. 鼠标键盘唤醒计算机,除了按下电源按钮唤醒计算机,WIN10也可以使用鼠标或键盘来唤醒...
  5. 数据库 Linux下的MySQL数据库管理
  6. 1.3 编程基础之算术表达式与顺序执行 04 带余除法
  7. linux 账号管理与ACL权限设定
  8. 2019秋季学习计划
  9. kubernetes之三:service
  10. autorun.inf sxs.exe病毒手动解决方法
  11. KnockOutJS(一)
  12. itx机箱尺寸_讲解 ATX M-ATX ITX 各种主板尺寸
  13. STKO助力OpenSEES系列:结构模态分析以及动力特性(MDOF与等效SDOF验证)
  14. 微信小程序 用户登录及对用户获取信息进行授权
  15. 那一年我是如何从功能测试跨入自动化测试的,绝对让你不虚此行!
  16. 系统性能统计(CPU占用率,内存占用率,系统平均负载)
  17. Guava学习之Joiner
  18. Redis 集群搭建(三):Docker 部署 Redis + Sentinel 高可用集群
  19. 2018年最流行JavaScript明星项目
  20. 关于Redis监控及缓存相关问题

热门文章

  1. 录屏软件哪个好用?10个免费好用的「录屏软件」推荐
  2. 解决华擎J3455主板DSM兼容性问题
  3. 每日C语言代码(The sixth day)——选择排序法
  4. JDBC,你真的知道怎么用吗?
  5. 浅析漫谈EOS之带宽
  6. iphone长截图哪个软件好_亲身体验过13款滚动截屏App,谁才是最好用的iPhone长截屏工具?...
  7. 记录VS2015编译cuda11+opencv库遇到的问题
  8. 看尚c49s电视恢复出厂设置后无法注册问题
  9. 一分钟带你了解超五类、六类网线的特点及区别
  10. supervisor的程序控制修改参考方案