自己动手写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 ...
随机推荐
- HTML和CSS的盒子模型(Box model)
本文作为属性篇的最后一篇文章, 将讲述HTML和CSS的关键—盒子模型(Box model). 理解Box model的关键便是margin和padding属性, 而正确理解这两个属性也是学习用css ...
- Servlet和JSP规范及版本对应关系
JSR 53: JavaTM Servlet 2.3 and JavaServer PagesTM 1.2 JSR 154: JavaTM Servlet 2.4 JSR 154: JavaTM Se ...
- cocos2dx --- 富文本的使用 RichText
在实际工作中,有非常多地方会使用 富文本,这里仅仅介绍最简单的富文本用法: 是由cocostudio 提供的 RichText: 直接贴代码,再分析: //这里測试富文本控件 ui::RichText ...
- 【linux】硬盘分区
fdisk -l fdisk /dev/sda d--删除分区 n-新建分区 p--主分区 e--扩展分区 t--改变分区格式 82为swap分区 w--保存退出 http://www.blogjav ...
- 如何在ChemDraw中打出符号π
很多人日常使用ChemDraw是一款非常优秀的化学绘图软件,在其绘制化学结构式或者反应式的过程中,常常需要添加各种符号.比如有的用户会需要输入希腊字符π,但是不知道用什么方法添加.本教程就来给大家介绍 ...
- JavaScript入门之函数返回值
函数返回值 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...
- localStorage变更事件当前页响应新解-awen
html5的localStorage相信大家都是很熟悉了,但是在chrome等支持该对象的浏览器中(ie10除外),如果你监听storage变更事件你就会发现,当数据发生变化时本页是监听不到stora ...
- 在 Linux 上管理加密密钥的最佳体验
导读 存储 SSH 的加密秘钥和记住密码一直是一个让人头疼的问题.但是不幸的是,在当前这个充满了恶意黑客和攻击的世界中,基本的安全预防是必不可少的.对于许多普通用户来说,大多数人只能是记住密码,也可能 ...
- oracle的后台进程能否杀掉
oracle的后台进程杀掉会有什么影响 说明:本文复制自网友的博客: https://blog.csdn.net/kellyseeme/article/details/8927757 数据库版本为: ...
- [Android Tips] 17. 查看 APK 签名信息
从 APK 文件中获取签名信息 方法一 $ keytool -list -printcert -jarfile <path of APK> 方法二 解压 APK 文件,释放出 META-I ...