全连接神经网络在分类和回归问题中都非常有效,本节对全连接神经网及神经元结构进行介绍,并使用Pytorch针对分类和回归问题分别介绍全连接神经网络的搭建,训练及可视化相关方面的程序实现。
1.全连接神经网络简介

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,calsaaification_report
from sklearn.manifold import TSNE
import torch
import torch.nn as nn
from torch.optim import SGD,Adam
from torch.utils.data as Data
import matplotlib.pyplot as plt
import seaborn as sns
import hiddenlayer as hl
from torchviz import make_dot

**2.MLP分类

  • 数据准备和探索
    本节使用一个垃圾邮件数据介绍如何使用PyTorch建立MLP分类模型,该数据集可以从UCI机器学习数据库进行下载。
https://archive.ics.uci.edu/ml/datasets/Spambase

该数据集中包含57个邮件内容的统计特征,其中:
48个特征是关键词出现的频率x100的取值,范围为[0,100],变量名使用word_freq_WORD命名,WORD表示该特征统计的词语。
6个特征为关键字符出现的频率x100取值,取值范围为[0,100],变量名为char_freq_CHAR命名
1个变量为captical_run_length_average,表示大写字母不间断的平均长度
1个变量captial_run_length_total表示邮件中大写字母的数量。
数据集中最后一个变量是带预测目标变量(0,1),表示电子邮件被认为是垃圾邮件(1)或者不是(0)

 spam=pd.read_csv("data/chap5/spambase.csv")
spam.head()
pd.value_counts(spam.label)X=spam.iloc[:,0:57].values
y=spam.label.values
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=123)scales=MinMaxScaler(featre_range=(0,1))
X_train_s=scales.fit_trandform(X_train)
X_test_s=scales.fit_trandform(X_test)colname=spam.cloumns.values[:-1]
plt.figure(figsize=(20,14))
for ii in range(len(colname)):plt.subplot(7,9,ii+1)sns.boxplot(x=y_train,y=X_train_s[:,ii])plt.title(colname[ii])
plt.subplots_adjust(hspace=0.4)
plt.show()
  • 搭建网络并可视化
 class MLPclassifica(nn.Module):def __init__(self):super(MLPclassifica,self).__init__()self.hidden1=nn.Sequential(nn.Linear(in_features=57,out_features=30,bias=True,),nn.ReLU())self.hidden2=nn.Sequential(nn.Linear(30,10),nn.ReLU())self.classifica=nn.Sequential(nn.Linear(10,2),nn.Sigmoid())def forward(self,x):fc1=self.hidden1(x)fc2=self.hidden2(fc1)output=self.classifica(fc2)return fc1,fc2,outputmlpc=MLPclassifica()
x=torch.randn(1,57).reshapes_grad_(True)
y=mlpc(x)
Mymlpcvis=make_dot(y,params=dict(list(mlpc.named_parameters())+[('x',x)]))
Mymlpcvis
  • 使用未预处理的数据训练模型
X_train_nots=torch.from_numpy(X_train.astype(np.float32))
y_train_t=torch.from_numpy(y_train.astype(np.int64))
X_test_nots=torch.from_numpy(X_test.astype(np.float32))
y_test_t=torch.from_numpy(y_test.astype(np.int64))
train_data_nots=Data.TensorDataset(X_train_nots,y_train_t)
train_nots_loader=Data.DataLodaer(dataset=train_data_nots,batch_size=64,shuffle=True,num_workers=1,
)
optimizer=torch.optim.Adam(mlpc.parameters(),lr=0.01)
loss_func=nn.CrossEntropyLoss()history1=h1.History()
canvas1=h1.Canvas()
print_step=25for epoch in range(15):for step,(b_x,b_y) in enumerate(train_nots_loader):_,_,output=mlpc(b_x)train_loss=loss_func(output,b_y)optimizer.zero_grad()train_loss.backward()optimizer.step()niter=epoch*len(train_nots_loader)+step+1if niter % print_step == 0:_,_,output=mlpc(X_test_nots)_,pre_lab=torch.max(output,1)test_accuracy=accuracy_score(y_test_t,pre_lab)history1.log(niter,train_loss=train_loss,test_accuracy=test_accuracy)with canvas1:canvas1.draw_plot(history1["train_loss"])canvas1.draw_plot(history1["test_accuracy"])
  • 使用预处理的数据训练模型
