Tensor Flow هو إطار عمل لبناء الشبكات العصبية والعمل عليها من Google. يتيح لك التجريد من التفاصيل الداخلية للتعلم الآلي والتركيز مباشرة على حل مشكلتك. شيء قوي للغاية ، يسمح لك بإنشاء وتدريب واستخدام الشبكات العصبية من أي نوع معروف. لم أجد نصاً واحداً معقولاً على حبري حول هذا الموضوع ، لذا أكتب نصي الخاص. سنصف أدناه تنفيذ حل مشكلة الفطر باستخدام مكتبة Tensor Flow. بالمناسبة ، الخوارزمية الموضحة أدناه مناسبة للتنبؤات في أي مجال تقريبًا. على سبيل المثال ، احتمالية الإصابة بالسرطان في الشخص في المستقبل أو البطاقات في الخصم في لعبة البوكر.
التحدي
جوهر المشكلة: على أساس معلمات المدخلات من الفطريات لتحديد قابليتها للأكل. إن الدقة هي أن هذه المعلمات هي تصنيفية وليست رقمية. على سبيل المثال ، يمكن تعيين معلمة "شكل القبعة" على "مسطح" أو "محدب" أو "على شكل مخروطي". مجموعة بيانات الفطر للتعلم الشبكي المأخوذة من
مستودع التعلم الآلي . وبالتالي ، يمكن أن يسمى حل المشكلة نوعًا من Hello World في مجال التعلم الآلي ، إلى جانب
مشكلة القزحية ، حيث يتم التعبير عن معلمات الزهرة في القيم الرقمية.
كود المصدر
يمكنك تنزيل جميع المصادر من مستودعي على Github:
link . افعل ذلك لترى الكود وهو يعمل. استخدم رموز المصدر فقط ، لأنه تتم ملاحظة جميع المسافات البادئة والتشفير اللازمة هناك. أدناه سيتم مناقشة العملية برمتها بالتفصيل.
تحضير
من المفترض أن لديك تثبيت Tensor Flow مثبت مسبقًا. إذا لم يكن كذلك ، يمكنك تثبيت
الرابط .
كود المصدر
from __future__ import absolute_import from __future__ import division from __future__ import print_function import tensorflow as tf import numpy as np import pandas as pd from sklearn.model_selection import train_test_split import os
قم بتنزيل وإعداد البيانات من المستودع
سنقوم بتنزيل بيانات التدريب واختبار الشبكة العصبية من
مستودع التعلم الآلي الذي تم إنشاؤه خصيصًا لهذا الغرض. يتم تقديم جميع البيانات في ملفين: agaricus-lepiota.data و agaricus-lepiota.names. أول 8124 صفًا و 22 عمودًا. يوفر سطر واحد فطر واحد ، كل عمود هو واحد من 22 معلمة للفطر في شكل حرف اختزال من كلمة المعلمة بأكملها. أسطورة جميع الشخصيات موجودة في ملف agarius-lepiota.names.
يجب معالجة البيانات من المستودع من أجل إحضاره إلى شكل مقبول لـ Tensor Flow. أولا نستورد بعض المكتبات للعمل
from __future__ import absolute_import from __future__ import division from __future__ import print_function import tensorflow as tf import numpy as np import pandas as pd from sklearn.model_selection import train_test_split import os
ثم سنشكل رأسًا من معلمات الفطر لـ Tensor Flow ، بحيث تعرف المكتبة أي عمود في ملف البيانات يتوافق مع أي معلمة. يتم لصق القبعة على ملف البيانات. نشكل في شكل صفيف ، يتم أخذ عناصرها من ملف agaricus-lepiota.names.
header = ['class', 'cap_shape', 'cap_surface', 'cap_color', 'bruises', 'odor', 'gill_attachment', 'gill_spacing', 'gill_size', 'gill_color', 'stalk_shape', 'stalk_root', 'stalk_surface_above_ring', 'stalk_surface_below_ring', 'stalk_color_above_ring', 'stalk_color_below_ring', 'veil_type', 'veil_color', 'ring_number', 'ring_type', 'spore_print_color', 'population', 'habitat'] df = pd.read_csv(data_file_name, sep=',', names=header)
الآن أنت بحاجة للتعامل مع البيانات المفقودة. في هذه الحالة ، يتم تعيين الرمز "؟" في ملف agaricus-lepiota.data بدلاً من المعلمة. هناك العديد من الطرق للتعامل مع مثل هذه الحالات ، ولكننا ببساطة سنحذف السطر بأكمله بمعلمة واحدة مفقودة على الأقل.
df.replace('?', np.nan, inplace=True) df.dropna(inplace=True)
بعد ذلك ، يجب عليك استبدال معلمة قابلية الأكل الرمزية يدويًا بمعامل رقمي. بمعنى ، استبدل "p" و "e" بـ 0 و 1.
df['class'].replace('p', 0, inplace=True) df['class'].replace('e', 1, inplace=True)
وبعد ذلك ، يمكنك تحويل بقية البيانات إلى رقم. هذا ما تقوم به وظيفة get_dummies في مكتبة الباندا.
cols_to_transform = header[1:] df = pd.get_dummies(df, columns=cols_to_transform)
يجب تدريب أي شبكة عصبية. ولكن بالإضافة إلى ذلك ، فإنه يحتاج أيضًا إلى المعايرة من أجل زيادة دقة العمل في الظروف الحقيقية. للقيام بذلك ، سوف نقسم مجموعة البيانات الخاصة بنا إلى قسمين - التدريب والمعايرة. الأول سيكون أكبر من الثاني ، كما يجب أن يكون.
df_train, df_test = train_test_split(df, test_size=0.1)
والأخير. يتطلب Tensor Flow عدد صفوف وأعمدة الملف ليتم الإشارة إليه في بداية ملفات البيانات. سنقوم باستخراج هذه المعلومات يدويًا من مجموعات بيانات التدريب والمعايرة الخاصة بنا ومن ثم الكتابة إلى ملفات CSV الناتجة.
في النهاية ، يجب أن تحصل على هذه الملفات:
التدريب والمعايرة .
رمي البيانات التي تم إنشاؤها في Tensor Flow
الآن بعد أن قمنا بتنزيله من المستودع ومعالجة ملفات CSV باستخدام بيانات الفطر ، يمكنك إرسالها إلى Tensor Flow للتدريب. يتم ذلك باستخدام دالة load_csv_with_header () التي يوفرها الإطار نفسه:
training_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename='mushroom_train.csv', target_dtype=np.int, features_dtype=np.int, target_column=0) test_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename='mushroom_test.csv', target_dtype=np.int, features_dtype=np.int, target_column=0)
تعمل دالة load_csv_with_header () في تكوين مجموعة بيانات تدريب من الملفات التي قمنا بجمعها أعلاه. بالإضافة إلى ملف البيانات ، تأخذ الدالة target_dtype كوسيطة ، وهي نوع من البيانات المتوقعة في النهاية. في حالتنا ، من الضروري تعليم الشبكة العصبية للتنبؤ بأكل أو سمية الفطريات ، والتي يمكن التعبير عنها بالقيم 1 أو 0. وبالتالي ، في حالتنا ، target_dtype هي قيمة صحيحة. features_dtype - معلمة يتم فيها تعيين نوع المعلمات المقبولة للتدريب. في حالتنا ، هو أيضًا عدد صحيح (في البداية كانوا سلسلة ، ولكن ، كما تتذكر ، تجاوزناهم في رقم). في النهاية ، يتم تعيين معلمة target_column ، وهو فهرس العمود مع المعلمة التي تتوقعها الشبكة العصبية. أي مع معلمة قابلية الطعام.
إنشاء كائن مصنف تدفق الموتر
أي كائن من فئة تشارك مباشرة في توقع النتيجة. وبعبارة أخرى ، فئة الشبكة العصبية نفسها.
feature_columns = [tf.contrib.layers.real_valued_column("", dimension=98)] classifier = tf.contrib.learn.DNNClassifier( feature_columns=feature_columns, hidden_units=[10, 20, 10], n_classes=2, model_dir="/tmp/mushroom_model")
المعلمة الأولى هي feature_columns. هذه هي معلمات الفطر. يرجى ملاحظة أنه يتم إنشاء قيمة المعلمة هناك ، وهي أعلى قليلاً. هناك ، عند الإدخال ، يتم أخذ القيمة 98 من معلمة البعد ، مما يعني 98 معلمة مختلفة للفطر ، باستثناء الطعام.
hidden_units - عدد الخلايا العصبية في كل طبقة من الشبكة العصبية. الاختيار الصحيح لعدد الطبقات والخلايا العصبية فيها شيء على مستوى الفن في مجال التعلم الآلي. من الممكن تحديد هذه القيم بشكل صحيح فقط بعد الخبرة. لقد أخذنا هذه الأرقام لمجرد أنها مدرجة في أحد دروس Tensor Flow التعليمية. ويعملون.
n_classes - عدد الفصول المتوقعة. لدينا اثنان منهم - صالح للأكل وليس.
model_dir - المسار الذي سيتم فيه حفظ النموذج المدرّب للشبكة العصبية. وفي المستقبل سيتم استخدامه للتنبؤ بالنتائج ، حتى لا يتم تدريب الشبكة في كل مرة.
تدريب
لسهولة العمل في المستقبل ، سنقوم بإنشاء وظيفتين:
def get_test_inputs(): x = tf.constant(test_set.data) y = tf.constant(test_set.target) return x, y def get_train_inputs(): x = tf.constant(training_set.data) y = tf.constant(training_set.target) return x, y
توفر كل وظيفة مجموعتها الخاصة من بيانات الإدخال - للتدريب والمعايرة. x و y هما ثوابت Tensor Flow التي يحتاجها الإطار للعمل. لا تدخل في التفاصيل ، فقط اقبل أن هذه الوظائف يجب أن تكون وسيطًا بين البيانات والشبكة العصبية.
ندرب شبكة:
classifier.fit(input_fn=get_train_inputs, steps=2000)
تأخذ المعلمة الأولى بيانات الإدخال التي تم تكوينها أعلاه ، والثانية - عدد خطوات التدريب. مرة أخرى ، تم استخدام الرقم في أحد أدلة Tensor Flow ، وسيأتيك فهم هذا الإعداد مع الخبرة.
بعد ذلك ، قم بمعايرة الشبكة المدربة. يتم ذلك باستخدام مجموعة بيانات المعايرة التي تم إنشاؤها أعلاه. وستكون نتيجة العمل دقة التنبؤات المستقبلية للشبكة (الدقة _النقاط).
accuracy_score = classifier.evaluate(input_fn=get_test_inputs, steps=1)["accuracy"] print("\n : {0:f}\n".format(accuracy_score))
سنختبر في
الآن الشبكة العصبية جاهزة ، ويمكنك محاولة التنبؤ بمساعدة فطرياتها.
def new_samples(): return np.array([[0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]], dtype=np.int)
تقدم الوظيفة أعلاه بيانات فطرين جديدين تمامًا لم يكونا موجودين في التدريب أو في مجموعات المعايرة (في الواقع ، تم سحبهما ببساطة من الأخير). تخيل ، على سبيل المثال ، أنك اشتريتها في السوق ، وتحاول فهم ما إذا كان يمكن تناولها. سيحدد الرمز أدناه هذا:
predictions = list(classifier.predict(input_fn=new_samples)) print(" : {}\n" .format(predictions))
يجب أن تكون نتيجة العمل على النحو التالي:
: [0, 1]
وهذا يعني أن الفطر الأول سام ، والثاني صالح للأكل. وبالتالي ، يمكنك إجراء تنبؤات استنادًا إلى أي بيانات ، سواء كانت فطرًا أو أشخاصًا أو حيوانات أو أي شيء. يكفي لتشكيل بيانات الإدخال بشكل صحيح. والتنبؤ ، على سبيل المثال ، باحتمالية عدم انتظام ضربات القلب لدى المريض في المستقبل أو حركة أسعار الأسهم في البورصة.