超简单的神经网络构建方法,你上你也行!

作者: 读芯术 2020-05-11 13:44:38

本文转载自公众号“读芯术”(ID:AI_Discovery)

人工智能,深度学习,这些词是不是听起来就很高大上,充满了神秘气息?仿佛是只对数学博士开放的高级领域?

错啦!在B站已经变成学习网站的今天,还有什么样的教程是网上找不到的呢?深度学习从未如此好上手,至少实操部分是这样。

假如你只是了解人工神经网络基础理论,却从未踏足如何编写,跟着本文一起试试吧。你将会对如何在PyTorch 库中执行人工神经网络运算,以预测原先未见的数据有一个基本的了解。

这篇文章最多10分钟就能读完;如果要跟着代码一步步操作的话,只要已经安装了必要的库,那么也只需15分钟。相信我,它并不难。

长话短说,快开始吧!

导入语句和数据集

在这个简单的范例中将用到几个库:

  • Pandas:用于数据加载和处理
  • Matplotlib: 用于数据可视化处理
  • PyTorch: 用于模型训练
  • Scikit-learn: 用于拆分训练集和测试集

如果仅仅是想复制粘贴的话,以下几条导入语句可供参考:

  1. import torch 
  2. import torch.nn as nn 
  3. import torch.nn.functional as F 
  4. import pandas as pd 
  5. import matplotlib.pyplot as plt 
  6. from sklearn.model_selection import train_test_split 

至于数据集,Iris数据集可以在这个URL上找到。下面演示如何把它直接导入

  1. Pandas: 
  2. iris = pd.read_csv('https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv') 
  3. iris.head() 

前几行如下图所示:

超简单的神经网络构建方法,你上你也行

现在需要将 Name列中鸢尾花的品种名称更改或者重映射为分类值。——也就是0、1、2。以下是步骤说明:

  1. mappings = { 
  2.    'Iris-setosa': 0, 
  3.    'Iris-versicolor': 1, 
  4.    'Iris-virginica': 2 
  5. }iris['Name'] = iris['Name'].apply(lambda x: mappings[x]) 

执行上述代码得到的DataFrame如下:

超简单的神经网络构建方法,你上你也行

这恭喜你,你已经成功地迈出了第一步!

拆分训练集和测试集

在此环节,将使用 Scikit-Learn库拆分训练集和测试集。随后, 将拆分过的数据由 Numpy arrays 转换为PyTorchtensors。

首先,需要将Iris 数据集划分为“特征”和“ 标签集” ——或者是x和y。Name列是因变量而其余的则是“特征”(或者说是自变量)。

接下来笔者也将使用随机种子,所以可以直接复制下面的结果。代码如下:

  1. X = iris.drop('Name', axis=1).values 
  2. y = iris['Name'].valuesX_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=42)X_train = torch.FloatTensor(X_train) 
  3. X_test = torch.FloatTensor(X_test) 
  4. y_train = torch.LongTensor(y_train) 
  5. y_test = torch.LongTensor(y_test) 

如果从 X_train 开始检查前三行,会得到如下结果:

超简单的神经网络构建方法,你上你也行

从 y_train开始则得到如下结果:

超简单的神经网络构建方法,你上你也行

地基已经打好,下一环节将正式开始搭建神经网络。

定义神经网络模型

