当输入具有不同的时间范围时,如何为Conv1D层准备数据?

时间:2019-08-25 13:49:05

标签: python keras

我想将对应于发音数字的频谱图馈送到以Conv1D作为第一层的模型。然后,我使用RNN层对发出的单词进行分类。这些频谱图具有不同的序列/时间长度,但是当然具有相同的特征编号。

在Keras的Conv1D文档中:

  

将这一层用作模型的第一层时,请为每步具有128个要素的可变长度序列提供一个input_shape参数[..](无,128)。

因此似乎可以处理它。无需填充/调整大小。

我曾经用numpy(例如:numpy.vstack)准备相同形状的数据,但是现在我有各种各样的形状,我不知道该怎么做!而且我只发现了人们拥有相同形状数据的示例。

或者也许用numpy是不可能的,我还必须使用其他东西吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

有可能,但是您必须确保将批处理在一起的序列具有相同的长度,这就是为什么大多数人只是简单地填充所有序列。如果使用屏蔽,它也会忽略屏蔽值,因此没有区别。

model.add(LSTM(32, return_sequences=True, input_shape=(None, 5)))
model.add(LSTM(8, return_sequences=True))
model.add(TimeDistributed(Dense(2, activation='sigmoid')))

print(model.summary(90))

model.compile(loss='categorical_crossentropy',
              optimizer='adam')

def train_generator():
    while True:
        sequence_length = np.random.randint(10, 100)
        x_train = np.random.random((1000, sequence_length, 5))
        # y_train will depend on past 5 timesteps of x
        y_train = x_train[:, :, 0]
        for i in range(1, 5):
            y_train[:, i:] += x_train[:, :-i, i]
        y_train = to_categorical(y_train > 2,5)
        yield x_train, y_train

model.fit_generator(train_generator(), steps_per_epoch=30, epochs=10, verbose=1)