تنسورفلو ۱ - تنسورفلو شروع می شود

TensorFlow = Tensor + Flowchartتنسرفلو یک کتاب خانه یادگیری ماشین و یادگیری عمیق است که توسط گوگل منتشر شده است و گوگل برای این که کاربراش تجربه کاربری بهتری داشته باشند این لایبری رو جا های مختلفی استفاده کرده یکی ازا این مثال ها وقتی هست که شما شروع به جست و جو می کنید و گوگل به صورت خودکار نوشته شما رو کامل می کنه.حدس زدن ادامه متن توسط گوگلسه دسته از آدما از یادگیری ماشین استفاده می کنند ۱. محققین ۲. دانشمندان علوم داده ۳. برنامه نویس هابرای پاسخ گویی به نیاز این افراد تیم گوگل برین لایبرری تنسورفلو را اینجاد کردهتنسورفلو می تونه روی cpu ها و gpu های مختلف اجرا بشه و با زبان های مختلفی همچون c++ پایتون یا جاوا استفاده بشه. تنسورفلو از سرور ها بگیرید تا حتی روی موبایل ها می تونه اجرا بشه.تاریخچه تنسورفلواز زمانی که حجم اطلاعات زیاد شد یادگیری عمیق شروع کرد بر الگوریتم های یادگیری عمیق غلبه کنه و خب گوگل هم به این نتیجه رسید که می تونه با این شبکه های عصبی عمیق خدماتش ارتقاء بده و شروع کردن به ساخت فریم ورکی به اسم تنسورفلو که می تونست کمک کنه که توسعه دهنده ها و محققین همزمان روی مدل های هوش مصنوعی باهم کار کنند. وقتی که پروژه به اندازه کافی توسعه پیدا کرد و مقیاس پذیری خوبی پیدا کرد در سال 2015 به صورت عمومی منتشر شد. البته تا سال 2017 هنوز ورژن پایدارش منتشر نشده بود.ویژگی مهم تنسورفلو اینه که اپن سورس هست و مجوزش هم آپاچی هست پس راحت می تونید ازش استفاده کنید، ویرایشش کنید و توزیع خودتون منتشر کنید حتی می تونید ازش درآمد کسب کنید بدون اینکه نیاز باشه به گوگل پولی بدهید :-)معماری تنسورفلومعماری تنسورفلو سه قسمت داره که میشه ۱. پیش پردازش دیتا ها ۲. ساخت مدل ۳. تعلیم و تخمین مدلدلیل این نام گذاری به تنسورفلو اینه که به عنوان ورودی آرایه های چند بعدی ای دریافت می کنه که اسمشون tensor هست و بعد شما می تونید یک سری گراف هایی از عملیات ها بر روی دیتا های خود اجرا کنید که به صورت flowchart هست.کجا اجرا میشه؟برای استفاده از این لایبرری دو فاز وجود دارهفاز توسعه: وقتی هست که مدل رو تعلیم می دید که این فاز معمولا روی لپ تاپ یا سیستمتون انجام میشه.فاز اجرا: وقتی تعلیم تموم شد شما می تونید هرجایی از دسکتاپ بگیر تا سرور ها و حتی موبایل ها مدلتون رو ران کنید.پس تعلیم و اجرا مدل می تونه روی ماشین های مختلفی انجام بشه.علاوه بر استفاده از CPU ها شما می تونید روی GPU هم تنسورفلو رو اجرا کنید.توی محاسبات ماتریکسی چون که یه عملگر یکسان روی تعداد زیادی از اطلاعات انجام می گیره، این نوع از محاسبات با ساختار GPU ها منطبقه این نکته رو اواخر سال 2010 محققین استفورد کشف کردند.یک نکته دیگه اینکه این لایبرری با زبان C++ نوشته شده پس خیلی سریع هست البته می تونید با سایر زبان ها مثل پایتون ازش استفاده کنید.یک ویژگی مهم تنسورفلو، تنسوربورد هست که به شما اجازه می ده مشاهده کنید تنسورفلو چکار داره می کنه.اجزا تنسورفلوتنسوریک تنسور آرایه ای از ماتریکس های N بعدی هست که می تونند انوع اطلاعات رو نمایش بدند. هر مقداری در تنسور اطلاعاتی با شکل یکسانی (Shape) نگه می دارند. تنسور ها می تونند ورودی یا خروجی یک محاسبه باشند.گرافدر تنسورفلو همه عملیات ها داخل گراف انجام می شوند. هر گراف مجوعه ای از محاسبات هست که پیوسته انجام می شوند. هر محسابه ای با نام op node شناخته می شه که به هم دیگه وصل هستند.حالا چرا گراف؟می تونه روی سیستم های مختلف اجرا بشهگراف می شه ذخیره کرد که بعدا استفاده کردهمه محاسبات در گراف با اتصال تنسور ها به هم اجرا می شه.به صورت خلاصه این که توی گراف ها هر یالی یک مقدار (تنسور) هست و هر گره یک عملگر( مثلا جمع) هست.چرا تنسورفلو مشهوره؟تنسورفلو بهترینه چونکه برای استفاده همه ساخته شده و تز api هایی استفاده میشه که بشه در مقیاس های مختلف از معماری های یادگیری عمیق همچون RNN, CNN استفاده کرد. چونکه بر اساس محاسبات گراف هست توانایی تجسم شبکه های عصبی داخل TensorBoard رو داره که خب برای دیباگ خیلی مفیده. و در کل اینکه تنسورفلو ساخته شده برای مقیاس پذيری در زمان استقرار.یک خبر خوب اینکه بزرگترین کامیونیتی را در بین فریم ورک های مختلف یادگیری عمیق در گیت هاب داره.چند تا از الگوریتم ها که توسط تنسورفلو پشتیبانی میشه چیه؟رگرسیون خیطی: tf.estimator.LinearRegressorطبقه بندی: tf.estimator.LinearClassifierطبقه بندی عمیق: tf.estimator.DNNClassifierDeep learning wipe and deep: tf.estimator.DNNLinearCombinedClassifierBooster tree regression: tf.estimator.BoostedTreesRegressorBoosted tree classification: tf.estimator.BoostedTreesClassifierچند مثال سادهimport numpy as np import tensorflow as tfتوی دو خط بالا لایبرری numpy و tensorflow رو وارد می کنیم.در این مثال می خواییم X_1 و X_2 را ضرب کنیم. اول باید گراف رو بسازیم و بعد یک session تنسورفلو ران کنیم که نتیجه رو محاسبه کنه.بریم شروع کنیممرحله ۱: تعریف متغیراولین قدم باید نود های ورودی X_1 , X_2 را بسازیم. تو تنسورفلو باید مشخص کنیم چه نوع نودی قراره بسازیم که اینجا نوع placeholder رو انتخاب می کنیم.placeholder:این نوع در هر زمان که ما یک محاسبه انجام می دهیم یک مقدار جدید به تنسور اختصاص می دهد.X_1 = tf.placeholder(tf.float32, name = "X_1") X_2 = tf.placeholder(tf.float32, name = "X_2")همونطور که می بینید به عنوان ورودی نوع این نود رو float و اسمش هم اسم متغییر وارد کردیم.مرحله ۲: تعریف محاسبهmultiply = tf.multiply(X_1, X_2, name = "multiply")با خط بالا داریم یک راس می سازیم که نقش عملگر عملگر ضرب رو دارهکه ورودی اون راس هایی هست که میخواییم ضرب بشند و اسمش هم گذاشتیم multiplyخب الان اولین گرافمون رو ساختیم.مرحله ۳: اجرا عملیاتبرای اجرا عملیات باید یک جلسه یا session اجرا کنیم. با استفاده از tf.Session() این جلسه ایجاد می شه و وقتی از run استفاده کنیم اونو اجرا می کنه.وقتی که ضرب رو قراره run کنیم باید به ورودی مقادیر تنسور های x1 و x2 رو بدهیم اینکار با تخصیص feed_dict انجام میشه. توی این مثال مقادیر 1 تا 3 به x1 و 4 تا 6 به x2 اختصاص پیدا کرده. و نتیجه رو چاپ کردیم.X_1 = tf.placeholder(tf.float32, name = "X_1") X_2 = tf.placeholder(tf.float32, name = "X_2")multiply = tf.multiply(X_1, X_2, name = "multiply")with tf.Session() as session: result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]}) print(result)[ 4. 10. 18.]راه های مختلف وارد کردن دیتا در تنسورفلوخب یکی از اولین مراحل قبل از آموزش مدل وارد کردن دیتا هست. که دو حالت داره:وارد کردن اطلاعات به حافظه رم: یه راه ساده هست که اطلاعات وارد یک آرایه مموری می کنید مثلا یک خط کد به زبان پایتون می نویسید.استفاده از خط لوله دیتا تسورفلو: تنسورفلو یک سری api داره که کمک می کنه دیتا رو وارد کنید و یک سری عملیات روشون انجام بدید و سپس به الگوریتمتون بدید.این متد خیلی موثره مخصوصا وقتی که دیتاست خیلی بزرگه. برای مثال تصاویر عظیم هستند و در رم جا نمی شند. اینجا دیتا پایپ لاین عمل مدیریت حافظه رم شما رو به عهده می گیره.سوالی که الان وجود داره اینه که از کدوم استفاده کنیماگه دیتا شما کمتر از ۱۰ گیگ هست که راحت می تونید از متد اول استفاده کنید مثلا یک لایبرری مشهور برای این کار pandas هست. در غیر این صورت مثلا اگه ۳۰ گیگ اطلاعات دارید و رمتون ۱۲ گیگ هست طبیعتا نمی تونید از این روش استفاده کنید و باید برید سراغ api پایپ لاین. پایپ لاین دیتا ها رو دسته دسته (batch) می کنه و هر دسته وارد پایپ لاین شده و برای یاد گرفتن مدل استفاده میشه. استفاده از پایپ لاین باعث میشه که بتونید از پردازش موازی استفادع کنید. یعنی تنسورفلو می تونه در چند cpu مختلف همزمان مدل رو آموزش بده.خلاصه که اگه دیتاست شما کوچکه کامل داخل مموری رم واردش کنید مثلا با pandasدر غیر این صورت یا اگه می خوایید از چند cpu استفاده کنید از پایپ لاین تنسورفلو استفاده کنید.ایجاد خط لوله در تنسورفلومرحله ۱) ساخت دیتابا لایبرری numpy دو تا عدد رندم می سازیمimport numpy as np x_input = np.random.sample((1,2)) print(x_input)[[0.8835775 0.23766977]]مرحله ۲) ساخت placeholderتوی این مرحله یک placeholder به اسم X به صورت یک آرایه با دو عضو از نوع float می سازیم# using a placeholder x = tf.placeholder(tf.float32, shape=[1,2], name = 'X') مرحله ۳: ساخت datasetدر این مرحله ما باید dataset رو تعریف کنیم که مقدار placeholder x داخلش قرار بدیم.tf.data.Dataset.from_tensor_slicesdataset = tf.data.Dataset.from_tensor_slices(x)مرحله ۴: ساخت پایپ لایندر این مرحله ما باید پایپ لاین رو مقدار دهی اولیه کنیم که اولین قدم یک iterator می سازیم که بر روی دیتا ها جریان داشته باشه. با متد get_next مقدار بعدی رو می گیریم که در این مثال یک batch موجود است که فقط دو مقدار دارد.iterator = dataset.make_initializable_iterator() get_next = iterator.get_next()مرحله ۵: اجرا محاسبهدر مرحله آخر یک سشن اجرا می کنیم که ورودی آن iterator و مقادیر ورودی هست که توسط numpy ساخته شده است. و برای هر کدوم مقدارش چاپ می کنیم.with tf.Session() as sess: # feed the placeholder with data sess.run(iterator.initializer, feed_dict={ x: x_input }) print(sess.run(get_next))[0.8835775 0.23766978]خلاصهتنسورفلو مشهور ترین کتاب خونه یادگیری عمیق هست که با استفاده از اون می تونید از هر گونه ساختار یادگیری عمیق بهره ببرید. گوگل برین این پروژه را توسعه داده که فاصله بین تیم های تحقیقاتی و تیم های توسعه رو پر کنه و تقریبا گوگل در تمام پروژه هاش ازش استفاده می کنه. یکی از دلایل اصلی استفاده از تنسورفلو آسان بودن مقیاس پذیر شدن در زمان Deploy هست. تنسورفلو از سرور های قدرتمند تا گوشی های Android , IOS قابل استفاده هست.تنسورفلو در یک session کار می کنه که هر جلسه به وسیله یک گراف با محاسبات مختلف تعریف شده است.به عنوان یک مثال ساده در تنسورفلو ضرب به صورت زیر استتعریف متغیرX_1 = tf.placeholder(tf.float32, name = "X_1") X_2 = tf.placeholder(tf.float32, name = "X_2") ۲. تعریف محاسبهmultiply = tf.multiply(X_1, X_2, name = "multiply")۳. اجرای عملیاتwith tf.Session() as session: result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]}) print(result)یک عمل رایج در تنسورفلو ایجاد پایپ لاین هست برای load دیتا در حافظه رم که با مراحل زیر انجام می شهساخت دیتا هاimport numpy as np x_input = np.random.sample((1,2)) print(x_input) ۲. ساخت place holderx = tf.placeholder(tf.float32, shape=[1,2], name = 'X')۳. تعریف متد دیتاستdataset = tf.data.Dataset.from_tensor_slices(x)۴. ساخت خط لولهiterator = dataset.make_initializable_iterator() get_next = iteraror.get_next()۵. اجرا برنامهwith tf.Session() as sess: sess.run(iterator.initializer, feed_dict={ x: x_input }) print(sess.run(get_next))