Python实现的递归神经网络简单示例


Posted in Python onAugust 11, 2017

本文实例讲述了Python实现的递归神经网络。分享给大家供大家参考,具体如下:

# Recurrent Neural Networks
import copy, numpy as np
np.random.seed(0)
# compute sigmoid nonlinearity
def sigmoid(x):
  output = 1/(1+np.exp(-x))
  return output
# convert output of sigmoid function to its derivative
def sigmoid_output_to_derivative(output):
  return output*(1-output)
# training dataset generation
int2binary = {}
binary_dim = 8
largest_number = pow(2,binary_dim)
binary = np.unpackbits(
  np.array([range(largest_number)],dtype=np.uint8).T,axis=1)
for i in range(largest_number):
  int2binary[i] = binary[i]
# input variables
alpha = 0.1
input_dim = 2
hidden_dim = 16
output_dim = 1
# initialize neural network weights
synapse_0 = 2*np.random.random((input_dim,hidden_dim)) - 1
synapse_1 = 2*np.random.random((hidden_dim,output_dim)) - 1
synapse_h = 2*np.random.random((hidden_dim,hidden_dim)) - 1
synapse_0_update = np.zeros_like(synapse_0)
synapse_1_update = np.zeros_like(synapse_1)
synapse_h_update = np.zeros_like(synapse_h)
# training logic
for j in range(10000):
  # generate a simple addition problem (a + b = c)
  a_int = np.random.randint(largest_number/2) # int version
  a = int2binary[a_int] # binary encoding
  b_int = np.random.randint(largest_number/2) # int version
  b = int2binary[b_int] # binary encoding
  # true answer
  c_int = a_int + b_int
  c = int2binary[c_int]
  # where we'll store our best guess (binary encoded)
  d = np.zeros_like(c)
  overallError = 0
  layer_2_deltas = list()
  layer_1_values = list()
  layer_1_values.append(np.zeros(hidden_dim))
  # moving along the positions in the binary encoding
  for position in range(binary_dim):
    # generate input and output
    X = np.array([[a[binary_dim - position - 1],b[binary_dim - position - 1]]])
    y = np.array([[c[binary_dim - position - 1]]]).T
    # hidden layer (input ~+ prev_hidden)
    layer_1 = sigmoid(np.dot(X,synapse_0) + np.dot(layer_1_values[-1],synapse_h))
    # output layer (new binary representation)
    layer_2 = sigmoid(np.dot(layer_1,synapse_1))
    # did we miss?... if so, by how much?
    layer_2_error = y - layer_2
    layer_2_deltas.append((layer_2_error)*sigmoid_output_to_derivative(layer_2))
    overallError += np.abs(layer_2_error[0])
    # decode estimate so we can print(it out)
    d[binary_dim - position - 1] = np.round(layer_2[0][0])
    # store hidden layer so we can use it in the next timestep
    layer_1_values.append(copy.deepcopy(layer_1))
  future_layer_1_delta = np.zeros(hidden_dim)
  for position in range(binary_dim):
    X = np.array([[a[position],b[position]]])
    layer_1 = layer_1_values[-position-1]
    prev_layer_1 = layer_1_values[-position-2]
    # error at output layer
    layer_2_delta = layer_2_deltas[-position-1]
    # error at hidden layer
    layer_1_delta = (future_layer_1_delta.dot(synapse_h.T) + layer_2_delta.dot(synapse_1.T)) * sigmoid_output_to_derivative(layer_1)
    # let's update all our weights so we can try again
    synapse_1_update += np.atleast_2d(layer_1).T.dot(layer_2_delta)
    synapse_h_update += np.atleast_2d(prev_layer_1).T.dot(layer_1_delta)
    synapse_0_update += X.T.dot(layer_1_delta)
    future_layer_1_delta = layer_1_delta
  synapse_0 += synapse_0_update * alpha
  synapse_1 += synapse_1_update * alpha
  synapse_h += synapse_h_update * alpha
  synapse_0_update *= 0
  synapse_1_update *= 0
  synapse_h_update *= 0
  # print(out progress)
  if j % 1000 == 0:
    print("Error:" + str(overallError))
    print("Pred:" + str(d))
    print("True:" + str(c))
    out = 0
    for index,x in enumerate(reversed(d)):
      out += x*pow(2,index)
    print(str(a_int) + " + " + str(b_int) + " = " + str(out))
    print("------------")

