簡體   English   中英

使用LSTM網絡和Keras進行文本分類

[英]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網絡。

所有這些概念對我來說都很難理解,所以請原諒我,如果你在我的代碼中看到一些非常愚蠢的東西。

1 /准備培訓數據

我有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個單詞

2 /代碼

這是我目前的代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM