0 تا 100 کتابخانه تنسورفلو در پایتون

کامل ترین آموزش عملی تنسورفلو در پایتون
تاریخ بروزرسانی : 12 آذر 1401 | تعداد بازدید : 6851 | زمان خواندن مقاله : 30
پایتون،

 کامل ترین آموزش عملی کتابخانه تنسورفلو در پایتون

ماشین لرنینگ یکی از پیچیده ترین شاخه های هوش مصنوعی است. پیاده سازی ماشین لرنینگ نیز پیچیدگی های خاص خودش را دارد اما این پیچیدگی ها با استفاده از کتابخانه تنسورفلو در پایتون به راحتی آب خوردن می شود. پایتون قدرتمند ترین زبان برنامه نویسی حال حاضر است و توانسته در هر حوزه ای که فکرش را کنید وارد شود که ماشین لرنینگ نیز یکی از همین حوزه ها است. با من همراه باشید تا هر آنچه را که باید درباره تنسورفلو بدانید به شما بگویم.

تنسورفلو چیست؟

تنسورفلو یک کتابخانه منبع باز است که در ماشین لرنینگ استفاده می شود. کتابخانه تنسورفلو در پایتون؛ یک کتابخانه ریاضی نمادین است و با استفاده از داده ها و برنامه نویسی در فعالیت های مختلف شبکه های عصبی استفاده می شود. تنسورفلو در سال 2015 توسط تیم Google Brain ایجاد شد. تنسورفلو مجموعه ای از مدل ها و الگوریتم های ماشین لرنینگ و دیپ لرنینگ است. رقبای اصلی کتابخانه تنسورفلو فریمورک هایی چون PyTorch و Apache هستند.

همه ما در سرچ های روزمره خود بار ها و بار ها از تنسورفلو استفاده می کنیم. تجربه جستجوی سریع گوگل با استفاده از کتابخانه تنسورفلو صورت می گیرد. در مثال زیر کاربر عبارت «سهام عدالت» را جستجو می کند و گوگل عبارت های مشابه را ارائه می دهد. در ویدیو که در ادامه آورده ایم؛ این موضوع را عملا نشان داده ایم.

چرا کتابخانه تنسورفلو محبوب است؟

کتابخانه تنسورفلو در پایتون یکی از بهترین کتابخانه های موجود در این زبان برنامه نویسی است. این کتابخانه از هر نظر که فکر کنید؛ بهترین است. کتابخانه تنسورفلو به گونه ای ساخته شده است که برای همه توسعه دهندگان قابل استفاده و در دسترس است. این کتابخانه محبوب پایتونی دارای API های مختلفی است با استفاده از یادگیری عمیق ساخته شده اند و از معماری هایی چون CNN و RNN استفاده کرده اند.

عملکرد تنسورفلو بر اساس محاسبه گراف است. این امر موجب شده تا توسعه دهنده عزیز بتواند ساخت شبکه عصبی را با Tensorboad تجسم کند. این ابزار در رفع اشکال برنامه ها به شدت راهگشا است. شاید برای شما هم جالب باشد که بدانید بیشترین میزان محبوبیت کتابخانه تنسورفلو در پایتون به GitHub بر می گردد و به نوعی محبوب ترین کتابخانه در یادگیری عمیق است.

آموزش پایتون

پیشینه کتابخانه تنسورفلو در پایتون

کتابخانه تنسورفلو در پایتون؛ سیستم نسل دوم Google Brain است. TensorFlow می‌تواند روی چندین CPU و GPU و TPU اجرا شود. قطعا می دانید CPU چیست اما احتمال می دهم در مورد GPU و TPU چیزی ندانید. GPU واحد پردازش گرافیکی یک پردازنده تخصصی است که در اصل برای تسریع رندر گرافیکی طراحی شده است. اگر بخواهیم دقیق تر بگوییم که پردازنده های گرافیکی چکاری انجام می دهند؛ باید بگوییم پردازنده‌ های گرافیکی می‌ توانند بسیاری از داده ‌ها را به‌طور همزمان پردازش کنند و آن‌ ها را برای یادگیری ماشین، ویرایش ویدیو و برنامه‌ های بازی مفید می ‌سازند.

