۱. مرور کلی
در این آزمایش، شما یاد خواهید گرفت که چگونه یک طبقهبندیکننده Keras بسازید. به جای تلاش برای کشف ترکیب کاملی از لایههای شبکه عصبی برای تشخیص گلها، ابتدا از تکنیکی به نام یادگیری انتقالی برای تطبیق یک مدل قدرتمند از پیش آموزشدیده با مجموعه دادههای خود استفاده خواهیم کرد.
این آزمایشگاه شامل توضیحات نظری لازم در مورد شبکههای عصبی است و نقطه شروع خوبی برای توسعهدهندگانی است که در مورد یادگیری عمیق یاد میگیرند.
این آزمایش بخش دوم از مجموعه «کرس روی TPU» است. میتوانید آنها را به ترتیب زیر یا به صورت مستقل انجام دهید.
- خطوط لوله داده با سرعت TPU: tf.data.Dataset و TFRecords
- [این آزمایشگاه] اولین مدل Keras شما، با یادگیری انتقالی
- شبکههای عصبی کانولوشن، با Keras و TPUها
- شبکههای عصبی مدرن، squeezenet، Xception، با Keras و TPUها

آنچه یاد خواهید گرفت
- برای ساخت طبقهبندیکننده تصویر Keras خودتان با یک لایه softmax و تلفات آنتروپی متقاطع
- برای تقلب 😈، به جای ساختن مدلهای خودتان، از یادگیری انتقالی استفاده کنید.
بازخورد
اگر در این آزمایشگاه کد، نکتهی نادرستی میبینید، لطفاً به ما بگویید. میتوانید از طریق GitHub issues [ لینک بازخورد ] بازخورد خود را ارائه دهید.
۲. شروع سریع Google Colaboratory
این آزمایشگاه از Google Collaboratory استفاده میکند و نیازی به راهاندازی از طرف شما ندارد. Colaboratory یک پلتفرم دفترچه یادداشت آنلاین برای اهداف آموزشی است. این پلتفرم آموزش رایگان CPU، GPU و TPU را ارائه میدهد.

میتوانید این دفترچه نمونه را باز کنید و چند سلول را مرور کنید تا با Colaboratory آشنا شوید.
یک پس زمینه TPU انتخاب کنید

در منوی Colab، Runtime > Change runtime type را انتخاب کنید و سپس TPU را انتخاب کنید. در این آزمایشگاه کد، از یک TPU (واحد پردازش تنسور) قدرتمند که برای آموزش شتابدهی سختافزاری پشتیبانی میشود، استفاده خواهید کرد. اتصال به محیط اجرا به طور خودکار در اولین اجرا اتفاق میافتد، یا میتوانید از دکمه "اتصال" در گوشه بالا سمت راست استفاده کنید.
اجرای نوت بوک

با کلیک روی یک سلول و استفاده از Shift-ENTER، سلولها را یکییکی اجرا کنید. همچنین میتوانید کل نوتبوک را با Runtime > Run all اجرا کنید.
فهرست مطالب

همه دفترچهها فهرست مطالب دارند. میتوانید آن را با استفاده از فلش سیاه سمت چپ باز کنید.
سلولهای پنهان

بعضی از سلولها فقط عنوان خود را نشان میدهند. این یک ویژگی مخصوص دفترچه یادداشت Colab است. میتوانید روی آنها دوبار کلیک کنید تا کد داخلشان را ببینید، اما معمولاً خیلی جالب نیست. معمولاً از توابع پشتیبانی یا تجسمسازی میکنند. برای تعریف توابع داخلشان، هنوز باید این سلولها را اجرا کنید.
احراز هویت

دسترسی به مخازن ذخیرهسازی ابری گوگل خصوصی شما برای Colab امکانپذیر است، مشروط بر اینکه با یک حساب کاربری مجاز احراز هویت شوید. قطعه کد بالا فرآیند احراز هویت را آغاز میکند.
۳. [اطلاعات] طبقهبندیکننده شبکه عصبی ۱۰۱
به طور خلاصه
اگر تمام اصطلاحات پررنگشده در پاراگراف بعدی را از قبل میدانید، میتوانید به تمرین بعدی بروید. اگر تازه یادگیری عمیق را شروع کردهاید، خوش آمدید و لطفاً ادامه مطلب را بخوانید.
برای مدلهایی که به صورت دنبالهای از لایهها ساخته شدهاند، Keras رابط برنامهنویسی کاربردی Sequential را ارائه میدهد. برای مثال، یک طبقهبندیکننده تصویر با استفاده از سه لایه متراکم را میتوان در Keras به صورت زیر نوشت:
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
tf.keras.layers.Dense(500, activation="relu"),
tf.keras.layers.Dense(50, activation="relu"),
tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])
# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy']) # % of correct answers
# train the model
model.fit(dataset, ... )

