تحية للجميع!ومع ذلك ، فإن جميع الأشخاص الذين يتلقون التعليم العالي ، دون طردهم ، يصلون إلى مرحلة كتابة دبلوم. لم أكن استثناء. كنت أرغب في تنفيذ شيء مثير للاهتمام وإتقان ما لم يتم استكشافه حتى الآن ، لذلك وجهت الانتباه إلى موضوع الشبكات العصبية والذكاء الاصطناعي بشكل عام. والمهمة التي قمت بحلها بمساعدة ذلك هي تحليل نغمة النص ، والتي يتم استخدامها بالفعل على نطاق واسع في أنظمة المراقبة المختلفة. سأحاول وصف عملية حلها في هذه المقالة.باختصار ، الهدف هو فهم ما إذا كانت العبارة لها دلالة إيجابية أو سلبية. أريد أن أقول على الفور أن هذه المشكلة يمكن حلها بعدة طرق ، وليس فقط عن طريق الشبكات العصبية. يمكننا عمل قواميس يتم فيها تمييز مواقف الكلمات ، إلخ. (جميع الطرق متوفرة بكثرة في المحور) ، ولكن كل طريقة قد تذهب إلى أبعد من ذلك وفقًا للمقالة ، لذلك سنترك مراجعتها في وقت لاحق.البيانات
كانت المهمة الأولى في طريقي هي جمع ومعالجة البيانات للتدريب. مجموعة البيانات الجيدة لمثل هذه الحالة هي مجموعة النصوص القصيرة التي كتبها Y. Rubtsova ، والتي كانت مقسمة سابقًا إلى جمل سلبية وإيجابية تم جمعها على Twitter. ما هو مناسب بشكل خاص - كل هذا موجود بتنسيق CSV.إعداد التدريب
انتبه إلى النموذج الذي يتم فيه تقديم البيانات - الكثير من الرموز والروابط والشخصيات غير الضرورية والزيارات. كل هذا ليس معلومات مهمة ويتعارض فقط مع التعلم ، علاوة على ذلك ، يجب إزالة كل شيء باللغة اللاتينية. لذلك ، سيكون النص جيدًا في المعالجة المسبقة.def preprocessText(text):
text = text.lower().replace("", "")
text = re.sub('((www\.[^\s]+)|(https?://[^\s]+))', ' ', text)
text = re.sub('@[^\s]+', ' ', text)
text = re.sub('[^a-zA-Z--1-9]+', ' ', text)
text = re.sub(' +', ' ', text)
return text.strip()
بعد التخلص من جميع الجمل من الملف ، نضعها في أحرف صغيرة ، ونستبدل "" بـ "e" ، والمراجع ، والإشارات ، ونقوم ببساطة بإزالة الكلمات الإنجليزية لعدم وجود معنى. باختصار ، نجعلها من نفس النوع ، وننظف "القمامة" غير الضرورية للتدريب.أدوات
بالطبع ، إذا كان لديك جهاز كمبيوتر فائق في المنزل ، يمكنك التمرير لأسفل هذا القسم أكثر ، بحثًا عن جزء مثير للاهتمام. أنصح بقية خدمة Google Colab ، والتي تسمح لك بتشغيل Jupyter Notebooks (والذين لم يسمعوا بها ، لمساعدة محرك البحث) باستخدام متصفح فقط ، ويتم كل العمل على جهاز افتراضي في السحابة.يقتصر الحجم المؤقت للجلسة التي أعطيت لك للعمل على 12 ساعة - يمكنك الانتهاء منها في وقت سابق ، وبعد ذلك تتم إعادة تعيين كل شيء.نكتب رمزنا الجميل
مثل أي وافد جديد لتعلم الآلة ، اخترت Python - لأنها بسيطة ، والمكتبات سحابة كاملة.أولاً ، سينفذ مدير الحزم أمرًا مهمًا واحدًا ، والذي سأشرح معناه بعد ذلك بقليل.
بعد ذلك ، نستورد المكتبات التي سنستخدمها عند تدريب الشبكة وإعداد البيانات ، أعتقد أن العديد منها مألوف لك.
أخيرا إلى النقطة.لذا ، لماذا قمنا بتنزيل مكتبة Tensorflow النصية واستيرادها؟ والحقيقة هي أنه لا يمكن "تغذية" العبارات بالشبكة بالشكل الذي يمكن قراءته به. هذا هو المكان الذي يأتي فيه Word Embedding ، وهو مصطلح لم أجد ترجمة كافية له ، وبشكل عام أشك في وجوده. ولكن بشكل تقريبي ، نحن نتحدث عن مطابقة ناقل لكلمة. يقال هذا بشكل جيد هنا .نحتاج إلى تحويل جمل كاملة إلى متجه ، لذلك نستخدم حلًا جاهزًا من Google - Universal Sentence Encoder.
يمكنك تنزيله من المحور هنا . هناك ، بالمناسبة ، هناك العديد من الحلول الجاهزة الأكثر إثارة للاهتمام والتي يمكن استخدامها عند تعلم شبكة عصبية ، حتى لا تزعج نفسك.
يتم تصنيف جميع التغريدات حسب الفئة - سيئة / جيدة. نقوم بإنشاء إطار بيانات الباندا الذي يتم فرزهم فيه حسب الفئة (السيئات غير مرئية في الصورة ، بسبب حقيقة أنها تتناسب).
قمنا بتحضير البيانات - دعنا ننتقل إلى النموذج نفسه. للقيام بذلك ، استخدم إطار عمل Keras.from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential, load_model
model = tf.keras.Sequential()
model.add(
tf.keras.layers.Dense(
units=256,
input_shape=(X_train.shape[1], ),
activation='relu'
)
)
model.add(
tf.keras.layers.Dropout(rate=0.5)
)
model.add(
tf.keras.layers.Dense(
units=128,
activation='relu'
)
)
model.add(
tf.keras.layers.Dropout(rate=0.5)
)
model.add(tf.keras.layers.Dense(2, activation='softmax'))
model.compile(
loss='categorical_crossentropy',
optimizer=tf.keras.optimizers.Adam(0.001),
metrics=['accuracy']
)
history = model.fit(
X_train, y_train,
epochs=10,
batch_size=16,
validation_split=0.1,
verbose=1,
shuffle=True
)
model.evaluate(X_test, y_test)
القليل عن النموذج نفسه. لديها طبقات المدخلات والمخفية والمخرجات.كل طبقة لها وظيفة التنشيط الخاصة بها.شرح صغير: في الشبكات العصبية الاصطناعية ، تحدد وظيفة تنشيط الخلايا العصبية إشارة الخرج ، والتي يتم تحديدها بواسطة إشارة الإدخال أو مجموعة من إشارات الإدخال. يمكنك قراءة المزيد هنا ، بالمناسبة ، يوجد الكثير منها لمهام مختلفة ، لكننا سنعمل فقط مع 2. نقومبتعيين وظيفة التنشيط ReLu للطبقتين الأوليين . و قبالة اليوم هو Softmax .بالإضافة إلى إضافة طبقات ، يمكنك ملاحظة كلمة "Dropout". ما هذا؟ من الغريب ، ولكن بالإضافة إلى مشكلة نقص التعلم في الشبكة العصبية ، عندما تكون توقعاتها غير صحيحة ، هناك مشكلة الإفراط في التدريب - يشرح النموذج جيدًا فقط أمثلة من عينة التدريب ، والتكيف مع أمثلة التدريب ، بدلاً من التعلم لتصنيف الأمثلة التي لم تشارك في التدريب. هذا مبتذل على البيانات الجديدة ، نموذجك الجميل ، الذي قام بعمله بشكل رائع من قبل ، ببساطة "يطير" ويبدأ في مفاجأتك غير السارة. لذا ، فإن Dropout منخرط في حقيقة أنه مع بعض الاحتمالية المحددة "تقوم بإيقاف" الخلايا العصبية من الشبكة ، بحيث تتوقف عن المشاركة في عملية التعلم. ثم يتم حساب متوسط نتائج العديد من الشبكات (عندما يتم استبعاد عصبون من الشبكة ، يتم الحصول على شبكة جديدة).بالمناسبة ، مقال رائع لأولئك المهتمين.يمكنك البدء في التعلم!Train on 53082 samples, validate on 5898 samples
Epoch 1/10
53082/53082 [==============================] - 12s 223us/sample - loss: 0.5451 - accuracy: 0.7207 - val_loss: 0.5105 - val_accuracy: 0.7397
Epoch 2/10
53082/53082 [==============================] - 11s 213us/sample - loss: 0.5129 - accuracy: 0.7452 - val_loss: 0.5000 - val_accuracy: 0.7523
Epoch 3/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.4885 - accuracy: 0.7624 - val_loss: 0.4914 - val_accuracy: 0.7538
Epoch 4/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.4686 - accuracy: 0.7739 - val_loss: 0.4865 - val_accuracy: 0.7589
Epoch 5/10
53082/53082 [==============================] - 11s 214us/sample - loss: 0.4474 - accuracy: 0.7889 - val_loss: 0.4873 - val_accuracy: 0.7616
Epoch 6/10
53082/53082 [==============================] - 11s 216us/sample - loss: 0.4272 - accuracy: 0.8004 - val_loss: 0.4878 - val_accuracy: 0.7603
Epoch 7/10
53082/53082 [==============================] - 11s 213us/sample - loss: 0.4081 - accuracy: 0.8111 - val_loss: 0.4986 - val_accuracy: 0.7594
Epoch 8/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3899 - accuracy: 0.8241 - val_loss: 0.5101 - val_accuracy: 0.7564
Epoch 9/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3733 - accuracy: 0.8315 - val_loss: 0.5035 - val_accuracy: 0.7633
Epoch 10/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3596 - accuracy: 0.8400 - val_loss: 0.5239 - val_accuracy: 0.7620
6554/6554 [==============================] - 0s 53us/sample - loss: 0.5249 - accuracy: 0.7524
[0.5249265961105736, 0.752365]
لذا ، مرت 10 عصور. بالنسبة لأولئك الذين ليسوا على دراية بمثل هذه المفاهيم ، سأشرح التعريف من الإنترنت: العصر عبارة عن تكرار واحد في عملية التعلم ، بما في ذلك عرض جميع الأمثلة من مجموعة التدريب ، وربما التحقق من جودة التدريب على مجموعة التحكم. لذا فقد مرت جميع بياناتنا 10 مرات بشكل كامل خلال العملية بأكملها.نتيجة
بالطبع ، ستكون هناك حاجة إلى الشبكة أكثر من مرة وسيكون من الرائع معرفة كيفية حفظها للأجيال القادمة ، حتى لا يضطروا إلى إعادة تدريبها وكل ذلك.يتم حفظ البنية بتنسيق JSON ، وتتم كتابة الأوزان في ملف h5 .محرك البحث مليء بالأدلة حول كيفية تحريك العملية العكسية لتهيئة الشبكة من هذه الملفات ، لذلك لن أصفها.باستخدام طريقة التنبؤ ، سنحاول معرفة رأي الشبكة ومكون الدرجة اللونية لعبارتين مختلفتين بشكل واضح في هذا الصدد. صحيح ، أنها لا تزال بحاجة إلى اختزالها إلى نموذج مصفوفة أولاً ، لكننا نعرف بالفعل كيفية القيام بذلك باستخدام حل جاهز.عند الإخراج ، نرى رقمين - احتمال أن تنتمي العبارة إلى الفئات "السلبية" / "الإيجابية". أعتقد أن الصورة تظهر بوضوح أن هناك اختلافًا) لذا كانت الكلمات المتشابهة في النهاية وقد قامت الشبكة بعمل رائع في علاقتها بفصولهم.استنتاج
لذلك ، أود أن أقول إن إتقان الأدوات المتقدمة لتطوير الشبكات العصبية وحل المشكلات البسيطة ، بعد تحديد الخطوات اللازمة لحلها بشكل صحيح وقراءة النظرية قليلاً ، يبدو أنها مهمة سهلة للغاية. أود أن أشير إلى أنني رأيت عدة مقالات حول موضوع التحليل اللوني على حبري ، ولكن كان لا يزال من المثير للاهتمام تجربة شيء أسهل وبدون كتلة نصية ضخمة ، على الرغم من أنك بحاجة إلى دراسة النظرية دون قيد أو شرط :)يمكنك العثور على الرمز هنا إذا وضعت علامة نجمية في المشروع ، فسيكون ذلك رائعًا. إذا كنت بحاجة إلى ملفات ذات أوزان وبنية شبكة ، بالإضافة إلى البيانات التي تمت معالجتها - اكتب إلى التعليقات ، وأضف إلى المستودع.