از آنجایی که پردازنده های گرافیکی می توانند مشکلات پیچیده را به هزاران قسمت تقسیم کنند و همه آن ها را یکباره حل کنند، این درحالی است که TPU مختص بارگذاری شبکه های عصبی طراحی شده اند و سرعت عملشان بیشتر از GPU است و از منابع کمتری نیز استفاده می کنند. تنسورفلو نیز مانند پایتون محدودیت پلتفر ندارد و روی لینوکس، macOS، ویندوز و پلتفرم ‌های موبایل از جمله اندروید و iOS در دسترس است. در حال حاضر، معروف ترین کتابخانه یادگیری عمیق در جهان TensorFlow است که در فعالیت هایی چون ماشین لرنینگ، موتور جستجو و ترجمه استفاده می شود.

در این مثال گوگل با استفاده از ماشین لرنینگ از مجموعه عظیم داده هایش استفاده می کند تا بهترین تجربه را به کاربرانش ارائه دهد.

نحوه عملکرد کتابخانه تنسورفلو در پایتون

کتابخانه تنسورفلو به شما این امکان را می دهد که نمودار ها و ساختار های جریان داده را بسازید و با در نظر گرفتن ورودی ها به عنوان یک آرایه چند بعدی به نام تنسور، نحوه عملکرد آن ها را به صورت نمودار نشان دهید. شما می توانید تمامی مراحلی که داده ها طی می کنند را به صورت فلوچارت نیز نمایش دهید.

برنامه هایی که از تنسورفلو استفاده می کنند، قابلیت استفاده در هر نوع پروژه ای را دارند، از کلاستر در فضای ابری گرفته تا دستگاه های ios و اندروید. البته که کاربرد تنسور فلو در پایتون محدود به این موارد نیست و می تواند در اکثر دستگاه هایی که وظیفه پیش بینی را بر عهده دارند نیز پیاده سازی شود.

یک خسته نباشید و خدا قوت میگم به همه دوستانی تا اینجای کار با من همراه بودند و عاشق یادگیری هستند؛ علی الخصوص اگر یادگیری درباره پایتون باشه. می دونم خیلی انرژی گذاشتید و فسفر سوزوندید، چون این مبحث یکم تخصصی تر هست. برای این که خستگی رو از تن به در کنیم؛ پیشنهاد می کنم آهنگ angel by the wings از sia را گوش کنید تا به ادامه مبحث جذابمون برسیم.

معماری تنسورفلو در پایتون

معماری تنسورفلو شامل سه بخش می باشد.

  1. پیش پردازش داده ها
  2. ساختن مدل
  3. آموزش مدل و تخمین عملکرد

این سه مرحله در کنار هم تنسورفلو را به وجود می آورد. تنسورفلو ورودی را به عنوان یک آرایه چند بعدی دریافت می کند. به این آرایه چند بعدی تانسور گفته می شود. در طی این مسیر چندین فرآیند روی داده های ورودی اعمال می شود و در انتها به عنوان خروجی خارج می شود. علت نام گذاری تنسورفلو نیز به خاطر فرآیندی است که داده ها طی می کنند و تانسور از طریق تعدادی عملیات مشخص جریان پیدا می کند و در انتها به عنوان خروجی؛ خارج می شود.

اجزای تنسورفلو

Tensor

اگر به واژه TensorFlow دقت کنید متوجه می شوید که نام این کتابخانه از اصلی ترین قسمت اصلی آن یعنی Tensor گرفته شده است. تمامی محاسباتی که در تنسورفلو انجام می شود شامل تانسور است. اگر بخواهیم دقیق تر بگوییم که تانسور از چه چیزی تشکیل شده است، باید بگوییم که تنسور از یک ماتریس چند بعدی تشکیل شده است. این ماتریس می تواند هر نوع داده ای را نمایش دهد. البته این را هم باید بگوییم که درست است که تانسور قابلیت نمایش همه نوع داده را دارد اما تمامی داده های درون یک تانسور باید از یک نوع باشند.

تانسور می تواند یک داده ورودی یا نتیجه یک محاسبه باشد. در کتابخانه تنسورفلو در پایتون تمامی عملیات روی نموداری که مجموعه ای از محاسبات متوالی است؛ انجام می شود. هر عملیاتی که انجام می شود را گره عملیات می گویند. تمامی گره ها به یکدیگر متصل هستند. نموداری که در طی عملیات تنسورفلو استفاده می شود؛ تمامی گره ها و اتصالات را نمایش می دهد.