شبکه عصبی متراکم
این سادهترین شبکه عصبی برای طبقهبندی تصاویر است. این شبکه از «نورونها»یی ساخته شده که در لایهها مرتب شدهاند. لایه اول دادههای ورودی را پردازش میکند و خروجیهای آن را به لایههای دیگر میدهد. به این شبکه «متراکم» میگویند زیرا هر نورون به تمام نورونهای لایه قبلی متصل است.

شما میتوانید با تبدیل مقادیر RGB تمام پیکسلهای یک تصویر به یک بردار طولانی و استفاده از آن به عنوان ورودی، آن را به چنین شبکهای وارد کنید. این بهترین تکنیک برای تشخیص تصویر نیست، اما بعداً آن را بهبود خواهیم بخشید.
نورونها، فعالسازیها، RELU
یک «نورون» مجموع وزنی تمام ورودیهای خود را محاسبه میکند، مقداری به نام «بایاس» به آن اضافه میکند و نتیجه را از طریق چیزی به نام «تابع فعالسازی» ارسال میکند. وزنها و بایاس در ابتدا ناشناخته هستند. آنها به صورت تصادفی مقداردهی اولیه میشوند و با آموزش شبکه عصبی روی تعداد زیادی از دادههای شناخته شده، «یاد گرفته» میشوند.

محبوبترین تابع فعالسازی، RELU (Rectified Linear Unit) نام دارد. همانطور که در نمودار بالا میبینید، این تابع بسیار ساده است.
فعالسازی سافتمکس
شبکه فوق با یک لایه ۵ نورونی به پایان میرسد زیرا ما گلها را به ۵ دسته (رز، لاله، قاصدک، مینا، آفتابگردان) طبقهبندی میکنیم. نورونهای لایههای میانی با استفاده از تابع فعالسازی کلاسیک RELU فعال میشوند. با این حال، در لایه آخر، میخواهیم اعداد بین ۰ و ۱ را محاسبه کنیم که نشاندهنده احتمال این است که این گل رز، لاله و غیره باشد. برای این کار، از یک تابع فعالسازی به نام "softmax" استفاده خواهیم کرد.
اعمال softmax روی یک بردار با در نظر گرفتن تابع نمایی هر عنصر و سپس نرمالسازی بردار، معمولاً با استفاده از نرم L1 (مجموع قدرمطلقها) انجام میشود، به طوری که مجموع مقادیر برابر با ۱ شود و بتوان آنها را به عنوان احتمال تفسیر کرد.


اتلاف آنتروپی متقاطع
حالا که شبکه عصبی ما پیشبینیهایی از تصاویر ورودی تولید میکند، باید میزان دقت آنها را اندازهگیری کنیم، یعنی فاصله بین آنچه شبکه به ما میگوید و پاسخهای صحیح، که اغلب "برچسب" نامیده میشوند. به یاد داشته باشید که ما برای همه تصاویر موجود در مجموعه دادهها برچسبهای صحیح داریم.
هر فاصلهای جواب میدهد، اما برای مسائل طبقهبندی، فاصلهای که «فاصله آنتروپی متقاطع» نامیده میشود، مؤثرترین است. ما این را تابع خطا یا «زیان» مینامیم:

