我尝试了解LSTM以及如何使用Keras构建它们。我发现,主要有4种模式运行RNN(图中右边4种模式)
图片来源:Andrej Karpathy
现在我想知道每个人的简约代码片段在Keras中会是什么样子。 像
这样的东西model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))
对于4个任务中的每一个,可能会有一点解释。
答案 0 :(得分:73)
所以:
Dense
图层,因为您不处理序列: model.add(Dense(output_size, input_shape=input_shape))
2。 一对多:由于链接模型在Keras
中不是很容易,因此不支持此选项,因此以下版本是最简单的版本:
model.add(RepeatVector(number_of_times, input_shape=input_shape))
model.add(LSTM(output_size, return_sequences=True))
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim)))
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
编辑:广告5
在我最近的一个应用程序中,我们从第4张图像中实现了类似于多对多的内容。如果您希望网络具有以下架构(当输入长于输出时):
O O O
| | |
O O O O O O
| | | | | |
O O O O O O
您可以通过以下方式实现此目的:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
model.add(Lambda(lambda x: x[:, -N:, :]
其中N
是您要覆盖的最后步骤的数量(在图片N = 3
上)。
从这一点开始:
O O O
| | |
O O O O O O
| | |
O O O
与使用例如长度N
的人工填充序列一样简单。使用0
向量,以便将其调整为适当的大小。
答案 1 :(得分:0)
@MarcinMożejko的精彩回答
我会在NR.5中添加以下内容(许多输入/输出长度不同的人很多):
A)为香草LSTM
L = [1, 3, 3, 4, 4, 5, 5, 7, 8, 9, 9, 9]; result = [[1, 3, 4, 5, 7, 8, 9]]
L = [3, 4, 5, 9, 9]; result = [[1, 3, 4, 5, 7, 8, 9], [3, 4, 5, 9]]
L = [9]; result = [[1, 3, 4, 5, 7, 8, 9], [3, 4, 5, 9], [9]]
L = []; result = [[1, 3, 4, 5, 7, 8, 9], [3, 4, 5, 9], [9], []]
B)作为编解码器LSTM
model = Sequential()
model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES)))
model.add(Dense(N_OUTPUTS))