如何设置1dCNN + LSTM网络(Keras)的输入形状?

时间:2018-04-17 05:17:30

标签: python tensorflow keras lstm

我有以下想法来实现:

                       Input -> CNN-> LSTM -> Dense -> Output

输入有100个时间步长,每个步骤都有一个64维特征向量

Conv1D 图层将在每个时间步骤提取功能。 CNN层包含64个滤波器,每个滤波器具有16个抽头长度。然后,maxpooling层将提取每个卷积输出的单个最大值,因此每个时间步将提取总共64个特征。

然后,CNN层的输出将被馈送到具有64个神经元的LSTM层。重复次数与输入的时间步长相同,即100个时间步长。 LSTM层应该返回一个64维输出序列(序列长度==时间步数== 100,所以应该有100 * 64 = 6400个数字)。

input = Input(shape=(100,64), dtype='float', name='mfcc_input')
CNN_out = TimeDistributed(Conv1D(64, 16, activation='relu'))(mfcc_input)
CNN_out = BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True)(CNN_out)
CNN_out = TimeDistributed(MaxPooling1D(pool_size=(64-16+1), strides=None, padding='valid'))(CNN_out)

LSTM_out = LSTM(64,return_sequences=True)(CNN_out)

... (more code) ...

但这不起作用。第二行报告" 列表索引超出范围 "而且我不明白发生了什么。

我是Keras的新手,所以如果有人能帮助我,我真诚地感激。

This picture explains how CNN should be applied to EACH TIME STEP

1 个答案:

答案 0 :(得分:1)

问题在于您的输入。您的输入形状为(100, 64),其中第一个维度是时间步长。因此,忽略这一点,您的输入形状为(64)Conv1D

现在,请参阅Keras Conv1D documentation,其中指出输入应为3D张量(batch_size, steps, input_dim)。忽略batch_size,您的输入应为2D张量(steps, input_dim)

因此,您提供1D张量输入,其中输入的预期大小是2D张量。例如,如果您以单词形式向Conv1D提供自然语言输入,则句子中有64个单词,并假设每个单词都使用长度为50的向量进行编码,您的输入应为{{1 }}。

另外,请确保您正在向LSTM输入正确的输入,如下面的代码所示。

所以,正确的代码应该是

(64, 50)