1. بررسی اجمالی
در این آزمایشگاه با نحوه ساخت طبقه بندی کننده Keras آشنا می شوید. به جای تلاش برای کشف ترکیب کامل لایههای شبکه عصبی برای تشخیص گلها، ابتدا از تکنیکی به نام یادگیری انتقال برای تطبیق یک مدل قدرتمند از پیش آموزشدیده با مجموعه دادههایمان استفاده میکنیم.
این آزمایشگاه شامل توضیحات نظری لازم در مورد شبکه های عصبی است و نقطه شروع خوبی برای توسعه دهندگان یادگیری عمیق است.
این آزمایشگاه قسمت 2 از سری "Keras on TPU" است. می توانید آنها را به ترتیب زیر یا به صورت مستقل انجام دهید.
- خطوط لوله داده با سرعت TPU: tf.data.Dataset و TFRecords
- [THIS LAB] اولین مدل Keras شما با یادگیری انتقالی
- شبکه های عصبی کانولوشنال، با Keras و TPU
- شبکه های مدرن، squeezenet، Xception، با Keras و TPU
چیزی که یاد خواهید گرفت
- برای ساخت طبقهبندیکننده تصویر Keras خود با لایه softmax و از دست دادن آنتروپی متقابل
- برای تقلب 😈، به جای ساختن مدل های خود، از یادگیری انتقال استفاده کنید.
بازخورد
اگر در این آزمایشگاه کد مشکلی مشاهده کردید، لطفاً به ما بگویید. بازخورد را می توان از طریق مسائل GitHub [ لینک بازخورد ] ارائه کرد.
2. شروع سریع Google Collaboratory
این آزمایشگاه از Google Collaboratory استفاده می کند و نیازی به تنظیم از طرف شما ندارد. Colaboratory یک پلت فرم نوت بوک آنلاین برای اهداف آموزشی است. آموزش رایگان CPU، GPU و TPU را ارائه می دهد.
میتوانید این نمونه دفترچه یادداشت را باز کنید و از چند سلول عبور کنید تا با Colaboratory آشنا شوید.
یک باطن TPU را انتخاب کنید
در منوی Colab، Runtime > Change runtime type و سپس TPU را انتخاب کنید. در این آزمایشگاه کد از یک TPU (واحد پردازش تنسور) قدرتمند استفاده میکنید که برای آموزش سختافزاری تسریع شده پشتیبانی میشود. اتصال به زمان اجرا به طور خودکار در اولین اجرا انجام می شود، یا می توانید از دکمه "اتصال" در گوشه سمت راست بالا استفاده کنید.
اجرای نوت بوک
با کلیک بر روی یک سلول و استفاده از Shift-ENTER سلول ها را یکی یکی اجرا کنید. همچنین می توانید کل نوت بوک را با Runtime > Run all اجرا کنید
فهرست مطالب
همه نوت بوک ها دارای فهرست مطالب هستند. می توانید آن را با استفاده از فلش سیاه سمت چپ باز کنید.
سلول های پنهان
برخی از سلول ها فقط عنوان خود را نشان می دهند. این یک ویژگی نوت بوک مخصوص Colab است. می توانید روی آنها دوبار کلیک کنید تا کد داخل آن را ببینید اما معمولاً چندان جالب نیست. به طور معمول توابع پشتیبانی یا تجسم. هنوز باید این سلول ها را اجرا کنید تا توابع داخل آن تعریف شوند.
احراز هویت
این امکان برای Colab وجود دارد که به سطلهای خصوصی Google Cloud Storage شما دسترسی داشته باشد، مشروط بر اینکه با یک حساب مجاز احراز هویت کنید. قطعه کد بالا یک فرآیند احراز هویت را راه اندازی می کند.
3. [INFO] طبقه بندی شبکه عصبی 101
به طور خلاصه
اگر تمام عبارات پررنگ در پاراگراف بعدی قبلاً برای شما شناخته شده است، می توانید به تمرین بعدی بروید. اگر تازه شروع به یادگیری عمیق کرده اید، خوش آمدید و لطفاً ادامه دهید.
برای مدلهایی که بهعنوان دنبالهای از لایهها ساخته میشوند، Keras API متوالی را ارائه میکند. برای مثال، یک طبقهبندیکننده تصویر با استفاده از سه لایه متراکم میتواند در 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 برای واحد خطی اصلاح شده نام دارد. این یک تابع بسیار ساده است همانطور که در نمودار بالا می بینید.
فعال سازی سافت مکس
شبکه بالا با یک لایه 5 نورونی به پایان می رسد زیرا ما گل ها را به 5 دسته (رز، لاله، قاصدک، دیزی، آفتابگردان) طبقه بندی می کنیم. نورون ها در لایه های میانی با استفاده از تابع فعال سازی کلاسیک RELU فعال می شوند. در آخرین لایه، می خواهیم اعدادی بین 0 و 1 را محاسبه کنیم که نشان دهنده احتمال گل رز، لاله و غیره است. برای این کار از یک تابع فعال سازی به نام softmax استفاده می کنیم.
اعمال softmax بر روی یک بردار با گرفتن نمایی هر عنصر و سپس نرمال سازی بردار انجام می شود، معمولاً با استفاده از هنجار L1 (مجموع مقادیر مطلق) به طوری که مجموع مقادیر به 1 می رسد و می توان آنها را به عنوان احتمال تفسیر کرد.
از دست دادن آنتروپی متقابل
اکنون که شبکه عصبی ما پیشبینیهایی را از تصاویر ورودی تولید میکند، باید میزان خوب بودن آنها را اندازهگیری کنیم، یعنی فاصله بین آنچه که شبکه به ما میگوید و پاسخهای صحیح، که اغلب «برچسبها» نامیده میشوند. به یاد داشته باشید که ما برچسب های درستی برای تمام تصاویر موجود در مجموعه داده داریم.
هر فاصله ای کار می کند، اما برای مشکلات طبقه بندی، به اصطلاح "فاصله آنتروپی متقابل" موثرترین است. ما این را تابع خطا یا "از دست دادن" خود می نامیم:
نزول گرادیان
"آموزش" شبکه عصبی در واقع به معنای استفاده از تصاویر و برچسب های آموزشی برای تنظیم وزن ها و سوگیری ها به گونه ای است که تابع تلفات متقابل آنتروپی را به حداقل برساند. در اینجا نحوه کار آن است.
آنتروپی متقاطع تابعی از وزن ها، بایاس ها، پیکسل های تصویر تمرینی و کلاس شناخته شده آن است.
اگر مشتقات جزئی آنتروپی متقاطع را نسبت به همه وزنها و همه بایاسها محاسبه کنیم، یک "gradient" به دست میآوریم که برای تصویر، برچسب و ارزش فعلی وزنها و بایاسها محاسبه میشود. به یاد داشته باشید که ما میتوانیم میلیونها وزن و سوگیری داشته باشیم، بنابراین محاسبه گرادیان کار زیادی به نظر میرسد. خوشبختانه، تنسورفلو این کار را برای ما انجام می دهد. ویژگی ریاضی یک گرادیان این است که به سمت بالا اشاره می کند. از آنجایی که می خواهیم به جایی برویم که آنتروپی متقاطع کم است، در جهت مخالف می رویم. وزن ها و سوگیری ها را با کسری از گرادیان به روز می کنیم. سپس همین کار را بارها و بارها با استفاده از دسته های بعدی تصاویر و برچسب های آموزشی در یک حلقه آموزشی انجام می دهیم. امیدواریم که این به جایی برسد که آنتروپی متقاطع حداقل باشد، اگرچه هیچ چیزی منحصر به فرد بودن این حداقل را تضمین نمی کند.
مینی بچینگ و تکانه
شما میتوانید گرادیان خود را فقط بر روی یک تصویر مثال محاسبه کنید و وزنها و بایاسها را فوراً بهروزرسانی کنید، اما انجام این کار روی دستهای از مثلاً 128 تصویر، گرادیانی به دست میدهد که محدودیتهای اعمالشده توسط تصاویر نمونههای مختلف را بهتر نشان میدهد و بنابراین احتمالاً همگرا میشود. به سمت راه حل سریعتر اندازه مینی بچ یک پارامتر قابل تنظیم است.
این تکنیک، که گاهی اوقات "نزول گرادیان تصادفی" نامیده میشود، یک مزیت عملیتر دیگر نیز دارد: کار با دستهها همچنین به معنای کار با ماتریسهای بزرگتر است و معمولاً بهینهسازی آنها روی GPU و TPU آسانتر است.
با این حال، همگرایی همچنان می تواند کمی آشفته باشد و حتی اگر بردار گرادیان صفر باشد، می تواند متوقف شود. آیا این بدان معناست که ما حداقلی را پیدا کرده ایم؟ نه همیشه. یک مولفه گرادیان می تواند بر روی حداقل یا حداکثر صفر باشد. با یک بردار گرادیان با میلیونها عنصر، اگر همه آنها صفر باشند، احتمال اینکه هر صفر با یک حداقل و هیچ یک از آنها به نقطه حداکثر مطابقت داشته باشد بسیار کم است. در فضایی با ابعاد مختلف، نقاط زین بسیار رایج هستند و ما نمی خواهیم در آنها توقف کنیم.
تصویر: یک نقطه زین. گرادیان 0 است اما در همه جهات حداقل نیست. (اشاره به تصویر ویکیمدیا: توسط Nicoguaro - Own Work, CC BY 3.0 )
راه حل این است که مقداری حرکت به الگوریتم بهینه سازی اضافه شود تا بتواند بدون توقف از نقاط زین عبور کند.
واژه نامه
دسته ای یا مینی دسته ای : آموزش همیشه بر روی دسته ای از داده ها و برچسب های آموزشی انجام می شود. انجام این کار به همگرایی الگوریتم کمک می کند. بعد "دسته ای" معمولاً اولین بعد تانسورهای داده است. برای مثال یک تانسور شکل [100، 192، 192، 3] حاوی 100 تصویر 192x192 پیکسل با سه مقدار در هر پیکسل (RGB) است.
از دست دادن آنتروپی متقابل : یک تابع تلفات ویژه که اغلب در طبقهبندیکنندهها استفاده میشود.
لایه متراکم : لایه ای از نورون ها که در آن هر نورون به تمام نورون های لایه قبلی متصل است.
ویژگی ها : ورودی های یک شبکه عصبی گاهی اوقات "ویژگی" نامیده می شود. هنر فهمیدن اینکه کدام بخش از یک مجموعه داده (یا ترکیبی از قطعات) باید به شبکه عصبی وارد شود تا پیشبینیهای خوبی داشته باشیم، «مهندسی ویژگی» نامیده میشود.
برچسب ها : نام دیگری برای "کلاس ها" یا پاسخ های صحیح در یک مشکل طبقه بندی نظارت شده
نرخ یادگیری : کسری از گرادیان که توسط آن وزنها و سوگیریها در هر تکرار از حلقه آموزشی بهروز میشوند.
logits : خروجی های لایه ای از نورون ها قبل از اعمال تابع فعال سازی "logits" نامیده می شوند. این اصطلاح از "عملکرد لجستیک" با نام "تابع سیگموئید" می آید که در گذشته محبوب ترین تابع فعال سازی بود. "خروجی های نورون قبل از عملکرد لجستیک" به "logits" کوتاه شد.
ضرر : تابع خطا در مقایسه خروجی های شبکه عصبی با پاسخ های صحیح
نورون : مجموع وزنی ورودی های خود را محاسبه می کند، بایاس اضافه می کند و نتیجه را از طریق یک تابع فعال سازی تغذیه می کند.
کدگذاری تک داغ : کلاس 3 از 5 به صورت بردار 5 عنصری کدگذاری می شود، همه صفرها به جز سومی که 1 است.
relu : واحد خطی اصلاح شده یک تابع فعال سازی محبوب برای نورون ها.
sigmoid : یکی دیگر از عملکردهای فعال سازی که قبلاً محبوب بود و هنوز هم در موارد خاص مفید است.
softmax : یک تابع فعالسازی ویژه که بر روی یک بردار عمل میکند، اختلاف بین بزرگترین مؤلفه و سایر مؤلفهها را افزایش میدهد، و همچنین بردار را با مجموع 1 نرمال میکند تا بتوان آن را به عنوان بردار احتمالات تفسیر کرد. به عنوان آخرین مرحله در طبقه بندی کننده ها استفاده می شود.
تانسور : یک "تانسور" مانند یک ماتریس است اما دارای تعداد دلخواه ابعاد است. تانسور یک بعدی یک بردار است. یک تانسور دو بعدی یک ماتریس است. و سپس می توانید تانسورهایی با ابعاد 3، 4، 5 یا بیشتر داشته باشید.
4. آموزش انتقال
برای مشکل طبقه بندی تصویر، لایه های متراکم احتمالا کافی نیستند. ما باید در مورد لایه های کانولوشن و روش های زیادی که می توانید آنها را مرتب کنید یاد بگیریم.
اما ما همچنین می توانیم میانبر را انتخاب کنیم! شبکه های عصبی کانولوشن کاملاً آموزش دیده برای دانلود در دسترس هستند. ممکن است آخرین لایه آنها، سر طبقه بندی softmax را بریده و آن را با لایه خود جایگزین کنید. تمام وزنه ها و سوگیری های آموزش دیده به همان شکلی که هستند باقی می مانند، شما فقط لایه softmax را که اضافه می کنید دوباره آموزش می دهید. این تکنیک یادگیری انتقال نامیده میشود و به طرز شگفتانگیزی، تا زمانی کار میکند که مجموعه دادهای که شبکه عصبی روی آن از قبل آموزش داده شده است به اندازه کافی به شما نزدیک باشد.
دست در
لطفاً نوتبوک زیر را باز کنید، سلولها را اجرا کنید (Shift-ENTER) و دستورالعملها را هر جا که برچسب "WORK REQUIRED" را مشاهده کردید دنبال کنید.
Keras Flowers transfer learning (playground).ipynb
اطلاعات تکمیلی
با یادگیری انتقال، هم از معماری شبکه عصبی کانولوشنال پیشرفته که توسط محققان برتر توسعه یافته است و هم از پیش آموزش روی مجموعه داده عظیمی از تصاویر بهره میبرید. در مورد ما، ما از یک شبکه آموزش دیده در ImageNet، یک پایگاه داده از تصاویر حاوی بسیاری از گیاهان و صحنه های بیرونی، که به اندازه کافی به گل ها نزدیک است، یادگیری را انتقال خواهیم داد.
تصویر: با استفاده از یک شبکه عصبی کانولوشنال پیچیده، که قبلاً آموزش داده شده است، به عنوان جعبه سیاه، فقط سر طبقه بندی را بازآموزی می کند. این یادگیری انتقالی است. بعداً خواهیم دید که این ترتیبات پیچیده لایه های کانولوشن چگونه کار می کنند. فعلاً مشکل شخص دیگری است.
آموزش انتقال در کراس
در Keras می توانید یک مدل از پیش آموزش دیده از مجموعه tf.keras.applications.*
را نمونه برداری کنید. برای مثال MobileNet V2 یک معماری کانولوشنال بسیار خوب است که از نظر اندازه معقول باقی می ماند. با انتخاب include_top=False
، مدل از پیش آموزش دیده را بدون لایه سافت مکس نهایی آن دریافت می کنید تا بتوانید مدل خود را اضافه کنید:
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 شما قرار داده شده است. لایه های متراکم روی بردارهای مسطح داده کار می کنند، اما نمی دانیم که آیا این همان چیزی است که مدل از پیش آموزش دیده برمی گرداند یا خیر. به همین دلیل باید صاف کنیم. در فصل بعد، همانطور که به معماری های کانولوشنال می پردازیم، فرمت داده ای را که توسط لایه های کانولوشن بازگردانده شده است، توضیح خواهیم داد.
با این روش باید دقتی نزدیک به 75% داشته باشید.
راه حل
این دفترچه راه حل است. اگر گیر کرده اید می توانید از آن استفاده کنید.
Keras Flowers transfer learning (solution).ipynb
آنچه را پوشش داده ایم
- 🤔 نحوه نوشتن طبقه بندی کننده در کراس
- 🤓 با آخرین لایه softmax و از دست دادن آنتروپی متقابل پیکربندی شده است
- 😈 آموزش انتقالی
- 🤔 آموزش اولین مدل شما
- 🧐 به دنبال از دست دادن و دقت آن در حین تمرین
لطفا یک لحظه وقت بگذارید و این چک لیست را در ذهن خود مرور کنید.
5. تبریک!
اکنون می توانید یک مدل Keras بسازید. لطفاً برای یادگیری نحوه جمع آوری لایه های کانولوشن، به آزمایشگاه بعدی بروید.
- خطوط لوله داده با سرعت TPU: tf.data.Dataset و TFRecords
- [THIS LAB] اولین مدل Keras شما با یادگیری انتقالی
- شبکه های عصبی کانولوشنال، با Keras و TPU
- شبکه های مدرن، squeezenet، Xception، با Keras و TPU
TPU ها در عمل
TPU ها و GPU ها در پلتفرم Cloud AI در دسترس هستند:
در نهایت، ما بازخورد را دوست داریم. لطفاً اگر چیزی در این آزمایشگاه اشتباه می بینید یا فکر می کنید باید بهبود یابد، به ما بگویید. بازخورد را می توان از طریق مسائل GitHub [ لینک بازخورد ] ارائه کرد.
|