如何訓練深度網絡的 LSTM 層
我正在使用 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