Python LSTM自动编码中的Keras嵌入层
我正在尝试实现char2vec模型,将人名转换或映射为50维或任意N维向量。它与FastText的get_word_向量或scikit learn的TFIDFvectorier非常相似 基本上,我从中找到了有监督的LSTM模型,并尝试将其转换为无监督或自动编码器模型 下面是模型的细节。输入是人名双字符的填充序列 输入:Python LSTM自动编码中的Keras嵌入层,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我正在尝试实现char2vec模型,将人名转换或映射为50维或任意N维向量。它与FastText的get_word_向量或scikit learn的TFIDFvectorier非常相似 基本上,我从中找到了有监督的LSTM模型,并尝试将其转换为无监督或自动编码器模型 下面是模型的细节。输入是人名双字符的填充序列 输入: person_name = [Heynis, Noordewier-Reddingius, De Quant, Ahanfouf, Falaturi ,...] ### Con
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'))
型号:
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)
以下是我尝试过的:
我从你那里得到了密码。似乎在将训练数据输入模型之前对其进行了重塑,因此不需要嵌入层。RepeatVector和TimeDistributed层用于重塑输出。这个模型对我来说似乎是正确的,但我不确定这个重塑和时间分布层是否与嵌入层相似
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模型,我很好奇这个模型是否更好。只有一个类,即名称,它不会很好。尝试添加更多类,如位置、非人名。然后将类作为目标传递给输出层。也许这会带来更好的结果。@Bharath,但我只对人名的向量表示感兴趣。只有一个类,即人名,它不会很好。尝试添加更多类,如位置、非人名。然后将类作为目标传递给输出层。也许这会带来更好的结果。@Bharath,但我只对人名的向量表示感兴趣。