تصنيف صور TensorFlow: كل ما تحتاج لمعرفته حول تصنيفات المباني

ستزودك مقالة تصنيف الصور TensorFlow هذه بمعرفة مفصلة وشاملة لتصنيف الصور.

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

ما هو TensorFlow؟

TensorFlow هو إطار عمل تعلم الآلة مفتوح المصدر من Google لبرمجة تدفق البيانات عبر مجموعة من المهام. تمثل العقد في الرسم البياني العمليات الحسابية ، بينما تمثل حواف الرسم البياني مصفوفات البيانات متعددة الأبعاد التي يتم توصيلها فيما بينها.





TensorFlow-Image-Recognition
الموترات هي مجرد مصفوفات متعددة الأبعاد ، امتداد للجداول ثنائية الأبعاد للبيانات ذات الأبعاد الأعلى. هناك العديد من ميزات Tensorflow مما يجعلها مناسبة للتعلم العميق وهي مكتبة أساسية مفتوحة المصدر تساعدك على تطوير وتدريب نماذج ML.

ما هو تصنيف الصور؟

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



الآن اعتمادًا على التفاعل بين المحلل والكمبيوتر أثناء التصنيف ، هناك نوعان من التصنيف:



  • تحت الإشراف و
  • غير خاضع للرقابة

لذلك ، دون إضاعة أي وقت ، فلننتقل إلى تصنيف TensorFlow للصور. لدي مثالان: سهل وصعب. دعونا ننتقل مع الأمر السهل.

تصنيف صور TensorFlow: Fashion MNIST

مجموعة بيانات أزياء MNIST

سنستخدم هنا مجموعة بيانات Fashion MNIST ، التي تحتوي على 70000 صورة تدرج الرمادي في 10 فئات. سنستخدم 60000 للتدريب والباقي 10000 لأغراض الاختبار. يمكنك الوصول إلى Fashion MNIST مباشرة من TensorFlow ، ما عليك سوى استيراد البيانات وتحميلها.

  • دعنا نستورد المكتبات أولاً
من __future__ استيراد مطلق_استيراد وتقسيم ووظيفة طباعة # TensorFlow و tf.keras استيراد tensorflow مثل tf من tensorflow import keras # مكتبات المساعدة تستورد numpy كـ np import matplotlib.pyplot as plt
  • فلنقم بتحميل البيانات
fashion_mnist = keras.datasets.fashion_mnist (صور القطار ، تصنيفات القطار) ، (test_images ، test_labels) = fashion_mnist.load_data ()
  • بعد ذلك ، سنقوم بتعيين الصور إلى فئات
class_names = ['T-shirt / top'، 'Trouser'، 'Pullover'، 'Dress'، 'Coat'، 'Sandal'، 'Shirt'، 'Sneaker'، 'Bag'، 'Ankle boot']
  • استكشاف البيانات
صور القطار.شكل 
#Each Label بين 0-9
خطوط القطار 
test_images.شكل
  • الآن ، حان الوقت للمعالجة المسبقة للبيانات.
PLT.الشكل() PLT.imshow(صور القطار[0]) PLT.شريط الألوان() PLT.جريد(خاطئة) PLT.تبين() 
#إذا قمت بفحص الصورة الأولى في مجموعة التدريب ، فسترى أن قيم البكسل تقع في النطاق من 0 إلى 255.

  • يتعين علينا تغيير حجم الصور من 0 إلى 1 لإدخالها في الشبكة العصبية
صور القطار = صور القطار / 255.0 test_images = test_images / 255.0
  • دعونا نعرض بعض الصور.
PLT.الشكل(حجم التين=(10و10)) إلى عن على أنا في نطاق(25): PLT.حبكة فرعية(5و5وأنا+واحد) PLT.xticks([]) PLT.yticks([]) PLT.جريد(خاطئة) PLT.imshow(صور القطار[أنا] ، سمب=PLT.سم.الثنائية) PLT.xlabel(class_names[خطوط القطار[أنا]]) PLT.تبين()
 

  • قم بإعداد الطبقات
نموذج = الصعب.تسلسلي([ الصعب.طبقات.تتسطح(شكل_المدخلات=(28و 28)) ، الصعب.طبقات.كثيف(128و التنشيط=تف.لا.ريلو) ، الصعب.طبقات.كثيف(10و التنشيط=تف.لا.سوفت ماكس) ])
  • تجميع النموذج
