Classification

如何訓練深度網絡的 LSTM 層

  • July 4, 2015

我正在使用 lstm 和前饋網絡對文本進行分類。

我將文本轉換為 one-hot 向量並將每個向量輸入 lstm,以便我可以將其總結為單個表示。然後我將它提供給另一個網絡。

但是我如何訓練 lstm?我只想對文本進行序列分類——我應該在沒有訓練的情況下餵牠嗎?我只想將段落表示為可以輸入分類器輸入層的單個項目。

我將不勝感激任何建議!

更新:

所以我有一個 lstm 和一個分類器。我獲取 lstm 的所有輸出並對它們進行平均池化,然後將該平均值輸入分類器。

我的問題是我不知道如何訓練 lstm 或分類器。我知道 lstm 的輸入應該是什麼,以及該輸入的分類器的輸出應該是什麼。由於它們是兩個單獨的網絡,只是按順序激活,因此我需要知道並且不知道 lstm 的理想輸出應該是什麼,這也將是分類器的輸入。有沒有辦法做到這一點?

LSTM 的最佳起點是 A. Karpathy 的博客文章http://karpathy.github.io/2015/05/21/rnn-effectiveness/。如果您使用的是 Torch7(我強烈建議),源代碼可在 github https://github.com/karpathy/char-rnn獲得。

我也會嘗試稍微改變你的模型。我會使用多對一的方法,讓您通過查找表輸入單詞並在每個序列的末尾添加一個特殊單詞,這樣只有當您輸入“序列結束”標誌時,您才會閱讀分類根據您的訓練標準輸出併計算誤差。通過這種方式,您可以直接在受監督的環境下進行訓練。

另一方面,更簡單的方法是使用paragraph2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ) 為您的輸入文本提取特徵,然後在您的特徵之上運行分類器。段落向量特徵提取非常簡單,在 python 中是:

class LabeledLineSentence(object):
   def __init__(self, filename):
       self.filename = filename

   def __iter__(self):
       for uid, line in enumerate(open(self.filename)):
           yield LabeledSentence(words=line.split(), labels=['TXT_%s' % uid])

sentences = LabeledLineSentence('your_text.txt')

model = Doc2Vec(alpha=0.025, min_alpha=0.025, size=50, window=5, min_count=5, dm=1, workers=8, sample=1e-5)
model.build_vocab(sentences)

for epoch in range(epochs):
   try:
       model.train(sentences)
   except (KeyboardInterrupt, SystemExit):
       break

引用自:https://stats.stackexchange.com/questions/159944

comments powered by Disqus