شروع کار با تنسورفلو
در جلسه اول از آموزش تنسورفلو به نحوه نصب تنسورفلو بر روی سیستمهای عامل لینوکس و ویندوز پرداخته شد. در دومین جلسه آموزش تنسورفلو که شروع کار با تنسورفلو است، میخواهیم به معرفی و توضیح ویژگیهای شاخص تنسورفلو بپردازیم. تنسورفلو با سایر زبانهای برنامهنویسی که تا امروز با آنها کار کردهاید، کمی تفاوت دارد. اگر این تفاوتهای شاخص تنسورفلو با سایر زبانهای برنامهنویسی رایج را درک نکنید، ممکن است نتوانید با تنسورفلو ارتباط برقرار کنید و درنتیجه از یادگیری این کتابخانه قدرتمند منصرف شوید. در این جلسه سعی کردهایم شما را با فضای تنسورفلو آشنا کنیم. امیدواریم که توضیحات ارایه شده ثمربخش باشد. نظرات شما در تهیه هرچه بهتر جلسات بعدی آموزش کمک خواهد کرد. با هوسم همراه باشید…
معنی تنسورفلو
قبل از هرچیز، میخواهیم جلسه دوم (شروع کار با تنسورفلو) را با معنی عبارت تنسورفلو (tensorflow) آغاز کنیم. چرا گوگل نام کتابخانه شبکه عصبی و یادگیری عمیق خود را tensorflow گذاشته است؟ قبل از هرچیز بهتر است بگوییم که عبارت tensorflow از دو کلمه tensor و flow تشکیل شده است و برای انتخاب این دو کلمه دلایل کاملا منطقی وجود دارد که در ادامه دلیل انتخاب هردو کلمه توضیح داده خواهد شد.
برای پاسخ به این سوال که tensor و flow از کجا آمدهاند، بهتر است مفهوم شبکههای عصبی را مرور کنیم. شبکههای عصبی شامل شبکهای از نورونها هستند که برای یک کاربرد خاص آموزش داده میشوند و پس از آموزش، دادههایی در اختیار این شبکه قرار داده میشود و شبکه هم خروجی را پیشبینی میکند. دو عامل مهم در مفهوم شبکههای عصبی مطرح شد: شبکهای از نورونها و ورودیها. اتفاقا جواب هم در همین دو عامل نهفته است.
اگر به شبکه نورونهایی که در شکل زیر آورده شده دقت کنید، احتمالا با ما موافق هستید که این شبکه بسیار شبیه گرافهاست. گرافهایی که در ریاضیات با آنها مواجه شدیم. همچنین، اگر کمی با ساختار شبکههای عصبی آشنا باشید، میدانید که پس از وارد شدن ورودیها به شبکه، یک جریان مستقیم و روبهجلو در شبکه وجود دارد تا درنهایت از ورودیهای شبکه، خروجی بهدست آید. بنابراین، شبکههای عصبی شبیه گرافها هستند و همچنین جریانی مستقیم و روبهجلو دادهها را از ورودی به خروجی میرساند. دلیل انتخاب flow هم همین است؛ flow یعنی گرافی که طی یک جریانی ورودیها به خروجی میرسند.
علاوه بر شبکه نورونها، دادههای ورودی هم عامل مهمی بودند که در پاراگراف اول به آن اشاره کردیم. دادههای ورودی به چه شکلی ظاهر میشوند؟ ممکن است یک بعدی باشند (یعنی در قالب یک بردار قرار گیرند، مثل سیگنال صدا) یا ممکن است دوبعدی باشند (یعنی به شکل یک ماتریس نشان داده شوند، مثل تصویر) و حتی ابعاد بالاتری داشته باشند. به همه این بردارها، ماتریسها و غیره تنسور میگوییم و tensor در عبارت tensorflow هم به همین دلیل انتخاب شده است. tensor یعنی آرایههای چندبعدی، حال ممکن است این آرایه یک بعدی باشد (بردار)، دوبعدی باشد (ماتریس)، سهبعدی باشد (مکعب) و یا ابعاد بالاتر. بنابراین به تمامی آرایهها، تنسور گفته میشود. همچنین، در تصویر زیر ترکیبی از یک گراف-جریان و تنسور را مشاهده کنید که دادههای تنسوری در ورودی گراف قرار میگیرند و با جریانی به سمت خروجی گراف، خروجی مورد انتظار ما را میسازند.
نحوه برنامهنویسی با تنسورفلو
باتوجه به توضیحاتی که در بالا داده شد، اگر شما برای پروژهای به تنسورفلو نیاز دارید، باید دو کار مهم انجام دهید: اول، دادههای ورودی خود را به شکل مناسبی در قالب تنسورها تعریف کنید. دوم، باید گرافی (شبکه) طراحی کنید، گراف خود را آموزش دهید و دادههای خود را به این گرافِ آموزش دیده بدهید تا خروجی را در اختیار شما قرار دهد. اما همانطور که در ابتدای این جلسه گفتیم، تنسورفلو با سایر زبانهای برنامهنویسی رایج تفاوت دارد. توضیحاتی که تاکنون ارایه دادیم، این تفاوتها را نشان نداد، اما حال میتوانیم ببینیم که این تفاوتها کجاست.
بیایید تفاوت تنسورفلو با سایر زبانها را با یک نمونه مثال بررسی کنیم. میخواهیم تنسورفلو را با متلب مقایسه کنیم. اگر در متلب دو متغیر زیر را تعریف کنیم و بخواهیم آنها را با هم جمع کرده و در متغیر c بریزیم، به شکل زیر مینویسیم:
a = 3; b = 4; c = a + b;
حال اگر بخواهیم نتیجه مقدار c را ببینیم، قطعا با مقدار 7 مواجه خواهیم شد. اما حال اگر بخواهیم همین چند خط کد را در تنسورفلو بنویسیم، نتیجه متفاوت خواهد بود. در کدهای زیر دو ثابت تعریف شده و با هم جمع شدهاند:
import tensorflow as tf a = tf.constant(3) b = tf.constant(4) c = a + b
حال با چاپ خروجی، مقدار c بهصورت زیر بدست خواهد آمد:
print(c) <tf.Tensor 'add:0' shape=() dtype=int32>
مشاهده میکنید که در اینحالت اصلا خبری از عدد 7 نیست و بجای آن دیده میشود که c را یک ماژول جمع (add) تعریف کرده است. یعنی میتوانیم بگوییم که c یک شی (object) جمع هست. حال سوال اینجاست که اگر بخواهیم نتیجه جمع را ببینیم باید چه کنیم؟ اصلا راهی وجود دارد؟ بله، راههای مختلفی برای مشاهده مقدار این جمع وجود دارد. یکی از این راهها استفاده از دستور tf.Session هست. با استفاده از این دستور ما حالتی را ایجاد میکنیم که مقادیر ورودی a و b به ماژول جمع داده شوند و خروجی c چاپ شود. مشابه دستورات زیر، ابتدا یک session ایجاد کردهایم و به این session گفتهایم که خروجی را به ما نشان دهد:
sess = tf.Session() sess.run(c) 7
دقت کنید، c در اینجا همان گراف ماست و دادههای ورودی هم a و b هستند. برای اینکه این مقادیر a و b را به c بدهیم باید از session استفاده کنیم. ممکن است کمی برای شما این مساله عجیب بهنظر برسد، اما باید اضافه کنیم که زبانهای برنامهنویسی دیگری وجود دارند که ساختاری شبیه به تنسورفلو دارند و به ساختار این نوع زبانهای برنامهنویسی Declarative گفته میشود. همچنین، لازم است این نکته را هم اضافه کنیم که از یادگرفتن این زبان منصرف نشوید، چون بعد از کمی کار کردن با تنسورفلو با آن ارتباط برقرار میکنید و حتی به این نتیجه میرسید که این یک ویژگی جالب است که شما ابتدا گراف خود را طراحی کنید و بعد به آن گراف هر ورودی که میخواهید، بدهید. در جلسههای بعدی با دستور tf.Session بیشتر آشنا خواهید شد. شروع کار با تنسورفلو
جلسه دوم آموزش تنسورفلو که شروع کار با تنسورفلو بود هم به پایان رسید. در جلسه اول هم به نصب تنسورفلو پرداختیم. ممکن است امروز مباحثی را در مورد تنسورفلو دیده باشید که برای شما تازگی داشته و هنوز ابهامات زیادی دارید، اما جای نگرانی نیست، صبور باشید و آموزشهای تنسورفلو در هوسم را دنبال کنید. در جلسههای آینده میخواهیم کمکم دستورات پرکاربرد در تنسورفلو را معرفی کنیم. نظرات، پیشنهادات و همچنین سوالات خود را در مورد این جلسه بنویسید.
مطالب زیر را حتما مطالعه کنید
مروری بر فریمورکهای یادگیری عمیق
عملیات جبری در تنسورفلو
شبکه عصبی عمیق VGG
متغیرها در تنسورفلو
نصب تنسورفلو
10 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام این کدهایی که نوشتید در محیط pycharm هس؟
سلام ممنون از مطلب خوبتون عکس ها مشکل دارند و باز نمیشن.
آقا دمتون گرم. مهم ترین نکته برای یاد گیری یه چیز جدید از نظر من ، ترسیم حالت کلی اون به زبان بسیار ساده بهمراه مثال و مقایسه س. که شما این کار رو کردین 🙂
سلام
سپاس 🌹🙏
خصوصا برای تنسورفلو 1.0 که کمی هم بدقلق بود! 😉
خیلی ممنونم اگه بخوام از همین ورژن 2 استفاده کنم به جای Session چی باید استفاده کنم؟
تنسورفلو 2.0 به کلی متفاوت از تنسورفلو 1.0 هست. بنابراین، نمیتوان یک جایگزین برای Session معرفی کرد.
سلام خسته نباشید چرا تابع tf.Session() رو نمیشناسه؟
سلام
آیا تنسورفلو رو که نصب کردید، import شد؟ چه نسخهای از تنسورفلو رو نصب کردید؟ با دستور tf.Version میتونید نسخه رو چک کنید (البته اگر نمیدونید چه نسخهای نصب کردید).
سلام بله فهمیدم از نسخه 2.1 استفاده میکنم
اما اون تابع کار نمیکنه
در نسخه تنسورفلو 2.0 تغییرات اساسی بوجود آمد. دستورات tf.Session دیگر در پیشفرض تنسورفلو وجود ندارد.
برای استفاده از Session باید تنسورفلو نسخه 1 نصب کنید.
البته، اگر اجباری در استفاده از Session نیست، بهتر هست نسخه 2.0 را کار کنید. بازهم باید به این نکته اشاره کنم که فعلا کدهای مقالهها بیشتر مبتنی بر نسخه 1.0 هستند.