نموذج.تجميع(محسن='آدم'و خسارة='متناثر_الفئات_الهجوم'و المقاييس=['صحة'])
  • تدريب نموذجي
نموذج.لائق بدنيا(صور القطارو خطوط القطارو العصور=10)

  • تقييم الدقة
test_lossو test_acc = نموذج.تقييم(test_imagesو test_labels) طباعة(دقة الاختبار:و test_acc)

  • يتنبأ
تنبؤات = نموذج.تنبؤ(test_images)
تنبؤات[0]

التوقع هو مصفوفة من 10 أرقام. تصف هذه 'ثقة' النموذج في أن الصورة تتوافق مع كل قطعة من الملابس العشر المختلفة. يمكننا معرفة التصنيف الذي يحتوي على أعلى قيمة ثقة.

على سبيل المثال.أرجماكس(تنبؤات[0])#Model واثق من أنه حذاء في الكاحل. دعونا نرى ما إذا كان هذا صحيحًا

الإخراج: 9

test_labels[0]

الإخراج: 9

  • حان الوقت الآن لإلقاء نظرة على المجموعة الكاملة المكونة من 10 قنوات
def مؤامرة_صورة(أناو التنبؤاتو صحيح_التصنيفو IMG): التنبؤاتو صحيح_التصنيفو IMG = التنبؤات[أنا] ، صحيح_التصنيف[أنا] ، IMG[أنا] PLT.جريد(خاطئة) PLT.xticks([]) PLT.yticks([]) PLT.imshow(IMGو سمب=PLT.سم.الثنائية) توقعت التسمية = على سبيل المثال.أرجماكس(التنبؤات) إذا توقعت التسمية == صحيح_التصنيف: اللون = 'أخضر' آخر: اللون = 'شبكة' PLT.xlabel('{} {: 2.0f}٪ ({}) '.شكل(class_names[توقعت التسمية] ، 100*على سبيل المثال.ماكس(التنبؤات) ، class_names[صحيح_التصنيف]) ، اللون=اللون) def plot_value_array(أناو التنبؤاتو صحيح_التصنيف): التنبؤاتو صحيح_التصنيف = التنبؤات[أنا] ، صحيح_التصنيف[أنا] PLT.جريد(خاطئة) PLT.xticks([]) PLT.yticks([]) هذه الحبكة = PLT.شريط(نطاق(10) ، التنبؤاتو اللون='# 777777') PLT.يليم([0و واحد]) توقعت التسمية = على سبيل المثال.أرجماكس(التنبؤات) هذه الحبكة[توقعت التسمية].set_color('شبكة') هذه الحبكة[صحيح_التصنيف].set_color('أخضر')
  • دعونا نلقي نظرة على الصورة 0 و 10 أولاً
أنا = 0 PLT.الشكل(حجم التين=(6و3)) PLT.حبكة فرعية(واحدو2وواحد) مؤامرة_صورة(أناو تنبؤاتو test_labelsو test_images) PLT.حبكة فرعية(واحدو2و2) plot_value_array(أناو تنبؤاتو test_labels) PLT.تبين()

أنا = 10 PLT.الشكل(حجم التين=(6و3)) PLT.حبكة فرعية(واحدو2وواحد) مؤامرة_صورة(أناو تنبؤاتو test_labelsو test_images) PLT.حبكة فرعية(واحدو2و2) plot_value_array(أناو تنبؤاتو test_labels) PLT.تبين()

  • الآن ، دعونا نرسم عدة صور وتوقعاتها. الألوان الصحيحة خضراء ، بينما تكون غير صحيحة باللون الأحمر.
num_rows = 5 num_cols = 3 عدد_الصور = num_rows*num_cols PLT.الشكل(حجم التين=(2*2*num_colsو 2*num_rows)) إلى عن على أنا في نطاق(عدد_الصور): PLT.حبكة فرعية(num_rowsو 2*num_colsو 2*أنا+واحد) مؤامرة_صورة(أناو تنبؤاتو test_labelsو test_images) PLT.حبكة فرعية(num_rowsو 2*num_colsو 2*أنا+2) plot_value_array(أناو تنبؤاتو test_labels) PLT.تبين()

  • أخيرًا ، سوف نستخدم النموذج المدرب لعمل توقع حول صورة واحدة.
