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. python3----splitlines

    Python中的splitlines用来分割行.当传入的参数为True时,表示保留换行符 \n.通过下面的例子就很明白了: mulLine = """Hello!!! W ...

  2. MPEG 编解码相关资料收集

    以下是我搜集的关于MPEG1/2的编解码相关的资料: (注:mpge帧内编码是基于jpeg编码的,所以请务必先理解jpeg的编解码原理.) 1:Introduction to MPEG 2 Video ...

  3. NPOI操作Excel常用函数

    最近因项目接触了NPOI,感觉还是蛮不错的,网络上的教程普遍版本较老,本篇记录所常用操作,采用NPOI 2.0版本. 推荐: NPOI官方网站 NPOI 1.2.4/1.2.5 官方教程 新建Exce ...

  4. php5.4新特性实践

    本机安装的是wampserver2.2e-php5.4.3-httpd2.2.22-mysql5.5.24-32b.exe集成包 自带了php5.4 1. 数组写法 定义一个数组 过去: $arr = ...

  5. wamp设置mysql默认编码

    来自:http://www.cnsecer.com/5984.html wamp下MySQL的默认编码是Latin1,不支持中文,要支持中文的话需要把数据库的默认编码修改为gbk或者utf8. 这里推 ...

  6. JS HTML DOM---Document对象

    Document 对象 当浏览器载入 HTML 文档, 它就会成为 document 对象. document 对象是HTML文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点). ...

  7. TFS二次开发-基线文件管理器(4)-标签的创建

    上一节已经完成了源码文件的读取,如果要将已经选择的文件保存为一个标签(Lable).在VS我们只能对一个目录做标签,非常的不方便.如果用下面的方法,将选择的文件路径保存为一个List在打标签,就非常的 ...

  8. Object-Oriented Metrics: LCOM 内聚性的度量

    Object-Oriented Metrics: LCOM https://www.computing.dcu.ie/~renaat/ca421/LCOM.html Object-Oriented M ...

  9. Java基础 - 函数与方法

    java 是一门面向对象编程,其它语言中的函数也就是java中的方法 方法的基本使用方法 package com.demo7; /* * 函数/方法 * * 定义格式: * 修饰符 返回值类型 方法名 ...

  10. Server Objects Extension(SOE)开发(二)

    前言 SOE的提供了REST和Soap两种模板,只要在模板特定的方法中添加自己的业务逻辑代码即可,开发流程非常的简单便捷.那怎么知道自己的业务逻辑代码该写在模板的那个方法里面呢?这就需要很好的理解SO ...