كيف بدأ كل شيء
بدأ كل شيء مع Apple Market - لقد وجدت أن لديهم برنامجًا لتحديد نضج البطيخ. البرنامج ... غريب. ما يستحق ، على الأقل ، عرض طرق البطيخ ليس مع مفاصلك ، ولكن ... عبر الهاتف! ومع ذلك ، أردت تكرار هذا الإنجاز على نظام أندرويد أكثر دراية.
اختيار الأداة
تم حل مشكلتنا بعدة طرق ، ولكي أكون صادقًا ، كان عليّ أن أبذل جهودًا كبيرة حتى لا أذهب بالطريقة "البسيطة". أي خذ تحويلات فورييه والمويجات ومحرر الإشارة. ومع ذلك ، أردت اكتساب خبرة في الشبكات العصبية ، لذا دع الشبكات تقوم بتحليل البيانات.
تم اختيار Keras ، إضافة Google لـ TensorFlow و Theano ، كمكتبة لإنشاء الشبكات العصبية وتدريبها. بشكل عام ، إذا كنت قد بدأت للتو بشبكات التعلم العميق ، فمن الأفضل ألا تجد أداة. من ناحية أخرى ، Keras هي أداة قوية محسنة للسرعة والذاكرة والأجهزة (نعم ، يمكنها العمل على بطاقات الفيديو ومجموعاتها). من ناحية أخرى ، كل شيء يمكن أن يكون "مخفيًا" عن المستخدم مخفيًا هناك ، لذلك ليس عليك أن تضغط على أدمغتك على إرساء طبقات الشبكة العصبية ، على سبيل المثال. مريح للغاية.
كما تتطلب Keras والشبكات العصبية بشكل عام معرفة Python - هذه اللغة ، مثل ثعبان ملفوف ... آسف ، مكبوت. باختصار ، يجب ألا تتدخل في التعلم العميق الحديث بدون Python. لحسن الحظ ، يمكن دراسة بايثون في غضون أسبوعين ، في الحالات القصوى - في غضون شهر.
ستحتاج إلى المزيد من المكتبات لـ Python ، لكن هذه أشياء تافهة - أعني ، إذا كنت قد تعاملت مع Python نفسه. سيتطلب التعارف (سطحيًا جدًا) مع NumPy و PyPlot وربما مع مكتبتين ، نأخذ منها وظيفتين. ليس صعب. الحقيقة هي.
حسنًا ، في الختام ، ألاحظ أننا لا نحتاج إلى مجموعات بطاقة الفيديو المذكورة أعلاه - يتم حل مهمتنا عادةً بمساعدة وحدة المعالجة المركزية للكمبيوتر - ببطء ، ولكن ليس ببطء شديد.
خطة العمل
تحتاج أولاً إلى إنشاء شبكة عصبية - على Python و Keras ، تحت Ubuntu. يمكنك - على Ubunta المحاكي. يمكنك - لنظام التشغيل Windows ، ولكن الوقت الإضافي الذي يقضيه كافٍ بالنسبة لك لدراسة Ubuntu المذكور ، ثم العمل بموجبه.
الخطوة التالية هي كتابة برنامج. أخطط للقيام بذلك في Java ضمن Android. سيكون هذا هو النموذج الأولي للبرنامج ، بمعنى أنه سيكون لديه واجهة مستخدم ، ولكن لا توجد شبكة عصبية حتى الآن.
تسألون ما معنى كتابة "سهوا". ولكن إليك الشيء: أي مهمة تتعلق بتحليل البيانات ، عاجلاً أم آجلاً تقع على البحث عن البيانات - لتدريب برنامجنا. في الواقع ، كم عدد البطيخ الذي يجب استغلاله وتذوقه حتى تتمكن الشبكة العصبية من بناء نموذج موثوق به من هذه البيانات؟ مائة؟ المزيد؟
هنا سيساعدنا برنامجنا: تحميله على Google Play ، وتوزيع (حسنًا ، فرض ، أذرع ملتوية) على جميع الأصدقاء الذين ليسوا محظوظين لوجود هاتف يعمل بنظام Android ، والبيانات ، دفق صغير ، يبدأ في التدفق ... وبالمناسبة ، أين؟
الخطوة التالية هي كتابة برنامج خادم يتلقى البيانات من عميل android لدينا. صحيح ، برنامج الخادم هذا بسيط للغاية ، لقد أنهيت كل شيء في حوالي عشرين دقيقة. ولكن ، مع ذلك ، هذه مرحلة منفصلة.
أخيرا ، بيانات كافية. ندرب شبكة عصبية.
نقوم بنقل الشبكة العصبية في Java وإصدار تحديث لبرنامجنا.
الربح وإن لم يكن كذلك. البرنامج مجاني. فقط الخبرة والمطبات المحشوة.
إنشاء شبكة عصبية
العمل مع الصوت ، الذي ، بالطبع ، ينقر على البطيخ ، إما شبكة عصبية متكررة أو ما يسمى شبكة تلافيفية أحادية البعد. علاوة على ذلك ، في السنوات الأخيرة ، كانت الشبكات التطورية تقود بشكل لا لبس فيه ، مما أدى إلى تشريد الشبكات المتكررة. فكرة الشبكة التلافيفية هي أن النافذة تنزلق فوق مصفوفة البيانات - الرسم البياني "شدة الصوت - الوقت" - وبدلاً من تحليل مئات الآلاف من العينات ، نحن نعمل فقط مع ما يدخل النافذة. تجمع الطبقات التالية وتحلل نتائج هذه الطبقة.
لجعلها أكثر وضوحًا ، تخيل أنك بحاجة إلى العثور على طائر النورس في صورة منظر طبيعي للبحر. تقوم بمسح صورة - تتحرك "نافذة" انتباهك على طول صفوف وأعمدة خيالية ، بحثًا عن علامة اختيار بيضاء. هذه هي الطريقة التي تعمل بها شبكة تلافيفية ثنائية الأبعاد ، في حين تفحص شبكة أحادية البعد على إحداثيات واحدة - وهذا هو الخيار الأفضل إذا كنا نتعامل مع إشارة صوتية.
ومع ذلك ، ألاحظ أنه ليس من الضروري التركيز على شبكات 1D. كتمرين ، قمت برسم الصوت وتحليل الصورة النقطية الناتجة كصورة - باستخدام شبكة التفاف ثنائية الأبعاد. ولدهشتي ، لم تكن النتيجة أسوأ مما كانت عليه عند تحليل البيانات "الأولية أحادية البعد".
كان للشبكة المستخدمة الهيكل التالي:
model = Sequential() model.add(Conv1D(filters=32, kernel_size=512, strides=3, padding='valid', use_bias=False, input_shape=(nSampleSize, 1), name='c1d', activation='relu')) model.add(Activation('relu', input_shape=(nSampleSize, 1))) model.add(MaxPooling1D(pool_size=(2))) model.add(Conv1D(32, (3))) model.add(Activation('relu')) model.add(MaxPooling1D(pool_size=(2))) model.add(Conv1D(64, (3))) model.add(Activation('relu')) model.add(MaxPooling1D(pool_size=(2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(nNumOfOutputs))
تحتوي هذه الشبكة على قيمتي إنتاج (تتنبأ بقيمتين): الحلاوة والنضج. الحلاوة هي 0 (غير محلاة) ، 1 (طبيعية) و 2 (ممتازة) ، والنضوج ، على التوالي ، 0 صعب للغاية ، 1 هو ما تحتاجه ، و 2 مفرطة النضج ، مثل الصوف القطني بالرمل.
يتم تحديد درجات عينة الاختبار من قبل الشخص ، وكيف بالضبط - سنتحدث في القسم على برنامج Android. مهمة الشبكة العصبية هي التنبؤ بالتصنيف الذي سيعطيه الشخص لبطيخ معين (وفقًا لصنبور).
كتابة برنامج
سبق أن ذكرت أن البرنامج يجب أن يأتي في نسختين. الأول ، الأولي ، يحذر المستخدم بصدق من أن توقعاتها هراء كاملة. ولكنه يسمح للمستخدم بتسجيل طرق على البطيخ ، وتقييم طعم هذا البطيخ وإرساله إلى مؤلف البرنامج عبر الإنترنت. أي أن الإصدار الأول يجمع البيانات ببساطة.
هذه هي صفحة
البرنامج على Google Play بالطبع البرنامج مجاني.
ماذا تفعل:
1. اضغط على الزر مع الميكروفون ويبدأ التسجيل. لديك خمس ثوان لضرب البطيخ ثلاث مرات - طرق طرق. زر ببطيخ يجعل "التنبؤ" ، ونحن لم نلمسها بعد.
ملاحظة - إذا كان لدى Google إصدار قديم ، فسيتم دمج التسجيل والتنبؤ في زر مع البطيخ ، ولكن لا يوجد زر مع ميكروفون.

2. الملف المحفوظ مؤقت وسيتم استبداله في المرة التالية التي تضغط فيها على زر التسجيل. هذا يسمح لك بتكرار النقر إذا كان شخص ما يتحدث ذراعًا (لا يمكنك تخيل مدى صعوبة جعل الآخرين يصمتون لمدة خمس ثوانٍ!) أو الماء صاخب - الأطباق ترن - الجار يحفر ...
ولكن الآن يتم اختيار وشراء البطيخ. لقد أحضرته إلى المنزل وسجلت صوتًا وقصته. الآن أنت جاهز لتقييم مذاقه. حدد علامة التبويب حفظ.
في علامة التبويب هذه ، نرى مربعي تحرير وسرد للتقدير - الحلاوة والنضوج (الحلاوة والنضوج ، والعمل جار على الترجمة). ضع علامة - انقر فوق حفظ.
إنتباه! يمكن النقر فوق حفظ مرة واحدة فقط. لذا ، ضع علامة أولاً. بلمسة زر ، تتم إعادة تسمية ملف الصوت ، والآن لن يتم مسحه في المرة التالية التي يتم تسجيله فيها.

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

كتابة برنامج خادم
كل شيء بسيط هنا ، لذا من الأفضل أن أضع الرمز الكامل لهذا النص البرمجي. برنامج "يمسك" الملفات ، يمنحها أسماء فريدة ويضعها في دليل يمكن لمالك الموقع الوصول إليه فقط.
<?php if (is_uploaded_file($_FILES['file']['tmp_name'])) { $uploads_dir = './melonaire/'; $tmp_name = $_FILES['file']['tmp_name']; $pic_name = $_FILES['file']['name']; $filename = md5(date('Ymd H:i:s:u')); move_uploaded_file($tmp_name, $uploads_dir.$filename); } else { echo "File not uploaded successfully."; } ?>
تدريب الشبكات العصبية
وتنقسم البيانات إلى تدريب واختبار 70 و 30 في المائة على التوالي. الشبكة العصبية - تتلاقى. ومع ذلك ، لا توجد مفاجآت للمبتدئين: لا تنس تطبيع بيانات الإدخال ، فهذا سيوفر لك الكثير من الأعصاب. شيء من هذا القبيل:
for file_name in os.listdir(path): nSweetness, nRipeness, arr_loaded = loadData(file_name) arr_data.append(arr_loaded / max(abs(arr_loaded)))
نقل شبكة عصبية
هناك عدة طرق لنقل شبكة من بيئة Python إلى Java. في الآونة الأخيرة ، جعلت Google هذه العملية أكثر ملاءمة ، لذلك إذا قرأت الكتب المدرسية ، فتأكد من أنها ليست قديمة. إليك كيف فعلت ذلك:
from keras.models import Model from keras.models import load_model from keras.layers import * import os import sys import tensorflow as tf
انتبه إلى السطر الأخير: في رمز Java ، ستحتاج إلى تحديد أسماء المدخلات والمخرجات للشبكة. هذه "الطباعة" تطبعها فقط.
لذا ، وضعنا الملف المتلوق coordted.pb في دليل الأصول للمشروع في Android Studio ، وقم بتوصيل مكتبة tensorflowinference Interface Library (انظر
هنا ، أو أفضل
هنا ) ، وهذا كل شيء.
هذا كل شيء. عندما فعلت ذلك لأول مرة ، توقعت أن يكون الأمر صعبًا ، ولكن ... نجح في المحاولة الأولى.
إليك ما تبدو عليه مكالمة الشبكة العصبية من رمز Java:
protected Void doInBackground(Void... params) { try {
هنا m_arrInput عبارة عن مصفوفة تحتوي على عنصرين - نعم! - تنبأنا ، تطبيع من صفر إلى واحد.
الخلاصة
هنا ، على ما يبدو ، من المفترض أن يشكر المرء على الاهتمام ، ويعرب عن أمله في أن يكون مثيرًا للاهتمام. بدلاً من ذلك ، ألاحظ أن Google هو الإصدار الأول من البرنامج. والثاني جاهز تمامًا ، ولكن ليس هناك بيانات كافية. لذا إذا كنت تحب البطيخ ، يرجى وضع برنامج على جهاز الأندرويد الخاص بك. كلما زادت البيانات التي ترسلها ، كان الإصدار الثاني يعمل بشكل أفضل ...
بالطبع ، ستكون مجانية.
حظا سعيدا ، ونعم: شكرا على المشاهدة. اتمنى ان يكون ممتع
تحديث هام: تم إصدار نسخة جديدة بتحليل محسن. شكرا لكل من أرسل البطيخ ويرجى إرسال المزيد!