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 (一)的更多相关文章

  1. CNN(卷积神经网络)、RNN(循环神经网络)、DNN,LSTM

    http://cs231n.github.io/neural-networks-1 https://arxiv.org/pdf/1603.07285.pdf https://adeshpande3.g ...

  2. 大话循环神经网络(RNN)

      在上一篇文章中,介绍了 卷积神经网络(CNN)的算法原理,CNN在图像识别中有着强大.广泛的应用,但有一些场景用CNN却无法得到有效地解决,例如: 语音识别,要按顺序处理每一帧的声音信息,有些结果 ...

  3. 循环神经网络LSTM RNN回归:sin曲线预测

    摘要:本篇文章将分享循环神经网络LSTM RNN如何实现回归预测. 本文分享自华为云社区<[Python人工智能] 十四.循环神经网络LSTM RNN回归案例之sin曲线预测 丨[百变AI秀]& ...

  4. 【学习笔记】循环神经网络(RNN)

    前言 多方寻找视频于博客.学习笔记,依然不能完全熟悉RNN,因此决定还是回到书本(<神经网络与深度学习>第六章),一点点把啃下来,因为这一章对于整个NLP学习十分重要,我想打好基础. 当然 ...

  5. 设计模式之单例模式的简单demo

    /* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...

  6. Spring的简单demo

    ---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...

  7. 使用Spring缓存的简单Demo

    使用Spring缓存的简单Demo 1. 首先创建Maven工程,在Pom中配置 <dependency> <groupId>org.springframework</g ...

  8. Managed DirectX中的DirectShow应用(简单Demo及源码)

    阅读目录 介绍 准备工作 环境搭建 简单Demo 显示效果 其他 Demo下载 介绍 DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染.交互式音乐和 ...

  9. angular实现了一个简单demo,angular-weibo-favorites

    前面必须说一段 帮客户做了一个过渡期的项目,唯一的要求就是速度,我只是会点儿基础的php,于是就用tp帮客户做了这个项目.最近和客户架构沟通,后期想把项目重新做一下,就用现在最流行的技术,暂时想的使用 ...

随机推荐

  1. 事务处理笔记《一》ADO.NET级别的事务

    现在我们对事务的概念和原理都有所了解了,并且作为已经有一些基础的C#开发者,我们已经熟知编写数据库交互程序的一些要点,即: (1)使用SqlConnection类的对象的Open()方法建立与数据库服 ...

  2. 类与类之间关系,用C#和JavaScript体现

    前言 在面向对象中,类之间的关系有六种,分别是: 关联关系(Association) 泛化关系(Generalization) 依赖(Dependency) 聚合(Aggregation) 组合(Co ...

  3. 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType

    回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...

  4. <2013 06 24> 关于Zigbee项目_Munik_TUM_eCar

    (本月)6月4号到德国慕尼黑,参与TUM大学的一个电动车项目组,预计时间3个月. 我的任务是参与wireless的研究,主要就是用无线链接取代有线链接(汽车线缆很多很讨厌). 使用的是TI MP430 ...

  5. Python菜鸟之路:Django 数据库操作进阶F和Q操作

    Model中的F F 的操作通常的应用场景在于:公司对于每个员工,都涨500的工资.这个时候F就可以作为查询条件 from django.db.models import F models.UserI ...

  6. Grunt自动化工具相关

    Grunt 项目中安装grunt模块npm install grunt --save,删除模块 npm uninstall grunt ,缺失某个插件:npm install grunt-contri ...

  7. python多进程理论

    什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 你在一个时间段内有很多任务要做:python学习的任务,赚钱的任务,交女朋 ...

  8. Android系统移植与调试之------->Amlogic方案编译步骤

    1. 拷贝Amlogic的SourceCode 切换目录到  /home/roco/work/amlogic/SourceCode/mx0831-0525下将mx0831-0525.tgz拷贝到  / ...

  9. Java性能监控之javassist探索

    https://www.cnblogs.com/orionhp/p/6362615.html ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实 ...

  10. argparse 模块 在终端执行脚本文件

    1.案例 #1.案例: import argparse #首先导入模块 parser = argparse.ArgumentParser() #创建一个解析对象 parser.add_argument ...