مقدمة
في التعلم الآلي ، الشبكات العصبية التلافيفية هي شبكات عصبية مصطنعة عميقة تم تطبيقها بنجاح على التعرف على الصور. في الوقت الحاضر ، استخدم العديد من الاعتراف بأرقام لوحة الترخيص ، والتعرف على الوجه ، وما إلى ذلك. يمكن القول أن الشبكات العصبية التلافيفية حققت نجاحًا كبيرًا في التعرف على الصور. هناك العديد من أطر التعلم العميق مفتوحة المصدر ، مثل Caffe و TensorFlow و Torch ، وما إلى ذلك. تشمل أطر عمل التعلم العميقة تنفيذ الشبكات العصبية التلافيفية الكاملة. فلماذا لا يزال يتعين علينا كتابة الشبكات العصبية التلافيفية لأنفسنا؟ من الأفضل استخدام أطر عمل التعلم العميق المفتوحة المصدر هذه مباشرة ، والتي هي سريعة وسهلة التعامل معها ، ولديها أداء جيد وعدد قليل من الأخطاء. نعم ، إذا كنت تستخدم فقط الشبكات العصبية التلافيفية للقيام ببعض التطبيقات ولا تهتم بمبدأ العمل الخاص بها ، فلا يتعين عليك العمل بجد لكتابة الشبكات العصبية التلافيفية. ولكن إذا كنت ترغب في إتقان مبدأ العمل تمامًا للشبكات العصبية التلافيفية ، قال القدماء: ما تحصل عليه على الورق دائمًا ضحل ، ويجب أن تمارس الوعي في هذا الوقت. لذلك ، من الضروري جدًا أن تنفذ الشبكة العصبية التلافيفية بنفسك لتعميق فهمك لها.
ما هو cupcnn
Cupcnn هي شبكة عصبية تلافيفية مكتوبة في Java. بالإضافة إلى العمل ، أدركت ذلك من أجل تعميق فهمي للشبكات العصبية التلافيفية. إنه بسيط بما فيه الكفاية ويؤدي أداءً جيدًا ، مما يجعل من المناسب للغاية للمبتدئين الإشارة إلى. يمكن تنزيل رمز المصدر الخاص به من Github: Cupcnn
لا داعي للقلق بشأن قيود بروتوكوله أو شيء من هذا القبيل. يمكنك استخدامه لفعل أي شيء وتعديله بشكل تعسفي. إذا كان بإمكانه مساعدتك ، آمل أن يعطيك نجمة! ! !
^-^^-^^-^^-^
أفكار تصميم
آمل أن تكون شبكة عصبية بسيطة بما يكفي لمساعدة المبتدئين على التعلم. لذلك لم أطبق تلك الأشياء المتزامنة للتسارع ، والتي تضمن الطبيعة التمهيدية للرمز. عند التصميم ، قمت بتقسيم الشبكة العصبية التلافيفية إلى أربع وحدات: الشبكة (خسارة Blob طبقة نشطة) ، والتي يمكن رؤيتها من اسم الحزمة. تحتوي الطبقة والخسارة والناشطة على فئة أساسية ، ويتم توجيه برمجة الشبكة العصبية بأكملها نحو الفئة الأساسية. الشبكة هي المركز الذي يدمج هذه الوحدات الأربعة ، وينسق الموارد وترسل الموارد. سيكون لكل طبقة مثيل للشبكة ، بحيث يمكن الحصول على بيانات مختلفة بسهولة من خلال الشبكة ، مثل الحصول على إخراج كل طبقة ، اختلاف ، إلخ.
مخطط كتلة التصميم كما يلي:
معلمات حفظ بسيطة للغاية بالنسبة لجافا. يمكن أن يؤدي تنفيذ الواجهة التسلسلية إلى تنفيذ التسلسل وتجاهل المعلمات بسرعة. يقوم Cupcnn بتنفيذ الواجهة القابلة للتسلسل فقط لـ blob و blobparams في دليل البيانات ، ويتم تنفيذ جميع المعلمات بواسطة هذين.
الأداء الحالي
شبكة عصبية متصلة بالكامل
حاليًا ، على مجموعة بيانات MNIST ، يتم تدريب شبكة عصبية متصلة بالكامل (اتصال كامل (100) + اتصال كامل (30) + اتصال كامل (10) + Softmax) مع 30 EPOES ، مع معدل دقة 96.76
الشبكة العصبية التلافيفية
الشبكة العصبية التلافيفية (6 ميزات) + الحد الأقصى للتجميع + الالتزام (6 ميزات) + اتصال كامل (512) + اتصال كامل (30) + الاتصال الكامل (10) + softmax) ، عندما يكون معدل التعلم 0.2 ، 30 EPOES ، معدل الدقة هو 97.79. أعتقد أنه بعد مزيد من ضبط المعلمات ، يمكن أن يكون معدل الدقة أعلى تحت تدريب كافٍ.
لقطة التدريب للشبكة العصبية التلافيفية هي كما يلي:
ابدأ القطار
Epoe: 0 LossValue: 2.3019369891560455 LR: 0.2 دقة 0.13
Epoe: 0 LossValue: 2.0722489482105195 LR: 0.2 دقة 0.44
Epoe: 0 LossValue: 1.2423286194012682 LR: 0.2 دقة 0.72
Epoe: 0 LossValue: 0.7860529560675255 LR: 0.2 دقة 0.79
Epoe: 0 LossValue: 0.6272194196176664 LR: 0.2 دقة 0.87
Epoe: 0 LossValue: 0.5240051326725808 LR: 0.2 دقة 0.84
Epoe: 0 LossValue: 0.27637563581928026 LR: 0.2 دقة 0.95
Epoe: 0 LossValue: 0.35585388987055083 LR: 0.2 دقة 0.92
Epoe: 0 LossValue: 0.441971528417802 LR: 0.2 دقة 0.92
Epoe: 0 LossValue: 0.25637710325999674 LR: 0.2 دقة 0.95
Epoe: 0 LossValue: 0.39872273532502 LR: 0.2 دقة 0.9
Epoe: 1 lossvalue: 0.264085484522027 LR: 0.160000000000000000003 دقة 0.91
Epoe: 1 LossValue: 0.22754066024803088 LR: 0.160000000000000000003 دقة 0.96
Epoe: 1 LossValue: 0.3025642097577103 LR: 0.160000000000000000003 دقة 0.96
Epoe: 1 lossvalue: 0.18149648622985948 LR: 0.16000000000000000003 دقة 0.99
Epoe: 1 lossvalue: 0.177239938748327 LR: 0.160000000000000000003 دقة 0.96
Epoe: 1 LossValue: 0.1504199300977443 LR: 0.160000000000000000003 دقة 0.98
Epoe: 1 LossValue: 0.1075954575265524 LR: 0.160000000000000000003 الدقة هي 1.0
استخدام cupcnn
في الوقت الحاضر ، يقوم Cupcnn بتنفيذ اختبارات على مجموعة بيانات MNIST. بموجب SRC/Test ، فإن Mnisttest هو مدخل الوظيفة الرئيسية ، وتم تصميم الشبكة العصبية المحددة في فئة MnistNetwork. في فئة Mnistnetwork ، تنفذ BuildConvNetwork و BuildFCNetwork على التوالي بناء الشبكات العصبية التلافيفية وبناء شبكات عصبية متصلة بالكامل. بفضل خصائص Java الجيدة للمنصات ، بعد تنزيل الكود المصدري لـ Cupcnn ، استخدم Eclipse لفتح المشروع ، ثم تشغيله مباشرة ، يجب أن تكون قادرًا على بدء التدريب والاختبار على مجموعة بيانات MNIST.
بناء شبكة عصبية
public void buildnetwork () {// أولاً ، قم ببناء كائن الشبكة العصبية وتعيين شبكة المعلمات = شبكة جديدة () ؛ network.setBatch (100) ؛ network.setloss (new logivehoodloss ()) ؛ //network.setloss(new crossentropyloss ()) ؛ Optimizer = SGDoptimizer جديد (0.2) ؛ Network.setOptimizer (Optimizer) ؛ // buildfcnetwork () ؛ BuildConvNetwork () ؛ network.prepare () ؛ } تحدد دالة setBatch () عدد الصور الموجودة في دفعة.
Setloss () يعين وظيفة الخسارة للاستخدام. يقوم Cupcnn بتنفيذ وظيفة فقدان الانتروبيا المتقاطعة ووظيفة فقدان السجل.
يجب استخدام setOptimizer () لتعيين المحسن. Cupcnn فقط ينفذ محسن SGD. إذا قمت بتطبيق مُحسّن أفضل وكنت على استعداد لتقديمه إلى Cupcnn ، فأود أرحب به بشدة.
بناء شبكة عصبية متصلة بالكامل
private void buildfcnetwork () {// أضف طبقة الشبكة إلى network inputlyer layer1 = new inputLayer (الشبكة ، blobparams جديدة (network.getBatch () ، 1،28،28)) ؛ network.addlayer (layer1) ؛ FullConnectionLayer layer2 = new FullConnectionLayer (الشبكة ، blobparams جديدة (network.getBatch () ، 784،1،1)) ؛ layer2.SetActivationFunc (ReluactivationFunc () جديد) ؛ network.addlayer (layer2) ؛ FullConnectionLayer layer3 = new FullConnectionLayer (الشبكة ، blobparams جديدة (network.getBatch () ، 100،1،1)) ؛ layer3.SetActivationFunc (ReluactivationFunc () جديد) ؛ network.addlayer (layer3) ؛ FullConnectionLayer layer4 = new FullConnectionLayer (الشبكة ، blobparams جديدة (network.getBatch () ، 30،1،1)) ؛ layer4.SetActivationFunc (sigmodactivationfunc () جديد) ؛ network.addlayer (layer4) ؛ FullConnectionLayer layer5 = new FullConnectionLayer (الشبكة ، blobparams جديدة (network.getBatch () ، 10،1،1)) ؛ layer5.setActivationFunc (ReluactivationFunc () جديد) ؛ network.addlayer (layer5) ؛ SoftMaxLayer sflayer = new SoftMaxLayer (الشبكة ، blobparams جديدة (network.getBatch () ، 10،1،1)) ؛ network.addlayer (sflayer) ؛ }كما هو موضح في الكود أعلاه ، تحتاج كل طبقة إلى شبكة ، وهي مثيل للشبكة. الشبكة هي المسؤول العالمي ومرسل الموارد. مع مرجع الشبكة ، يمكننا بسهولة الحصول على بيانات الإخراج ، وأخطاء الإخراج ، وما إلى ذلك من كل طبقة. بالإضافة إلى ذلك ، تحتاج كل طبقة إلى معلمة تحدد حجم كتلة بيانات إخراج الطبقة الحالية ، والتي تخبر طبقة معينة مقدار البيانات التي تحتاج إلى إخراجها. على سبيل المثال ، الطبقة الأخيرة من الشبكة العصبية هي softmaxlayer ، والتي يجب إخراجها. يتم تمثيل هذا الرقم بمتجه بطول 10 ، مثل الرقم 7 ، لذلك يجب على softmaxlayer إخراج قيمة العنصر الثامن ليكون 1 وقيمة العناصر الأخرى لتكون 0. طبقة الالتواء وطبقة التجميع تتطلب المزيد من المعلمات لأن كلاهما له نواة. بالنسبة لطبقة الالتواء ، يطلق عليه نواة الالتواء. خطوة كل اتجاه لطبقة الالتواء هي 1 ، والتي لا تزال مجال للتحسين. بالنسبة لطبقة التجميع ، بالإضافة إلى تمرير معلمات قلب التجميع ، تحتاج أيضًا إلى المرور في الخطوات الأفقية والرأسية ، وهو أمر ضروري.
التدريب والاختبار
بعد إنشاء شبكة عصبية ، تحتاج إلى الاتصال بالشبكة. لذلك ، فإن دعوة هذه الطريقة ضرورية.
قطار باطل عام (قائمة <GigitImage> imglist ، int epoes) {system.out.println ("start train") ؛ int batch = network.getBatch () ؛ double loclalr = Optimizer.getlr () ؛ لـ (int e = 0 ؛ e <epoes ؛ e ++) {collections.shuffle (imglist) ؛ لـ (int i = 0 ؛ i <imglist.size ()-batch ؛ i+= batch) {list <lob> inputandlabel = buildBlobbyImagelist (imglist ، i ، batch ، 1،28،28) ؛ double lossvalue = network.train (inputandlabel.get (0) ، inputandlabel.get (1)) ؛ if (i> batch && i/batch ٪ 50 == 0) {system.out.print ("epoe:"+e+"lossvalue:"+lossvalue+""+"lr:"+Optimizer.getlr ()+"") ؛ testinner (inpectandlabel.get (0) ، inputandlabel.get (1)) ؛ }} if (loclalr> 0.001) {loclalr*= 0.8 ؛ Optimizer.setlr (loclalr) ؛ }}} اختبار void العام (قائمة <GigitImage> imglist) {system.out.println ("start test") ؛ int batch = network.getBatch () ؛ int screateCount = 0 ؛ int i = 0 ؛ لـ (i = 0 ؛ i <imglist.size ()-batch ؛ i+= batch) {list <Lob> inputandlabel = buildBlobbyImagelist (imglist ، i ، batch ، 1،28،28) ؛ blob output = network.predict (inputandlabel.get (0)) ؛ int [] caloutlabels = getBatchOutputLabel (output.getData ()) ؛ int [] RealLabels = getBatchOutputLabel (inputandlabel.get (1) .getData ()) ؛ لـ (int kk = 0 ؛ kk <caloutlabels.length ؛ kk ++) {if (caloutlabels [kk] == RealLabels [kk]) {screeCount ++ ؛ }}} دقة مزدوجة = screateCount/(1.0*i+batch) ؛ System.out.println ("دقة الاختبار هي"+دقة+"screateCount"+screcleCount) ؛ }كما ذكر أعلاه ، يمكنك التدريب عن طريق استدعاء قطار الشبكة ، ويمكنك الاختبار عن طريق استدعاء طريقة التنبؤ بالشبكة.
حفظ وتحميل المعلمات
public void savemodel (اسم السلسلة) {network.savemodel (name) ؛ } public void loadmodel (اسم السلسلة) {network = new Network () ؛ network.loadModel (name) ؛ network.prepare () ؛ }يمكن استدعاء SaveModel و LoadModel للشبكة حفظ معلمات وتحميلها على التوالي. تحتاج فقط إلى تمرير اسم الملف. عندما نقوم بإنشاء شبكة عصبية من خلال المعلمات المحفوظة ، نحتاج إلى أولاً شبكة جديدة ، ثم اتصل بـ LoadModel لهذه الشبكة لتحميل المعلمات المحفوظة ، ثم لا تنسى استدعاء طريقة إعداد لإنشاء كتل بيانات الإخراج وكتل بيانات الخطأ لكل طبقة.
حالة الانتهاء الحالية والخطط المستقبلية
في الوقت الحالي ، تشمل الطبقات التي تم تنفيذها: الاتصال الكامل ، والالتواء ، وطبقة التجميع القصوى ، ومتوسط طبقة التجميع ، وطبقة Softmax. وظائف التنشيط التي تم تنفيذها هي: Sigmod ، TANH ، RELU.
وظائف الخسارة التي تم تنفيذها هي: الانتروبيا المتقاطعة ، احتمالية السجل. التحسين المنفذ هو: SGD. يمكن للمعلمات بالفعل حفظ وتحميل. بعد ذلك ، ستتم إضافة طبقة التسرب ، وسيتم إضافة أمثلة على CIFAR-10.
بالإضافة إلى ذلك ، سأكتب بعض المقالات لمراجعة أفكاري وأسئلتي أثناء عملية كتابة Cupcnn للرجوع إليها من قبل المبتدئين. من فضلك خذ مسارا. يمكن للمهتمين الاستمرار في الاهتمام. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.