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

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

تنسورفلو، یک کتابخانه ی متن باز یادگیری ماشین برای زبان پایتون ( و زبان C++ ) است که توسط تیم Google Brain در نهم نوامبر ۲۰۱۵ معرفی شد. امروزه گوگل از این کتابخانه برای مواردی چون بازشناسی گفتار، Gmail، Google photo و سرویس های جست وجو استفاده می کند.از آنجایی که تنسور فلو بر اساس روش های مبتنی بر یادگیری عمیق طراحی شده است، قابلیت اجرای فعالیتهای پردازشی سنگین مثل روش های خوشه بندی، مدل های گرافیکی، مسائل بهینه سازی و …را دارا می باشد.

از ویژگی های این کتابخانه می توان به مشتق گیری اتوماتیک( که نیاز به نوشتن کدهای دستی برای پیاده سازی الگوریتم پس انتشار را رفع می کند )، خاصیت موازی سازی اتوماتیک و بکار گیری GPU در پردازش های سنگین اشاره کرد.یکی از قابلیت های خوب تنسورفلو، خاصیتTensorBoard است. TensorBoard ابزاری است که به برنامه نویس، اجازه ی مصورسازی گراف محاسباتی را می دهد. گرافی که مبینمسیر و چارچوب کلی محاسباتی و رفتاری مسئله ی مورد بررسی است.

کار با تنسورفلو

تنسور فلو با تعریف کردن یک گراف عملیاتی داده ای کار می کند.گرافی که ضلع های آن، معرف داده ها و گره های آن معرف عملیات ها است. در تنسور فلو، برنامه نویس، با استفاده از تنسورها یک گراف محاسباتی را تعریف می کند.

نصب و راه اندازی

برای نصب این کتابخانه، یک راهنمای آموزشی که بطور پیوسته و مداوم بروز رسانی می شود، در آدرس زیر وجود دارد:

https://www.tensorflow.org/get_started

در ادامه یک مثال از کتابخانه ی تنسور فلو ارائه شده است.

رگریسیون خطی در تنسور فلو

رگریسیون خطی در کتابخانه ی تنسورفلو به شکلی که در ادامه بیان خواهیم کرد تعریف می شود:

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

				
					import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

# NEW DATA
data_x = np.linspace(1, 8, 100)[:, np.newaxis]
data_y = np.polyval([1, -14, 59, -70], data_x) \
        + ۱٫۵ * np.sin(data_x) + np.random.randn(100, 1)
# --------

model_order = 5
data_x = np.power(data_x, range(model_order))
data_x /= np.max(data_x, axis=0)

order = np.random.permutation(len(data_x))
portion = 20
test_x = data_x[order[:portion]]
test_y = data_y[order[:portion]]
train_x = data_x[order[portion:]]
train_y = data_y[order[portion:]]

				
			

در ادامه باید مدل خود را یا همان گراف مسئله را تعریف کنیم. برای این کار ابتدا نگهدارنده های ورودی ها و خروجی هایمان را تعریف می کنیم که برای پیاده سازی آن باید نوع داده ها ( float32 )، شکل داده ها را به صورت زیر تعریف کنیم:

				
					with tf.name_scope("IO"): inputs = tf.placeholder(tf.float32, [None, model_order], name="X") outputs = tf.placeholder(tf.float32, [None, 1], name="Yhat")
				
			

در ادامه مدل رگریسیون خطی را تعریف می کنیم:

				
					with tf.name_scope("LR"): W = tf.Variable(tf.zeros([model_order, 1], dtype=tf.float32), name="W") y = tf.matmul(inputs, W)
				
			

و در نهایت تابع هزینه و بهینه ساز خود را تعریف می نماییم :

				
					with tf.name_scope("train"):
    learning_rate = tf.Variable(0.5, trainable=False)
    cost_op = tf.reduce_mean(tf.pow(y-outputs, 2))
    train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost_op)

				
			

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

				
					tolerance = 1e-3
# Perform Stochastic Gradient Descent
epochs = 1
last_cost = 0
alpha = 0.4
max_epochs = 50000
sess = tf.Session() # Create TensorFlow session
print "Beginning Training"
with sess.as_default():
    init = tf.initialize_all_variables()
    sess.run(init)
    sess.run(tf.assign(learning_rate, alpha))
    while True:
        # Execute Gradient Descent
        sess.run(train_op, feed_dict={inputs: train_x, outputs: train_y})
        # Keep track of our performance
        if epochs%100==0:
            cost = sess.run(cost_op, feed_dict={inputs: train_x, outputs: train_y})
            print "Epoch: %d - Error: %.4f" %(epochs, cost)
            # Stopping Condition
            if abs(last_cost - cost) < tolerance or epochs > max_epochs:
                print "Converged."
                break
            last_cost = cost
        epochs += 1
    w = W.eval()
    print "w =", w
    print "Test Cost =", sess.run(cost_op, feed_dict={inputs: test_x, outputs: test_y})

				
			

نتیجه ی اعمال داده های آموزش به شبکه به صورت زیر است :

آموزش شبکه در تنسورفلو

با استفاده از TensorBoard مدل ما به صورت زیر است :

تنسورفلو

6 در مورد “آشنایی با کتابخانه ی تنسورفلو”

  1. سلام
    از توضیحات خوبتون بسیار ممنونم. من کامپیوترم ویندوز هست و برای کدنویسی در پایتون تا امروز از مفسر spyder در Anaconda استفاده می‌کردم. الان می‌خوام برای کد نویسی در حوزه یادگیری عمیق از تنسورفلو استفاده کنم، اما گویا این کتابخانه در Anaconda قابل اجرا نیست. به نظر شما از چه مفسری استفاده کنم؟ و اینکه TensorBoard رو از کجا می‌تونم دانلود کنم؟

    1. تنسورفلو یک کتابخانه پایتون است و تفاوتی نمی کند از چه مفسری استفاده کنید، قاعدتا باید بتوانید در هر مفسری از آن استفاده کنید. بنده هم روی آناکوندا و هم روی ویژوال استودیو (با pip) تنسورفلو را نصب کرده ام، مشکلی ندارد:
      pip install tensorflow
      ضمنا Tensorboard هم جزء وابستگیهای تنسورفلو بوده و با دستور فوق نصب خواهد شد

  2. سلام خسته نباشید مدل سیستم من asus pro p2540 uv است آیا می توانم برای یادگیری عمیق از آن استفاده کنم؟

    1. سلام
      بله می توانید استفاده کنید. در حالت کلی با هر کامپیوتری می توانید کار کنید، لیکن هر چقدر گرافیک شما بهتر باشد و پردازنده قوی تری داشته باشید، سرعت اجرا بهتر خواهد بود. البته بسیاری از الگوریتمهای فعلی به منظور استفاده از GPU نیازمند گرافیک NVIDIA هستند و با AMD درست کار نمی کنند.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اسکرول به بالا