关于LSTM形状的怀疑

时间:2020-09-01 13:26:17

标签: python tensorflow keras lstm

我看到很多人在LSTM方面有同样的问题,所以我想先提出一个问题,然后再介绍一个通用的例子。

预期的输入形状由(样本,时间步长,特征)组成。这是我第一次陷入困境,因为很多示例仅提供以下两种输入:

model.add(LSTM(32, input_shape=(TIMESTEPS, FEATURES), activation='relu', return_sequences = True))

如果我是对的,则省略第三个参数时,您只是没有指定样本数。

因此,想象一下我具有以下结构作为输入:

import numpy as np    
np.zeros((BATCHES, TIMESTEPS, FEATURES))

将其放入我们可以拥有的数字中

np.zeros((2,3,5))

[[[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]]

那正是我的情况。我有一个带有input_shape=(480, 16)的第0层,并且model.predict()正在接受使用batch = np.zeros((90, 480, 16))创建后填充了形状为(1、480、16)的输入。预测的形状为(1,480,16)的单个微型批处理等于model.predict(batch[[i]]),但我期望返回的数组1D的长度等于480,相反,我收到了: {1}},即<480。

此数组的值暂时无关紧要,但是他的形状应该可以预测每个时间步长的值。

我的问题在哪里?预先感谢

更新: 我的案例的整个模型声明是:

[[0. 1. ... 0. 0.]]

输入类似于以下声明:

model = Sequential()
model.add(LSTM(32, input_shape=(480, 16), activation='relu', return_sequences = True)))
model.add(Dense(16))
model.compile(loss='mse', optimizer=Adam(lr=0.1))
return model

1 个答案:

答案 0 :(得分:0)

上面的示例返回形状(1, 480, 16)。当您设置return_sequences=True时,Keras将返回时间步长维度(您的“中间”维度),因此,如果您的输入有480个时间步长,则它将输出480个时间步长。最后一个维度是最后一层的单位数。

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import *

model = Sequential()
model.add(LSTM(32, input_shape=(480, 16), return_sequences = True))
model.add(Dense(16))
model.compile(loss='mse', optimizer='adam')


batch = np.zeros((90, 480, 16))
input_to_predict = batch[[0]]
model.predict(input_to_predict).shape
array([[[0., 0., 0., ..., 0., 0., 0.],
        [0., 0., 0., ..., 0., 0., 0.],
        [0., 0., 0., ..., 0., 0., 0.],
        ...,
        [0., 0., 0., ..., 0., 0., 0.],
        [0., 0., 0., ..., 0., 0., 0.],
        [0., 0., 0., ..., 0., 0., 0.]]], dtype=float32)
(1, 480, 16)

如果设置return_sequences=False,则不会返回时间步长维度:

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import *

model = Sequential()
model.add(LSTM(32, input_shape=(480, 16), return_sequences = False))
model.add(Dense(16))
model.compile(loss='mse', optimizer='adam')


batch = np.zeros((90, 480, 16))
input_to_predict = batch[[0]]
model.predict(input_to_predict).shape
(1, 16)