Как объединить новые функции на более поздней стадии модели? - PullRequest
0 голосов
/ 20 мая 2019

У меня есть тренировочные данные в виде пустых массивов, которые я буду использовать в 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. Ниже приведена ошибка ValueError

ValueError: zero-dimensional arrays cannot be concatenated

1 Ответ

0 голосов
/ 22 мая 2019

То, что вы говорите, не может быть сделано с помощью режима Sequential Keras.

Вам необходимо использовать API класса Model Руководство по модели Keras .

С помощью этого API вы можете построить сложную модель, которую вы ищете

Вот пример использования: Как использовать функциональный API Keras для глубокого обучения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...