keras中SimpleRNN层的计算流程验证

  keras中SimpleRNN和日常RNN所不同的就是其隐藏层到输出层之间是没有权重的,即最后时刻隐藏层的输出即为最终的输出。下面以一个例子来说明运算过程

keras自带的SimpleRNN进行计算

  • 导入所需要的库
import tensorflow as tf
import keras
from keras import Sequential
from keras.layers import SimpleRNN
  • 搭建神经网络
model=Sequential()
model.add(SimpleRNN(32,input_shape=(None,20),activation='relu'))
model.summary()

  keras中SimpleRNN 默认的激活函数为tanh,这里为了方便对比,采用relu激活函数。keras中输入的形式一般为[batch_size,timestep,num],在上述代码中,20代表的是num 。time_step是未知的None,一般batch_size在网络输入的时候不直接输进去吧(好像是在训练的时候自己可以改)。此处,我们不训练,直接用生成的初始化参数作为最后的参数,因为只是验证计算过程,只需要对比网络最后的结果和我自己算出的结果是否一致就行。

  此时模型情况如下:
生成的网络结构
  • 参数的提取
      在生成网络后,初始化的参数就已经确定了,导出初始化参数作为自己验证的权重。
U=model.get_weights()[0] #输入层和循环层之间的权重,维度为(20*32)
W=model.get_weights()[1]  #循环层与循环层之间的权重,维度为(32*32)
bias=model.get_weights()[2] #隐藏层的偏置项,32个

  上述代码中,U表示输入和循环层之间的权重(因为在搭建网络时固定了输入的num为20,循环层t时刻的维数为32),其维度为(2032),W表示循环层之间的权重,因为t-1时刻和t时刻的都为32,所以权重矩阵维度为(3232)。这里其实的计算没有考虑batch_size,如果考虑了batch_size的话,其实都是矩阵的计算。(这里想不明白没关系,后面验证时候具体的计算流程,一看就懂了)。最后的bias表示的是某个时刻t的32个偏置项。

  • 测试数据生成
test=np.random.randint(1,20,(10,2,20))

  为方便验证,生成的test的维度为[10,2,20],10指的是batch_size,2表示的是时间步time_step , 20指的是输入的维度。

-直接用网络进行计算

model_predict=model.predict(test)
model_predict.shape

  输出的维度为[10,32],model_predict的具体数值在后续的对比中进行展示。

自己计算SimpleRNN的输出

  • 自己定义一个relu激活函数
def activation_relu(x):
    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            if x[i,j]<0:
                x[i,j]=0
    return x
  • 矩阵乘法进行验证
x_t1=test[:,0,:]
x_t2=test[:,1,:]
# 第一个循环层的数据
s_t1=activation_relu(np.dot(x_t1,U)+bias)
# 第二个循环层的数据
s_t2=activation_relu(np.dot(x_t2,U)+np.dot(s_t1,W)+bias)

  在测试数据生成的时候,我们已经说明了测试数据的时间步为2,第一个时间步x_t1的维度为[10,20],s_t1的维度为()_{10*20} \cdot ()_{20*32}+()_{32,}=()_{10*32}, s_t2的维度为()_{10*20} \cdot ()_{20*32}+()_{10*32} \cdot ()_{32*32}+()_{32,}=()_{10*32} 。此时s_t2就为最后的输出。

对比两个结果

随机选取一行数据进行对比

   从上图发现SimpleRNN和我所理解的计算过程是一样的。为更准确的验证,做一个循环,代码如下:

def compare_value(a,b):
    if len(a.shape)!=len(b.shape):
        print("两者维度不同,无法比较")
    else:
        a_shape=np.array(a.shape)  #原始的a.shape的格式为tuple
        b_shape=np.array(b.shape)
        result=a_shape-b_shape
        if sum(result)!=0:
            print("维度不同,无法比较")
        else:
            #为防止保留位数的差异,统一保留小数点后6位
            a=np.round(a,3)
            b=np.round(b,3)
            c=a-b
            #由于电脑计算位数等等一些方式,可能保留的小数位不同,会在小数点后6,7位有点点误差
            #这个不是运算方式,而是电脑保留位数导致的
            if c.sum()<1e-5:  
                print("两者相同")
            else:
                print("两者数据不同")
        
compare_value(s_t2,model_predict)
两者相同

以一张图来描述SimpleRNN的计算过程


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