Theano入门神经网络(二) 实现一个XOR门

与非门的图片如下

示意图

详细解释:

1 定义变量的代码,包括了输入、权值、输出等。其中激活函数采用的是sigmod函数

 1 # -*- coding: utf-8 -*-
 2 __author__ = ‘Administrator‘
 3
 4 import theano
 5 import  theano.tensor as T
 6 import  random
 7 import  numpy as np
 8 from itertools import izip
 9
10
11 #定义网络结构
12 #定义输入
13 x=T.vector()
14 #定义权值W1
15 w1=theano.shared(np.random.randn(2)) #生成一个1行2列的随机数
16 w2=theano.shared(np.random.randn(2))
17 b1=theano.shared(np.random.randn(1))
18 b2=theano.shared(np.random.randn(1))
19 z1=T.dot(w1,x)+b1
20 a1=1/(1+T.exp(-z1))
21 z2=T.dot(w2,x)+b2
22 a2=1/(1+T.exp(-z2))
23
24 w=theano.shared(np.random.randn(2))
25 b=theano.shared(np.random.randn(1))
26 z=T.dot(w,[a1,a2])+b
27 y=1/(1+T.exp(-z))

2 定义目标输出和损失函数计算方式,我们采用的平方损失

1 y_hat = T.scalar()#正确输出
2 cost = T.sum((y-y_hat)**2) #采用的是平方损失函数

另外也可以采用交叉熵损失函数

cost = - (y_hat*T.log(y)+(1-y_hat)*T.log(1-y)).sum() #采用交叉熵损失函数

3 误差反向传播求导,直接调用theano函数求解,方便快捷

1 #误差反向传播求导
2 dw,db,dw1,dw2,db1,db2= T.grad(cost,[w,b,w1,w2,b1,b2])

4 权值更新

 1 #手动定义一个权值更新函数
 2 def MyUpdate(paramters,gradients):
 3     mu=0.1 #步长
 4     paramters_updates=  5     [(p, p-mu*g) for p,g in izip(paramters,gradients)]
 6     return paramters_updates
 7
 8 #绑定输入、输出与权值更新函数
 9 g = theano.function(
10     inputs=[x,y_hat],
11     outputs=[y,cost],
12     updates=MyUpdate([w,b,w1,w2,b1,b2],[dw,db,dw1,dw2,db1,db2])
13 )

5 开始训练

1 for i in range(50000):
2     y1,c1=g([0,0],0)
3     y2,c2=g([0,1],1)
4     y3,c3=g([1,0],1)
5     y4,c4=g([1,1],0)
6     print  c1+c2+c3+c4
7     print y1,y2,y3,y4

6 结果输出:

0.000541548001074
[ 0.01069522] [ 0.98782012] [ 0.98784247] [ 0.01144574]
0.000541536246431
[ 0.01069511] [ 0.98782025] [ 0.9878426] [ 0.01144562]

可以看到,每一项都接近[0 1 1 0],网络已经成功训练了。

交叉熵的结果输出

0.00187006124627
[ 0.00044582] [ 0.99958399] [ 0.99938235] [ 0.00039013]

相同参数下,很明显交叉熵的结果更好!

时间: 2024-10-04 18:52:58

Theano入门神经网络(二) 实现一个XOR门的相关文章

GitHub入门之二 参与一个项目编写

接上文:大多数时候我们也需要把别人的代码进行整合和修改,而不是简单的修改,这时就需要对一个项目进行修改. 注意,本系列文章主要说明在github网站上的操作,更多高级操作请使用git控制台 一.fork一个项目 打开一个项目,点击界面右上角的的“fork”,就会在你自己的项目库里创建一个代码的拷贝. 这份代码的主人就是你,你可以对代码进行任何修改.比如在此我fork了一个比特币的项目 https://github.com/bitcoin/bitcoin 进入自己的主页后看到有了一份项目的拷贝,而

无废话MVC入门教程二[第一个小Demo]

mvc技术交流,欢迎加群: 本文目标 1.了解"模型"."视图"."控制器"的创建.调试和使用过程. 本文目录 1.创建模型 2.创建视图 3.创建控制器 4.调试 5.使用模型.视图.控制器 1.创建模型 在文件夹"Models"中创建新类,如下图所示: 1.命名:Model的命名规则一般以Model结尾,如:以业务为主的命名UserModel或以页面为主的命名LoginModel. 2.作用:开发过三层的朋友都知道,我们在

Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器

Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器 MVC概念 MVC的含义是 “模型-视图-控制器”.MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉

手把手入门神经网络:从初等数学的角度初探神经网络

转一篇关于神经网络的小品文 https://mp.weixin.qq.com/s?__biz=MzA4MTA5MjE5Mw==&mid=401758390&idx=1&sn=a870201b307b6531abfe9c571461876e&scene=1&srcid=0122t2d7CyeurEFwtlp2ya3k&pass_ticket=5vlHG30VriwzFjNjxIzDT9YjTp2c0tOsRclaa6RliQEmlEGduKOiY9XcBWb0

Bootstrap入门(二)栅格

Bootstrap入门(二)栅格 全局CSS样式--栅格 先引入本地的CSS文件(根据自己的文件夹,有不同的引入地址,我是放在一个新建的名为css的文件夹中) container 容器,栅格系统是依赖容器存在的 ... Bootstrap 提供的栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局.参数: 超小屏幕 手机 (<768px) 小屏幕 平板 (≥768px) 中等屏幕 桌面显示

[WebGL入门]十二,模型数据和顶点属性

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 顶点属性的意思 上次的文章中,介绍了一下从着色器的生成,编译,到程序对象的生成和着色器的连接.这次,简单的说一下模型数据的定义和顶点属性的处理.另外,介绍一下根据模型数据生成VBO的方法.VBO的使用要比生成难理解一些,但是不要担心,后面会慢慢说明.接下来看一下顶点属性.顶点属性,说的简单点,

HTML入门(二)

外部样式表当样式需要被应用到很多页面的时候,外部样式表将是理想的选择.使用外部样式表,你就可以通过更改一个文件来改变整个站点的外观. <head> <link rel="stylesheet" type="text/css" href="mystyle.css"> </head> 内部样式表当单个文件需要特别样式时,就可以使用内部样式表.你可以在 head 部分通过 <style> 标签定义内部样式

C语言快速入门教程(二)

C语言快速入门教程(二) C语言的基本语法 本节学习路线图: 引言: C语言,顾名思义就是一门语言,可以类比一下英语; 你要说出一个英语的句子需要:  单词  +  语法!  将单词按照一定的语法拼凑起来就成了一个英语句子了; C语言同样是这样,只不过单词可以理解为一些固定的知识点,而语法可以理解为算法(可以理解为解决问题的方法) 在这一节中我们就对固定知识点中的语言描述与数据存储进行解析! 1.C语言的基本元素 1.1  标识符 什么是标识符? 答:在C语言中,符号常量,变量,数组,函数等都需

Maven入门系列(二)--设置中央仓库的方法

原文地址:http://www.codeweblog.com/maven入门系列-二-设置中央仓库的方法/ Maven仓库放在我的文档里好吗?当然不好,重装一次电脑,意味着一切jar都要重新下载和发布. 下载的地址是中央仓库mvnrepository.com,当然,全球很多个仓库. 资源的坐标简称GVA 那么,现在如何修改maven的本地仓库路径呢? 关键在于maven文件夹的config下的settings.xml(E:\IDE\apache-maven-3.3.1\conf\settings