深度学习之python实现RNN

#用python实现RNN
#用RNN学习二进制加法:1.学习当前位的加法;2.学习关于前一位的进位
import copy,numpy as np
np.random.seed(0)

def sigmoid(inX):
       return 1/(1+np.exp(-inX))

def sigmoid_output_to_derivative(output):
    return output*(1-output)

int2binary={}#字典格式
binary_dim=8#二进制最多8位-即2^8
#二进制和十进制的对应
largest_number=pow(2,binary_dim )
binary = np.unpackbits(np.array([range(largest_number)],dtype=np.uint8).T,axis=1)
#unpackbits函数可以把整数转化成2进制数
for i in range(largest_number ):
    int2binary[i]=binary[i]

#对网络进行初始化
alpha=0.1
input_dim=2#两个数相加
hidden_dim=16
output_dim=1
#权重值的初始化操作
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)


#10000次迭代
for j in range(10000):
    #a+b=c
    a_int=np.random.randint(largest_number/2)
    a=int2binary[a_int]
    b_int = np.random.randint(largest_number / 2)
    b = int2binary[b_int]
    c_int=a_int+b_int
    c=int2binary[c_int]#是label值
    d=np.zeros_like(c)#保存预测值

    overallError = 0#保存损失值

    layer_2_deltas=list()
    layer_1_values=list()#上一个阶段的值
    layer_1_values.append(np.zeros(hidden_dim))

    for position in range(binary_dim ):
        x=np.array([[a[binary_dim -position-1],b[binary_dim -position-1]]])
        y=np.array([[c[binary_dim -position-1]]]).T

        layer_1=sigmoid(np.dot(x,synapse_0)+np.dot(layer_1_values[-1],synapse_h))#注意点
        #list-表示列表list[-1]表示从右侧开始读取的第一个元素
        
        #dot()返回的是两个数组的点积(dot product)
        #如果处理的是一维数组,则得到的是两数组的內积
        #如果是二维数组(矩阵)之间的运算,则得到的是矩阵积
        layer_2=sigmoid(np.dot(layer_1,synapse_1 ))
        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])
        d[binary_dim-position-1]=np.round(layer_2[0][0])
        #函数原型是:round(flt, ndig=0)  其中 ndig 是小数点的后面几位(默认为0),然后对原浮点数 进行四舍五入的操作。
        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]

        layer_2_delta=layer_2_deltas[-position-1]
        layer_1_delta=(future_layer_1_delta.dot(synapse_h.T)+layer_2_delta .dot(synapse_1 .T))*sigmoid_output_to_derivative(layer_1)
        #注意点
        #参数更新
        synapse_1_update +=np.atleast_2d(layer_1).T.dot(layer_2_delta)
        #维度改变 :atleast_xd 支持将输入数据直接视为 x维。这里的 x 可以表示:1,2,3。
        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

    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


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 目前能ping通的IP:216.58.193.51 59.18.44.245 59.18.44.53 59.18....
    StevenZack阅读 1,667评论 0 0
  • 目录: Android:Android 0.*Android 1.*Android 2.*Android 3.*A...
    敲代码的令狐葱阅读 3,806评论 0 2
  • 休息在家,没有学习,没有娱乐,没有任何形式的输入,以至于今天的打卡不知怎么输出。 事实证明,人的惰性思维很强大。不...
    祝雨葭阅读 283评论 0 2
  • 会利原创分享第478天 《跳河的兔子》 兔子的胆小是出了名的,经常受到的惊吓总是像石头一样压在它们的心上。...
    王会利阅读 141评论 0 0
  • 我刚入社会,突然有一种无力感,就像书上所说的迷茫,无所适从。现在谈了个女朋友,那种感觉就越明显。唉:-(还有这段时...
    天空和遗憾阅读 246评论 0 1