运行输出:

Error:[ 3.45638663]
Pred:[0 0 0 0 0 0 0 1]
True:[0 1 0 0 0 1 0 1]
9 + 60 = 1
------------
Error:[ 3.63389116]
Pred:[1 1 1 1 1 1 1 1]
True:[0 0 1 1 1 1 1 1]
28 + 35 = 255
------------
Error:[ 3.91366595]
Pred:[0 1 0 0 1 0 0 0]
True:[1 0 1 0 0 0 0 0]
116 + 44 = 72
------------
Error:[ 3.72191702]
Pred:[1 1 0 1 1 1 1 1]
True:[0 1 0 0 1 1 0 1]
4 + 73 = 223
------------
Error:[ 3.5852713]
Pred:[0 0 0 0 1 0 0 0]
True:[0 1 0 1 0 0 1 0]
71 + 11 = 8
------------
Error:[ 2.53352328]
Pred:[1 0 1 0 0 0 1 0]
True:[1 1 0 0 0 0 1 0]
81 + 113 = 162
------------
Error:[ 0.57691441]
Pred:[0 1 0 1 0 0 0 1]
True:[0 1 0 1 0 0 0 1]
81 + 0 = 81
------------
Error:[ 1.42589952]
Pred:[1 0 0 0 0 0 0 1]
True:[1 0 0 0 0 0 0 1]
4 + 125 = 129
------------
Error:[ 0.47477457]
Pred:[0 0 1 1 1 0 0 0]
True:[0 0 1 1 1 0 0 0]
39 + 17 = 56
------------
Error:[ 0.21595037]
Pred:[0 0 0 0 1 1 1 0]
True:[0 0 0 0 1 1 1 0]
11 + 3 = 14
------------

英文原文:https://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python 实现「食行生鲜」签到领积分功能
Sep 26 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
Python/Django后端使用PIL Image生成头像缩略图
Apr 30 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
Tensorflow 实现释放内存
Feb 03 Python
Python continue语句实例用法
Feb 06 Python
python实现图像拼接
Mar 05 Python
python使用PIL剪切和拼接图片
Mar 23 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
python 元组的使用方法
Jun 09 Python
python Matplotlib模块的使用
Sep 16 Python
Python调用系统底层API播放wav文件的方法
Aug 11 #Python
Django 导出 Excel 代码的实例详解
Aug 11 #Python
python技能之数据导出excel的实例代码
Aug 11 #Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 #Python
Python对字符串实现去重操作的方法示例
Aug 11 #Python
python中模块查找的原理与方法详解
Aug 11 #Python
python利用lxml读写xml格式的文件
Aug 10 #Python
You might like
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
php命令行写shell实例详解
2018/07/19 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
JavaScript 对象、函数和继承
2009/07/07 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
详解如何较好的使用js
2016/12/16 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
浅谈Vue.js
2017/03/02 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
Python标准库内置函数complex介绍
2014/11/25 Python
Python中super关键字用法实例分析
2015/05/28 Python
使用Python解析JSON数据的基本方法
2015/10/15 Python
Python如何实现文本转语音
2016/08/08 Python
一道python走迷宫算法题
2018/01/22 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
简单的Python人脸识别系统
2020/07/14 Python
python实现数字炸弹游戏
2020/07/17 Python
Python类型转换的魔术方法详解
2020/12/23 Python
经营理念口号
2014/06/21 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
时尚女魔头观后感
2015/06/04 职场文书
Python matplotlib多个子图绘制整合
2022/04/13 Python
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers