Keras Conv1D在多个时间序列上:一次

时间:2018-10-04 23:34:02

标签: keras

我有一个numpy数组,其形状为(观察数,时间步数,要素数)。这相当于每个长度为24(上述时间步长)的59个特征(即时间序列)。这是用于输入RNN的标准设置。

我想做的是将其输入模型,第一步是分别对每个序列进行一维卷积,然后将59个输出连接到下一层(密集层或LSTM,然后是密集层)。 / p>

如果我遍历多个要素并将卷积应用于每个系列,则应如何构造输入X?

例如,说我的数据如下:

var=np.array([[[1., 3., 5., 7.],
        [2., 4., 6., 8.]],

       [[9., 11., 13., 15.],
        [10., 12., 14., 16.]],

       [[17., 19., 21., 23.],
        [18., 20., 22., 24.]]])

其中第一个观测值的时间序列1为[1,2],第二个观测值的时间序列为[3,4] ....,第一个观测值的第四时间序列为[7,8]。

nb_filters=(8,4)
filter_length=(5,5)
dense=(16,8)


    conv_layers=[]
    input=Input(shape=(None,no_timesteps,no_features))

    for i in range(no_features):
        series=Lambda(lambda x: x[:, i])(input)
        print(series.shape)
        conv_layer=Conv1D(nb_filters[0], kernel_size=filter_length[0], padding='valid',activation='relu')(series)
        conv_layer = MaxPooling1D()(conv_layer)
        conv_layer=Conv1D(nb_filters[1], kernel_size=filter_length[1], padding='valid',activation='relu')(conv_layer)
        conv_layer = MaxPooling1D()(conv_layer)
        conv_layers.append(conv_layer)
    merge_layer=Concatenate(axis=1)(conv_layers)
    merge_layer= Flatten()(merge_layer)
    output=Dense(dense[0], activation='sigmoid')(merge_layer)

    nn=Model(inputs=inputs,outputs=output)
    nn.compile(optimizer=RMSprop(), loss='binary_crossentropy')
    nn.summary()
    nn.fit(X,y, epochs=5)

首先,这不能按预期方式工作,因为print语句的形状为(?,24,59),这似乎并不表示我实际上在lambda中进行切片。我希望每个切片都是特定的时间序列形状(1,24),其中24是每个序列的长度。这个想法是让一维卷积在这个单个时间序列上运行(对所有59个序列重复)并将它们连接在一起。

2 个答案:

答案 0 :(得分:0)

输入形状必须仅包含时间步长和 num_features。 因此,而不是:

input=Input(shape=(None, no_timesteps,no_features))

试试:

input=Input(shape=(no_timesteps,no_features))

答案 1 :(得分:-1)

您必须使用:

input=Input(shape=(None, no_timesteps,no_features))

input=Input(shape=(number_of_samples, no_timesteps,no_features))

输入层是张量,其形状必须与训练数据相同。