شعار زيفيرنت

بناء 3D-CNN في TensorFlow

التاريخ:

تم نشر هذه المقالة كجزء من مدونة علوم البيانات.

مقدمة عن 3D-CNN

تساعد مجموعة بيانات MNIST المبتدئين على فهم مفهوم الشبكات العصبية التلافيفية وتنفيذها. يعتقد الكثيرون أن الصور مجرد مصفوفة عادية ولكن في الواقع ، ليس هذا هو الحال. تمتلك الصور ما يعرف بالمعلومات المكانية. ضع في اعتبارك مصفوفة 3X3 الموضحة أدناه.

 في المصفوفة العادية ، ستكون القيم الموجودة في المصفوفة مستقلة عن بعضها البعض. لن تحمل القيم المجاورة أي علاقة أو معلومات لحقل معين في المصفوفة. على سبيل المثال ، القيمة الموجودة بدلاً من "e" في المصفوفة لن يكون لها صلة بالقيم الموجودة في مواضع أخرى مثل "a" ، "b" ، إلخ. هذا ليس هو الحال في الصورة.

في صورة ما ، يمثل كل موضع في المصفوفة بكسلًا في الصورة وتمثل القيمة الموجودة في كل موضع قيمة البكسل. يمكن أن تكون قيمة البكسل من [0-255] في صورة 8 بت. كل بكسل له بعض العلاقة مع وحدات البكسل المجاورة له. جوار أي بكسل هو مجموعة البكسل الموجودة حوله. بالنسبة لأي بكسل ، توجد 3 طرق لتمثيل جوارها المعروف باسم N-4 و ND و N-8. دعونا نفهمها بالتفصيل.

  1. N-4: يمثل وحدات البكسل الموجودة في أعلى ، وأسفل ، ويمين ، ويسار البكسل المرجعي. بالنسبة إلى البكسل "e" ، يحتوي N-4 على "b" و "f" و "h" و "d".
  2. اختصار الثاني: يمثل وحدات البكسل الموجودة قطريًا التي يمكن الوصول إليها من البكسل المرجعي. بالنسبة إلى البكسل "e" ، تحتوي ND على "a" و "c" و "i" و "g".
  3. N-8: يمثل جميع وحدات البكسل الموجودة حوله. يتضمن كلاً من N-4 و ND pixels. بالنسبة إلى البكسل "e" ، يحتوي N-8 على "a" و "b" و "c" و "d" و "f" و "g" و "h" و "i".

تساعد وحدات البكسل N-4 و N-8 و ND في استخراج معلومات حول البكسل. على سبيل المثال ، يمكن استخدام هذه المعلمات لتصنيف البكسل على أنه إما حد أو بكسل داخلي أو خارجي. هذا هو تخصص الصور. يقبل ANN الإدخال كمصفوفة 1D. الصورة موجودة دائمًا في مصفوفة ثنائية الأبعاد ، بقناة واحدة أو أكثر. عندما يتم تحويل مصفوفة صور إلى مصفوفة 2D ، فإنها تفقد المعلومات المكانية وبالتالي ، تفشل ANN في التقاط هذه المعلومات وتعمل بشكل سيئ على مجموعة بيانات الصورة. هذا هو المكان الذي تتفوق فيه شبكة سي إن إن. تقبل CNN مصفوفة ثنائية الأبعاد كمدخلات وتنفذ عملية التفاف باستخدام قناع (أو مرشح أو نواة) وتستخرج هذه الميزات. يتم تنفيذ عملية تعرف باسم التجميع والتي تقلل من عدد الميزات المستخرجة وتقلل من التعقيد الحسابي. بعد إجراء هذه العمليات ، نقوم بتحويل الميزات المستخرجة إلى مصفوفة 1D وإدخالها في جزء ANN الذي يتعلم إجراء التصنيف.

تهدف المقالة إلى توسيع مفهوم عملية الالتواء على البيانات ثلاثية الأبعاد. سنقوم ببناء شبكة CNN ثلاثية الأبعاد والتي ستؤدي الأداء الكلاسيكي.

نظرة عامة على مجموعة البيانات

سنستخدم ملف fulldatasetvectors.h5 ملف في مجموعة البيانات. يحتوي هذا الملف على 4096-D متجه تم الحصول عليها من voxelization (x: 16 ، y: 16 ، z: 16) لجميع السحب النقطية ثلاثية الأبعاد. يحتوي هذا الملف على 3 عينة تدريب و 10000 عينة اختبار. تحتوي مجموعة البيانات على بيانات سحابة نقطية أيضًا والتي يمكن استخدامها. يتوفر شرح مفصل لمجموعة البيانات هنا. لا تتردد في قراءة المزيد عن مجموعة البيانات قبل المتابعة.

استيراد الوحدات

