التعرف على المشاعر باستخدام شبكة عصبية تلافيفية


لطالما كان التعرف على المشاعر تحديا مثيرا للعلماء. في الآونة الأخيرة ، أعمل على مشروع تجريبي لـ SER (التعرف على عاطفة الكلام) لفهم إمكانات هذه التكنولوجيا - ولهذا اخترت المستودعات الأكثر شعبية في جيثب وجعلتها أساس مشروعي.

قبل أن نبدأ في فهم المشروع ، سيكون من الجيد أن نتذكر أي نوع من الاختناقات لدى SER.

العقبات الرئيسية


  • العواطف ذاتية ، حتى الناس يفسرونها بشكل مختلف. من الصعب تحديد مفهوم "العاطفة" ذاته ؛
  • التعليق على الصوت صعب. هل يجب أن نحتفل بطريقة أو بأخرى بكل كلمة أو جملة أو كل الاتصالات ككل؟ مجموعة من أي نوع من العواطف لاستخدامها في الاعتراف؟
  • جمع البيانات هو أيضا ليس بالأمر السهل. يمكن جمع الكثير من البيانات الصوتية من الأفلام والأخبار. ومع ذلك ، فإن كلا المصدرين "متحيزان" لأن الأخبار يجب أن تكون محايدة ، ويتم تشغيل عواطف الممثلين. من الصعب العثور على مصدر "موضوعي" للبيانات الصوتية.
  • تتطلب بيانات العلامات موارد بشرية ووقتية كبيرة. على عكس رسم الإطارات على الصور ، فإنه يتطلب من الأفراد المدربين خصيصًا الاستماع إلى التسجيلات الصوتية بالكامل وتحليلها وتقديم التعليقات. وبعد ذلك يجب أن يكون موضع تقدير هذه التعليقات من قبل العديد من الأشخاص الآخرين ، لأن التقييمات ذاتية.


وصف المشروع


استخدام شبكة عصبية تلافيفية للتعرف على المشاعر في التسجيلات الصوتية. ونعم ، لم يشير صاحب المستودع إلى أي مصادر.

وصف البيانات


هناك مجموعتان من البيانات تم استخدامها في مستودعات RAVDESS و SAVEE ، لقد قمت فقط بتكييف RAVDESS في نموذجي. هناك نوعان من البيانات في سياق RAVDESS: الكلام والأغنية.

Dataset RAVDESS (قاعدة بيانات Ryerson الصوتية والمرئية للنطق العاطفي والأغنية) :

  • سجل 12 ممثل و 12 ممثلة خطابهم وأغانيهم في أدائهم ؛
  • الممثل رقم 18 ليس لديه أغنيات مسجلة.
  • العواطف (الاشمئزاز) ، المحايد (المحايد) والمفاجآت (مفاجأة) غائبة في بيانات "الأغنية".

انهيار العاطفة:


مخطط توزيع العاطفة:


استخراج الميزة


عندما نعمل مع مهام التعرف على الكلام ، فإن معاملات Cepstral (MFCCs) هي تقنية متقدمة ، على الرغم من حقيقة أنها ظهرت في الثمانينات.

اقتباس من البرنامج التعليمي MFCC :
يحدد هذا الشكل صوت الإخراج. إذا استطعنا تحديد النموذج ، فسوف يعطينا تمثيلًا دقيقًا للصوت الذي بدا. يتجلى شكل الجهاز الصوتي في غلاف من الطيف القصير ، وتعمل MFCC على عرض هذا الظرف بدقة.


الموجي


الطيفية

نحن نستخدم MFCC كميزة الإدخال. إذا كنت مهتمًا بمعرفة المزيد حول ماهية مركز عملائي ، فهذا البرنامج التعليمي يناسبك. يمكن بسهولة تنزيل البيانات وتحويلها إلى تنسيق MFCC باستخدام حزمة librosa Python.

نموذج العمارة الافتراضي


طور المؤلف نموذجًا لشبكة CNN باستخدام حزمة Keras ، حيث أنشأ 7 طبقات - ستة طبقات Con1D وطبقة واحدة كثيفة (كثيفة).