اما از آن جایی که من می خواهم شما تنسورفلو را مثل یک برنامه نویس حرفه ای یاد بگیرید و بشناسید؛ می خواهم یکی از عیب های بزرگ تنسورفلو را به شما بگویم. البته این نقص آنقدر ها هم مهم نیست و خدشه ای به کار شما وارد نمی کند و صد البته چیزی از ارزش های تنسورفلو نیز کم نمی کند. عیبی که می خواهم درباره اش با شما صحبت کنم؛ عدم نمایش مقادیر است. از آنجایی که لبه گره ها تانسور قرار دارد؛ دیگر نمی توان عملیات را با داده های مختلف پر کرد. 

Graphs

همانطور که در بخش تانسور متوجه شدیم، کتابخانه تنسورفلو در پایتون از نمودار ها استفاده می کند. با استفاده از این نمودار ها می توان تمام محاسبات انجام شده در طول آموزش را جمع آوری و توصیف کرد. البته مزایای گراف محدود به این موارد نیست. از دیگر مزایای گراف ها می توان به اجرا روی چندین CPU، GPU و حتی سیستم عامل های تلفن های همراه اشاره کرد. نمودار ها قابلیت ذخیره دارند و می توان آن ها را برای استفاده های بعدی ذخیره کرد.

تمامی محاسبات درون نمودار ها به تانسور ها وابسته است و به وسیله آن ها انجام می شود. هر تانسور یک گره و یک لبه دارد. گره وظیفه انجام عملیات ریاضی را بر عهده دارد و خروجی ها را تولید می کند. لبه ها نیز وظیفه توضیح روابط ورودی و خروجی را بر عهده دارند.

 

هوش مصنوعی چیست

بیشتر بخوانید:

هوش مصنوعی چیست و چگونه دنیا را متحول کرده است؟

 

محل اجرای تنسورفلو کجاست؟

مراحل اجرای تنسورفلو را می توان به دو بخش سخت افزار و نرم افزار تقسیم کرد. اگر در مرحله توسعه باشید و مدل خود را آموزش می دهید، پس محل اجرای شما دسکتاپ لپ تاپ یا کامپیوتر شما است. اگر در مرحله اجرا یا استنتاج باشید؛ می توانید تنسورفلو را روی هر پلتفرمی اجرا کنید، چرا که تمام آموزش های لازم را در مرحله قبل به آن داده اید.

مهم نیست سیتم عامل شما لینوکس ، ویندوز، مک، انروید یا ios باشد؛ شما می توانید تنسور فلو را روی هر پلتفرمی اجرا کنید و از این نظر هیچ محدودیتی ندارید. شما می توانید تنسورفلو را روی یک دستگاه آموزش دهید و آن را در دستگاه دیگری اجرا کنید. و این است قدرت کتابخانه تنسورفلو در پایتون.

 

از کتابخانه تنسور فلو می توان در پردازنده های گرافیکی نیز استفاده کرد. پردازنده های گرافیکی ابتدا برای بازی های ویدیویی طراحی و ساخته شده بودند اما با گذشت زمان و در آخرین روز های سال 2010 میلادی بود که محققین دریافتند که پردازنده های گرافیکی عملکرد فوق العاده ای در عملیات های جبری و ماتریس ها دارد و می تواند سرعت انجام محاسبت در این نوع عملیات را به شدت بالا ببرد.

یکی دیگر از ویژگی های فوق العاده کتابخانه تنسورفلو در پایتون؛ TensorBoard است. تنسور برد به شما این امکان را می دهد که به صورت گرافیکی و بصری بر تمام فعالیت های تنسورفلو نظارت داشته باشید و آن را کنترل کنید.

چگونگی محاسبات در تنسورفلو

یکی از حساس ترین و مهم ترین بخش های این مقاله همین قسمت است. پس با دقت بخونید که تو حافظتون ثبت بشود. به دستورات زیر نگاه کنید:

import numpy as np

import tensorflow as tf

