درباره این codelab
1. قبل از اینکه شروع کنی
در این نرم افزار کد، شما اصول اولیه "Hello, World" ML را یاد می گیرید، جایی که به جای برنامه نویسی قوانین صریح در یک زبان، مانند جاوا یا C++، سیستمی می سازید که بر روی داده ها آموزش دیده است تا قوانینی را که تعیین کننده رابطه بین اعداد
مشکل زیر را در نظر بگیرید: شما در حال ساختن سیستمی هستید که تشخیص فعالیت را برای ردیابی تناسب اندام انجام می دهد. ممکن است به سرعتی که یک فرد در حال راه رفتن است دسترسی داشته باشید و سعی کنید فعالیت خود را بر اساس آن سرعت با استفاده از یک شرطی استنباط کنید.
if(speed<4){
status=WALKING;
}
شما می توانید آن را به دویدن با شرایط دیگری گسترش دهید.
if(speed<4){
status=WALKING;
} else {
status=RUNNING;
}
در شرایط نهایی، شما می توانید به طور مشابه دوچرخه سواری را تشخیص دهید.
if(speed<4){
status=WALKING;
} else if(speed<12){
status=RUNNING;
} else {
status=BIKING;
}
حال، در نظر بگیرید که وقتی میخواهید فعالیتی مانند گلف را انجام دهید، چه اتفاقی میافتد. نحوه ایجاد یک قانون برای تعیین فعالیت کمتر واضح است.
// Now what?
نوشتن برنامه ای که فعالیت گلف را تشخیص دهد بسیار دشوار است، پس چه کار می کنید؟ برای حل مشکل می توانید از ML استفاده کنید!
پیش نیازها
قبل از تلاش برای این کد لبه، باید داشته باشید:
- دانش کامل پایتون
- مهارت های اولیه برنامه نویسی
چیزی که یاد خواهید گرفت
- اصول یادگیری ماشین
چیزی که خواهی ساخت
- اولین مدل یادگیری ماشین شما
آنچه شما نیاز دارید
اگر هرگز یک مدل ML با استفاده از TensorFlow ایجاد نکردهاید، میتوانید از Colaboratory، یک محیط مبتنی بر مرورگر که شامل تمام وابستگیهای مورد نیاز است، استفاده کنید. میتوانید کد بقیه کدهای در حال اجرا در Colab را پیدا کنید.
اگر از IDE دیگری استفاده می کنید، مطمئن شوید که پایتون را نصب کرده اید. همچنین به TensorFlow و کتابخانه NumPy نیاز خواهید داشت. میتوانید درباره و نصب TensorFlow در اینجا اطلاعات بیشتری کسب کنید. NumPy را اینجا نصب کنید.
2. ML چیست؟
روش سنتی ساخت برنامه ها را در نظر بگیرید، همانطور که در نمودار زیر نشان داده شده است:
شما قوانین را در یک زبان برنامه نویسی بیان می کنید. آنها بر روی داده ها عمل می کنند و برنامه شما پاسخ هایی را ارائه می دهد **.** در مورد تشخیص فعالیت، قوانین (کدی که برای تعریف انواع فعالیت نوشتید) بر روی داده ها (سرعت حرکت فرد) عمل می کند تا پاسخی را ایجاد کند: مقدار را از تابع برای تعیین وضعیت فعالیت کاربر (اعم از اینکه در حال راه رفتن، دویدن، دوچرخه سواری، یا انجام کار دیگری) است، برمی گرداند.
فرآیند تشخیص وضعیت فعالیت از طریق ML بسیار مشابه است، فقط محورها متفاوت هستند.
به جای تلاش برای تعریف قوانین و بیان آنها در یک زبان برنامه نویسی، شما پاسخ ها (معمولاً برچسب نامیده می شود) را همراه با داده ها ارائه می دهید و ماشین قوانینی را استنباط می کند که رابطه بین پاسخ ها و داده ها را تعیین می کند. برای مثال، سناریوی تشخیص فعالیت شما ممکن است در زمینه ML به این شکل باشد:
شما دادههای زیادی را جمعآوری میکنید و به آن برچسب میزنید تا به طور مؤثر بگویید: «پیادهروی شبیه این است» یا «دویدن شبیه این است». سپس، رایانه میتواند قوانینی را استنباط کند که از روی دادهها، الگوهای متمایزی که یک فعالیت خاص را نشان میدهند، تعیین میکنند.
این رویکرد علاوه بر اینکه یک روش جایگزین برای برنامهنویسی آن سناریو است، به شما امکان باز کردن سناریوهای جدید را نیز میدهد، مانند سناریوهای گلف که ممکن است تحت رویکرد برنامهنویسی سنتی مبتنی بر قوانین امکانپذیر نبوده باشد.
در برنامه نویسی سنتی، کد شما به یک باینری کامپایل می شود که معمولاً برنامه نامیده می شود. در ML، موردی که از داده ها و برچسب ها ایجاد می کنید، مدل نامیده می شود.
بنابراین، اگر به این نمودار برگردید:
نتیجه آن را یک مدل در نظر بگیرید که در زمان اجرا به این صورت استفاده می شود:
شما برخی از دادهها را به مدل منتقل میکنید و مدل از قوانینی که از آموزش استنباط کرده است برای پیشبینی استفاده میکند، مانند «این دادهها شبیه راه رفتن هستند» یا «این دادهها شبیه دوچرخهسواری هستند».
3. اولین مدل ML خود را ایجاد کنید
مجموعه اعداد زیر را در نظر بگیرید. آیا می توانید رابطه بین آنها را ببینید؟
ایکس: | -1 | 0 | 1 | 2 | 3 | 4 |
Y: | -2 | 1 | 4 | 7 | 10 | 13 |
همانطور که به آنها نگاه می کنید، ممکن است متوجه شوید که مقدار X با خواندن چپ به راست 1 افزایش می یابد و مقدار متناظر Y با 3 افزایش می یابد. احتمالا فکر می کنید که Y برابر است با 3X به علاوه یا منهای چیزی. سپس، احتمالاً به 0 روی X نگاه میکنید و میبینید که Y 1 است، و به رابطه Y=3X+1 میرسید.
این تقریباً دقیقاً همان روشی است که از کد برای آموزش یک مدل برای تشخیص الگوهای موجود در داده ها استفاده می کنید!
حالا به کد این کار نگاه کنید.
چگونه یک شبکه عصبی را برای انجام کار مشابه آموزش می دهید؟ استفاده از داده! با تغذیه آن با مجموعه ای از X و مجموعه ای از Y ها، باید بتواند رابطه بین آنها را دریابد.
واردات
با واردات خود شروع کنید. در اینجا، شما TensorFlow را وارد میکنید و برای سهولت استفاده، آن را tf
.
در مرحله بعد، کتابخانه ای به نام numpy
را وارد کنید، که داده های شما را به راحتی و به سرعت به صورت فهرست نشان می دهد.
چارچوب تعریف شبکه عصبی به عنوان مجموعه ای از لایه های متوالی keras
نامیده می شود، بنابراین آن را نیز وارد کنید.
import tensorflow as tf
import numpy as np
from tensorflow import keras
تعریف و کامپایل شبکه عصبی
در مرحله بعد، ساده ترین شبکه عصبی ممکن را ایجاد کنید. یک لایه دارد، آن لایه یک نورون دارد و شکل ورودی آن فقط یک مقدار است.
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
سپس کدی را برای کامپایل شبکه عصبی خود بنویسید. هنگامی که این کار را انجام می دهید، باید دو عملکرد را مشخص کنید - یک loss
و یک optimizer
.
در این مثال می دانید که رابطه بین اعداد Y=3X+1 است.
وقتی کامپیوتر سعی می کند آن را یاد بگیرد، حدس می زند، شاید Y=10X+10. تابع loss
پاسخ های حدس زده شده را در برابر پاسخ های صحیح شناخته شده اندازه گیری می کند و میزان خوب یا بد بودن آن را اندازه می گیرد.
در مرحله بعد، مدل از تابع optimizer
برای حدس زدن دیگر استفاده می کند. بر اساس نتیجه تابع ضرر، سعی میکند تلفات را به حداقل برساند. در این مرحله، شاید چیزی شبیه Y=5X+5 به دست بیاید. در حالی که هنوز خیلی بد است، به نتیجه صحیح نزدیکتر است (ضرر کمتر است).
این مدل برای تعداد دورهها تکرار میکند که به زودی خواهید دید.
ابتدا، در اینجا نحوه استفاده از mean_squared_error
برای از دست دادن و نزول گرادیان تصادفی ( sgd
) برای بهینهساز توضیح داده شده است. شما هنوز نیازی به درک ریاضی برای آنها ندارید، اما می توانید ببینید که آنها کار می کنند!
با گذشت زمان، عملکردهای مختلف و مناسب از دست دادن و بهینه ساز را برای سناریوهای مختلف یاد خواهید گرفت.
model.compile(optimizer='sgd', loss='mean_squared_error')
داده ها را ارائه دهید
بعد، مقداری داده را تغذیه کنید. در این مورد، شما شش متغیر X و شش Y را از قبل می گیرید. می توانید ببینید که رابطه بین آنها این است که Y = 3 X +1، بنابراین در جایی که X -1 است، Y برابر با 2 است.
یک کتابخانه پایتون به نام NumPy بسیاری از ساختارهای داده از نوع آرایه را برای انجام این کار فراهم می کند. مقادیر را به عنوان یک آرایه در NumPy با np.array[]
مشخص کنید.
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-2.0, 1.0, 4.0, 7.0, 10.0, 13.0], dtype=float)
اکنون تمام کدهای مورد نیاز برای تعریف شبکه عصبی را دارید. مرحله بعدی این است که آن را آموزش دهید تا ببینید آیا می تواند الگوهای بین آن اعداد را استنتاج کند و از آنها برای ایجاد یک مدل استفاده کند.
4. آموزش شبکه عصبی
فرآیند آموزش شبکه عصبی، جایی که ارتباط بین X و Y را یاد می گیرد، در model.fit
است. اینجاست که قبل از حدس زدن، اندازه گیری خوب یا بد بودن آن (از دست دادن)، یا استفاده از بهینه ساز برای حدس زدن دیگر، از حلقه عبور می کند. این کار را برای تعداد دوره هایی که شما مشخص می کنید انجام می دهد. وقتی آن کد را اجرا می کنید، خواهید دید که ضرر برای هر دوره چاپ می شود.
model.fit(xs, ys, epochs=500)
به عنوان مثال، می توانید ببینید که در چند دوره اول، ارزش ضرر بسیار زیاد است، اما با هر مرحله کوچکتر می شود.
با پیشرفت آموزش، ضرر به زودی بسیار کم می شود.
تا زمانی که آموزش انجام می شود، ضرر بسیار کم است، و نشان می دهد که مدل ما در استنباط رابطه بین اعداد کار بسیار خوبی انجام می دهد.
احتمالاً به همه 500 دوره نیاز ندارید و می توانید مقادیر مختلفی را آزمایش کنید. همانطور که از مثال می بینید، ضرر پس از 50 دوره واقعاً ناچیز است، بنابراین ممکن است کافی باشد!
5. از مدل استفاده کنید
شما مدلی دارید که برای یادگیری رابطه بین X و Y آموزش دیده است. می توانید از روش model.predict
استفاده کنید تا Y را برای X قبلاً ناشناخته مشخص کند. برای مثال، اگر X 10 باشد، نظر شما چیست. Y خواهد بود؟ قبل از اجرای کد زیر یک حدس بزنید:
print(model.predict([10.0]))
ممکن است فکر کرده باشید 31، اما در نهایت کمی به پایان رسید. به نظر شما چرا اینطور است؟
شبکههای عصبی با احتمالات سر و کار دارند، بنابراین محاسبه کرد که احتمال بسیار بالایی وجود دارد که رابطه بین X و Y Y=3X+1 باشد، اما تنها با شش نقطه داده نمیتوان مطمئن شد. نتیجه بسیار نزدیک به 31 است، اما نه لزوماً 31.
همانطور که با شبکه های عصبی کار می کنید، شاهد تکرار آن الگو خواهید بود. شما تقریباً همیشه با احتمالات سر و کار خواهید داشت، نه با قطعیت ها، و کمی کدنویسی انجام می دهید تا بفهمید که نتیجه بر اساس احتمالات چیست، به خصوص وقتی صحبت از طبقه بندی می شود.
6. تبریک می گویم
باور کنید یا نه، شما بیشتر مفاهیم را در ML پوشش دادید که در سناریوهای بسیار پیچیده تر از آنها استفاده خواهید کرد. شما یاد گرفتید که چگونه یک شبکه عصبی را آموزش دهید تا با تعریف شبکه، رابطه بین دو مجموعه اعداد را تشخیص دهد. شما مجموعهای از لایهها را تعریف کردید (در این مورد فقط یک لایه) که حاوی نورونها بود (همچنین در این مورد، فقط یک)، که سپس با یک تابع از دست دادن و یک بهینهساز کامپایل کردید.
مجموعه ای از یک شبکه، تابع ضرر و بهینه ساز فرآیند حدس زدن رابطه بین اعداد، اندازه گیری میزان عملکرد آنها و سپس تولید پارامترهای جدید برای حدس های جدید را انجام می دهد. در TensorFlow.org بیشتر بیاموزید.
بیشتر بدانید
برای اینکه بدانید چگونه ML و TensorFlow میتوانند به مدلهای بینایی رایانه شما کمک کنند، به ساخت مدل بینایی رایانه با TensorFlow ادامه دهید.