Объединение двух слоев пула - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь спроектировать двунаправленную модель LSTM и хочу объединить функции после слоев максимального пула и среднего пула.У меня есть это для моей модели:

from keras.layers import Dense, Embedding
from keras.layers.recurrent import LSTM
from keras.layers import Bidirectional
from keras.models import Sequential
from keras.layers.core import Dropout
from features import train,embedding_matrix,words
from keras.layers import concatenate,AveragePooling1D,GlobalMaxPooling1D

model=Sequential()

model.add(Embedding(words,300,input_length=train.shape[1],weights=[embedding_matrix]))
model.add(Bidirectional(LSTM(20,activation='tanh',kernel_initializer='glorot_uniform',recurrent_dropout = 0.2, dropout = 0.2,return_sequences=True)))

model.add(concatenate([GlobalMaxPooling1D(),AveragePooling1D()]))

model.add(Dropout(0.2))

model.add(Dense(2, activation='softmax'))

print model.summary()

Но у меня есть: ValueError: Layer concatenate_1 was called with an input that isn't a symbolic tensor, потому что я считаю, что слой сцепления.Так как я не добавляю пул в модель.

Можно ли добавить два слоя в одну модель?или я должен определить две отдельные модели, а затем добавить слои объединения в каждую из них?

1 Ответ

0 голосов
/ 14 октября 2018

Хитрость здесь в том, чтобы использовать графовую модель вместо последовательной модели.

Прежде чем мы начнем, я предполагаю, что

  1. ваша сеть ожидает двухмерный входной тензор формы (B=batch_size, N=num_of_words), где N - самая длинная длина выборки ваших тренировочных данных.(Если у вас сэмплы неравной длины, вы должны использовать keras.preprocessing.sequence.pad_sequences для получения сэмплов одинаковой длины)
  2. ваш словарный запас равен V (вероятно, 300, если я правильно понимаю)
  3. ваш слой встраивания кодирует каждое слово в элемент размера F, т.е. весовая матрица вашего встраиваемого слоя VxF.

    из keras.layers импортирует Dense, Embedding, Input, Concatenate, Lambda из keras.layers.recurrent.импорт LSTM из keras.layers импорт Двунаправленный из keras.models import Модель из keras.layers.core import Dropout из keras импорт бэкэнда как BKN

    из keras.layers импорт конкатенация, AveragePooling1D, GlobalMaxPooling1D

    слова = ввод (форма = (N,))

    f = встраивание (input_dim = V, output_dim = F) (слова) f = двунаправленный (LSTM (20, активация = 'tanh', kernel_initializer = 'glorot_uniform', recurrent_dropout = 0.2, dropout = 0.2, return_sequence = True)) (f) gpf = GlobalMaxPooling1D () (f) gpf = лямбда (лямбда t: BKN.expand_dims (t, axis = 1)) (gpf)apf = AveragePooling1D (pool_size = 2) (f) pf = сцепление (ось = 1) ([gpf, apf]) pf = выпадение (0.2) (pf) pred = плотное (2, активация = 'softmax') (pf)# <- убедитесь, что это правильно </p>

    модель = модель (вход = слова, выход = пред)

Наконец, я не могу найти, что керас Embeddingслой поддерживает синтаксис, такой как weights=[embedding_matrix].

...