گرادیان نزولی
«آموزش» شبکه عصبی در واقع به معنای استفاده از تصاویر آموزشی و برچسبها برای تنظیم وزنها و بایاسها به منظور به حداقل رساندن تابع زیان آنتروپی متقاطع است. در اینجا نحوه کار آن آمده است.
آنتروپی متقاطع تابعی از وزنها، بایاسها، پیکسلهای تصویر آموزشی و کلاس شناختهشده آن است.
اگر مشتقات جزئی آنتروپی متقاطع را نسبت به تمام وزنها و تمام بایاسها محاسبه کنیم، یک "گرادیان" به دست میآوریم که برای یک تصویر، برچسب و مقدار فعلی وزنها و بایاسهای داده شده محاسبه میشود. به یاد داشته باشید که میتوانیم میلیونها وزن و بایاس داشته باشیم، بنابراین محاسبه گرادیان به نظر کار زیادی میآید. خوشبختانه، Tensorflow این کار را برای ما انجام میدهد. خاصیت ریاضی گرادیان این است که به سمت "بالا" اشاره میکند. از آنجایی که میخواهیم به جایی برویم که آنتروپی متقاطع کم است، در جهت مخالف میرویم. وزنها و بایاسها را با کسری از گرادیان بهروزرسانی میکنیم. سپس همین کار را بارها و بارها با استفاده از دستههای بعدی تصاویر آموزشی و برچسبها، در یک حلقه آموزشی انجام میدهیم. امیدواریم که این به جایی همگرا شود که آنتروپی متقاطع حداقل باشد، اگرچه هیچ چیز تضمین نمیکند که این حداقل منحصر به فرد باشد.

مینی بچینگ و مومنتوم
شما میتوانید گرادیان خود را فقط روی یک تصویر نمونه محاسبه کنید و وزنها و بایاسها را فوراً بهروزرسانی کنید، اما انجام این کار روی یک دسته، مثلاً ۱۲۸ تصویر، گرادیانی را ارائه میدهد که محدودیتهای اعمال شده توسط تصاویر نمونه مختلف را بهتر نشان میدهد و بنابراین احتمالاً سریعتر به سمت راهحل همگرا میشود. اندازه مینی-دسته یک پارامتر قابل تنظیم است.
این تکنیک که گاهی اوقات «کاهش گرادیان تصادفی» نامیده میشود، یک مزیت عملیتر دیگر نیز دارد: کار با دستهها به معنای کار با ماتریسهای بزرگتر نیز هست و بهینهسازی این ماتریسها روی GPUها و TPUها معمولاً آسانتر است.
با این حال، همگرایی هنوز میتواند کمی آشوبناک باشد و حتی اگر بردار گرادیان همه صفر باشد، میتواند متوقف شود. آیا این بدان معناست که ما یک مینیمم پیدا کردهایم؟ نه همیشه. یک مؤلفه گرادیان میتواند روی یک مینیمم یا یک ماکزیمم صفر باشد. با یک بردار گرادیان با میلیونها عنصر، اگر همه آنها صفر باشند، احتمال اینکه هر صفر مربوط به یک مینیمم باشد و هیچ یک از آنها به یک نقطه ماکزیمم نرسد، بسیار کم است. در فضایی با ابعاد زیاد، نقاط زینی بسیار رایج هستند و ما نمیخواهیم در آنها متوقف شویم.

