آموزش تنسورفلو
سلام. به آموزش تنسورفلو هوسم خوش آمدید. در این پست میخواهیم بگوییم تنسورفلو (tensorflow) چیست و چگونه میتوان از این فریمورک محبوب برای آموزش مدلهای یادگیری عمیق استفاده کرد. این آموزش مبتنی بر تنسورفلو 2 بوده و در آن یک پروژه، صفرتاصد، کدنویسی میشود. با هوسم همراه باشید…
تنسورفلو (tensorflow) چیست ؟
تنسورفلو (tensorflow) یک کتابخانه رایگان و متنباز پایتونی برای یادگیری عمیق است. این کتابخانه در سال 2015 توسط شرکت گوگل منتشر شد و تا امروز یکی از شناختهشدهترین فریمورکهای یادگیری عمیق است. تنسورفلو مبتنی بر زبانهای پایتون، C++، جاوا و R است، اما بیشتر محققان از API پایتون استفاده میکنند.
گذر از TensorFlow I به TensorFlow II
در این بخش از آموزش تنسورفلو ، تاریخچه کوتاهی از TensorFlow ارائه شده است. اگر میخواهید بدانید که این فریمورک دستخوش چه تغییراتی شده و چرا این تغییرات انجام شده، این بخش را بخوانید. در غیر این صورت میتوانید به بخش بعدی بروید.
در سال 2019 گوگل یک آپدیت اساسی برای تنسورفلو ارائه داد و Tensorflow II را منتشر کرد. تغییرات مهمی در این آپدیت انجام شد. یک تغییر مهم، استفاده از eager execution بود. کار با تنسورفلو 1 شبیه جنگ بود! یعنی، بعد از یک ساعت کار کردن با تنسورفلو 1، احتمالا یا لپتاپ را میشکستید یا اینکه یک بلایی سرخودتان میآوردید! شاید فکر کنید اغراق میکنم. اما بیایید یک مثال ساده ببینیم! حتما میدانید که در پایتون چطور باید دو عدد را باهم جمع کنیم و در یک متغیر جدید بریزیم و خروجی آن را نمایش دهیم. یعنی کد زیر:
a = 1 b = 2 print(c)
3
حالا بیایید این کار با تنسورفلو 1 انجام دهیم:
import tensorflow as tf a = tf.constant(3) b = tf.constant(4) c = a + b print(c)
<tf.Tensor 'add:0' shape=() dtype=int32>
خروجی عددی نداریم! خروجی به شکل سمبلیک است. بسیار خب، چطور خروجی را باید دید؟ اینطوری:
sess = tf.Session() sess.run(c)
7
برای خیلی از مبتدیها، دنیای تنسورفلو 1 قابل درک نیست! در واقع، اگر بخواهم یک توضیح فنی بدهم، در تنسورفلو 1، ابتدا باید گراف شبکه ساخته شده و سپس گراف ساخته شده اجرا شود. در واقع تنسورفلو 1 از static computational graph استفاده میکند. در کد اول ابتدا تنسورفلو را ایمپورت کردیم و بعد یک گراف شامل دو constant ساختیم. در کد دوم با استفاده از Session و run گراف را اجرا کردیم.
این در حالی است که برای نوشتن همین عملیات در پایتورچ که از dynamic computational graph استفاده میکند کافی است بنویسیم:
import torch a = torch.tensor(3) b = torch.tensor(4) c = a + b print(c)
tf.Tensor(7, shape=(), dtype=int32)
در حالت استاتیک ابتدا گراف را ساختیم و سپس اجرایش کردیم. اما در حالت داینامیک این دو مرحله جدا نیستند و همزمان انجام میشوند.
این همه مشقت برای نوشتن یک جمله؟ چرا؟!!
استفاده از static computational graph مزایایی مثل افزایش سرعت دارد. گرافی که ساختهایم بدون اتلاف وقت میتواند چندین بار اجرا شود، بدون اینکه نیاز باشد مجدد تعریف شود. همین امر باعث افزایش سرعت میشود. اما همان طور که در بخش قبل مشاهده کردید، پیچیدگی در حالت استاتیک بیشتر از حالت داینامیک است و این پیچیدگی با پیچیده شدن شبکهها، بیشتر هم میشود! همچنین دیباگ کردن در حالت استاتیک بسیار سخت میشود.
Eager execution یعنی چه؟
گوگل دید که مجروح جنگی زیاد شده و کلا استقبال از تنسورفلو 1 کم شده، در نهایت تسلیم کاربرانش شد و تصمیم گرفت با استفاده از eager execution، یک تحول اساسی در این فریمورک ایجاد کند. Eager execution در تنسورفلو 2، این امکان را فراهم میکند که کدها به صورت داینامیک اجرا شوند و دیگر خبری از Session و run نباشد. یعنی اینطوری:
import tensorflow as tf a = tf.constant(3) b = tf.constant(4) c = a + b print(c)
tf.Tensor(7, shape=(), dtype=int32)
تغییرات دیگر در TensorFlow
مشکل تنسورفلو 1، فقط همین مورد نبود! بلکه مشکلات بزرگ دیگری هم داشت. مثلا، برای یک دستور لایه کانولوشنی، یک عالمه ماژول داشت. مثلا فکر کنید 5 دستور مختلف با کارایی تقریبا یکسان که کاربر در استفاده از آنها گیج میشد. از همه بدتر، هرکسی به یک شکل کدها را مینوشت! یکی با لایه کانولوشنی ماژول A یکی با ماژول B و …
تنسورفلو 1 در لوگو هم یک اشتباه ریز داشت! 😁 یعنی اگر به پرسپکتیو لوگوی زیر نگاه کنید، میبینید که حرف T درست در نمیآید.
چه شد که تنسورفلو انقدر تغییر کرد؟
در سال 2017 پایتورچ به دنیا آمد و توانست در بین محققان محبوبیت زیادی کسب کند. ببینید آندرج کارپسی بعد از مهاجرت به پایتورچ چه گفته:
دیگه ببینید تنسورفلو 1 چه بلایی سر ملت آورده! ما هم دوره دیپ لرنینگ را اوایل با تنسورفلو 1 آموزش میدادیم و همگی در عذاب بودیم. بعد پایتورچ آمد و …
البته، ویژگیهای خوب تنسورفلو 1 را نباید فراموش کنیم. تنسورفلو 1 ملت را از دست Caffe خلاص کرد. حالا تصور کنید Caffe دیگر چه بوده! همچنین، امکانات بسیار بسیار خوبی برای توسعه پروژه های تجاری در اختیار افراد قرار میداد. مثلا ما تجربه استفاده از مدلهای تنسورفلو در ++c برای کار تجاری را داشتیم.
چرا تنسورفلو؟
امروزه تنسورفلو و پایتورچ دو فریمورک محبوب و پرطرفدار یادگیری عمیق هستند. ما در پست مقایسه تنسورفلو و پایتورچ این دو فریمورک را همراه با نمودارها و آمار متعدد مورد بررسی قرار دادیم. میتوانید جزئیات مقایسه این دو فریمورک را در این پست بخوانید.
آنچه از این نمودارها و آمارها میتوان برداشت کرد این است که تنسورفلو و پایتورچ دو فریمورک محبوب یادگیری عمیق هستند که توسط بسیاری از محققان استفاده میشوند. خب، تا اینجا کمی مقدمه و تاریخچه گفتیم. دیگر میتوانیم برویم سراغ کدنویسی…
فراخوانی تنسورفلو
برای فراخوانی تنسورفلو در پایتون، همانند هر کتابخانه دیگری از دستور import استفاده میشود. همچنین معمولا از نام کوتاهشده tf برای این کتابخانه استفاده میشود.
import tensorflow as tf
با استفاده از اتریبیوت version میتوانید ورژن این کتابخانه را چک کنید:
tf.__version__
2.12.0
ادامه دارد…
دیدگاهتان را بنویسید