همانطور که در کد های بالا مشاهده کردید، تنسورفلو را به صورت tf وارد کردیم. اگر تجب کرده اید که چرا نام این کتابخانه را کوتاه کرده ام؛ باید بگویم در زبان برنامه نویسی پایتون این یک امر طبیعی است. در این زبان شما می توانید نام کتابخانه ها را به صورت کوتاه شده وارد کنید. اگر بخواهم واضح تر توضیح بدهم؛ باید بگویم به عنوان مثال می توانید تنسورفلو را به صورت tf وارد کنید و در صورت نیاز برای فراخوانی همان tf را وارد کنید.

از آنجایی که بهترین راه برای یادگیری عمیق یک مبحث استفاده از مثال است، در اینجا هم یک مثال برای شما می آورم تا اساسی کتابخانه تنسورفلو در پایتون را یاد بگیرید. مثال که بدون رسم شکل نمیشه. پس اول یه شکل میارم که روی شکل توضیح بدم.
به شکل زیر دقت کنید:


 آموزش کتابخانه تنسورفلو در پایتون

ابتدا یک نمودار رسم می کنیم. این نمودار قابلیت ضرب دو عدد را دارد. در این مثال X_1 و X_2 را در هم ضرب می کنیم. در این لحظه تنسورفلو یک گره برای اتصال این عملیات ایجاد می کند که در این مثال به آن ضرب گفته می شود. وقتی این نمودار مشخص شود، موتور های محاسباتی تنسورفلو در X_1 و X_2 ضرب می شوند. در نهایت کتابخانه تنسورفلو اجرا می شود و نتیجه ضرب را به عنوان خروجی نمایش می دهد.

هنگامی که یک گره در تنسورفلو تعریف می شود؛ در همان ابتدا باید نوع گره مشخص شود. در مثالی که پیش تر گفته ایم؛ گره ما از نوع نگهدارنده مکان است. این نوع گره با هر بار محاسبه مقدار جدیدی را دریافت می کند. این گره ها به عنوان گره نگهدارنده نقطه TF ایجاد شده اند. برای آن که متوجه شویم که کتابخانه تنسورفلو در پایتون دقیقا چه کاری انجام می دهد، باید سه مرحله زیر را انجام دهیم.

مرحله اول: تعریف متغیر

X_1 = tf.placeholder(tf.float32, name = "X_1")

X_2 = tf.placeholder(tf.float32, name = "X_2")

همانطور که در مثال بالا می بینید گره نگهدارنده ای که ایجاد کرده ایم؛ باید به گونه ای باشد که که بتوانیم از نوع داده اعشاری استفاده کنیم. در اینجا داده تنسورفلو به صورت tf.float32 است. تمامی گره های ایجاد شده در تنسورفلو نام گذاری شده اند. در اینجا پارامتری به نام name را تعریف کرده ایم و به آن مقدار X_1 را داده ایم. متقابلا دومین متغیر را نیز با نام name و مقدار X_2 تعریف کرده ایم.

مرحله دوم: تعریف نوع عملیات

multiply = tf.multiply(X_1, X_2, name = "multiply")

در این مرحله گره ای که عملیات ضرب را انجام می دهد؛ تعریف می کنیم. همانطور که در بالا مشاهده می کنید؛ در کتابخانه تنسورفلو در پایتون گره را با دستور tf.multiply تعریف می کنیم. همانطور که مشاهده می کنید گره های X_1 و X_2 را به گره ضرب انتقال می دهیم. در اینجا از تنسورفلو می خواهیم گره های ورودی را در گراف محاسباتی به یکدیگر پیوند دهد و نتیجه محاسبات را برگرداند.

مرحله سوم: اجرایی کردن عملیات

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)

در آخرین مرحله به اجرایی کردن عملیات می پردازیم. برای اجرایی کردن عملیات در تنسورفلو در اولین اقدام باید یک جلسه ایجاد کنیم. در کتابخانه تنسورفلو در پایتون ایجاد جلسه را با استفاده از دستور ()tf.Session انجام می دهیم. پس از آن که جلسه را ایجاد کردیم؛ نوبت به فراخوانی آن می رسد. با فراخوانی جلسه می توانیم از آن بخواهیم تا محاسبات روی نمودار را برای ما انجام دهد. همانطور که در قطعه کد بالا مشاهده می کنید؛ برای اجرای محاسبات از دستور run استفاده می کنیم.

