متغیرها در تنسورفلو
در جلسه دوم آموزش تنسورفلو، در مورد شروع کار با تنسورفلو و همچنین یکسری مفاهیم اولیه توضیح داده شد. از این جلسه میخواهیم دستورات تنسورفلو را به شما معرفی کنیم. در جلسه سوم آموزش تنسورفلو، میخواهیم در مورد متغیرها در تنسورفلو توضیح دهیم و نحوه تعریف متغیرها (variables) و ثابتها (constants) دو بخش اصلی این آموزش هستند. توصیه میکنیم که همراه با آموزشها، تمرین کنید تا تنسورفلو را زودتر یاد بگیرید. سومین جلسه از آموزش تنسورفلو همراه با هوسم همراه باشید…
tf.constant
برای تعریف یک عدد ثابت در تنسورفلو، از دستور tf.constant استفاده میشود. همانطور که میدانید، ثابتها یکبار مقداردهی میشوند و پس از آن دیگر قابلیت مقداردهی ندارند. tf.constant شامل ورودیهای متعددی است که در زیر چند نمونه تعریف ثابت آورده شده است. در مثال اول، ثابت x تنها یک ورودی دارد که آنهم عددی است که میخواهیم به x نسبت دهیم. بنابراین، دستور tf.constant قابلیت داشتن تنها یک ورودی را هم دارد و نیازی نیست که تمامی ورودیهای این تابع را مشخص کنید.متغیرها در تنسورفلو
a = tf.constant(4.0)
برای چاپ مقدار a باید از مباحث گفته شده در جلسه دوم استفاده کنیم. یادتان میآید برای چاپ مقادیر در تنسورفلو چه راهی را پیشنهاد کردیم؟ بر فرض میخواهیم از دستور ساده print استفاده کنیم، دراینصورت نتیجه زیر حاصل خواهد شد:
Tensor("Const_1:0", shape=(), dtype=float32)
با نوشتن دستور بالا، تنها ما یک آبجکت میبینیم که یک تنسور از نوع ثابت، بدون ابعاد خاصی (shape) و همچنین نوع داده float32 هست. اما مطابق گفتههای جلسه دوم، اگر از دستور tf.Session استفاده کنیم، میتوانیم مقدار دقیق a را مشاهده کنیم.
sess = tf.Session() print(sess.run(a) 4.0
در مثال دوم، دستور tf.variable شامل 2 ورودی است که ورودی دوم، نوع داده را مشخیص میکند؛ اگر مشخص نشود، بهصورت پیشفرض نوع داده مشابه مثال بالا float32 در نظر گرفته میشود. متغیرها در تنسورفلو
b = tf.constant(3.0, dtype=tf.int32) sess = tf.Session() print(sess.run(b) 3.0
تاکنون، نحوه تعریف ثابت را یاد گرفتهایم، حال بیایید یک شبکه کوچک بسازیم. یک شبکه کوچک میسازیم که در آن دو ورودی ثابت با هم جمع و در خروجی نشان داده شوند. با استفاده از دستور tf.add دو ثابت را با هم جمع میکنیم. در مورد دستور tf.add و سایر عملیات ریاضی در جلسههای بعدی توضیح خواهیم داد. در کدهای زیر دو ثابت تعریف شده که با هم جمع شدهاند:
node1 = tf.constant(4.0) node2 = tf.constant(3.0) node3 = tf.add(node1, node2) print(node3) print(sess.run(node3)) Tensor("Add:0", shape=(), dtype=float32) 7.0
اما شبکهای که طراحی کردیم، به چه شکلی است؟ ابزارهایی مانند تنسوربورد (tensorboard) وجود دارد که به ما کمک میکنند تا گرافی را که طراحی کردهایم، مشاهده نماییم. در تصویر زیر میتوانید شبکه کوچکی که طراحی کردیم را مشاهده کنید:
اولین شبکه خود را طراحی کردیم. اما این شبکه خیلی با اهداف مدنظر ما فاصله دارد و بسیار ساده است و البته معایب زیادی هم دارد. یکی از بزرگترین ضعفهای آن، ثابت بودن ورودیهاست. چون ورودیها از نوع ثابت هستند، ما اصلا نمیتوانیم مقدار جدیدی به این شبکه بدهیم. یعنی ما یک شبکه ساختهایم که نهتنها بسیار ساده است، بلکه مقادیر ورودی و خروجی آن نیز همواره ثابت است! ما شبکهای را میپسندیم که هر مقدار ورودی که میخواهیم به شبکه بدهیم و شبکه هم خروجی را به ما نشان دهد. بنابراین، به نظر میرسد مشکل از ثابتهاست، باید بجای ثابتها از دستور دیگری استفاده کنیم. در ادامه، دستور جدیدی تعریف شده که به ما این امکان را میدهد که ورودیهای متفاوت و دلخواه به شبکه بدهیم.متغیرها در تنسورفلو
tf.placeholder
placeholder، یکی دیگر از راههای تعریف ورودی است. متاسفانه نتوانستیم برای placeholder یک معادل فارسی مناسب بیابیم، البته شما میتوانید به ما در انتخاب نام مناسب کمک کنید. placeholder را میتوان بدون هیچگونه مقدار اولیهای تعریف کرد و صرفا مشخص کرد که نوع داده چیست. درحقیقت، placeholder برای ما یک فضای خالی در رم اختصاص میدهد و بعدا میتوانیم در آن مقدار قرار دهیم و بارها مقدارش را تغییر دهیم. در زیر دو تعریف a و b از نوع placeholder داریم که با هم جمع شدهاند تا دوباره ما شبکه کوچک خود را بسازیم. اینبار انتظار داریم که بتوانیم ورودیهای دلخواه به شبکه بدهیم.
a = tf.placeholder(tf.float32) b = tf.placeholder(tf.float32) adder_node = a + b
حال سوال اینجاست که چگونه به این شبکه ورودی بدهیم؟ نحوه چاپ خروجی به صورت قبل و براساس tf.Session هست، اما ورودیها را هم باید در همین دستور بگنجانیم. در دستورات زیر، مشاهده میکنید که ورودی دلخواه در داخل علامتهای {} قرار داده شده است. شما هم دقیقا به همین شکل ورودیهای جدید بدهید و تمرین کنید:
print(sess.run(adder_node, {a: 3, b: 4.5})) 7.5
tf.variable
تا به اینجا دو تعریف constant و placeholder را توضیح دادیم، اما یک نوع تعریف دیگر بنام variable هم هست که از اهمیت و کاربرد بالایی برخوردار است. میدانیم که وقتی صحبت از یادگیری ماشین و شبکههای عصبی است، یعنی الگوریتمهای ما باید آموزش داده شوند. یعنی یکسری پارامترهایی داریم که در فرآیند آموزش آنقدر تغییر میکنند تا به بهترین جواب ممکن برسیم. بهعنوان مثال وزنها (w) و بایاسها (b) در شبکههای عصبی باید از یک مقدار اولیه تغییر کنند و به سمت مقدار بهینه بروند. برای این پارامترها که یک مقدار اولیه دارند و در فرآیند آموزش بارها و بارها تغییر میکنند، variable-ها در تنسورفلو بهترین گزینه هستند. به عنوان مثال، در زیر ورودی (x) در وزنها (w) ضرب شده و درنهایت با بایاس (b) جمع شده است. ورودی (x) از نوع placeholder و وزنها (w) و بایاسها (b) از نوع variable است.
W = tf.Variable(0.3, dtype=tf.float32) b = tf.Variable(-0.3, dtype=tf.float32) x = tf.placeholder(tf.float32) linear_model = W*x + b sess = tf.Session()
یک نکته جدیدی که باید گفته شود این است که، برای اینکه مقادیر اولیه درون w و b ریخته شوند، حتما باید از دو دستور زیر استفاده کنید:متغیرها در تنسورفلو
init = tf.global_variables_initializer() sess.run(init)
چرا؟ یادتان باشد هرگاه در برنامه تنسورفلوی خود، متغیر داشتید حتما باید از دستور tf.global_variables_initializer و سپس sess.run استفاده کنید که مقادیر اولیه در متغیرهای مربوطه قرار گیرند. درنهایت، مشابه قبل با استفاده از دستور زیر، به x مقدار ورودی میدهیم و خروجی شبکه را بدست میآوریم:
print(sess.run(linear_model, {x: 4})) 0.90000004
جلسه سوم آموزش تنسورفلو (متغیرها در تنسورفلو) هم به پایان رسید. در این جلسه به معرفی tf.variable، tf.constant و tf.placeholder پرداختیم. اگر در برنامه بخواهیم ثابتهایی برای یک بار تعریف کنیم، بهترین گزینه tf.constant هست. اگر در برنامه تنسورفلو بخواهیم ورودیها را تعریف کنیم، بهترین گزینه tf.placeholder هست. درنهایت، اگر بخواهیم متغیرهایی در برنامه داشته باشیم، tf.variable برای این کار مناسب خواهد بود. تاکنون، فقط نحوه تعریف اعداد اسکالر را یاد گرفتهایم، اما اگر بخواهیم ماتریس یا برداری تعریف کنیم، باید چه کنیم؟ این سوالی است که در جلسه چهارم به آن پاسخ داده شده است. در پایان، خوشحال میشویم که نظرات خود را در مورد این جلسه از آموزش با ما در میان بگذارید.
مطالب زیر را حتما مطالعه کنید
مروری بر فریمورکهای یادگیری عمیق
عملیات جبری در تنسورفلو
شبکه عصبی عمیق VGG
شروع کار با تنسورفلو
نصب تنسورفلو
5 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام وقتتون بخیر
خواستم ازتون صمیمانه تشکر کنم بابت مطالب خوبی که به اشتراک میگذارید
ممنون
بسیار عالی واقعا
فقط اگر از منبع خاصی استفاده کردید خیلی بهتر هست قید بفرمایید.
سلام
سپاس 🌹🙏
معمولا آموزشهای ما منبع خاصی نداره. مجموعهای از مطالعات و تجربیات خودمون هست. اگر آموزشی رو ترجمه کرده باشیم، معمولا مراجع رو هم معرفی میکنیم.
امورش خیلی روونیه. خیلی ممنونم.
سلام
سپاس