model = Sequential() model.add(Conv1D(256, 5,padding='same', input_shape=(216,1))) #1 model.add(Activation('relu')) model.add(Conv1D(128, 5,padding='same')) #2 model.add(Activation('relu')) model.add(Dropout(0.1)) model.add(MaxPooling1D(pool_size=(8))) model.add(Conv1D(128, 5,padding='same')) #3 model.add(Activation('relu')) #model.add(Conv1D(128, 5,padding='same')) #4 #model.add(Activation('relu')) #model.add(Conv1D(128, 5,padding='same')) #5 #model.add(Activation('relu')) #model.add(Dropout(0.2)) model.add(Conv1D(128, 5,padding='same')) #6 model.add(Activation('relu')) model.add(Flatten()) model.add(Dense(10)) #7 model.add(Activation('softmax')) opt = keras.optimizers.rmsprop(lr=0.00001, decay=1e-6) 

علق المؤلف على الطبقتين 4 و 5 في الإصدار الأخير (18 سبتمبر 2018) وحجم الملف النهائي لهذا النموذج لا يلائم الشبكة المقدمة ، لذلك لا يمكنني تحقيق نفس النتيجة بدقة - 72 ٪.

تم تدريب النموذج ببساطة باستخدام المعلمات batch_size=16 epochs=700 ، دون أي جدول تدريب ، إلخ.

 # Compile Model model.compile(loss='categorical_crossentropy', optimizer=opt,metrics=['accuracy']) # Fit Model cnnhistory=model.fit(x_traincnn, y_train, batch_size=16, epochs=700, validation_data=(x_testcnn, y_test)) 

هنا categorical_crossentropy هي دالة للخسائر ، ومقياس التقييم هو الدقة.

تجربتي


تحليل البيانات الاستكشافية


في مجموعة بيانات RAVDESS ، يُظهر كل ممثل 8 عواطف ، ويعلن ويغني جملتين ، مرتين لكل منهما. نتيجة لذلك ، يتم الحصول على 4 أمثلة لكل مشاعر من كل ممثل ، باستثناء العواطف المحايدة المذكورة أعلاه ، والاشمئزاز ، والمفاجأة. يدوم كل صوت حوالي 4 ثوانٍ ، وفي الثواني الأولى والأخيرة يكون الصمت غالبًا.

العروض النموذجية :

مراقبة


بعد أن حددت مجموعة بيانات من ممثل واحد وممثلة واحدة ، ثم استمعت إلى جميع سجلاتهم ، أدركت أن الرجال والنساء يعبرون عن مشاعرهم بطرق مختلفة. على سبيل المثال:

  • غضب الذكور (غاضب) هو أعلى من الصوت.
  • فرحة الرجال (سعيد) والإحباط (حزين) - سمة في الضحك والبكاء نغمات خلال "الصمت" ؛
  • فرحة الإناث (سعيد) ، والغضب (الغاضب) والإحباط (حزين) هي بصوت أعلى.
  • اشمئزاز الأنثى (اشمئزاز) يحتوي على صوت القيء.

تكرار التجربة


قام المؤلف بإزالة الطبقات المحايدة والاشمئزاز والدهشة لجعل التعرف على فئة RAVDESS من فئة 10. في محاولة لتكرار تجربة المؤلف ، حصلت على هذه النتيجة:



ومع ذلك ، اكتشفت وجود تسرب للبيانات عندما تكون مجموعة البيانات للتحقق من الصحة مطابقة لمجموعة بيانات الاختبار. لذلك ، كررت الفصل بين البيانات ، وعزل مجموعات البيانات من ممثلين اثنين والممثلات اثنين بحيث لم تكن مرئية أثناء الاختبار:

  • تستخدم الجهات الفاعلة من 1 إلى 20 في مجموعات Train / Valid بنسبة 8: 2 ؛
  • الجهات الفاعلة 21 إلى 24 معزولة عن الاختبارات ؛
  • مجموعة المعلمات القطار: (1248 ، 216 ، 1) ؛
  • مجموعة صالحة المعلمات: (312 ، 216 ، 1) ؛
  • اختبار مجموعة المعلمات: (320 ، 216 ، 1) - (معزولة).

لقد قمت بإعادة تدريب النموذج وإليكم النتيجة:


اختبار الأداء


من الرسم البياني Train Valid Gross ، من الواضح أنه لا يوجد تقارب للفئات العشرة المختارة. لذلك ، قررت تقليل تعقيد النموذج وترك مشاعر الذكور فقط. قمت بعزل اثنين من الممثلين في مجموعة الاختبار ، ووضع الباقي في مجموعة القطار / صالحة ، نسبة 8: 2. هذا يضمن عدم وجود خلل في مجموعة البيانات. ثم قمت بتدريب البيانات من الذكور والإناث بشكل منفصل لإجراء الاختبار.