حيث يتم تخزين البيانات في h5 التنسيق ، سنستخدم تنسيق h5py وحدة لتحميل مجموعة البيانات من البيانات من ملف fulldatasetvectors. TensorFlow و Keras سيتم استخدامها لبناء وتدريب 3D-CNN. ال to_categorical تساعد الوظيفة في إجراء تشفير واحد ساخن للمتغير المستهدف. سنستخدم أيضًا رد اتصال الإيقاف المبكر لإيقاف التدريب ومنع التجهيز الزائد للنموذج.

استيراد numpy كـ np import h5py من tensorflow.keras.utils استيراد إلى_categorical من tensorflow.keras استيراد طبقات من tensorflow.keras.models استيراد تسلسلي من tensorflow.keras.initializers استيراد ثابت من tensorflow.keras.optimizers استيراد آدم من tensorflow.keras.callbacks استيراد EarlyStopping

تحميل مجموعة البيانات

كما ذكرنا سابقًا ، سنقوم بتحميل البيانات من ملف fulldatasetvectors.h5 باستخدام الوحدة النمطية h5py.

باستخدام h5py.File ('../ input / 3d-mnist / full_dataset_vectors.h5'، 'r') كمجموعة بيانات:

xtrain ، xtest = مجموعة البيانات [“X_train”] [:] ، مجموعة البيانات [“X_test”] [:]

ytrain ، ytest = مجموعة البيانات [“y_train”] [:] ، مجموعة البيانات [“y_test”] [:]

xtrain = np.array (xtrain)

xtest = np.array (xtest)

طباعة ("شكل القطار:" ، xtrain.shape)

طباعة ("شكل اختبار:" ، xtest.shape)

xtrain = xtrain.reshape (xtrain.shape [0] ، 16 ، 16 ، 16 ، 1)

xtest = xtest.reshape (xtest.shape [0]، 16، 16، 16، 1)

ytrain، ytest = to_categorical (ytrain، 10)، to_categorical (ytest، 10)


يمكننا أن نرى أن بيانات القطار بها 10000 عينة بينما تحتوي بيانات الاختبار على 2000 عينة وكل عينة تضم 4096 ميزة.

شكل القطار: (10000، 4096) شكل اختبار: (2000، 4096)

بناء 3D-CNN

يحتوي 3D-CNN ، تمامًا مثل أي CNN عادي ، على جزأين - مستخرج الميزات ومصنف ANN ويعمل بنفس الطريقة. 2D-CNN ، على عكس CNN العادي ، يقوم بإجراء التفاف ثلاثي الأبعاد بدلاً من التفاف ثنائي الأبعاد. سنستخدم API التسلسلي من Keras لبناء شبكة CNN ثلاثية الأبعاد. ستكون أول طبقتين هي الطبقات التلافيفية ثلاثية الأبعاد مع 3 مرشحًا و ReLU كوظيفة تنشيط متبوعة بطبقة تجميع قصوى لتقليل الأبعاد. يوجد أيضًا مصطلح تحيز يضاف إلى هذه الطبقات بقيمة 3. بشكل افتراضي ، يتم تعيين قيمة الانحياز إلى 2. يتم استخدام نفس مجموعة الطبقات مرة أخرى ولكن مع 3 مرشحًا. ثم يتبع ذلك طبقة مسقطة وطبقة مسطحة. تساعد الطبقة المسطحة في إعادة تشكيل الميزات في مصفوفة أحادية الأبعاد يمكن معالجتها بواسطة ANN ، أي طبقات كثيفة. يتكون الجزء ANN من طبقتين ، مع 2 و 3 خلية عصبية على التوالي ، و ReLU كوظيفة التنشيط. ثم يتبع ذلك طبقة إخراج بها 32 خلايا عصبية حيث توجد 0.01 فئات أو تسميات مختلفة في مجموعة البيانات.

