在这一部分内容中,我们的主要目标是使用神经网络从零开始构建一个与、或、异或等逻辑运算门,具体而言这一章节是使用神经网络构建异或逻辑门。

逻辑运算门是构建电子单元模块的重要组成部门。顾名思义,逻辑运算门为我们提供逻辑运算操作。就拿异或门操作而言,如上图所示,只有当输入的信号不同的时候,逻辑门才会输出高电平;当输入的信号相同的时候,才会输出低电平。因此,后续将从零介绍如何使用神经网络实现这样一个异或门逻辑运算操作。

1 导入模块

首先,我们需要导入一些必要的模块从而去实现神经网络的构建。在这里,我们暂时并不需要使用那些复杂的框架(比如PyTorch),仅仅使用NumPy库就可以。为了后续可视化模型训练的过程,我们还需要导入matplotlib库。

import numpy as np
import matplotlib.pyplot as plt

2 输入数据

下面,我们研究一下神经网络所需要的输入数据。首先,输入数据分为两个部分,输入的训练数据以及所期望的输出数据(又称之为真值)。

x1,x2 = np.array([0,0,1,1]), np.array([0,1,0,1])
x = np.array([x1,x2])
y = np.array([0,1,1,0])

上述代码中的x1和x2分别表示异或门的两个数据,y表示每对x1和x2所期望的输出数据。输入数据共有四列数据,表示参加模型训练的总共有四组,即batch size为4。为了方便管理输入数据,我们将x1和x2整合成x数据,这个x的尺寸为(2,4),怎样正确的理解x数据的尺寸呢?从线性代数的角度而言,我们需要将x看成是列向量,即共有4组1*2的列向量,每个列向量共有2个特征。

下面,让我们定义一些在构建只含有一个神经元的神经网络工程中所需要用到的超参数吧。其中nums_input表示输入数据特征的个数,在此处由于有x1和x2两个特征,因此为2,nums_hidden表示隐藏层神经元的个数,在这里设置为2,num_output表示输出节点的个数,在此处只有y一个输出,故为1。lr表示学习率,epochs表示训练模型的迭代次数,losses表示需要存储每一次的损失函数的值,这是为了后续绘制损失函数曲线用的。

nums_input, nums_hidden, nums_output = 2,2,1
lr = 0.01
epochs = 10000
losses = []
bs = x.shape[1]

3 前向传播

前项传播是神经网络对输入数据进行学习的过程,具体而言就是将输入数据依次进行下面的公式操作:

上式中的z表示经过w和b计算之后的值,而a表示经过记过激活函数计算的值。w和b的值分别是什么呢?在这里我们需要随机生成w和b的值进行神经网络的第一次训练:

w1 = np.random.rand(nums_hidden, nums_input)
b1 = np.random.rand(nums_hidden,1)
w2 = np.random.rand(nums_output, nums_hidden)
b2 = np.random.rand(nums_output,1)

不难得知,W的行表示输出神经元的个数,列表示输入神经网络的个数;b的行表示输出神经元的个数,而列一直为1。下面对神经网络进行前向传播计算:

# 进行前项传播计算
def sigmoid(x):return 1.0 / (1 + np.exp(-x))# 前项传播函数
def forward(x,w1,b1,w2,b2):# 必须将b1变成列向量z1 = np.dot(w1,x) + b1a1 = sigmoid(z1)z2 = np.dot(w2,a1) + b2a2 = sigmoid(z2)return z1,a1,z2,a2

4 反向传播

反向传播的参数计算公式如下:

因此,我们可以按照上述的公式进行编程,对神经网络的参数进行更新(参考这篇博客进行总结)。

def backward(x,y,z1,a1,z2,a2,w1,w2):bs = x.shape[1]dz2 = a2 - ydw2 = np.dot(dz2, a1.T) / bsdb2 = np.sum(dz2, axis=1,keepdims=True) / bsdz1 = np.dot(w2.T,dz2)*a1*(1-a1)dw1 = np.dot(dz1, x.T) / bsdb1 = np.sum(dz1, axis=1,keepdims=True) / bs# 对dw1和dw2的数据的尺寸进行设置dw1 = dw1.reshape(w1.shape)db1 = db1.reshape(b1.shape)dw2 = dw2.reshape(w2.shape)db2 = db2.reshape(b2.shape)return dw1,db1,dw2,db2

5 训练模型

因此,就可以开始对神经网络进行训练了。在模型每次训练的迭代过程中,依次做了下面几件事情:

(1)进行了前向传播算法,并输出每一层的z和a值。

(2)进行损失函数的计算。

(3)进行反向传播,需要用到每一层的w,b以及z和a的值。

(4)进行参数的更新。

import matplotlib.pyplot as plt
# 对超参数进行设置
lr = 0.01
epochs = 10000
losses = []
bs = x.shape[1]
# 进行训练
for epoch in range(epochs):# 进行前项传播z1,a1,z2,a2 = forward(x,w1,b1,w2,b2)loss = -np.sum(y * np.log(a2) + (1-y)*np.log(1-a2)) / bslosses.append(loss)# 进行反向传播dw1,db1,dw2,db2 = backward(x,y,z1,a1,z2,a2,w1,w2)w1 -= lr * dw1b1 -= lr * db1w2 -= lr * dw2b2 -= lr * db2# 绘制损失函数曲线
plt.plot(losses)
plt.xlabel("epoch")
plt.ylabel("loss value")

