说的再好,也不如实际行动,今天手写了一个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的更多相关文章

  1. 【原创】自己动手写控件----XSmartNote控件

    一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...

  2. 【原创】自己动手写工具----XSmartNote [Beta 3.0]

    一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...

  3. 【原创】自己动手写工具----XSmartNote [Beta 2.0]

    一.前面的话 在上一篇自己动手写工具----XSmartNote中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版ev ...

  4. 【原创】自己动手写工具----签到器[Beta 2.0]

    一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程 ...

  5. 自己动手写ORM的感受

    之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻.作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM ...

  6. 自己动手写插件底层篇—基于jquery移动插件实现

    序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...

  7. Python - 动手写个ORM

    Python - 动手写个ORM 任务: 模拟简单的ORM - Object Relational Mapping 为model添加create方法 代码很简单,直接上 字段类型类 class Fie ...

  8. 【转】自己动手写SC语言编译器

    自序 编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设 计大师都是编译领域的高手,像写出BASIC语言的BIL ...

  9. 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明

    将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...

随机推荐

  1. 关于json动态拼接响应数据

    在EasyUI http://www.jeasyui.com/demo/main/get_users.php 响应数据如下格式: { "total": "11" ...

  2. 009Maven_建立私服——报错问题

    前一篇文章的建立私服一直出问题,这里的问题是: jdk6.0只支持nuxus2.5及以下的版本,要支持nexus2.6以上,必须要jdk7.0以上.不然报错,把nexus-2.6.2war包放在Tom ...

  3. backbone.js初探(转)

    BackBone是JavaScript frameworks for creating MVC-like web applications,最近流行的用来建立单页面web application的工具 ...

  4. 【BZOJ】1646: [Usaco2007 Open]Catch That Cow 抓住那只牛(bfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1646 这一题开始想到的是dfs啊,,但是本机测样例都已经re了... 那么考虑bfs...很巧妙? ...

  5. 【Openwrt】刷

    设定你的电脑ip 为192.168.1.100 网线一头连接lan口,另外一头连接电脑.WAN口不能插线. 按住路由器的qss 键,开启路由器的电,灯灭掉,等6秒左右灯会再次闪几下就松开,用googl ...

  6. jhipster(springboot+datatable+jpa)后台分页,总结

    最近用datatable做了一个后台分页,但是后台实体原本没写DTO.就碰到的问题做了一下总结 一.datatable使用get方式传数据到后台,这是正常的后台分页,不涉及过滤查询和前端传递的排序字段 ...

  7. jboss6.4 域模式自动部署

    1.通过jenkins传递部署包到服务器,调用自动部署shell完成jboss6.4的域模式部署: 2.自动部署shell如下: 完成部署包重命名(从jenkins过来的包可能没有改名:). 调用jb ...

  8. Ubuntu 16.04 LTS 完善解决亮度调整

    环境: ubuntu16.04 lts acer aspire 4752G i5-2450M 内容来源:点击这里 ubuntu无法调整屏幕亮度,对笔记本来说很耗电,同时也很刺眼,因为它是默认以最大亮度 ...

  9. 那些在BAE上部署node.js碰到的坑

    在BAE上使用node.js半年多了,其中碰到了不少因为BAE云环境限制碰到的坑 写下来大家碰到了,也不用那么麻烦的去看好几天代码了,直接对症下药 官方公布的坑有: BAE是使用package.jso ...

  10. 分页技巧_测试并继续改进分页用的QueryHelper辅助对象

    分页技巧_测试并继续改进分页用的QueryHelper辅助对象 QueryHelper.java /** * 用于辅助拼接HQL语句 */ public class QueryHelper { pri ...