普通神经网络和RNN简单demo (一)
2017-08-04
花了两天时间看了下神经网络的一点基础知识,包括单层的感知机模型,普通的没有记忆功能的多层神经网咯,还有递归神经网络RNN。这里主要是参考了一个博客,实现了几个简单的代码,这里把源地址给出来,还有几个我觉的不错的神经网络的入门资源:
https://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/ 这个是我的代码参考连接
https://github.com/kjw0612/awesome-rnn 这个是github上被人整理的RNN资源汇总,相当的丰富
http://cs231n.stanford.edu/2016/syllabus.html 这是李菲菲教授的课程讲授 CNN,有很多的资料,视频在youtube上有,暂时没有2017的
1.简单神经网络实现(没有隐层hidden layer)
模型: 输出有第一列决定(也可以改为由第二列或者其他的决定,修改相应的y就行)
# -*- coding: utf-8 -*- '''
function:
note: 1.系统只有输入层和输出层,没有隐层;
2.这里神经网络要训练的模型是:有几个输入特征,但是输出只和第二个特征有关(也可以改成之和第一个
有关系试试~);
3.
date: 2017.8.5
''' import numpy as np #sigmoid functoin: map the output to probability
def sigmoid(x):
output = 1 / (1 + np.exp(-x))
return output #derivation of sigmoid function
def sigmoid_Derivation(x):
output = sigmoid(x) * (1 - sigmoid(x))
#output = x * (1-x)
return output # initialize the matrix randomly,syn0 between the input and output layer
np.random.seed(1)
syn0 = 2*np.random.random((3,1)) - 1 # 3*1 vector 神经网络的核心,连接输入层和输出层,完成反馈 x = np.array([[0,0,1], #x 4*3 matrix 一行代表一次输入数据,所以是三个特征输入
[0,1,1],
[1,0,1],
[1,1,1]]) # y = np.array([[0], # y 4*1 vector 每行代表一次输入的输出
# [0],
# [1],
# [1]]) y = np.array([[0,1,0,1]]).T #设置迭代次数#如果是python 2 可以用xrange(100000)
for iter in range(1000): #input layer, output layer
l0 = x #数组可以直接复制,和list不一样
l1 = sigmoid(np.dot(l0,syn0)) #点积 4*1 vector 输出层,用sigmoid函数将y转化为0~1之间,否则可能大于1 #calculate the error
l1_error = y - l1 # 4*1 vector #reduce the error of high confidence
l1_delta = l1_error * sigmoid_Derivation(l1) #接近0或者1的sigmoid导数很小,所以就降低了对应的差错 #update the matrix
syn0 += np.dot(l0.T, l1_delta) #print some info
print('correct output:')
print(y) print('output after training: ')
print(l1) print('error: ')
print(l1_error)
2.有一个隐层的神经网络
模型:输出由前两个特征决定:
# -*- coding: utf-8 -*- '''
note : 1.系统含有一个隐层,采用后向传播训练(应该是的吧..);
2.神经网络训练的模型是:输出 = 前两个特征的和 date: 2017.8.5
''' import numpy as np
#sigmoid function,map output to (0~1)
def sigmoid(x):
output = 1 / (1 + np.exp(-x))
return output #derivation of sigmoid function
def sigmoid_derivation(x):
output = sigmoid(x) * (1 - sigmoid(x))
return output #input x,
x = np.array([[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]]) y = np.array([[0,1,1,0]]).T #correct output 4*1 #initialize the neaurla network matrix syn0,syn1
np.random.seed(1)
syn0 = 2*np.random.random((3,4))-1 #连接input layer ,hidden layer,输入层三个单元隐层四个单元,所以3*4 syn1 = 2*np.random.random((4,1))-1 #连接hidden layer and output layer,隐层四个输出层一个单元 #times we train the network
for iter in range(60000): #input layer,hidden layer,output layer
l0 = x
l1 = sigmoid(np.dot(l0,syn0)) #4*4 hidden layer
l2 = sigmoid(np.dot(l1,syn1)) #4*1 output layer #how big the error is
l2_error = y - l2 #输出层错误 计算错误需要从后向前
l2_delta = l2_error * sigmoid_derivation(l2) #减小偏差小的错误,相应参数更新会比较小 #l1_error = np.dot(syn1.T,l2_delta) #4*1 隐层的偏差从输出层传递过来
l1_error = l2_delta.dot(syn1.T) #4 * 4
l1_delta = l1_error * sigmoid_derivation(l1) #update the matrix syn0,syn1
syn0 += np.dot(l0.T,l1_delta)
syn1 += np.dot(l1.T,l2_delta) #print some info
print('output after training')
print(l2) print('correct answer')
print(y)
迭代次数对结果的影响很大,直观的感受就是下面这个图。分别是迭代次数为 1000, 10000, 60000
刚刚开始i还以为哪里的参数有问题,改了迭代次数明显就效果更好了,也就是对结果的预测更加准确了。

3.RNN(隐层的数据来源包括上个时间戳的隐层和当前的输入)
注意:
1).这里和前面有一个隐层的区别在于,这里隐层的输出不仅是input layer,还有上一个时间戳的隐层输出,也是作为这个隐层的输入。
2).这里说的上个时间戳隐层的输出layer_1作为这个时刻隐层的输入,不是指output layer 的输出,因为layer_1 =sigmoid( np.dot(layer_0,syn0) + np.dot(layer_1_values[-1], syn_h))
但是 output layer 的输出为:
layer_2 = sigmoid(np.dot(layer_1, syn1))所以不能混淆;
3)这里采用模型是计算二进制加法 a + b = c;训练模型,让它找到这个加法的规律,从而给定两个数就可以计算二进制的和。
因为RNN是对时间序列有一定的记忆能力,所以在不同次的训练的时候,就是不同的时间戳。
这里截图表示是否把上个时间戳的隐层输出作为此刻隐层输入的区别:

从图中可以看出,如果仅仅考虑输入层作为当前隐层输入,那么前面的信息就全部丢失了,考虑到以前的信息可能对以后的决策有帮助,采用RNN是一个比较好的策略。
代码下次补上
普通神经网络和RNN简单demo (一)的更多相关文章
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN,LSTM
http://cs231n.github.io/neural-networks-1 https://arxiv.org/pdf/1603.07285.pdf https://adeshpande3.g ...
- 大话循环神经网络(RNN)
在上一篇文章中,介绍了 卷积神经网络(CNN)的算法原理,CNN在图像识别中有着强大.广泛的应用,但有一些场景用CNN却无法得到有效地解决,例如: 语音识别,要按顺序处理每一帧的声音信息,有些结果 ...
- 循环神经网络LSTM RNN回归:sin曲线预测
摘要:本篇文章将分享循环神经网络LSTM RNN如何实现回归预测. 本文分享自华为云社区<[Python人工智能] 十四.循环神经网络LSTM RNN回归案例之sin曲线预测 丨[百变AI秀]& ...
- 【学习笔记】循环神经网络(RNN)
前言 多方寻找视频于博客.学习笔记,依然不能完全熟悉RNN,因此决定还是回到书本(<神经网络与深度学习>第六章),一点点把啃下来,因为这一章对于整个NLP学习十分重要,我想打好基础. 当然 ...
- 设计模式之单例模式的简单demo
/* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...
- Spring的简单demo
---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...
- 使用Spring缓存的简单Demo
使用Spring缓存的简单Demo 1. 首先创建Maven工程,在Pom中配置 <dependency> <groupId>org.springframework</g ...
- Managed DirectX中的DirectShow应用(简单Demo及源码)
阅读目录 介绍 准备工作 环境搭建 简单Demo 显示效果 其他 Demo下载 介绍 DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染.交互式音乐和 ...
- angular实现了一个简单demo,angular-weibo-favorites
前面必须说一段 帮客户做了一个过渡期的项目,唯一的要求就是速度,我只是会点儿基础的php,于是就用tp帮客户做了这个项目.最近和客户架构沟通,后期想把项目重新做一下,就用现在最流行的技术,暂时想的使用 ...
随机推荐
- jQuery.getJSON()方法小记
今天看了下jQquery中的getJSON()方法,做点小结: 原型: jQuery.getJSON( url [, data ] [, success(data, textStatus, jqXHR ...
- GUN C中的流
当我们要对文件(在Linux环境中一切皆文件,包括硬件设备.资源等)进行操作(读.写.读写)时,必须连接文件或形成通信管道.这个过程称为打开文件.打开文件后可以进行读.写.读写操作. 打开的文件可以称 ...
- 转:: 刺鸟:用python来开发webgame服务端(4)
来源:http://ciniao.me/article.php?id=14 --------------- 刺鸟原创文章,转载请注明出处 前面的工作都已准备就绪,现在我们得来看看服务端怎么和客户 ...
- iOS学习笔记(二)——Hello iOS
前面写了iOS开发环境搭建,只简单提了一下安装Xcode,这里再补充一下,点击下载Xcode的dmp文件,稍等片刻会有图一(拖拽Xcode至Applications)的提示,拖拽至Applicatio ...
- 【BZOJ3444】最后的晚餐 乱搞
[BZOJ3444]最后的晚餐 Description [问题背景] 高三的学长们就要离开学校,各奔东西了.某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结.因为有m名学生偷偷找他,要求和自己暗恋 ...
- Harmonic Value Description(构造题)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission ...
- 160817、Java数据类型以及变量的定义
Java 是一种强类型的语言,声明变量时必须指明数据类型.变量(variable)的值占据一定的内存空间.不同类型的变量占据不同的大小. Java中共有8种基本数据类型,包括4 种整型.2 种浮点型. ...
- if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
- Exponential Backoff
f^x(f^y+f-m)+f-n =f^(x+y)+f^(f-m)+(f-n) <?php $exponent=0; w(80,3); function w($input,$base){ glo ...
- JavaWeb 之过滤器
1. 什么是过滤器 Servlet 是用来处理请求的, 过滤器是用来拦截请求的. 当用户请求某个 Servlet 时,会先执行部署在这个请求上的 Filter, 而 Filter 决定是否调用 Ser ...