model = Sequential()
model.add(layers.Conv3D(32,(3,3,3),activation='relu',input_shape=(16,16,16,1),bias_initializer=Constant(0.01)))
model.add(layers.Conv3D(32,(3,3,3),activation='relu',bias_initializer=Constant(0.01)))
model.add(layers.MaxPooling3D((2,2,2)))
model.add(layers.Conv3D(64,(3,3,3),activation='relu'))
model.add(layers.Conv3D(64,(2,2,2),activation='relu'))
model.add(layers.MaxPooling3D((2,2,2)))
model.add(layers.Dropout(0.6))
model.add(layers.Flatten())
model.add(layers.Dense(256,'relu'))
model.add(layers.Dropout(0.7))
model.add(layers.Dense(128,'relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10,'softmax'))
model.summary()

هذه هي بنية 3D-CNN.

النموذج: "Sequential_2" _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ الطبیقة ============================== conv3d_5 (Conv3D) (لا شيء ، 14 ، 14 ، 14 ، 32) 896 ________________________________________________________________________________________________ (Conv3D_6) (لا شيء ، 3 ، 12 ، 12 ، 12) 32 _____________________________________________________________________ max_pooling27680d_3 (maxpooling2 (لا شيء ، 3 ، 6 ، 6 ، 6) 32 _________________________________________________________ _____________ conv0d_3 (conv7d) (لا شيء ، 3 ، 4 ، 4 ، 4) 64 _____________________________________________________________________ max_pooling55360d_3 (maxpooling8 (لا شيء ، 3 ، 3 ، 3 ، 3) 64 _________________________________________________________ dropout_32832 (لا شيء ، 3 ، 3 ، 3 ، 1) Ten_1 (Flatten) (لا شيء ، 1) 64 ________________________________________________________________________ كثيفة __ (كثيفة) (لا شيء ، 0) 4 _____________________________________________________________________________________________________________________________________________ _________________________________________________________________ كثيف_ 1 (لا شيء ، 1) 1 ========================================= ========================== إجمالي المعلمات: 64،0 معلمات قابلة للتدريب: 1،64 معلمات غير قابلة للتدريب: 0

تدريب 3D-CNN

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

model.compile(Adam(0.001),'categorical_crossentropy',['accuracy'])
model.fit(xtrain,ytrain,epochs=200,batch_size=32,verbose=1,validation_data=(xtest,ytest),callbacks=[EarlyStopping(patience=15)])

هذه بعض فترات تدريب 3D-CNN.

الحقبة 1/200 313/313 [===============================] - 39 ثانية 123 مللي ثانية / خطوة - الخسارة: 2.2782 - الدقة : 0.1237 - val_loss: 2.1293 - دقة val: 0.2235 الحقبة 2/200 313/313 [===============================] - 39 ثانية 124 مللي ثانية / خطوة - الخسارة: 2.0718 - الدقة: 0.2480 - val_loss: 1.8067 - دقة الصمام: 0.3395 الحقبة 3/200 313/313 [====================== ========] - 39 ثانية 125 مللي ثانية / خطوة - خسارة: 1.8384 - الدقة: 0.3382 - val_loss: 1.5670 - دقة val: 0.4260 ... ... عصر 87/200 313/313 [====== ========================] - 39 ثانية 123 مللي ثانية / خطوة - خسارة: 0.7541 - الدقة: 0.7327 - val_loss: 0.9970 - دقة دقة: 0.7061

اختبار 3D-CNN

يحقق 3D-CNN دقة مناسبة تبلغ 73.3% في القطار و 70.6% على بيانات الاختبار. قد تكون الدقة في الجانب السفلي قليلاً لأن مجموعة البيانات صغيرة جدًا وغير متوازنة.

_، acc = model.evaluate (xtrain، ytrain) print ('دقة التدريب:'، str (round (acc * 100، 2)) + '٪') _، acc = model.evaluate (xtest، ytest) print ( 'دقة الاختبار:' ، str (round (acc * 100، 2)) + '٪')
313/313 [===============================] - 11 ثانية 34 مللي ثانية / خطوة - خسارة: 0.7541 - الدقة: 0.7327 دقة التدريب : 73.27٪ 63/63 [===============================] - ثانيتان 2 مللي ثانية / خطوة - خسارة: 34 - الدقة: 0.9970 دقة الاختبار: 0.7060٪

n

لتلخيص ذلك ، غطت هذه المقالة الموضوعات التالية:

  • جيران بكسل في الصورة
  • سبب ضعف أداء ANN في مجموعة بيانات الصورة
  • الاختلافات بين CNN و ANN
  • تعمل سي ان ان
  • بناء وتدريب 3D-CNN في TensorFlow

لمواصلة هذا المشروع أكثر ، يمكن إنشاء مجموعة بيانات ثلاثية الأبعاد جديدة مخصصة من مجموعة بيانات MNIST عن طريق إسقاط قيم البكسل على محور آخر. سيظل المحور x والمحور y كما هو الحال في أي صورة ولكن سيتم عرض قيم البكسل على المحور z. يمكن تطبيق هذا التحول لإنشاء بيانات ثلاثية الأبعاد من بيانات ثنائية الأبعاد بعد إجراء تكبير للصورة بحيث يكون لدينا مجموعة بيانات متوازنة ومعممة جيدًا يمكن استخدامها لتدريب 3D-CNN وتحقيق دقة أفضل. هذه نهاية هذا المقال. آمل أن تكونوا استمتعت بقراءة هذا المقال.

شكرا للقراءة والتعلم السعيد!

الوسائط الموضحة في هذه المقالة ليست مملوكة لـ Analytics Vidhya ويتم استخدامها وفقًا لتقدير المؤلف.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة

الدردشة معنا

أهلاً! كيف يمكنني مساعدك؟