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爬虫工程师面试问题总结
Mar 22 Python
用Python写一段用户登录的程序代码
Apr 22 Python
Python爬虫使用脚本登录Github并查看信息
Jul 16 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
Python根据成绩分析系统浅析
Feb 11 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
Jun 27 Python
pandas 强制类型转换 df.astype实例
Apr 09 Python
使用Keras中的ImageDataGenerator进行批次读图方式
Jun 17 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
python3爬虫中异步协程的用法
Jul 10 Python
一劳永逸彻底解决pip install慢的办法
May 24 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实现逐行删除文件右侧空格的方法
2015/12/25 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
CI框架的安全性分析
2016/05/18 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
Python字符串内置函数功能与用法总结
2019/04/16 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
高中毕业自我鉴定
2013/12/22 职场文书
学校安全责任书
2014/04/14 职场文书
群教个人对照检查材料
2014/08/20 职场文书
毕业感言怎么写
2015/07/31 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
如何利用pygame实现打飞机小游戏
2021/05/30 Python
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python