# احصل على صورة من مجموعة بيانات الاختبار IMG = test_images[0] طباعة(IMG.شكل)
# أضف الصورة إلى دفعة حيث تكون العضو الوحيد. IMG = (على سبيل المثال.expand_dims(IMGو0)) طباعة(IMG.شكل)
التنبؤات = نموذج.تنبؤ(IMG) طباعة(التنبؤات)

plot_value_array(0و التنبؤاتو test_labels) PLT.xticks(نطاق(10) ، class_namesو دوران=أربعة خمسة) PLT.تبين()

  • كما ترون التنبؤ بالصورة الوحيدة لدينا دفعة واحدة.
نتيجة التنبؤ = على سبيل المثال.أرجماكس(التنبؤات[0])

الإخراج: 9

سيفار -10: سي إن إن

تتكون مجموعة بيانات CIFAR-10 من الطائرات والكلاب والقطط وأشياء أخرى. ستقوم بمعالجة الصور مسبقًا ، ثم تدريب شبكة عصبية تلافيفية على جميع العينات. الصور بحاجة إلى تطبيع ويجب أن تكون التسميات مشفرة واحدة ساخنة. من المؤكد أن حالة الاستخدام هذه ستزيل شكوكك حول تصنيف الصور TensorFlow.

  • تنزيل البيانات
من عند طلب urllib استيراد urlretrieve من عند os.path استيراد isfileو السخام من عند تقدم استيراد تقدم استيراد تارفيل cifar10_dataset_folder_path = 'سيفار 10 دفعات بي' صف دراسي تنزيل التقدم(تقدم): last_block = 0 def صنارة صيد(الذاتو block_num=واحدو مقاس الكتله=واحدو الحجم الإجمالي=لا شيء): الذات.مجموع = الحجم الإجمالي الذات.تحديث((block_num - الذات.last_block) * مقاس الكتله) الذات.last_block = block_num '' تحقق مما إذا كان ملف البيانات (zip) قد تم تنزيله بالفعل إذا لم يكن الأمر كذلك ، فقم بتنزيله من 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz' وحفظه كـ cifar-10-python.tar.gz '' إذا ليس isfile('cifar-10-python.tar.gz'): مع تنزيل التقدم(وحدة='ب'و مقياس_الوحدات=صحيحو مينترات=واحدو تنازلي='مجموعة بيانات CIFAR-10') مثل pbar: urlretrieve( 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz'و 'cifar-10-python.tar.gz'و pbar.صنارة صيد) إذا ليس السخام(cifar10_dataset_folder_path): مع تارفيل.افتح('cifar-10-python.tar.gz') مثل قطران: قطران.استخراج كافة() قطران.أغلق()
  • استيراد المكتبات الضرورية
استيراد ورطة استيراد حبيبي مثل على سبيل المثال استيراد matplotlib.pyplot مثل PLT
  • فهم البيانات

الدفعة الأصلية من البيانات هي 10000 × 3072 موتر معبرًا عنها في مصفوفة عددية ، حيث 10000 هو عدد بيانات العينة. الصورة ملونة ومقاس 32 × 32. يمكن أن يتم التغذية إما بصيغة (العرض × الارتفاع × عدد_القناة) أو (عدد_القناة × العرض × الارتفاع). دعونا نحدد التسميات.

def load_label_names(): إرجاع ['مطار'و 'سيارة'و 'طائر'و 'قط'و 'الغزال'و 'الكلب'و 'ضفدع'و 'حصان'و 'سفينة'و 'شاحنة نقل']
  • إعادة تشكيل البيانات

سنقوم بإعادة تشكيل البيانات على مرحلتين

أولاً ، قسّم متجه الصف (3072) إلى 3 قطع. كل قطعة تتوافق مع كل قناة. ينتج عن هذا أبعاد (3 × 1024) للموتر. ثم قسّم الموتر الناتج من الخطوة السابقة بالرقم 32. 32 هنا يعني عرض الصورة. ينتج عن هذا (3 × 32 × 32).

ثانيًا ، يتعين علينا نقل البيانات من (عدد_قناة ، عرض ، ارتفاع) إلى (عرض ، ارتفاع ، عدد_قناة). لذلك ، سنستخدم وظيفة التبديل.

