Tensorflow 如何在LSTM层之间实现跳过连接结构

Tensorflow 如何在LSTM层之间实现跳过连接结构,tensorflow,machine-learning,keras,deep-learning,lstm,Tensorflow,Machine Learning,Keras,Deep Learning,Lstm,最近我学习了ResNet的skip连接,我发现这种网络结构在训练过程中可以有很大的改进,它也适用于卷积网络,如U-net。然而,我不知道如何使用LSTM自动编码器网络实现类似的结构。看起来我被一些维度问题困住了。。。 我正在使用keras的方法来实现,但我不断地出错。 下面是网络代码: # lstm autoencoder recreate sequence from numpy import array from keras.models import Sequential from kera

最近我学习了ResNet的skip连接,我发现这种网络结构在训练过程中可以有很大的改进,它也适用于卷积网络,如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中跳过连接图一样,我尝试如下修改网络:


编码器lstm层的输出还将前一层的输出合并(concat或add?)作为解码器lstm层的输入。如图所示,共响应层是对称的。这种联系的想法可能吗?但是我不熟悉keras API和跳过连接结构,我不知道如何实现它。

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

了解有关函数式API的更多信息,请访问:

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

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)
此代码将生成以下网络:

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

由于Add要求所有参数具有相同的形状,因此必须在跳过端添加额外的
LSTM
,以均衡块的开始和结束形状(与原始ResNet的概念相同)

当然,你应该搞乱这个网络,添加不同类型的层、
退出、
激活,或者任何你选择为你的案例工作的东西。这只是一个树桩网络,用于显示与LSTM的跳过连接

其余的与您已经培训过的任何其他网络几乎相同