X_train_t=torch.from_numpy(X_train_s.astype(np.float32))
y_train_t=torch.from_numpy(y_train.astype(np.int64))
X_test_t=torch.from_numpy(X_test_s.astype(np.float32))
y_test_t=torch.from_numpy(y_test.astype(np.int64))
train_data=Data.TensorDataset(X_train_t,y_train_t)
train_loader=Data.DataLodaer(dataset=train_data,batch_size=64,shuffle=True,num_workers=1,
)
optimizer=torch.optim.Adam(mlpc.parameters(),lr=0.01)
loss_func=nn.CrossEntropyLoss()history1=h1.History()
canvas1=h1.Canvas()
print_step=25for epoch in range(15):for step,(b_x,b_y) in enumerate(train_loader):_,_,output=mlpc(b_x)train_loss=loss_func(output,b_y)optimizer.zero_grad()train_loss.backward()optimizer.step()niter=epoch*len(train_loader)+step+1if niter % print_step == 0:_,_,output=mlpc(X_test_t)_,pre_lab=torch.max(output,1)test_accuracy=accuracy_score(y_test_t,pre_lab)history1.log(niter,train_loss=train_loss,test_accuracy=test_accuracy)with canvas1:canvas1.draw_plot(history1["train_loss"])canvas1.draw_plot(history1["test_accuracy"])_,_,output=mlpc(X_test_t)_,pre_lab=torch.max(output,1)test_accuracy=accuracy_score(y_test_t,pre_lab)print("test_accuracy:",test_accuracy)
  • 获取中间层的输出并可视化

  • 使用中间层的输出

 _,test_fc2,_=mlpc(X_test_t)
print("test_fc2.shape: ",test_fc2.shape)
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_f2_tsne")
plt.show()
  • 使用钩子获取中间层的输出
activation={}
def get_activation(name):def hook(model,input,output):activation[name]=output.detach()return hook
mlpc.classifica.register_forward_hook(get_activation("classifica"))
_,_,_=mlpc(X_test_t)
classifica=activation["classifica"].data.numpy()
print("classifica.shape:"classifica.shape)
plt.figure(figsize=(8,6))
plt.plot(classifica[y_test==0,0],classifica[y_test=0,1],"bo",label="0")
plt.plot(classifica[y_test==1,0],classifica[y_test=1,1],"rd",label="1")
plt.legend()
plt.title("test_f2_tsne")
plt.show()

3.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 mean_squared_error,mean_absolute_error
from sklearn.datasets import fetch_california_housing
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.optim import SGD
from torch.utils.data as Data
import matplotlib.pyplot as plt
import seaborn as snshousdata=fetch_california_housing()
X_train,X_test,y_train,y_test=train_test_split(housdata.data,housdata.target,test_size=0.3,random_state=42
)
scale=StandardScaler()
X_train_s=scale.fit_transform(X_train)
X_test_s=scale.fit_transform(X_test)housedatadf=pd.DataFrame(data=X_train_s,columns=housedata.feature_names)
housedatadf["target"]=y_train
//热力图分析9个变量之间的相关性
datacor=np.corrcoef(housedatadf.values,rowvar=0)
datacor=pd.DataFrame(data=datacor,columns=housedatadf.columns,index=housedatadf.columns)
plt.figure(figsiez=(8,6))
ax=sns.heatmap(datacor,square=True,annot=True,fmt=".3f",linewidths=.5,cmap="Y1GnBu",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_trian.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,batch_size=64,shuffle=True,num_workers=1)class MPLregression(nn.Module):def __init__(self):super(MLPregression,self).__init__()self.hidden1=nn.Linear(in_features=8,out_features=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)return output[:,0]mlpreg=MPLregression()
print(mlpreg)optimzer=torch.optim.SGD(mlpreg.parameters(),lr=0.01)
loss_func=nn.MSELoss()
train_loss_all=[]
for epoch in range(30):train_loss=0train_num=0for step,(b_x,b_y) in enumerate(train_loader):output=mlpreg(b_x)loss=loss_func(output,b_y)optimzer.zero_grad()loss.backward()optimzer.step()train_loss+=loss.item()*b_x.size(0)train_num+=b_x.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=mlpreg(test_xt)
pre_y=pre_y.data.numpy()
mae=mean_absolute_error(y_test,pre_y)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()