مجموعة بيانات الذكور

  • مجموعة القطار - 640 عينة من الجهات الفاعلة 1-10 ؛
  • مجموعة صالحة - 160 عينات من الجهات الفاعلة 1-10 ؛
  • مجموعة اختبار - 160 عينات من الجهات الفاعلة 11-12.

الخط المرجعي: الرجال


مجموعة بيانات الإناث

  • مجموعة القطار - 608 عينات من الممثلات 1-10 ؛
  • مجموعة صالحة - 152 عينات من الممثلات 1-10 ؛
  • مجموعة اختبار - 160 عينات من الممثلات 11-12.

الخط المرجعي: النساء


كما ترون ، مصفوفات الخطأ مختلفة.

الرجال: الغاضب والسعيد هي الطبقات الرئيسية المتوقعة في النموذج ، لكنهم ليسوا على حد سواء.

النساء: اضطراب (حزين) وفرح (سعيد) - فصول متوقعة بشكل أساسي في النموذج ؛ الغضب والفرح مرتبكون بسهولة.

استذكارًا لملاحظات تحليل بيانات الذكاء ، أظن أن الأنثى الغاضبة والسعيدة تشبه نقطة الخلط لأن طريقة تعبيرها هي ببساطة رفع أصواتها.

علاوة على ذلك ، أشعر بالفضول من أنه إذا قمت بتبسيط النموذج إلى أبعد من ذلك ، فاترك الطبقات الإيجابية والمحايدة والسلبية فقط. أو فقط الإيجابية والسلبية. باختصار ، قمت بتجميع العواطف في فصول 2 و 3 ، على التوالي.

2 فصول:

  • إيجابي: الفرح (سعيد) ، الهدوء (الهدوء) ؛
  • سلبي: الغضب ، الخوف (الخوف) ، الإحباط (الحزن).

3 فصول:

  • إيجابي: الفرح (سعيد) ؛
  • محايد: هادئ (هادئ) ، محايد (محايد) ؛
  • سلبي: الغضب ، الخوف (الخوف) ، الإحباط (الحزن).

قبل بدء التجربة ، قمت بإعداد بنية النموذج باستخدام بيانات الذكور ، مما يجعل التعرف على 5 فصول.

 #   -  target_class = 5 #  model = Sequential() model.add(Conv1D(256, 8, padding='same',input_shape=(X_train.shape[1],1))) #1 model.add(Activation('relu')) model.add(Conv1D(256, 8, padding='same')) #2 model.add(BatchNormalization()) model.add(Activation('relu')) model.add(Dropout(0.25)) model.add(MaxPooling1D(pool_size=(8))) model.add(Conv1D(128, 8, padding='same')) #3 model.add(Activation('relu')) model.add(Conv1D(128, 8, padding='same')) #4 model.add(Activation('relu')) model.add(Conv1D(128, 8, padding='same')) #5 model.add(Activation('relu')) model.add(Conv1D(128, 8, padding='same')) #6 model.add(BatchNormalization()) model.add(Activation('relu')) model.add(Dropout(0.25)) model.add(MaxPooling1D(pool_size=(8))) model.add(Conv1D(64, 8, padding='same')) #7 model.add(Activation('relu')) model.add(Conv1D(64, 8, padding='same')) #8 model.add(Activation('relu')) model.add(Flatten()) model.add(Dense(target_class)) #9 model.add(Activation('softmax')) opt = keras.optimizers.SGD(lr=0.0001, momentum=0.0, decay=0.0, nesterov=False) 

أضفت طبقتين من Conv1D ، وطبقة واحدة من MaxPooling1D وطبقتين من BarchNormalization ؛ لقد غيرت أيضًا قيمة التسرب إلى 0.25. أخيرًا ، قمت بتغيير المُحسِّن إلى SGD بسرعة تعلم تبلغ 0.0001.

 lr_reduce = ReduceLROnPlateau(monitor='val_loss', factor=0.9, patience=20, min_lr=0.000001) mcp_save = ModelCheckpoint('model/baseline_2class_np.h5', save_best_only=True, monitor='val_loss', mode='min') cnnhistory=model.fit(x_traincnn, y_train, batch_size=16, epochs=700, validation_data=(x_testcnn, y_test), callbacks=[mcp_save, lr_reduce]) 

لتدريب النموذج ، قمت بتطبيق تخفيض في "هضبة التدريب" وحفظت فقط أفضل نموذج بأقل قيمة من val_loss . وهنا النتائج للفئات المستهدفة المختلفة.

أداء نموذج جديد


الرجال ، 5 فصول



النساء ، الصف 5

الرجال ، الصف 2


الرجال ، 3 فصول


