Попытка разделить входной слой Keras, по-разному обрабатывать оба субтензора и соединять их последний в слой LSTM. - PullRequest
0 голосов
/ 11 сентября 2018

Итак, один вход моей нейронной сети в Керасе - это массив из 10 элементов. Вопрос в том, что первые 9 элементов - это числа, а последний - это матрица, которая будет объединена. То, что я пытаюсь сделать, это:

  • Получите ввод
  • Разделить вход, разделяя записи [0: 8] и [9]
  • Отправка [9] записи в ряд сверточных слоев
  • Завершение его в слой LSTM, который получит записи [0: 8] напрямую, а также выходные данные сверточных слоев

Я понимаю, что придется использовать входной слой:

shape = (10,)
input = Input(shape=shape , name='input', dtype='float32')

У меня также уже есть слои свертки:

conv = Convolution1D(nb_filter=nb_filter, filter_length=filter_kernels[0],
                     border_mode='valid', activation='relu',
                     input_shape=(maxlen, vocab_size),
                     kernel_initializer=initializer)(text_input)
conv = MaxPooling1D(pool_length=3)(conv)

conv1 = Convolution1D(nb_filter=nb_filter, filter_length=filter_kernels[1],
                      border_mode='valid', activation='relu',                                                                                                         kernel_initializer=initializer)(conv)
conv1 = MaxPooling1D(pool_length=3)(conv1)

conv2 = Convolution1D(nb_filter=nb_filter, filter_length=filter_kernels[2],
                      border_mode='valid', activation='relu', kernel_initializer=initializer)(conv1)

conv3 = Convolution1D(nb_filter=nb_filter, filter_length=filter_kernels[3],
                      border_mode='valid', activation='relu', kernel_initializer=initializer)(conv2)

conv4 = Convolution1D(nb_filter=nb_filter, filter_length=filter_kernels[4],
                      border_mode='valid', activation='relu', kernel_initializer=initializer)(conv3)

conv5 = Convolution1D(nb_filter=nb_filter, filter_length=filter_kernels[5],
                      border_mode='valid', activation='relu', kernel_initializer=initializer)(conv4)
conv5 = MaxPooling1D(pool_length=3)(conv5)
conv5 = Flatten()(conv5)
conv5 = Dropout(0.5)(Dense(dense_outputs, activation='relu', kernel_initializer=initializer)(conv5))

Я также знаю, что мне придется объединить их последним и передать в слой LSTM:

concat_lstm2 = Concatenate()([first, second])
Dropout(0.5)(LSTM(lstm_size, return_sequences=True, name='lstm')(concat_lstm2))

Вопрос заключается в том, как разделить запись на подпроцессы процессов в разных слоях, чтобы последние объединяли их обратно в слой LSTM.

...