自己动手写RNN
说的再好,也不如实际行动,今天手写了一个RNN,没有使用Numpy库,自己写的矩阵运算方法,由于这也只是个学习用的demo,所以矩阵运算那一部分写的比较丑陋,见笑了。
import com.mylearn.hw.Process as pr
class RNN(object):
def __init__(self , input_dim , hidden_dim , output_dim , alpha):
self.input_dim = input_dim;
self.hidden_dim = hidden_dim;
self.output_dim = output_dim;
self.alpha = 0.1
self.U = pr.generateRandomMatrix(self.input_dim, self.hidden_dim);
self.V = pr.generateRandomMatrix(self.hidden_dim, self.output_dim);
self.W = pr.generateRandomMatrix(self.hidden_dim, self.hidden_dim);
self.error = 0
def forward_propagation(self, X):
T = len(X)
s = [[0] * self.hidden_dim for i in range(T)]
s[-1] = [0] * (self.hidden_dim)
o =[ [0] * self.output_dim for i in range(T)]
for t in range(T):
s[t] = pr.sigmoid2D(pr.posPlus2D(pr.matrixMul2D([X[t]], self.U) , pr.matrixMul2D([s[t-1]] , self.W)))[0]
o[t] = pr.sigmoid2D(pr.matrixMul2D([s[t]], self.V))[0]
return [o, s]
def bptt(self , X , Y):
o , s = self.forward_propagation(X)
errors = pr.subtraction2D(Y, o)
u = [[ 0] * self.hidden_dim for i in range(self.input_dim)]
v = [[ 0 ] * self.output_dim for i in range(self.hidden_dim)]
w = [[ 0 ] * self.hidden_dim for i in range(self.hidden_dim)]
T = len(errors)
self.error = 0
s_deltas_pre = [[0] * self.hidden_dim]
for t in range(T):
e = errors[-t - 1]
self.error = self.error + abs(e[0])
s_pre = [s[-t-1]]
if t == T - 1:
s_pre = [[0] * self.hidden_dim]
else:
s_pre = [s[-t-2]]
deltas_layer_2 =pr.posMul2D([e] , pr.sigmoid_output_to_derivative2D([o[-t-1]]))
deltas_layer_1 =pr.posMul2D( pr.posPlus2D(pr.matrixMul2D(deltas_layer_2 , pr.T2D(self.V)) , pr.matrixMul2D(s_deltas_pre, pr.T2D(self.W))) , pr.sigmoid_output_to_derivative2D([s[-t-1]]))
s_deltas_pre = deltas_layer_1;
v = pr.posPlus2D(v , pr.matrixMul2D(pr.T2D([s[-t-1]]) , deltas_layer_2))
w = pr.posPlus2D(w , pr.matrixMul2D(pr.T2D(s_pre) , deltas_layer_1))
u = pr.posPlus2D(u , pr.matrixMul2D(pr.T2D([X[-t-1]]), deltas_layer_1))
return u , v , w , o
def train(self , data):
count = 0
for l in data:
count += 1
a_int = l[0]
b_int = l[1]
c_int = a_int + b_int
a = pr.dec2bin(a_int)
b = pr.dec2bin(b_int)
c = pr.dec2bin(c_int)
X = [[0] * 2 for i in range(len(a))]
Y = [[0] * 1 for i in range(len(a))]
for t in range(len(a)):
X[t][0] = a[len(a) - 1 - t]
X[t][1] = b[len(a) - 1 - t]
Y[t][0] = c[len(a) - 1 - t]
u ,v , w , o = self.bptt(X, Y)
self.U = pr.posPlus2D(pr.mul(u, self.alpha) , self.U)
self.V = pr.posPlus2D(pr.mul(v, self.alpha) , self.V)
self.W = pr.posPlus2D(pr.mul(w, self.alpha) , self.W)
if count % 1000 == 0:
out = pr.around2D(o)
print("Iterate :" , count )
print("input: a " , a_int ,'\t', a )
print("input: b " , b_int ,'\t', b )
print("input: c " , c_int ,'\t', c )
print("predict: %d + %d = %d"%(a_int , b_int , pr.arrayToInt(out)))
print("ERROR:" , self.error)
print('-' * 64)
rnn = RNN(2 , 16 , 1,0.1)
rnn.train(pr.generateData(10000 , 127))
from math import exp
from copy import deepcopy
import random as ran
def generateData( size , max):
lst = []
for x in range(0 , size):
lst.append([ran.randint(0 , max) , ran.randint(0 , max)])
return lst
def generateRandomMatrix(line , row):
res = []
for i in range(line):
temp = []
for j in range(row):
temp.append( round(2 * ran.random() - 1 , 7))
res.append(temp)
return res
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
def dec2bin(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 2)
mid.insert(0, int(base[rem]))
ss = ''.join([str(x) for x in mid[::-1]])
sslength = len(ss)
for i in range( 8 - sslength ):
mid.insert(0, 0)
return mid
import decimal as dec
def toFloat(A):
res = []
for i in range(len(A)):
temp = []
for j in range(len(A[i])):
b = dec.Decimal(A[i][j],dec.getcontext())
temp.append(b.__round__(7))
res.append(temp)
return res
#转置
def T2D(A):
line = len(A)
row = len(A[0])
res = [[0] * line for i in range(row)]
for i in range(line):
for j in range(row):
res[j][i] = deepcopy(A[i][j])
return res
def outer1D(A , B):
res = [[0] * len(A) for i in range(len(B))]
for i in len(A):
for j in len(B):
res[i][j] = A[i] * B[j]
return res
def sumabs2D(A ):
sum = 0.0
for i in range(0 , len(A)):
for j in range(0 ,len(A[0])):
sum += abs(A[i][j])
return sum
def subtraction2D(A , B):
res = [[0] * len(A[0]) for i in range(len(A))]
for i in range(0 , len(A)):
for j in range(0 ,len(A[0])):
res[i][j] = A[i][j] - B[i][j]
return res
def matrixMul2D(A, B):
res = [[0] * len(B[0]) for i in range(len(A))]
for i in range(len(A)):
for j in range(len(B[0])):
for k in range(len(B)):
res[i][j] += A[i][k] * B[k][j]
return res
def posMul2D(A , B):
res = [[0] * len(A[0]) for i in range(len(A))]
for i in range(0 , len(A)):
for j in range(0 ,len(A[0])):
res[i][j] = A[i][j] * B[i][j]
return res
def posPlus2D(A , B):
res = [[0] * len(A[0]) for i in range(len(A))]
for i in range(0 , len(A)):
for j in range(0 ,len(A[0])):
res[i][j] = A[i][j] + B[i][j]
return res
def sigmoid_output_to_derivative2D(A):
res = [[0] * len(A[0]) for i in range(len(A))]
for i in range(0 , len(A)):
for j in range(0 ,len(A[0])):
res[i][j] = A[i][j] * (1 - A[i][j])
return res
def sigmoid2D(x):
try:
res = [[0] * len(x[0]) for i in range(len(x))]
for i in range(0 , len(x)):
for j in range(0 ,len(x[i])):
res[i][j] = 1 / (1 + exp(-x[i][j]))
return res
except Exception:
print()
print('X:' , x)
def mul(A , x):
res = [0] * len(A)
for t in range(len(A)):
temp = []
for i in range(len(A[t])):
temp.append(A[t][i] * x)
res[t] = temp
return res
def puls(A , x):
res = [0] * len(A)
for t in range(len(A)):
temp = []
for i in range(len(A[t])):
temp.append(A[t][i] + x)
res[t] = temp
return res
def around2D(A):
res = [0] * len(A)
for t in range(len(A)):
temp = []
for i in range(len(A[t])):
v = 1
if A[t][i] < 0.5:
v = 0
temp.append(v)
res[t] = temp
return res
def arrayToInt(A):
l = len(A)
res = 0
for i in range(l):
v = A[i][0] * pow(2, i)
res += v
return res
自己动手写RNN的更多相关文章
- 【原创】自己动手写控件----XSmartNote控件
一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...
- 【原创】自己动手写工具----XSmartNote [Beta 3.0]
一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...
- 【原创】自己动手写工具----XSmartNote [Beta 2.0]
一.前面的话 在上一篇自己动手写工具----XSmartNote中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版ev ...
- 【原创】自己动手写工具----签到器[Beta 2.0]
一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程 ...
- 自己动手写ORM的感受
之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻.作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM ...
- 自己动手写插件底层篇—基于jquery移动插件实现
序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...
- Python - 动手写个ORM
Python - 动手写个ORM 任务: 模拟简单的ORM - Object Relational Mapping 为model添加create方法 代码很简单,直接上 字段类型类 class Fie ...
- 【转】自己动手写SC语言编译器
自序 编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设 计大师都是编译领域的高手,像写出BASIC语言的BIL ...
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...
随机推荐
- [android] android 获取网络连接信息
效果图: 工具类 /** * 获取网络连接信息 * * 根据NetworkInfo可以知道有很多的连接方式和信息 * * ① 当没有任何可用网络的时候,networkinfo为null 判断netw ...
- java 多线程 3 synchronized 同步
多任务编程的难点在于多任务共享资源.对于同一个进程空间中的多个线程来说,它们都共享堆中的对象.某个线程对对象的操作,将影响到其它的线程. 在多线程编程中,要尽力避免竞争条件(racing condit ...
- 快速开发 jQuery 插件的 10 大技巧(转)
1. 把你的代码全部放在闭包里面 这是我用的最多的一条.但是有时候在闭包外面的方法会不能调用.不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面.而方法可能应 ...
- mongoose 数据库操作3
Model.find(query, fields, options, callback) Model.find({ 'some.value': 5 }, function (err, docs) { ...
- ubuntu被delete的文件位置
在-/.local/share/Trash/files下边 可以通过 cd / find -name <filename> 找到盖文件的位置
- Objective-C Runtime初探:self super
题目 上题目,已知A是爷爷,B是爸爸,C是孙子. @interface A : NSObject - (void)f; @end @interface B : A - (void)f; - (void ...
- CENTOS --5分钟搞定Nginx安装的教程
1. 安装gcc(centos 7之后一般已自带,可以在第6步失败后再安装) yum install gcc gcc-c++ 2. 安装pcre yum install -y pcre pcre-de ...
- Codeforces Round #311 (Div. 2) A,B,C,D,E
A. Ilya and Diplomas 思路:水题了, 随随便便枚举一下,分情况讨论一下就OK了. code: #include <stdio.h> #include <stdli ...
- MySQL------如何卸载与安装
1.安装 转载:http://wenda.so.com/q/1471475177723102?src=140 2.卸载 转载:http://jingyan.baidu.com/article/3d69 ...
- Spring_day02--Spring的aop操作
Spring的aop操作 1 在spring里面进行aop操作,使用aspectj实现 (1)aspectj不是spring一部分,和spring一起使用进行aop操作 (2)Spring2.0以后新 ...