Tensorflow轻松实现XOR运算的方式


Posted in Python onFebruary 03, 2020

对于“XOR”大家应该都不陌生,我们在各种课程中都会遇到,它是一个数学逻辑运算符号,在计算机中表示为“XOR”,在数学中表示为“Tensorflow轻松实现XOR运算的方式”,学名为“异或”,其来源细节就不详细表明了,说白了就是两个a、b两个值做异或运算,若a=b则结果为0,反之为1,即“相同为0,不同为1”.

在计算机早期发展中,逻辑运算广泛应用于电子管中,这一点如果大家学习过微机原理应该会比较熟悉,那么在神经网络中如何实现它呢,早先我们使用的是感知机,可理解为单层神经网络,只有输入层和输出层(在吴恩达老师的系列教程中曾提到过这一点,关于神经网络的层数,至今仍有异议,就是说神经网络的层数到底包不包括输入层,现今多数认定是不包括的,我们常说的N层神经网络指的是隐藏层+输出层),但是感知机是无法实现XOR运算的,简单来说就是XOR是线性不可分的,由于感知机是有输入输出层,无法线性划分XOR区域,于是后来就有了使用多层神经网络来解决这一问题的想法~~

关于多层神经网络实现XOR运算可大致这么理解:

Tensorflow轻松实现XOR运算的方式

两个输入均有两个取值0和1,那么组合起来就有四种可能,即[0,0]、[0,1]、[1,0]、[1,1],这样就可以通过中间的隐藏层进行异或运算了~

咱们直接步入正题吧,对于此次试验我们只需要一个隐藏层即可,关于神经网络 的基础知识建议大家去看一下吴恩达大佬的课程,真的很棒,百看不厌,真正的大佬是在认定学生是绝对小白的前提下去讲解的,所以一般人都能听懂~~接下来的图纯手工操作,可能不是那么准确,但中心思想是没有问题的,我们开始吧:

Tensorflow轻松实现XOR运算的方式

上图是最基本的神经网络示意图,有两个输入x1、x2,一个隐藏层,只有一个神经元,然后有个输出层,这就是最典型的“输入层+隐藏层+输出层”的架构,对于本题目,我们的输入和输出以及整体架构如下图所示:

Tensorflow轻松实现XOR运算的方式

输入量为一个矩阵,0和0异或结果为0,0和1异或结果为1,依次类推,对应我们的目标值为[0,1,1,0],最后之所以用约等号是因为我们的预测值与目标值之间会有一定的偏差,如果训练的好那么这二者之间是无限接近的。

我们直接上全部代码吧,就不分步进行了,以为这个实验本身难度较低,且代码注释很清楚,每一步都很明确,如果大家有什么不理解的可以留言给我,看到必回:

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
 
import numpy as np
import tensorflow as tf
 
#定义输入值与目标值
X=np.array([[0,0],[0,1],[1,0],[1,1]])
Y=np.array([[0],[1],[1],[0]])
 
#定义占位符,从输入或目标中按行取数据
x=tf.placeholder(tf.float32,[None,2])
y=tf.placeholder(tf.float32,[None,1])
 
#初始化权重,使其满足正态分布,w1和w2分别为输入层到隐藏层和隐藏层到输出层的权重矩阵
w1=tf.Variable(tf.random_normal([2,2]))
w2=tf.Variable(tf.random_normal([2,1]))
 
#定义b1和b2,分别为隐藏层和输出层的偏移量
b1=tf.Variable([0.1,0.1])
b2=tf.Variable([0.1])
 
#使用Relu激活函数得到隐藏层的输出值
a=tf.nn.relu(tf.matmul(x,w1)+b1)
 
#输出层不用激活函数,直接获得其值
out=tf.matmul(a,w2)+b2
 
#定义损失函数MSE
loss=tf.reduce_mean(tf.square(out-y))
 
#优化器选择Adam
train=tf.train.AdamOptimizer(0.01).minimize(loss)
 
#开始训练,迭代1001次(方便后边的整数步数显示)
with tf.Session() as session:
  session.run(tf.global_variables_initializer()) #初始化变量
  for i in range(1001):
    session.run(train,feed_dict={x:X,y:Y}) #训练模型
    loss_final=session.run(loss,feed_dict={x:X,y:Y}) #获取损失
    if i%100==0:
      print("step:%d   loss:%2f" % (i,loss_final))
  print("X: %r" % X)
  print("pred_out: %r" % session.run(out,feed_dict={x:X}))

对照第三张图片理解代码更加直观,我们的隐藏层神经元功能就是将输入值和相应权重做矩阵乘法,然后加上偏移量,最后使用激活函数进行非线性转换;而输出层没有用到激活函数,因为本次我们不是进行分类或者其他操作,一般情况下隐藏层使用激活函数Relu,输出层若是分类则用sigmode,当然你也可以不用,本次实验只是单纯地做异或运算,那输出层就不劳驾激活函数了~

对于标准神经元内部的操作可理解为下图:

Tensorflow轻松实现XOR运算的方式

这里的x和w一般写成矩阵形式,因为大多数都是多个输入,而矩阵的乘积要满足一定的条件,这一点属于线代中最基础的部分,大家可以稍微了解一下,这里对设定权重的形状还是很重要的;

看下效果吧:

Tensorflow轻松实现XOR运算的方式

这是我们在学习率为0.1,迭代1001次的条件下得到的结果

然后我们学习率不变,迭代2001次,看效果:

Tensorflow轻松实现XOR运算的方式

没有改进,这就说明不是迭代次数的问题,我们还是保持2001的迭代数,将学习率改为0.01,看效果:

Tensorflow轻松实现XOR运算的方式

完美~~~最后损失降为0了~~一般来说,神经网络中的超参中最重要的就是学习率了,如果损失一直降不下来,我们首先要想到修改学习率,其他的超参次之……

大家可以观察一下我们的预测值,四项分别对应[0,1,1,0],已经是相当接近了……

以上这篇Tensorflow轻松实现XOR运算的方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python异常学习笔记
Feb 03 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
Python聚类算法之基本K均值实例详解
Nov 20 Python
浅谈Python Opencv中gamma变换的使用详解
Apr 02 Python
python中eval与int的区别浅析
Aug 11 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 03 Python
python批量处理txt文件的实例代码
Jan 13 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
Python ConfigParser模块的使用示例
Oct 12 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
Nov 20 Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
Apr 05 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 #Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 #Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 #Python
tensorflow2.0保存和恢复模型3种方法
Feb 03 #Python
详解字符串在Python内部是如何省内存的
Feb 03 #Python
python自动化unittest yaml使用过程解析
Feb 03 #Python
Python类如何定义私有变量
Feb 03 #Python
You might like
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
javascript 函数调用规则
2009/08/26 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
vue的mixins属性详解
2018/03/14 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
介绍Python中几个常用的类方法
2015/04/08 Python
Python中super()函数简介及用法分享
2016/07/11 Python
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
python openpyxl模块的使用详解
2021/02/25 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
中国梦主题教育活动总结
2014/05/05 职场文书
党员理论学习心得体会
2016/01/21 职场文书
python内置进制转换函数的操作
2021/06/02 Python