我有以下想法来实现:
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
答案 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)