اگر یادتان باشد؛ پیشتر گفتیم با هر بار انجام محاسبه مقادیر X_1 و X_2 نیز تغذیه می شوند و مقادیر جدیدی می گیرند. در کتابخانه تنسورفلو در پایتون این کار را با دستور feed_dict انجام می دهیم. در این مثال برای X_1 مقادیر 0، 4، 8 و برای X_2 مقادیر 3 ، 5 ، 7 در نظر می گیریم. پس از انجام محاسبه انتظار داریم جواب های ما 0، 20، 56 باشد.

[56. 20. 0]

بارگذاری داده ها در کتابخانه تنسورفلو در پایتون

برای بارگذاری داده ها در کتابخانه تنسورفلو در پایتون باید قبل از هر گونه آموزشی اقدام کنیم. شما باید قبل از آموزش الگوریتم ماشین لرنینگ؛ داده های خود را بارگذاری کنید. بارگذاری داده ها به دو روش امکان پذیر است.

روش اول: بارگذاری در حافظه

این روش راحت ترین روش بار گذاری داده است. عملکرد این روش به این صورت است که شما تمامی داده های خود را به عنوان یک آرایه در حافظه بارگذاری می کنید. شما می توانید این کار را تنها با یک خط کد انجام دهید و نیازی به کتابخانه تنسورفلو ندارید.

روش دوم: خط لوله تنسورفلو

یکی از مزیت های تنسورفلو دارا بودن API های داخلی است. این کتابخانه پایتونی با استفاده از این ویژگی می توانید داده های خود را بارگیری کنید، عملیات مورد نظرتان را انجام دهید و در نهایت الگوریتم یادگیری ماشین را تغذیه کنید. درست است که این روش به آسانی روش قبل نیست اما بهترین روش برای زمانی است که تعداد داده های بسیار بالایی دارید.

به طور مثال شما رکورد های تصویر بسیار زیادی دارید که در حافظه جای نمی شود. اینجاست که خط لوله به کمک شما می آید و حافظه را مدیریت می کند. برای ساخت یک خط لوله در کتابخانه تنسورفلو در پایتون باید مراحل زیر را طی کنید.

برای آن که ایجاد خط لوله در کتابخانه تنسورفلو در پایتون را به طور کامل یاد بگیرید؛ از روش همیشگی و مورد علاقه ام؛ یعنی مثال استفاده می کنم. برای این قسمت هم از همان مثال قبلی استفاده می کنیم که فهم آن آسان تر باشد. اگر خاطر مبارکتان باشد؛ در مثالی که قبل تر آورده ایم؛ سه مقدار به X_1 و سه مقدار به X_2 دادیم و این کار را به صورت دستی انجام دادیم. در این قسمت به شما می گویم که این مقادیر چگونه در Tensorflow بارگذاری می شوند. مرحله به مرحله با من همراه باشید تا به طور کامل این مبحث را یاد بگیرید و متوجه شوید یک خط لوله برای تغذیه شبکه های عصبی چگونه کار می کند. 

چگونگی عملکرد خط لوله در تغذیه شبکه های عصبی

مرحله اول: ایجاد داده

در اولین قدم باید داده هایی را که نیاز داریم ایجاد کنیم. برای این کار از کتابخانه numpy استفاده می کنیم تا برای ما دو مقدار تصادفی ایجاد کند.

import numpy as np
x_input = np.random.sample((1,2))
print(x_input)

در این مرحله دو مقدار تصادفی 0.23766977 و 0.8835775 تولید شد.

مرحله دوم: ایجاد مکان نگهدارنده

همانند مثالی که قبلا برای کتابخانه تنسورفلو در پایتون آورده ایم؛ در این مثال نیز مکان نگهدارنده ای با نام X ایجاد می شود. در این مرحله باید شکل تانسور را نیز مشخص کنیم، که باید برای آن آرایه ای را با دو مقدار بارگذاری کنیم. در این مثال این دو مقدار را به شکل  [1,2] نشان داده ایم.

# using a placeholder
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')

مرحله سوم: تعریف متد مجموعه داده

