جارٍ تحميل الدرس...
في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
الشبكات العصبية - الدرس 10
LSTM على مجموعة بيانات 20 Newsgroups باستخدام Kerasبناء ومقارنة LSTM قياسية مقابل LSTM ثنائية الاتجاه لتصنيف النصوص
20 Newsgroupscomp.graphics، sci.space، rec.autos، talk.politics.misc، ...)؛ ويستخدم هذا المعمل 10 فئات مختارةfrom sklearn.datasets import fetch_20newsgroups
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Embedding, LSTM, Dense, Bidirectionalcategories = ['sci.space', 'comp.graphics', 'rec.sport.baseball', 'talk.politics.misc',
'sci.electronics', 'soc.religion.christian', 'rec.autos',
'talk.politics.mideast', 'comp.sys.mac.hardware', 'misc.forsale']
newsgroups = fetch_20newsgroups(subset='train', categories=categories)
texts = newsgroups.data
labels = newsgroups.target
# len(texts) -> 5750fetch_20newsgroups يرجع 5750 منشورا موزعة على 10 فئات0 إلى 9 يقابل newsgroups.target_namesTokenizer: تحويل النص إلى متسلسلات صحيحةTokenizer(num_words=vocab_size) المفردات على أكثر N كلمة تكرارا؛ وتحذف الكلمات الأندرنص خام
fit_on_texts
يبني قاموس الكلمة إلى عدد صحيح
texts_to_sequences
يحول النص إلى أعداد صحيحة
pad_sequences
يحشو أو يقتطع إلى طول ثابت
vocab_size, maxlen = 10000, 200
tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
padded_sequences = pad_sequences(sequences, maxlen=maxlen, padding='post')
encoder = LabelBinarizer()
one_hot_labels = encoder.fit_transform(labels)one-hotEmbedding| المعامل | المعنى |
|---|---|
input_dim | حجم المفردات |
output_dim | بعد متجه التضمين |
input_length | طول المتسلسلة الثابت |
Embedding(input_dim=vocab_size, output_dim=128, input_length=maxlen)Embedding بأبعاد 128one-hot خامLSTM| المعامل | المعنى |
|---|---|
units | عدد الوحدات المخفية / خلايا الذاكرة |
return_sequences=True | تعيد متسلسلة المخرج كاملة، ضرورية عند تكديس طبقات LSTM |
dropout | إسقاط على اتصالات الإدخال |
recurrent_dropout | إسقاط على الاتصالات المتكررة (حالة الذاكرة) بين الخطوات الزمنية |
LSTM(units=64, return_sequences=True)
LSTM(units=32, dropout=0.2, recurrent_dropout=0.2)LSTM أولى تعيد المتسلسلة كاملة، وطبقة ثانية بإسقاط لمنع الإفراط في التخصيصLSTM قياسيةLSTM، ثم صنف إلى 10 فئات بدالة softmaxmodel_lstm = Sequential()
model_lstm.add(Embedding(input_dim=vocab_size, output_dim=128, input_length=maxlen))
model_lstm.add(LSTM(units=64, return_sequences=True))
model_lstm.add(LSTM(units=32, dropout=0.2, recurrent_dropout=0.2))
model_lstm.add(Dense(10, activation='softmax'))
model_lstm.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model_lstm.fit(padded_sequences, one_hot_labels, epochs=10, batch_size=32, validation_split=0.2)Sequential بطبقتي LSTM مكدستين، مدرب لـ 10 حقبEpoch 1/10 accuracy: 0.1436 val_accuracy: 0.2157
Epoch 10/10 accuracy: 0.5796 val_accuracy: 0.519152% فقط دقة تحقق بعد 10 حقبBidirectionalLSTM لمعالجة المتسلسلة في الاتجاهين معا، الأمامي والخلفيBidirectional(LSTM(units=64, dropout=0.2, recurrent_dropout=0.2))LSTM بـ BidirectionalLSTM ثنائية الاتجاهLSTM مغلفة بـ Bidirectionalmodel_bi = Sequential()
model_bi.add(Embedding(input_dim=vocab_size, output_dim=128, input_length=maxlen))
model_bi.add(Bidirectional(LSTM(units=64, dropout=0.2, recurrent_dropout=0.2)))
model_bi.add(Dense(10, activation='softmax'))
model_bi.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model_bi.fit(padded_sequences, one_hot_labels, epochs=10, batch_size=32, validation_split=0.2)LSTM الأولى مغلفة بـ BidirectionalEpoch 1/10 accuracy: 0.1717 val_accuracy: 0.3843
Epoch 5/10 accuracy: 0.9387 val_accuracy: 0.7783
Epoch 10/10 accuracy: 0.9971 val_accuracy: 0.807080.7% مقابل 51.9%، رغم أن دقة التدريب القريبة من 1.0 تشير إلى إفراط في التخصيصنص جديد
ترميز وحشو
texts_to_sequences ثم pad_sequences
تنبؤ
model_bi.predict
sample_text = ["NASA is planning a mission to Jupiter"]
seq = tokenizer.texts_to_sequences(sample_text)
pad = pad_sequences(seq, maxlen=maxlen, padding='post')
prediction = model_bi.predict(pad)
predicted_class_index = np.argmax(prediction)
print("Actual Category:", newsgroups.target_names[predicted_class_index])
# Predicted class index: 6 -> sci.space (correct!)| النموذج | طريقة معالجة التسلسل |
|---|---|
| LSTM القياسية | تعالج المتسلسلات من الماضي إلى المستقبل فقط |
| LSTM ثنائية الاتجاه | تعالج المتسلسلات في الاتجاهين، وتتعلم سياقا أغنى، وعموما أفضل لمعالجة اللغة الطبيعية |
LSTM أخرى وأضف Dropout بعدهاLSTM بـ `GRU` وقارن20 Newsgroups الكاملة للتدريب والاختبار؛ وجرب أطوال متسلسلات وأحجام حالة مخفية مختلفةEmbedding تمثيلات كلمات كثيفة بدلا من استخدام متجهات one-hot خامreturn_sequences=True ضرورية عند تكديس طبقات LSTM متعددةdropout وrecurrent_dropout طبقات LSTM ضد الإفراط في التخصيص على اتصالات الإدخال والاتصالات المتكررة على التوالي80.7% مقابل 51.9% دقة تحقق)99.7% تدريبا مقابل 80.7% تحققا) إشارة واضحة على إفراط في التخصيص تستحق المعالجةMahmoud Abas|LSTM على مجموعة بيانات 20 Newsgroups باستخدام Keras