Я пытаюсь реализовать модель 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, и мне любопытно, будет ли эта модель лучше.