下面就是模型可视化的效果:

6 测试模型

# 进行推理计算
def inference(x,w1,b1,w2,b2):_,_,_,a2 = forward(x,w1,b1,w2,b2)a2 = np.squeeze(a2)if a2 > 0.5:return 1return 0

从零构建神经网络-实现异或门操作相关推荐

  1. 从零构建神经网络-不使用框架(纯纯手撕)

    一.从零构建神经网络-不使用框架(纯手撕) 神经网络从0开始 动手从零开始实现一个神经网络,不使用框架,一步一步推理应该可以加深一下对神经网络的理解. 网络结构为三层全连接网络,节点个数依次为784. ...

  2. Python AI:如何构建神经网络并进行预测

    人工智能概述 从根本上讲,使用人工智能的目标是让计算机像人类一样思考.这似乎是新事物,但该领域诞生于 1950 年代. 想象一下,您需要编写一个使用 AI解决数独问题的 Python 程序.实现这一点 ...

  3. 9步教你用NumPy从头开始构建神经网络!

    https://www.toutiao.com/a6693296472533762574/ 动机 如果你是一个了解神经网络如何工作的初级数据科学家,或者只是对深度学习有所了解的机器学习爱好者,那么这篇 ...

  4. pytorch神经网络因素预测_实战:使用PyTorch构建神经网络进行房价预测

    微信公号:ilulaoshi / 个人网站:lulaoshi.info 本文将学习一下如何使用PyTorch创建一个前馈神经网络(或者叫做多层感知机,Multiple-Layer Perceptron ...

  5. 打包node服务端_如何基于NodeJS从零构建线上自动化打包工作流?

    前言 NodeJS在前端领域正扮演着越越重要的地位,它不仅可以让前端工作者使用javascript编写后端代码,还能方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动,非阻塞I/O ...

  6. Keras深度学习实战(2)——使用Keras构建神经网络

    Keras深度学习实战(2)--使用Keras构建神经网络 0 前言 1. Keras 简介与安装 2. Keras 构建神经网络初体验 3. 训练香草神经网络 3.1 香草神经网络与 MNIST 数 ...

  7. 我的Go+语言初体验——Go+语言构建神经网络实战手写数字识别

    "我的Go+语言初体验" | 征文活动进行中- 我的Go+语言初体验--Go+语言构建神经网络实战手写数字识别 0. 前言 1. 神经网络相关概念 2. 构建神经网络实战手写数字识 ...

  8. python神经网络编程 豆瓣,用python构建神经网络

    python深度学习框架学哪个 Python深度学习生态系统在这几年中的演变实属惊艳.pylearn2,已经不再被积极地开发或者维护,大量的深度学习库开始接替它的位置.这些库每一个都各有千秋. 我们已 ...

  9. 亿级流量架构演进实战 | 从零构建亿级流量API网关 02

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

  10. 【ResNet】Pytorch从零构建ResNet50

    Pytorch从零构建ResNet 第一章 从零构建ResNet18 第二章 从零构建ResNet50 文章目录 Pytorch从零构建ResNet 前言 一.Res50和Res18的区别? 1. 残 ...

最新文章

  1. idea git 使用
  2. p40与p100训练性能对比
  3. XML和JSON两种数据交换格式的比较
  4. php实战搭建博客,yii2项目实战-博客管理平台的搭建
  5. java自己实现linkedlist_自己根据java的LinkedList源码编写的一个简单的LinkedList实现...
  6. java全文检索功能_基于Java的全文检索引擎简介
  7. 关于Windowsn 7因验证未通过被视为“非正版”出现“黑屏”的应急处理预案
  8. 前期易语言编程作品收录|赤壁盗号|
  9. android 开源 视频播放器,安卓视频播放器——ijkPlayer(Bilibili开源)
  10. Mac开发者福利来了!安利一波各领域不错的软件工具
  11. 【每周一爬】爬取盗版小说网的小说
  12. spurious wakeups(虚假唤醒)
  13. 全球及中国DIN 2353压缩配件行业研究及十四五规划分析报告
  14. python 递归,迭代器,生成器,面向过程编程
  15. 好分数班级等级C_2020高中分数线(广州|深圳|天津|广州|南宁|泉州|龙岩|武汉|沈阳|青岛|汉中|长春|四平|北京等)...
  16. 漂洋过海去学习,一文读懂程序员如何从初级升级到高级
  17. NVIDIA Jetson TK1 rosrun rviz segmentation fault的解决方法
  18. php html钓鱼源码,PHP全新仿QQ空间钓鱼源码
  19. n个企业的古诺模型中的纳什均衡
  20. python中导入numpy库_python中的Numpy库

热门文章

  1. 使用MyQR和qrcode来制作二维码
  2. STM32学习笔记二、DS18B20单总线上挂载多路采集
  3. 基于Fruits-360数据集构建CNN进行水果识别实验
  4. cygwin中安装apt-cyg管理工具注意事项
  5. 微信朋友圈自动点赞---一个也不能少
  6. windows系统IIS服务安装
  7. java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
  8. gerrit 将代码从一个分支合并到另外一个分支 Cherry Pick的使用
  9. FPGA:vivado2018.1编程界面字体大小与颜色修改
  10. linux centos中使用cp命令复制文件的时候出现omitting directory报错如何解决