Pytorch深度学习入门与实战一--全连接神经网络相关推荐

  1. PyTorch深度学习入门与实战(案例视频精讲)

    作者:孙玉林,余本国 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2020-07-01 PyTorch深度学习入门与实战(案例视频精讲)

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

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

  3. pytorch深度学习入门与实战——今天我们来对一张图像进行卷积、池化,以及激活层的使用展示

    import numpy as np import torch import torch.nn as nn import matplotlib.pyplot as plt from PIL impor ...

  4. Pytorch深度学习入门与实战(笔记)

    目录 第二章 1.张量数据类型 (1)查看张量数据类型 (2)修改张量数据类型

  5. AI深度学习入门与实战21 文本分类:用 Bert 做出一个优秀的文本分类模型

    在上一讲,我们一同了解了文本分类(NLP)问题中的词向量表示,以及简单的基于 CNN 的文本分类算法 TextCNN.结合之前咱们学习的 TensorFlow 或者其他框架,相信你已经可以构建出一个属 ...

  6. PyTorch深度学习入门

    作者:曾芃壹 出版社:人民邮电出版社 品牌:iTuring 出版时间:2019-09-01 PyTorch深度学习入门

  7. 【金融】【pytorch】使用深度学习预测期货收盘价涨跌——全连接神经网络模型构建与训练

    [金融][pytorch]使用深度学习预测期货收盘价涨跌--全连接神经网络模型构建与训练 模型构建与训练 模型构建与训练 def get_accuracy(SR,GT,threshold=0.5):S ...

  8. pytorch深度学习入门笔记

    Pytorch 深度学习入门笔记 作者:梅如你 学习来源: 公众号: 阿力阿哩哩.土堆碎念 B站视频:https://www.bilibili.com/video/BV1hE411t7RN? 中国大学 ...

  9. Tensorflow2.0深度学习入门与实战(日月光华)(学习总结1)

    Tensorflow2.0深度学习入门与实战(学习总结1) 我是刚学的,网易云课堂跟着日月光华老师,现在对每节课的学习课程做一下记录,总结,仅仅作为总结. 1.使用快捷键 shift+enter执行代 ...

最新文章

  1. 十年AI学者影响力盘点:何恺明排名第一,华人学者呈正向流入
  2. jmeter constant timer 如何添加_基于jmeter+perfmon的稳定性测试记录
  3. Android 的Google+平台
  4. SSIS中的容器和数据流—举例说明数据转换任务
  5. 计算机网络工程实验分析与体会_《软件工程》面向对象分析实验
  6. 在JAXB解组期间应用名称空间
  7. The type sun.management.ManagementFactory is not visible
  8. vue、nuxt性能优化
  9. C# 根据空格数截取
  10. TMG自动发现功能配置正常,但客户端却检测不到TMG服务器。
  11. CvCreateImage函数说明
  12. PMP第六版 十大知识领域五大过程组
  13. 智能优化算法——模拟退火法(PythonMatla实现)
  14. ThreadPoolExecutor中的submit()方法详细讲解
  15. C++一本通题库1015
  16. Windows Server 2008 R2 搭建ASP网站
  17. echarts地图上的标签为图片_百度地图标记点中添加Echarts图表
  18. Linux系统Initramfs机制
  19. 从java到女装暴走漫画_[Java教程]暴走漫画
  20. 一个隐藏文件夹的方法

热门文章

  1. AI模型风险评估 第1部分:动机
  2. 抖音小店和橱窗的区别,你知道吗?商品的来源不同
  3. 【Proteus仿真】【STM32单片机】玩转TFTLCD彩屏设计
  4. Java EE中Ajax技术实例
  5. 一文了解72名图灵奖获得者的成就
  6. 我认错人了几种英语表达
  7. imf 能量矩 matlab,基于IMF能量矩和遗传算法优化SVM的储能电池过充诊断方法与流程...
  8. 2.PT介绍及思科的基本操作命令
  9. web services学习笔记(摘自菜鸟教程)
  10. 2013年大尺寸Android平板横评