تصویر: یک نقطه زینی. گرادیان صفر است اما در همه جهات حداقل نیست. (منبع تصویر: ویکیمدیا: نوشته نیکوگوارو - اثر شخصی، CC BY 3.0 )
راه حل این است که مقداری مومنتوم به الگوریتم بهینهسازی اضافه کنیم تا بتواند بدون توقف از نقاط زینی عبور کند.
واژهنامه
دستهای یا مینی-دستهای : آموزش همیشه روی دستههایی از دادههای آموزشی و برچسبها انجام میشود. انجام این کار به همگرایی الگوریتم کمک میکند. بُعد «دستهای» معمولاً اولین بُعد از تانسورهای داده است. به عنوان مثال، یک تانسور شکل [100، 192، 192، 3] شامل 100 تصویر با ابعاد 192x192 پیکسل با سه مقدار در هر پیکسل (RGB) است.
تابع زیان آنتروپی متقاطع : یک تابع زیان ویژه که اغلب در طبقهبندیکنندهها استفاده میشود.
لایه متراکم : لایهای از نورونها که در آن هر نورون به تمام نورونهای لایه قبلی متصل است.
ویژگیها : ورودیهای یک شبکه عصبی گاهی اوقات «ویژگیها» نامیده میشوند. هنر تشخیص اینکه کدام بخشهای یک مجموعه داده (یا ترکیبی از بخشها) باید به یک شبکه عصبی داده شوند تا پیشبینیهای خوبی حاصل شود، «مهندسی ویژگی» نامیده میشود.
برچسبها : نام دیگری برای «کلاسها» یا پاسخهای صحیح در یک مسئله طبقهبندی نظارتشده
نرخ یادگیری : کسری از گرادیان که وزنها و بایاسها در هر تکرار حلقه آموزش بهروزرسانی میشوند.
لوجیتها : خروجیهای یک لایه از نورونها قبل از اعمال تابع فعالسازی، «لوجیت» نامیده میشوند. این اصطلاح از «تابع لجستیک» یا «تابع سیگموئید» گرفته شده است که قبلاً محبوبترین تابع فعالسازی بود. «خروجیهای نورون قبل از تابع لجستیک» به «لوجیتها» خلاصه شد.
تابع خطا (loss) : تابع خطایی که خروجیهای شبکه عصبی را با پاسخهای صحیح مقایسه میکند.
نورون : مجموع وزنی ورودیهایش را محاسبه میکند، یک بایاس اضافه میکند و نتیجه را از طریق یک تابع فعالسازی ارسال میکند.
کدگذاری وان-هات : کلاس ۳ از ۵ به صورت برداری با ۵ عنصر کدگذاری میشود که همه عناصر آن صفر هستند به جز عنصر سوم که ۱ است.
relu : واحد خطی یکسو شده. یک تابع فعالسازی محبوب برای نورونها.
سیگموئید : تابع فعالسازی دیگری که قبلاً محبوب بود و هنوز هم در موارد خاص مفید است.
softmax : یک تابع فعالسازی ویژه که روی یک بردار عمل میکند، تفاوت بین بزرگترین مؤلفه و سایر مؤلفهها را افزایش میدهد، و همچنین بردار را طوری نرمالسازی میکند که مجموع آن ۱ باشد تا بتوان آن را به عنوان برداری از احتمالات تفسیر کرد. به عنوان آخرین مرحله در طبقهبندیکنندهها استفاده میشود.
تانسور : یک "تانسور" مانند یک ماتریس است اما با تعداد دلخواهی از ابعاد. یک تانسور یک بعدی یک بردار است. یک تانسور دو بعدی یک ماتریس است. و سپس میتوانید تانسورهایی با ۳، ۴، ۵ یا بیشتر بعد داشته باشید.
۴. انتقال یادگیری
برای یک مسئله طبقهبندی تصویر، لایههای متراکم احتمالاً کافی نخواهند بود. ما باید در مورد لایههای کانولوشن و روشهای مختلف چیدمان آنها اطلاعات کسب کنیم.
اما میتوانیم از یک راه میانبر هم استفاده کنیم! شبکههای عصبی کانولوشنی کاملاً آموزشدیده برای دانلود موجود هستند. میتوان آخرین لایه آنها، یعنی هد طبقهبندی softmax، را جدا کرد و آن را با لایه خودتان جایگزین کرد. تمام وزنها و بایاسهای آموزشدیده به همان شکل باقی میمانند، شما فقط لایه softmax اضافه شده را دوباره آموزش میدهید. این تکنیک یادگیری انتقالی نام دارد و به طرز شگفتانگیزی، تا زمانی که مجموعه دادهای که شبکه عصبی روی آن از قبل آموزش دیده است، "به اندازه کافی نزدیک" به مجموعه داده شما باشد، کار میکند.
عملی
لطفاً دفترچه یادداشت زیر را باز کنید، سلولها را اجرا کنید (Shift-ENTER) و هر جا که برچسب «کار لازم است» را دیدید، دستورالعملها را دنبال کنید.
Keras Flowers transfer learning (playground).ipynb
اطلاعات تکمیلی
با یادگیری انتقالی، شما از معماریهای پیشرفته شبکه عصبی کانولوشنی توسعهیافته توسط محققان برتر و همچنین پیشآموزش روی مجموعه دادههای عظیمی از تصاویر بهرهمند میشوید. در مورد ما، یادگیری انتقالی از شبکهای آموزشدیده روی ImageNet، پایگاه دادهای از تصاویر حاوی گیاهان و صحنههای بیرونی فراوان، که به اندازه کافی به گلها نزدیک است، انجام خواهد شد.