def load_cfar10_batch(cifar10_dataset_folder_pathو دفعة_ معرّف): مع افتح(cifar10_dataset_folder_path + '/ data_batch_' + ص(دفعة_ معرّف) ، الوضع='rb') مثل ملف: # لاحظ أن نوع الترميز هو 'latin1' دفعة = ورطة.حمل(ملفو التشفير='لاتينية 1') الميزات = دفعة['البيانات'].إعادة تشكيل((لين(دفعة['البيانات']) ، 3و 32و 32)).تبديل موضع(0و 2و 3و واحد) ملصقات = دفعة['ملصقات'] إرجاع الميزاتو ضع الكلمة المناسبة
  • استكشاف البيانات
def display_stats(cifar10_dataset_folder_pathو دفعة_ معرّفو رقم تعريف العينة): الميزاتو ملصقات = load_cfar10_batch(cifar10_dataset_folder_pathو دفعة_ معرّف) إذا ليس (0 <= رقم تعريف العينة < لين(الميزات)): طباعة('{}عينات دفعة واحدة{}.{}خارج النطاق..شكل(لين(الميزات) ، دفعة_ معرّفو رقم تعريف العينة)) إرجاع لا شيء طباعة(' احصائيات الدفعة #{}: '.شكل(دفعة_ معرّف)) طباعة(عدد العينات:{} '.شكل(لين(الميزات))) label_names = load_label_names() Label_counts = قاموس(الرمز البريدي(*على سبيل المثال.فريد(ملصقاتو عودة_العد=صحيح))) إلى عن على مفتاحو القيمة في Label_counts.العناصر(): طباعة(أعداد تسمية [{}] ({}):{}'.شكل(مفتاحو label_names[مفتاح].العلوي() ، القيمة)) sample_image = الميزات[رقم تعريف العينة] sample_label = ملصقات[رقم تعريف العينة] طباعة(' مثال على الصورة{}: '.شكل(رقم تعريف العينة)) طباعة(الصورة - القيمة الدنيا:{}قيمة الحد الأقصى:{}'.شكل(sample_image.دقيقة() ، sample_image.ماكس())) طباعة(الصورة - الشكل:{}'.شكل(sample_image.شكل)) طباعة(التسمية - معرّف التصنيف:{}اسم:{}'.شكل(sample_labelو label_names[sample_label])) PLT.imshow(sample_image)
٪matplotlib في النسق ٪التكوين InlineBackend.شكل_شكل = 'شبكية العين' استيراد حبيبي مثل على سبيل المثال # اكتشف مجموعة البيانات دفعة_ معرّف = 3 رقم تعريف العينة = 7000 display_stats(cifar10_dataset_folder_pathو دفعة_ معرّفو رقم تعريف العينة)

  • تنفيذ وظائف ما قبل المعالجة

سنقوم بتطبيع البيانات عبر Min-Max Normalization. هذا ببساطة يجعل جميع قيم x تتراوح بين 0 و 1.
y = (x-min) / (max-min)

جافا ما هو الرمز المميز
def تطبيع(x): '' جدال - x: إدخال بيانات الصورة في مصفوفة numpy [32 ، 32 ، 3] إرجاع - تطبيع x '' min_val = على سبيل المثال.دقيقة(x) max_val = على سبيل المثال.ماكس(x) x = (x-min_val) / (max_val-min_val) إرجاع x
  • تشفير واحد ساخن
def one_hot_encode(x): '' جدال - س: قائمة التسميات إرجاع - مصفوفة تشفير واحدة ساخنة (عدد الملصقات ، عدد الفئة) '' مشفر = على سبيل المثال.الأصفار((لين(x) ، 10)) إلى عن على معرفو ساعة في عد(x): مشفر[معرف] [ساعة] = واحد إرجاع مشفر
  • المعالجة المسبقة وحفظ البيانات
def _preprocess_and_save(تطبيعو one_hot_encodeو الميزاتو ملصقاتو اسم الملف): الميزات = تطبيع(الميزات) ملصقات = one_hot_encode(ملصقات) ورطة.تفريغ((الميزاتو ملصقات) ، افتح(اسم الملفو 'wb')) def preprocess_and_save_data(cifar10_dataset_folder_pathو تطبيعو one_hot_encode): n_ الدُفعات = 5 ميزات صالحة = [] صالحة = [] إلى عن على دفعة_أ في نطاق(واحدو n_ الدُفعات + واحد): الميزاتو ملصقات = load_cfar10_batch(cifar10_dataset_folder_pathو دفعة_أ) # اعثر على الفهرس ليكون النقطة كبيانات التحقق من الصحة في مجموعة البيانات الكاملة للدفعة (10٪) index_of_validation = int(لين(الميزات) * 0.1) # معالجة 90٪ من مجموعة البيانات الكاملة للدفعة # - تطبيع الميزات # - one_hot_encode the lables # - احفظ في ملف جديد باسم 'preprocess_batch_' + batch_number # - كل ملف لكل دفعة _preprocess_and_save(تطبيعو one_hot_encodeو الميزات[:-index_of_validation] ، ملصقات[:-index_of_validation] ، 'preprocess_batch_' + ص(دفعة_أ) + '.p') # على عكس مجموعة بيانات التدريب ، ستتم إضافة مجموعة بيانات التحقق من خلال كل مجموعة بيانات الدُفعات # - خذ 10٪ من مجموعة البيانات الكاملة للدُفعة # - قم بإضافتها إلى قائمة # - ميزات_ صالحة # - valid_labels ميزات صالحة.تمديد(الميزات[-index_of_validation:]) صالحة.تمديد(ملصقات[-index_of_validation:]) # معالجة مجموعة بيانات التحقق المكدسة بالكامل _preprocess_and_save(تطبيعو one_hot_encodeو على سبيل المثال.مجموعة مصفوفة(ميزات صالحة) ، على سبيل المثال.مجموعة مصفوفة(صالحة) ، 'preprocess_validation.p') # تحميل مجموعة بيانات الاختبار مع افتح(cifar10_dataset_folder_path + '/ test_batch'و الوضع='rb') مثل ملف: دفعة = ورطة.حمل(ملفو التشفير='لاتينية 1') # معالجة بيانات الاختبار اختبار_ميزات = دفعة['البيانات'].إعادة تشكيل((لين(دفعة['البيانات']) ، 3و 32و 32)).تبديل موضع(0و 2و 3و واحد) test_labels = دفعة['ملصقات'] # المعالجة المسبقة وحفظ جميع بيانات الاختبار _preprocess_and_save(تطبيعو one_hot_encodeو على سبيل المثال.مجموعة مصفوفة(اختبار_ميزات) ، على سبيل المثال.مجموعة مصفوفة(test_labels) ، 'preprocess_training.p')
preprocess_and_save_data(cifar10_dataset_folder_pathو تطبيعو one_hot_encode)
  • نقطة تفتيش
استيراد ورطة ميزات صالحةو صالحة = ورطة.حمل(افتح('preprocess_validation.p'و الوضع='rb'))
  • بناء الشبكة

يتكون النموذج بأكمله من 14 طبقة في المجموع.

استيراد تينسورفلو مثل تف def conv_net(xو احفظ): conv1_filter = تف.متغير(تف.truncated_normal(شكل=[3و 3و 3و 64] ، يعني=0و الأمراض المنقولة جنسيا ديف=0.08)) conv2_filter = تف.متغير(تف.truncated_normal(شكل=[3و 3و 64و 128] ، يعني=0و الأمراض المنقولة جنسيا ديف=0.08)) conv3_filter = تف.متغير(تف.truncated_normal(شكل=[5و 5و 128و 256] ، يعني=0و الأمراض المنقولة جنسيا ديف=0.08)) conv4_filter = تف.متغير(تف.truncated_normal(شكل=[5و 5و 256و 512] ، يعني=0و الأمراض المنقولة جنسيا ديف=0.08)) رقم 1 ، 2 التحويل 1 = تف.لا.التحويل(xو conv1_filterو خطوات واسعة=[واحدوواحدوواحدوواحد] ، حشوة='نفسه') التحويل 1 = تف.لا.ريلو(التحويل 1) conv1_pool = تف.لا.ماكس_بوول(التحويل 1و ksize=[واحدو2و2وواحد] ، خطوات واسعة=[واحدو2و2وواحد] ، حشوة='نفسه') conv1_bn = تف.طبقات.Batch_normalization(conv1_pool) # 3. 4 التحويل 2 = تف.لا.التحويل(conv1_bnو conv2_filterو خطوات واسعة=[واحدوواحدوواحدوواحد] ، حشوة='نفسه') التحويل 2 = تف.لا.ريلو(التحويل 2) conv2_pool = تف.لا.ماكس_بوول(التحويل 2و ksize=[واحدو2و2وواحد] ، خطوات واسعة=[واحدو2و2وواحد] ، حشوة='نفسه') conv2_bn = تف.طبقات.Batch_normalization(conv2_pool) # 5 ، 6 التحويل 3 = تف.لا.التحويل(conv2_bnو conv3_filterو خطوات واسعة=[واحدوواحدوواحدوواحد] ، حشوة='نفسه') التحويل 3 = تف.لا.ريلو(التحويل 3) conv3_pool = تف.لا.ماكس_بوول(التحويل 3و ksize=[واحدو2و2وواحد] ، خطوات واسعة=[واحدو2و2وواحد] ، حشوة='نفسه') conv3_bn = تف.طبقات.Batch_normalization(conv3_pool) # 7 ، 8 التحويل 4 = تف.لا.التحويل(conv3_bnو conv4_filterو خطوات واسعة=[واحدوواحدوواحدوواحد] ، حشوة='نفسه') التحويل 4 = تف.لا.ريلو(التحويل 4) conv4_pool = تف.لا.ماكس_بوول(التحويل 4و ksize=[واحدو2و2وواحد] ، خطوات واسعة=[واحدو2و2وواحد] ، حشوة='نفسه') conv4_bn = تف.طبقات.Batch_normalization(conv4_pool) # 9 مسطحة = تف.المساهمة.طبقات.تتسطح(conv4_bn) # 10 كامل 1 = تف.المساهمة.طبقات.متصل بالكامل(المدخلات=مسطحةو عدد_المخرجات=128و Activation_fn=تف.لا.ريلو) كامل 1 = تف.لا.أوقع(كامل 1و احفظ) كامل 1 = تف.طبقات.Batch_normalization(كامل 1) # أحد عشر ممتلئ 2 = تف.المساهمة.طبقات.متصل بالكامل(المدخلات=كامل 1و عدد_المخرجات=256و Activation_fn=تف.لا.ريلو) ممتلئ 2 = تف.لا.أوقع(ممتلئ 2و احفظ) ممتلئ 2 = تف.طبقات.Batch_normalization(ممتلئ 2) رقم 12 ممتلئ 3 = تف.المساهمة.طبقات.متصل بالكامل(المدخلات=ممتلئ 2و عدد_المخرجات=512و Activation_fn=تف.لا.ريلو) ممتلئ 3 = تف.لا.أوقع(ممتلئ 3و احفظ) ممتلئ 3 = تف.طبقات.Batch_normalization(ممتلئ 3) # 13 ممتلئ 4 = تف.المساهمة.طبقات.متصل بالكامل(المدخلات=ممتلئ 3و عدد_المخرجات=1024و Activation_fn=تف.لا.ريلو) ممتلئ 4 = تف.لا.أوقع(ممتلئ 4و احفظ) ممتلئ 4 = تف.طبقات.Batch_normalization(ممتلئ 4) # 14 خارج = تف.المساهمة.طبقات.متصل بالكامل(المدخلات=ممتلئ 3و عدد_المخرجات=10و Activation_fn=لا شيء) إرجاع خارج
  • Hyperparameters
العصور = 10 حجم الدفعة = 128 احتمالية البقاء = 0.7 معدل التعليم = 0.001
سجلات = conv_net(xو احفظ) نموذج = تف.هوية(سجلاتو اسم='سجلات') # اسم سجلات Tensor ، بحيث يمكن تحميلها من القرص بعد التدريب # الخسارة والمحسن كلفة = تف.تقليل_من(تف.لا.softmax_cross_entropy_with_logits(سجلات=سجلاتو ملصقات=ص)) محسن = تف.قطار.AdamOptimizer(معدل التعليم=معدل التعليم).قلل(كلفة) # صحة الربيع الصحيح = تف.مساو(تف.أرجماكس(سجلاتو واحد) ، تف.أرجماكس(صو واحد)) صحة = تف.تقليل_من(تف.المصبوب(الربيع الصحيحو تف.تعويم 32) ، اسم='صحة')
  • تدريب الشبكة العصبية
# التحسين الفردي 
def
train_neural_network(جلسةو محسنو احتمالية البقاءو feature_batchو دفعة التسمية): جلسة.يركض(محسنو feed_dict={ x: feature_batchو ص: دفعة التسميةو احفظ: احتمالية البقاء })
#Showing الإحصائيات def print_stats(جلسةو feature_batchو دفعة التسميةو كلفةو صحة): خسارة = sess.يركض(كلفةو feed_dict={ x: feature_batchو ص: دفعة التسميةو احفظ: واحد. }) valid_acc = sess.يركض(صحةو feed_dict={ x: ميزات صالحةو ص: صالحةو احفظ: واحد. }) طباعة('خسارة:{:> 10.4f}دقة التحقق:{:.6f}'.شكل(خسارةو valid_acc))
  • التدريب الكامل وحفظ النموذج
def الدُفعات_ميزات_التسميات(الميزاتو ملصقاتو حجم الدفعة): '' تقسيم الميزات والتسميات إلى مجموعات '' إلى عن على بداية في نطاق(0و لين(الميزات) ، حجم الدفعة): النهاية = دقيقة(بداية + حجم الدفعةو لين(الميزات)) يخضع أو يستسلم الميزات[بداية:النهاية] ، ملصقات[بداية:النهاية] def load_preprocess_training_batch(دفعة_ معرّفو حجم الدفعة): '' قم بتحميل بيانات التدريب المُعالج مسبقًا وأعدها على دفعات أو أقل '' اسم الملف = 'preprocess_batch_' + ص(دفعة_ معرّف) + '.p' الميزاتو ملصقات = ورطة.حمل(افتح(اسم الملفو الوضع='rb')) # أعد بيانات التدريب على دفعات ذات حجم أو أقل إرجاع الدُفعة_ميزات_التسميات(الميزاتو ملصقاتو حجم الدفعة)
# نموذج الحفظ والمسار 
save_model_path
= './image_classification' طباعة('تدريب...') مع تف.جلسة() مثل sess: # تهيئة المتغيرات sess.يركض(تف.global_variables_initializer()) # دورة تدريبية إلى عن على العصر في نطاق(العصور): # حلقة فوق جميع الدفعات n_ الدُفعات = 5 إلى عن على دفعة_أ في نطاق(واحدو n_ الدُفعات + واحد): إلى عن على دفعة_ميزاتو الدُفعات في load_preprocess_training_batch(دفعة_أو حجم الدفعة): train_neural_network(sessو محسنو احتمالية البقاءو دفعة_ميزاتو الدُفعات) طباعة(حقبة{:> 2}، CIFAR-10 دفعة{}: '.شكل(العصر + واحدو دفعة_أ) ، النهاية=') print_stats(sessو دفعة_ميزاتو الدُفعاتو كلفةو صحة) # حفظ النموذج التوقف = تف.قطار.التوقف() حفظ مسار = التوقف.حفظ(sessو save_model_path)

الآن ، تم الانتهاء من الجزء المهم من Tensorflow Image Classification. حان الوقت الآن لاختبار النموذج.

  • اختبار النموذج
استيراد ورطة استيراد حبيبي مثل على سبيل المثال استيراد matplotlib.pyplot مثل PLT من عند sklearn.preprocessing استيراد LabelBinarizer def الدُفعات_ميزات_التسميات(الميزاتو ملصقاتو حجم الدفعة): '' تقسيم الميزات والتسميات إلى مجموعات '' إلى عن على بداية في نطاق(0و لين(الميزات) ، حجم الدفعة): النهاية = دقيقة(بداية + حجم الدفعةو لين(الميزات)) يخضع أو يستسلم الميزات[بداية:النهاية] ، ملصقات[بداية:النهاية] def عرض_صورة_تنبؤات(الميزاتو ملصقاتو تنبؤاتو أعلى_التنبؤات): n_classes = 10 label_names = load_label_names() lab_binarizer = LabelBinarizer() lab_binarizer.لائق بدنيا(نطاق(n_classes)) label_ids = lab_binarizer.inverse_transform(على سبيل المثال.مجموعة مصفوفة(ملصقات)) تينو الفؤوس = PLT.المؤامرات الفرعية(nrows=أعلى_التنبؤاتو ncols=2و حجم التين=(عشرينو 10)) تين.مخطط ضيق() تين.العنوان('توقعات سوفت ماكس'و حجم الخط=عشرينو ص=1.1) n_ التوقعات = 3 حافة = 0.05 الهند = على سبيل المثال.غريب(n_ التوقعات) عرض = (واحد. - 2. * حافة) / n_ التوقعات إلى عن على image_iو (خاصيةو label_idو المقدماتو القيم المسبقة) في عد(الرمز البريدي(الميزاتو label_idsو تنبؤات.المؤشراتو تنبؤات.القيم)): إذا (image_i < أعلى_التنبؤات): الأسماء = [label_names[بريد_أ] إلى عن على بريد_أ في المقدمات] الاسم الصحيح = label_names[label_id] الفؤوس[image_i] [0].imshow((خاصية*255).نوع(على سبيل المثال.int32و نسخ=خاطئة)) الفؤوس[image_i] [0].تعيين العنوان(الاسم الصحيح) الفؤوس[image_i] [0].set_axis_off() الفؤوس[image_i] [واحد].باره(الهند + حافةو القيم المسبقة[:3] ، عرض) الفؤوس[image_i] [واحد].set_yticks(الهند + حافة) الفؤوس[image_i] [واحد].set_yticklabels(الأسماء[::-واحد]) الفؤوس[image_i] [واحد].set_xticks([0و 0.5و 1.0])
٪matplotlib في النسق ٪التكوين InlineBackend.شكل_شكل = 'شبكية العين' استيراد تينسورفلو مثل تف استيراد ورطة استيراد عشوائي save_model_path = './image_classification' حجم الدفعة = 64 n_samples = 10 أعلى_التنبؤات = 5 def نموذج_الاختبار(): اختبار_ميزاتو test_labels = ورطة.حمل(افتح('preprocess_training.p'و الوضع='rb')) تحميل الرسم البياني = تف.رسم بياني() مع تف.جلسة(رسم بياني=تحميل الرسم البياني) مثل sess: # تحميل النموذج محمل = تف.قطار.import_meta_graph(save_model_path + '.meta') محمل.استعادة(sessو save_model_path) # احصل على موتر من النموذج المحمل تحميل_x = تحميل الرسم البياني.get_tensor_by_name('input_x: 0') محملة = تحميل الرسم البياني.get_tensor_by_name('الإخراج_ص: 0') تحميل الملف = تحميل الرسم البياني.get_tensor_by_name('keep_prob: 0') تحميل = تحميل الرسم البياني.get_tensor_by_name('سجلات: 0') تحميل = تحميل الرسم البياني.get_tensor_by_name(الدقة: 0) # احصل على الدقة على دفعات لقيود الذاكرة test_batch_acc_total = 0 test_batch_count = 0 إلى عن على قطار_ميزة_دفعةو train_label_batch في الدُفعة_ميزات_التسميات(اختبار_ميزاتو test_labelsو حجم الدفعة): test_batch_acc_total + = sess.يركض( تحميلو feed_dict={تحميل_x: قطار_ميزة_دفعةو محملة: train_label_batchو تحميل الملف: 1.0}) test_batch_count + = واحد طباعة(دقة الاختبار:{} '.شكل(test_batch_acc_total/test_batch_count)) # طباعة عينات عشوائية عشوائية_اختبار_ميزاتو عشوائي_test_labels = tuple(الرمز البريدي(*عشوائي.عينة(قائمة(الرمز البريدي(اختبار_ميزاتو test_labels)) ، n_samples))) التوقعات العشوائية = sess.يركض( تف.لا.top_k(تف.لا.سوفت ماكس(تحميل) ، أعلى_التنبؤات) ، feed_dict={تحميل_x: عشوائية_اختبار_ميزاتو محملة: عشوائي_test_labelsو تحميل الملف: 1.0}) عرض_صورة_تنبؤات(عشوائية_اختبار_ميزاتو عشوائي_test_labelsو التوقعات العشوائيةو أعلى_التنبؤات) نموذج_الاختبار()

انتاج: دقة الاختبار: 0.5882762738853503

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

لذلك ، بهذا ، نصل إلى نهاية مقالة تصنيف الصور TensorFlow. أنا متأكد من أنه يمكنك الآن استخدام نفس الشيء لتصنيف أي نوع من الصور وأنت لست مبتدئًا في تصنيف الصور.

إديوريكا مع Python Certification Training يتم تنسيقه بواسطة متخصصين في الصناعة وفقًا لمتطلبات ومتطلبات الصناعة. سوف تتقن مفاهيم مثل وظيفة SoftMax ، والشبكات العصبية ذات التشفير التلقائي ، وآلة بولتزمان المقيدة (RBM) ، و Keras & TFLearn. تم تنسيق الدورة بشكل خاص من قبل خبراء الصناعة مع دراسات الحالة في الوقت الفعلي.