Keras Встраивание слоя в LSTM Autoenconder - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь реализовать модель char2ve c для преобразования или отображения имен человека в 50-мерный или любой N-мерный вектор. Она очень похожа на get_word_vector или scfit-learn от FastText TfidfVectorizer.

По сути, я обнаружил контролируемую модель LSTM из этноколлера и пытаюсь преобразовать ее в модель без присмотра или с автоматическим кодировщиком.

Вот деталь модели. Входными данными является последовательность заполнения символа биграммы имени человека.

Ввод:

person_name = [Heynis, Noordewier-Reddingius, De Quant, Ahanfouf, Falaturi ,...]

### Convert person name to sequence with post padding
X_train = array([[101,  25, 180,  95, 443,   9, 343, 198,  38,  84,  37,   0,   0,   0,   0,   0,   0],
       [128,  27,   8,   6,  22,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [142, 350, 373,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [999,  14,  33,  16, 512,  36,  52, 352,  14,  33,   5, 211, 143,   0,   0,   0,   0],
       [146,  54,  99,  72, 102,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       ...]

Модель:

model = Sequential()
model.add(Embedding(num_words, 32, input_length=feature_len))
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(num_classes, activation='softmax'))

В идеале это то, что я ищу для:

inputs = Input(shape=(feature_len,  ))
embedded = Embedding(num_words, 32)(inputs)
encoded = LSTM(50, dropout=0.2, recurrent_dropout=0.2)(embedded)

decoded = LSTM()(encoded)
decoded_inverse_embedded= Inverse_Embedding()(decoded )   # I know it's silly.
outputs = Layer_something()   # to convert back to the original shape

autoencoder_model= Model(inputs, outputs)
encoder = Model(inputs, encoded)   # This is what I want, ultimately.

autoencoder_model.fit(X_train, X_train) 

Вот что я попробовал: Я получил код от { ссылка }. Кажется, что данные обучения были изменены до того, как они были переданы в модель, поэтому нет необходимости в слое Embedding. Слои RepeatVector и TimeDistributed использовались для изменения формы вывода. Модель мне кажется правильной, но я не уверен, что этот слой с измененной формой и TimeDistributed похож на слой Embedding или нет.

sequence = X_train.reshape((len(X_train), feature_len, 1))

#define encoder
visible = Input(shape=(feature_len, 1))
encoder = LSTM(50, activation='relu')(visible)

# define reconstruct decoder
decoder1 = RepeatVector(feature_len)(encoder)
decoder1 = LSTM(50, activation='relu', return_sequences=True)(decoder1)
decoder1 = TimeDistributed(Dense(1))(decoder1)

myModel = Model(inputs=visible, outputs=decoder1)

myModel.fit(sequence, sequence, epochs=400)

Результат не выглядит правильным. Есть ли другие подходы к этой проблеме? Я пробовал и FastText (через gensim) и модель TF-IDF, и мне любопытно, будет ли эта модель лучше.

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