3.Highway Network& Grid LSTM(李宏毅)

1.Feedforward与Recurrent

在这里插入图片描述
在说明Highway Network之前先回顾Feedforward与Feedforward
Feedforward
1.经过t层之后得到y,每个f皆不相同
2.这边的t所指为Layer
3.只有一开始有输入x
经常性
1.同一个f不断计算,最后经过g得到y
2.这边的t所指为time step
3.每个time step皆输入x
结论:把RNN竖直,它就可以是一个Feedforward。

2. 循环网络-GRU与Highway Network

2.1GRU变成Highway Network的过程

在这里插入图片描述
Highway Network的想法就是要将RNN竖直,测试是否可以训练出一个非常深的NN,这边说明将GRU调整为Highway Network:
左图为原始GRU,右图为调整之后GRU
1.将每个时步的 x t x^t xt取消掉
2.将每个时步的 y t y^t yt取消掉
3.将h调整为a:原 h t − 1 h^{t -1} ht1指第t − 1个时步的输出,调整为 a t − 1 a^{t -1} at1代表第t − 1个Layer的输出
4.取消reset gate,保留update gate
原GRU中每一个时步皆有输入,因此不重要的事就可以忘掉,但在Highway Network中只有最开始有输入,如果过程中忘掉资讯,后面就没有任何资讯了。另类想法上,取消reset gate也减少大量参数。

2.2Highway Network

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
上图是将Highway Network应用于MNIST与CIFAR-100两个资料集。
横轴:层数
纵轴:Loss
作法上是将一个训练好拥有50层的Highway Network直接拔掉一层,看他在训练资料集中的变化,如果没有任何影响,代表它在过程中是直接被pass掉的。
可以发现到,在MNIST中间有一大部份被拿掉之后对结果是没有影响的,这代表训练过程模型自己发现到前面几层才是有用的。
而在CIFAR-100上拿掉几个Layer都对模型有影响,这是因为CIFAR-100的资料较为复杂。
Highway Network的优势:对网络的层数依赖性较低,且有的时候回自动决定需要的网络层数。

3.Grid LSTM

在这里插入图片描述
右图:
在这里插入图片描述
在这里插入图片描述
LSTM不止可以竖直,还可以横向发展,这就是Grid LSTM。
第一行的左图是原始LSTM,第二行的左图Grid LSTM的差异在于输入的部份由一个原本的x,变化为a, b,以此方式同时拥有时间H与深度b的Memory。
第二行的右图Grid LSTM:同样的逻辑也可以套用在3维的情况。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,您在模型定义中使用了 `model.add` 的形式,但是您没有定义 `model`,因此会出现错误。要解决这个问题,您需要在函数的开头定义 `model`,然后在函数中使用 `model.add` 的形式添加层。例如: ```python from tensorflow.keras.layers import Input, Lambda, Dense, LSTM, concatenate, add, Activation from tensorflow.keras.models import Model def LSTNetAttention(trainX1, trainX2, trainY, config): # 定义输入张量 time_steps1 = trainX1.shape[1] input_dim1 = trainX1.shape[2] input_data1 = Input(shape=(time_steps1, input_dim1)) #lstm1 = input_data1 .... # 添加其他层 lstm_out1 = LSTM(units=128, return_sequences=True)(input_data1) # ... concat = concatenate([lstm_out1, lstm_out2]) # 添加其他层 model = Model(inputs=[input_data1, input_data2], outputs=concat) model.add(Dense(units=5)) model.add(Dense(units=config.prediction_steps)) # 添加多步预测输出层 highway_window = config.highway_window #截取近3个窗口的时间维 保留了所有的输入维度 z = Lambda(lambda k: k[:, -highway_window:, :])(input_data1) z = Lambda(lambda k: K.permute_dimensions(k, (0, 2, 1)))(z) z = Lambda(lambda k: K.reshape(k, (-1, highway_window*trainX1.shape[2])))(z) z = Dense(trainY.shape[1])(z) res = add([res, z]) res = Activation('sigmoid')(res) # 返回模型 return model ``` 在上面的代码中,我们首先定义了输入张量 `input_data1`,然后添加了一些层,包括 `LSTM` 层和 `Dense` 层。然后,我们使用 `Model` 函数定义了模型,并使用 `model.add` 的形式添加了其他层。最后,我们返回了模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值