تصویر: استفاده از یک شبکه عصبی کانولوشنی پیچیده، که قبلاً آموزش دیده است، به عنوان یک جعبه سیاه، و آموزش مجدد فقط سر طبقهبندی. این یادگیری انتقالی است. بعداً خواهیم دید که این چیدمانهای پیچیده لایههای کانولوشنی چگونه کار میکنند. فعلاً، این مشکل شخص دیگری است.
یادگیری انتقالی در کراس
در Keras، میتوانید یک مدل از پیش آموزشدیده را از مجموعه tf.keras.applications.* نمونهسازی کنید. به عنوان مثال، MobileNet V2 یک معماری کانولوشن بسیار خوب است که از نظر اندازه معقول باقی میماند. با انتخاب include_top=False ، مدل از پیش آموزشدیده را بدون لایه softmax نهایی آن دریافت میکنید تا بتوانید لایه خودتان را اضافه کنید:
pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False
model = tf.keras.Sequential([
pretrained_model,
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(5, activation='softmax')
])
همچنین به تنظیم pretrained_model.trainable = False توجه کنید. این تنظیم، وزنها و بایاسهای مدل از پیش آموزشدیده را ثابت نگه میدارد تا شما فقط لایه softmax خود را آموزش دهید. این کار معمولاً شامل وزنهای نسبتاً کمی است و میتواند به سرعت و بدون نیاز به مجموعه دادههای بسیار بزرگ انجام شود. با این حال، اگر دادههای زیادی دارید، یادگیری انتقالی میتواند با pretrained_model.trainable = True حتی بهتر عمل کند. سپس وزنهای از پیش آموزشدیده، مقادیر اولیه بسیار خوبی ارائه میدهند و همچنان میتوانند توسط آموزش تنظیم شوند تا با مسئله شما مطابقت بیشتری داشته باشند.
در نهایت، به لایه Flatten() که قبل از لایه softmax متراکم شما قرار داده شده است، توجه کنید. لایههای متراکم روی بردارهای مسطح دادهها کار میکنند، اما ما نمیدانیم که آیا این همان چیزی است که مدل از پیش آموزش دیده برمیگرداند یا خیر. به همین دلیل است که باید آن را مسطح کنیم. در فصل بعد، همانطور که به معماریهای کانولوشن میپردازیم، فرمت دادهای که توسط لایههای کانولوشن برگردانده میشود را توضیح خواهیم داد.
با این رویکرد باید به دقتی نزدیک به ۷۵٪ برسید.
راه حل
این دفترچهی حل مسئله است. اگر به مشکلی برخوردید، میتوانید از آن استفاده کنید.
Keras Flowers transfer learning (solution).ipynb
آنچه ما پوشش دادهایم
- 🤔 نحوه نوشتن یک طبقهبندیکننده در Keras
- 🤓 با یک لایه آخر softmax و تلفات آنتروپی متقاطع پیکربندی شده است
- 😈 انتقال یادگیری
- 🤔 آموزش اولین مدل شما
- 🧐 دنبال کردن میزان از دست دادن و دقت آن در طول آموزش
لطفا چند لحظه وقت بگذارید و این چک لیست را در ذهن خود مرور کنید.
۵. تبریک میگویم!
اکنون میتوانید یک مدل Keras بسازید. لطفاً برای یادگیری نحوهی سرهمبندی لایههای کانولوشنی، به آزمایشگاه بعدی بروید.
- خطوط لوله داده با سرعت TPU: tf.data.Dataset و TFRecords
- [این آزمایشگاه] اولین مدل Keras شما، با یادگیری انتقالی
- شبکههای عصبی کانولوشن، با Keras و TPUها
- شبکههای عصبی مدرن، squeezenet، Xception، با Keras و TPUها
TPU ها در عمل
TPUها و GPUها در پلتفرم هوش مصنوعی ابری موجود هستند:
در نهایت، ما عاشق بازخورد هستیم. لطفاً اگر در این آزمایشگاه نکتهی اشتباهی میبینید یا فکر میکنید باید بهبود یابد، به ما بگویید. بازخورد را میتوانید از طریق GitHub issues [ لینک بازخورد ] ارائه دهید.

|

