[英]Text classification with LSTM Network and Keras
我目前正在使用Naive Bayes算法進行文本分類。
我的最終目標是,如果算法確定該句子屬於某個類別,則能夠突出顯示大文本文檔的某些部分。
Naive Bayes的結果很好,但是我想為這個問題訓練一個NN,所以我遵循了這個教程: http : //machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/在Keras上建立我的LSTM網絡。
所有這些概念對我來說都很難理解,所以請原諒我,如果你在我的代碼中看到一些非常愚蠢的東西。
我有155個不同大小的句子已被標記為標簽。
所有這些標記的句子都在training.csv文件中:
8,9,1,2,3,4,5,6,7
16,15,4,6,10,11,12,13,14
17,18
22,19,20,21
24,20,21,23
(每個整數代表一個單詞)
所有結果都在另一個label.csv文件中:
6,7,17,15,16,18,4,27,30,30,29,14,16,20,21 ...
我在trainings.csv中有155行,當然在label.csv中有155行
我的詞典有1038個單詞 。
這是我目前的代碼:
total_words = 1039
## fix random seed for reproducibility
numpy.random.seed(7)
datafile = open('training.csv', 'r')
datareader = csv.reader(datafile)
data = []
for row in datareader:
data.append(row)
X = data;
Y = numpy.genfromtxt("labels.csv", dtype="int", delimiter=",")
max_sentence_length = 500
X_train = sequence.pad_sequences(X, maxlen=max_sentence_length)
X_test = sequence.pad_sequences(X, maxlen=max_sentence_length)
# create the model
embedding_vecor_length = 32
model = Sequential()
model.add(Embedding(total_words, embedding_vecor_length, input_length=max_sentence_length))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_train, Y, epochs=3, batch_size=64)
# Final evaluation of the model
scores = model.evaluate(X_train, Y, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))
這個模型永遠不會收斂:
155/155 [==============================] - 4s - loss: 0.5694 - acc: 0.0000e+00
Epoch 2/3
155/155 [==============================] - 3s - loss: -0.2561 - acc: 0.0000e+00
Epoch 3/3
155/155 [==============================] - 3s - loss: -1.7268 - acc: 0.0000e+00
我希望將24個標簽中的一個作為結果,或者每個標簽的概率列表。
我在這做錯了什么?
謝謝你的幫助!
由於我的問題發布了很好的評論,我已經更新了我的代碼。
Y_train = numpy.genfromtxt("labels.csv", dtype="int", delimiter=",")
Y_test = numpy.genfromtxt("labels_test.csv", dtype="int", delimiter=",")
Y_train = np_utils.to_categorical(Y_train)
Y_test = np_utils.to_categorical(Y_test)
max_review_length = 50
X_train = sequence.pad_sequences(X_train, maxlen=max_review_length)
X_test = sequence.pad_sequences(X_test, maxlen=max_review_length)
model = Sequential()
model.add(Embedding(top_words, 32, input_length=max_review_length))
model.add(LSTM(10, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(31, activation="softmax"))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=["accuracy"])
model.fit(X_train, Y_train, epochs=100, batch_size=30)
我想我可以使用LSTM尺寸(10或100),紀元數量和批量大小。
模型的准確性很差(40%)。 但目前我認為這是因為我沒有足夠的數據(24個標簽有150個句子)。
我將把這個項目置於待機模式,直到我獲得更多數據。
如果有人有一些改進此代碼的想法,請隨時發表評論!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.