در این مرحله از عملیات کتابخانه تنسورفلو در پایتون به تعریف متد مجموعه داده می پردازیم. با استفاده از این مجموعه داده تمامی مقادیر مورد نیاز مکان نگهدارنده X را فراهم می کنیم. برای این کار مطابق با دستوری که در ادامه آورده ایم عمل می کنیم.

dataset = tf.data.Dataset.from_tensor_slices(x)

مرحله چهارم: ساخت خط لوله

در این مرحله باید خط لوله ای را که در آن داده ها جریان دارند؛ مقدار دهی کنیم. در این جا نیاز به یک تکرار کننده داریم. پس این تکرار کننده را ایجاد می کنیم. حال نوبت به فراخوانی این تکرار کننده می رسد. هدف از فراخوانی تکرار کننده؛ تغذیه دسته بعدی داده ها؛ یعنی get_next  است.

iterator = dataset.make_initializable_iterator()
get_next = iterator.get_next()

مرحله پنجم: اجرایی کردن عملیات

این مرحله؛ آخرین مرحله از ایجاد خط لوله تنسورفلو در کتابخانه تنسورفلو در پایتون است. در مرحله پنجم جلسه ای را راه اندازی می کنیم. در اینجا feed_dict را با مقادیر تولید شده توسط کتابخانه numpy تغذیه می کنیم. این دو مقدار در X را به طور کامل پر می کنند. در پایان get_next را اجرا می کنیم تا نتیجه چاپ شود.

with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iterator.initializer, feed_dict={ x: x_input })
    print(sess.run(get_next)) # output [ 0.52374458  0.71968478]

نتایج چاپ شده نیز به ترتیب 0.8835775  و  0.23766978 می باشند.

برای بارگذاری داده ها در تنسورفلو از کدام روش استفاده کنیم؟

برای بارگذاری داده ها در کتابخانه تنسورفلو در پایتون؛ باید به مجموعه داده خود توجه کنید. اگر مجموعه داده شما کمتر از 10 گیگابایت است؛ بهتر است از روش اول؛ یعنی بارگذاری در حافظه استفاده کنید. داده های کمتر از این مقدار در حافظه جا می شوند. حال اگر مجموعه داده شما بیشتر از 10 گیگابایت باشد؛ استفاده از روش خط لوله تنسورفلو بهترین گزینه است. اینجا است که مثال به کمک می آید تا بهتر متوجه این اتفاقات شویم. فرض کنید 100 گیگ اطلاعات و داده دارید و کمپیوتر شما فقط 32 گیگ حافظه دارد. اگر این داده ها به کامپیوتر منتقل شود؛ قطعا آن را از کار می اندازد.

در این شرایط نیاز به یک خط لوله تنسورفلو داریم. خط لوله تمامی 100 گیگ داده را به دسته های کوچک تقسیم می کند و هر کدام از این دسته ها را بارگذاری می کند. تمامی این دسته ها به خط لوله فرستاده می شوند تا آموزش ببینند. یکی از مزایای استفاده از خط لوله؛ بهره مندی از محاسبات موازی است. محاسبات موازی به کتابخانه تنسورفلو در پایتون این امکان را می دهد که آموزش را در چندین CPU به صورت همزمان داشته باشیم.

خلاصه ای درباره کتابخانه تنسورفلو در پایتون

قبل از هر صحبتی خیلی ممنونم که تا اینجای کار همراه من بودید تا یک مبحث خیلی مهم و کاربردی از پایتون را یاد بگیریم. تو این مقاله صفر تا صد مبحث کتابخانه تنسورفلو در پایتون را گفتم. تمامی مباحث تنسورفلو چیست، چه کاربردی دارد، چه طور کار می کند، چه وظایفی را بر عهده دارد، از چه اجزایی تشکیل شده، معماری آن و مباحث بسیار دیگری را برای شما دوستان عزیز آورده ایم.

امیدوارم این مبحث به تکمیل دانش پایتونی شما کمک کند تا بتوانید عملکرد حرفه ای تری داشته باشید. اولین باری که از تنسورفلو استفاده کردید چه حسی نسبت به کد های خود داشتید؟ تجربه خود را با ما به اشتراک بگذارید. بی صبرانه منتظر سوالات و نظرات پر مهرتان هستم.