在模型后期如何合并新功能?

时间:2019-05-20 04:04:03

标签: keras

我有numpy数组形式的训练数据,将在ConvLSTM中使用。 以下是数组的尺寸。 trainX = (5000, 200, 5) 其中5000是样本数。 200是每个样本的时间步长,8是每个时间步长的特征数。(样本,时间步长,特征)。

在这8个特征中,有3个特征在样本中的所有时间步中都保持不变(换句话说,这些特征与样本直接相关)。例如,星期几,月份号,工作日(这些随样本的不同而变化)。为了降低复杂度,我想将这三个功能与初始训练集分开,并将它们与convlstm层的输出合并,然后再应用密集层进行分类(softmax激活)。例如 初始训练集维将为(7000, 200, 5),要合并的辅助输入维将为(7000, 3)->因为这3个特征与样本直接相关。如何使用keras来实现此目的?

以下是我使用Functional API编写的代码,但不知道如何合并这两个输入。

    #trainX.shape=(7000,200,5)
    #trainy.shape=(7000,4)
    #testX.shape=(3000,200,5)
    #testy.shape=(3000,4)
    #trainMetadata.shape=(7000,3)
    #testMetadata.shape=(3000,3)

    verbose, epochs, batch_size = 1, 50, 256
    samples, n_features, n_outputs = trainX.shape[0], trainX.shape[2], trainy.shape[1]
    n_steps, n_length = 4, 50
    input_shape = (n_steps, 1, n_length, n_features)
    model_input = Input(shape=input_shape)

    clstm1 = ConvLSTM2D(filters=64, kernel_size=(1,3), activation='relu',return_sequences = True)(model_input)
    clstm1 = BatchNormalization()(clstm1)

    clstm2 = ConvLSTM2D(filters=128, kernel_size=(1,3), activation='relu',return_sequences = False)(clstm1)
    conv_output = BatchNormalization()(clstm2)

    metadata_input = Input(shape=trainMetadata.shape)
    merge_layer = np.concatenate([metadata_input, conv_output])

    dense = Dense(100, activation='relu', kernel_regularizer=regularizers.l2(l=0.01))(merge_layer)
    dense = Dropout(0.5)(dense)
    output = Dense(n_outputs, activation='softmax')(dense)


    model = Model(inputs=merge_layer, outputs=output)

    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    history = model.fit([trainX, trainMetadata], trainy, validation_data=([testX, testMetadata], testy), epochs=epochs, batch_size=batch_size, verbose=verbose)
    _, accuracy = model.evaluate(testX, testy, batch_size=batch_size, verbose=0)
    y = model.predict(testX)

但是在merge_layer语句中出现Value错误。以下是ValueError

ValueError: zero-dimensional arrays cannot be concatenated

1 个答案:

答案 0 :(得分:0)

使用Keras的Sequential模式无法完成您所说的话。

您需要使用Model类API Guide to Keras Model

使用此API,您可以构建所需的复杂模型

这里有一个使用方法的示例:How to Use the Keras Functional API for Deep Learning