زيادة (زيادة)


عندما عززت بنية النموذج والمحسن وسرعة التدريب ، اتضح أن النموذج لا يزال لا يتقارب في وضع التدريب. لقد اقترحت أن هذه مشكلة في كمية البيانات ، نظرًا لأن لدينا 800 عينة فقط. هذا قادني إلى طرق لزيادة الصوت ، وفي النهاية ضاعفت مجموعات البيانات. دعونا نلقي نظرة على هذه الأساليب.

الرجال ، 5 فصول


الزيادة الديناميكية

 def dyn_change(data): """    """ dyn_change = np.random.uniform(low=1.5,high=3) return (data * dyn_change) 



ضبط الملعب

 def pitch(data, sample_rate): """    """ bins_per_octave = 12 pitch_pm = 2 pitch_change = pitch_pm * 2*(np.random.uniform()) data = librosa.effects.pitch_shift(data.astype('float64'), sample_rate, n_steps=pitch_change, bins_per_octave=bins_per_octave) 


الإزاحة

 def shift(data): """   """ s_range = int(np.random.uniform(low=-5, high = 5)*500) return np.roll(data, s_range) 


مضيفا الضوضاء البيضاء

 def noise(data): """    """ #     : https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.random.html noise_amp = 0.005*np.random.uniform()*np.amax(data) data = data.astype('float64') + noise_amp * np.random.normal(size=data.shape[0]) return data 


من الملاحظ أن الزيادة تزيد إلى حد كبير من الدقة ، وتصل إلى 70٪ في الحالة العامة. خاصة في حالة إضافة اللون الأبيض ، مما يزيد من الدقة إلى 87.19٪ - ومع ذلك ، تنخفض دقة الاختبار وقياس F1 بأكثر من 5٪. ثم حصلت على فكرة الجمع بين العديد من أساليب التعزيز للحصول على نتيجة أفضل.

الجمع بين عدة طرق


الضوضاء البيضاء + التحيز


اختبار تكبير على الرجال


الرجال ، الصف 2


الضوضاء البيضاء + التحيز

لجميع العينات


الضوضاء البيضاء + التحيز

فقط للعينات الإيجابية ، حيث أن المجموعة 2-فئة غير متوازنة (نحو عينات سلبية).


الملعب + الضوضاء البيضاء
لجميع العينات


الملعب + الضوضاء البيضاء

للحصول على عينات إيجابية فقط


استنتاج


في النهاية ، تمكنت من تجربة مجموعة بيانات ذكور فقط. أعيد تقسيم البيانات لتفادي عدم التوازن ونتيجة لذلك تسرب البيانات. قمت بإعداد النموذج لتجربة أصوات الذكور ، حيث أردت تبسيط النموذج قدر الإمكان للبدء. أجريت أيضًا اختبارات باستخدام طرق تكبير مختلفة ؛ عملت إضافة الضوضاء البيضاء والتحيز بشكل جيد على البيانات غير المتوازنة.

النتائج


  • العواطف ذاتية ويصعب إصلاحها ؛
  • من الضروري تحديد المشاعر المناسبة للمشروع مسبقًا ؛
  • لا تثق دائمًا بالمحتوى مع Github ، حتى إذا كان به العديد من النجوم ؛
  • مشاركة البيانات - ضعها في الاعتبار ؛
  • يعطي تحليل البيانات الاستكشافية دائمًا فكرة جيدة ، ولكن عليك التحلي بالصبر عندما يتعلق الأمر بالعمل مع البيانات الصوتية ؛
  • حدد ما ستعطيه لمدخلات النموذج الخاص بك: الجملة ، سجل كامل أو تعجب؟
  • يعد نقص البيانات أحد عوامل النجاح المهمة في SER ، ومع ذلك ، فإن إنشاء مجموعة بيانات جيدة ذات عواطف مهمة معقدة ومكلفة ؛
  • تبسيط النموذج الخاص بك في حالة نقص البيانات.

مزيد من التحسن


  • لقد استخدمت فقط أول 3 ثوان كمدخلات لتقليل حجم البيانات الإجمالي - استخدم المشروع الأصلي 2.5 ثانية. أرغب في تجربة تسجيلات كاملة الحجم ؛
  • يمكنك معالجة البيانات مسبقًا: تقليم الصمت وتطبيع الطول عن طريق الحشو باستخدام الأصفار وما إلى ذلك ؛
  • حاول الشبكات العصبية المتكررة لهذه المهمة.

Source: https://habr.com/ru/post/ar461435/


All Articles