模型的架构很简单。重头戏在于神经网络的架构:

  • 输入层 (4个输入特征(即X所含特征的数量),16个输出特征(随机))
  • 全连接层 (16个输入特征(即输入层中输出特征的数量),12个输出特征(随机))
  • 输出层(12个输入特征(即全连接层中输出特征的数量),3个输出特征(即不同品种的数量)

大致就是这样。除此之外还将使用ReLU 作为激活函数。下面展示如何在代码里执行这个激活函数。

  1. class ANN(nn.Module): 
  2.    def __init__(self): 
  3.        super().__init__() 
  4.        self.fc1 =nn.Linear(in_features=4out_features=16
  5.        self.fc2 =nn.Linear(in_features=16out_features=12
  6.        self.output =nn.Linear(in_features=12out_features=3
  7.   
  8.  def forward(self, x): 
  9.      x = F.relu(self.fc1(x)) 
  10.      x = F.relu(self.fc2(x)) 
  11.      x = self.output(x) 
  12.      return x 

PyTorch使用的面向对象声明模型的方式非常直观。在构造函数中,需定义所有层及其架构,若使用forward(),则需定义正向传播。

接着创建一个模型实例,并验证其架构是否与上文所指的架构相匹配:

  1. model = ANN() 
  2. model 

在训练模型之前,需注明以下几点:

  • 评价标准:主要使用 CrossEntropyLoss来计算损失
  • 优化器:使用学习率为0.01的Adam 优化算法

下面展示如何在代码中执行CrossEntropyLoss和Adam :

  1. criterion = nn.CrossEntropyLoss() 
  2. optimizer = torch.optim.Adam(model.parameters(), lr=0.01) 

令人期盼已久的环节终于来啦——模型训练!

模型训练

这部分同样相当简单。模型训练将进行100轮, 持续追踪时间和损失。每10轮就向控制台输出一次当前状态——以指出目前所处的轮次和当前的损失。

代码如下:

  1. %%timeepochs = 100 
  2. loss_arr = []for i in range(epochs): 
  3. y_hat = model.forward(X_train) 
  4. loss = criterion(y_hat, y_train) 
  5. loss_arr.append(loss) 
  6.  
  7. if i % 10 == 0: 
  8. print(f'Epoch: {i} Loss: {loss}') 
  9.  
  10. optimizer.zero_grad() 
  11. loss.backward() 
  12. optimizer.step() 

好奇最后三行是干嘛用的吗?答案很简单——反向传播——权重和偏置的更新使模型能真正地“学习”。

以下是上述代码的运行结果:

超简单的神经网络构建方法,你上你也行

进度很快——但不要掉以轻心。

如果对纯数字真的不感冒,下图是损失曲线的可视化图(x轴为轮次编号,y轴为损失):

超简单的神经网络构建方法,你上你也行

模型已经训练完毕,现在该干嘛呢?当然是模型评估。需要以某种方式在原先未见的数据上对这个模型进行评估。

模型评估

在评估过程中,欲以某种方式持续追踪模型做出的预测。需要迭代 X_test并进行预测,然后将预测结果与实际值进行比较。

这里将使用 torch.no_grad(),因为只是评估而已——无需更新权重和偏置。

总而言之,代码如下:

  1. preds = []with torch.no_grad(): 
  2.    for val in X_test: 
  3.        y_hat = model.forward(val) 
  4.       preds.append(y_hat.argmax().item()) 

现在预测结果被存储在 preds阵列。可以用下列三个值构建一个Pandas DataFrame。

  • Y:实际值
  • YHat: 预测值
  • Correct:对角线,对角线的值为1表示Y和YHat相匹配,值为0则表示不匹配

代码如下:

  1. df = pd.DataFrame({'Y': y_test, 'YHat':preds})df['Correct'] = [1 if corr == pred else 0 for corr, pred in zip(df['Y'],df['YHat'])] 

df 的前五行如下图所示:

超简单的神经网络构建方法,你上你也行

下一个问题是,实际该如何计算精确度呢?

很简单——只需计算 Correct列的和再除以 df的长度:

  1. df['Correct'].sum() / len(df)>>> 1.0 

此模型对原先未见数据的准确率为100%。但需注意这完全是因为Iris数据集非常易于归类,并不意味着对于Iris数据集来说,神经网络就是最好的算法。NN对于这类问题来讲有点大材小用,不过这都是以后讨论的话题了。

这可能是你写过最简单的神经网络,有着完美简洁的数据集、没有缺失值、层次最少、还有神经元!本文没有什么高级深奥的东西,相信你一定能够掌握它。

神经网络 人工智能 深度学习
上一篇:数字创新——应对下一次全球危机的关键要素 下一篇:打开摄像头,2D插画实时变动画,中国程序媛出品,Demo在线可玩
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

AI安全对抗中,只用一招轻松骗过五种神经网络

图像识别作为人工智能最成熟的应用领域,已经大规模落地并服务于人们的日常生活。但在大规模商业化的同时,也面临更多方面的威胁。

张鑫 ·  1天前
盘点人工智能十大经典应用领域、图解技术原理

本文通过案例分门别类地深入探讨人工智能的实际应用。案例甚多,此处所列举的仅是九牛一毛。本该按行业或业务对这些案例进行分类,但相反我选择按在行业或业务中最可能应用的顺序来分类。

Alex Castrounis ·  1天前
详解人工智能十大经典应用领域及其技术原理

本文通过案例分门别类地深入探讨人工智能的实际应用。案例甚多,此处所列举的仅是九牛一毛。本该按行业或业务对这些案例进行分类,但相反我选择按在行业或业务中最可能应用的顺序来分类。

华章科技 ·  1天前
目标驱动系统模式,能否成为实现人工通用智能(AGI)的关键?

组织开发AI方案时采取的一大核心模式,正是目标驱动型系统模式。与其他AI模式一样,这种形式的AI能够解决一系列原本需要人类认知能力才能处理的常见问题。

佚名 ·  1天前
后疫情时代的八大关键技术发展趋势

建立必要的基础架构以支持数字化世界并保持比较新的技术,这对于任何企业或国家在后疫情时代的世界中保持竞争力都至关重要。

Ahmed Banafa ·  2天前
从AI测温到安防机器人 智能安防会是新的“守门神”吗?

说起安防系统,很多人的脑海中会先冒出“监控摄像头”,“电子门禁”等字眼,而随着人工智能的加速发展,传统的安防系统短板也在逐渐暴露,越来越多的新功能开始被需要:人脸识别、车辆检测、夜间识别等等,而我们小时候幻想过的机器人站岗的场景,也正在逐渐变成现实……

王嘉陆 ·  2天前
用PyTorch实现一个简单的分类器

这篇文章我们先考虑在一个自己定义的简单数据集上实现分类,这样子可以最简单的了解一个神经网络的模型,如何用 pytorch 搭建起来。

佚名 ·  2天前
疫情期间,如何借AI之力持续提升客户忠诚度?

无论是保险公司Farmers Insurance,保险公司Tryg,还是通用汽车金融公司GM Financial,现在纷纷转向聊天机器人与AI技术,借此在疫情时期稳定客户群体。

佚名 ·  2天前
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载