gpt4 book ai didi

tensorflow - 如何在 LSTM 层之间实现跳跃连接结构

转载 作者:行者123 更新时间:2023-12-05 02:08:33 28 4
gpt4 key购买 nike

最近学习了ResNet的skip connection,发现这种网络结构在训练的时候可以有很大的提升,在U-net等卷积网络中也适用。但是,我不知道如何使用 LSTM 自动编码器网络实现类似的结构。看起来我被一些尺寸问题困住了......我是用keras的方法实现的,但是一直报错。所以这里是网络代码:

# lstm autoencoder recreate sequence
from numpy import array
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import RepeatVector
from keras.layers import TimeDistributed
from keras.utils import plot_model
# from keras import regularizers
from keras.regularizers import l1
from keras.optimizers import Adam
import keras.backend as K
model = Sequential()
model.add(LSTM(512, activation='selu', input_shape=(n_in,1),return_sequences=True))
model.add(LSTM(256, activation='selu',return_sequences=True))
model.add(LSTM(20, activation='selu'))
model.add(RepeatVector(n_in))
model.add(LSTM(20, activation='selu',return_sequences=True))
model.add(LSTM(256, activation='selu',return_sequences=True))
model.add(LSTM(512, activation='selu', return_sequences=True))
model.add(TimeDistributed(Dense(1)))
# model.add
plot_model(model=model, show_shapes=True)

就像在resnet或unet中跳过连接图一样,我正在尝试像这样修改网络: network with out blue lines is the original network

编码器 lstm 层的输出还将前一层输出组合(连接,或相加?)作为解码器 lstm 层的输入。如图所示,对应层是对称的。这样的连接想法可能吗?但我是 keras API 和跳过连接结构的新手,我不知道如何实现它。

最佳答案

首先,您需要开始使用函数式 API 而不是 Sequential。函数式 API 允许您在每一层中构建任意输入和输出连接,而不是堆叠网络。

在以下位置了解有关函数式 API 的更多信息: https://keras.io/guides/functional_api/

关于从 LSTM 层构建跳跃连接,它与为任何类型的层构建跳跃一样简单。我将向您展示示例代码:

input = Input(shape=input_shape)
a = LSTM(32, return_sequences=True)(input)

x = LSTM(64, return_sequences=True)(a) # main1
a = LSTM(64, return_sequences=True)(a) # skip1

x = LSTM(64, return_sequences=True)(x) # main1
x = LSTM(64, return_sequences=True)(x) # main1

b = Add()([a,x]) # main1 + skip1

x = LSTM(128, return_sequences=True)(b) # main2
b = LSTM(128, return_sequences=True)(b) # skip2

x = LSTM(128, return_sequences=True)(x) # main2
x = LSTM(128, return_sequences=True)(x) # main2

c = Add()([b,x]) # main2 + skip2

x = LSTM(256, return_sequences=False)(c)

x = Dense(512, activation='relu')(x)
x = Dense(128, activation='relu')(x)

x = Dense(2, activation='softmax')(x)
model = Model(input, x)

此代码将产生以下网络:

enter image description here

如您所见,Add 层接收前一层加上 block 之前的层(第一个 block 中的 a)作为参数。

由于 Add 要求所有参数具有相同的形状,因此您必须在 skip 侧添加一个额外的 LSTM 以均衡 block 开始和结束的形状(与原始 ResNet 相同的概念) .

当然你应该搞乱这个网络,添加不同种类的层,DropoutregularizersActivation 或您选择为您的案例工作的任何内容。这只是一个树桩网络,用于显示与 LSTM 的跳过连接。

其余部分与您已经训练过的任何其他网络几乎相同。

关于tensorflow - 如何在 LSTM 层之间实现跳跃连接结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60772323/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com