وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

TensorFlow: ذخیره و بازیابی مدل ها

0 3
زمان لازم برای مطالعه: 5 دقیقه


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

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

در این پست به ذخیره و بازیابی یک مدل TensorFlow می پردازیم که برخی از مفیدترین گزینه ها را شرح می دهیم. روی راه، و چند مثال ارائه کنید.

معرفی سریع مدل TensorFlow

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

درک آن از طریق مثال‌ها همیشه آسان‌تر است، بنابراین بیایید یک مدل TensorFlow ساده برای رگرسیون خطی داده‌های دو بعدی ایجاد کنیم.

اول، ما import کتابخانه های ما:

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

مرحله بعدی ایجاد مدل است. ما مدلی تولید می کنیم که تغییر افقی و عمودی یک تابع درجه دوم را به شکل زیر برآورد می کند:

y = (x - h) ^ 2 + v

جایی که h و v تغییرات افقی و عمودی هستند.

خطوط زیر مدل را تولید می کنند (برای جزئیات بیشتر به نظرات در کد مراجعه کنید):


tf.reset_default_graph()


X = tf.placeholder("float")
Y = tf.placeholder("float")


h_est = tf.Variable(0.0, name='hor_estimate')
v_est = tf.Variable(0.0, name='ver_estimate')


y_est = tf.square(X - h_est) + v_est


cost = (tf.pow(Y - y_est, 2))



trainop = tf.train.GradientDescentOptimizer(0.001).minimize(cost)

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


h = 1
v = -2


x_train = np.linspace(-2,4,201)
noise = np.random.randn(*x_train.shape) * 0.4
y_train = (x_train - h) ** 2 + v + noise


plt.rcParams('figure.figsize') = (10, 6)
plt.scatter(x_train, y_train)
plt.xlabel('x_train')
plt.ylabel('y_train')

تخمین تابع درجه دوم

کلاس Saver

را Saver کلاس ارائه شده توسط کتابخانه TensorFlow روش توصیه شده برای ذخیره ساختار و متغیرهای گراف است.

ذخیره مدل ها

در چند خط زیر a را تعریف می کنیم Saver شی و در داخل train_graph() روش ما از طریق 100 تکرار برای به حداقل رساندن تابع هزینه. سپس مدل در هر تکرار و همچنین پس از اتمام بهینه سازی در دیسک ذخیره می شود. هر ذخیره فایل های باینری ایجاد می کند روی دیسکی به نام «نقاط بازرسی».


saver = tf.train.Saver()

init = tf.global_variables_initializer()


def train_graph():
    with tf.Session() as sess:
        sess.run(init)
        for i in range(100):
            for (x, y) in zip(x_train, y_train):
                
                
                sess.run(trainop, feed_dict={X: x, Y: y})
            
            
            saver.save(sess, 'model_iter', global_step=i)
        
        
        saver.save(sess, 'model_final')
        h_ = sess.run(h_est)
        v_ = sess.run(v_est)
    return h_, v_

حالا بیایید مدل را با تابع بالا و آموزش دهیم print پارامترهای آموخته شده

result = train_graph()
print("h_est = %.2f, v_est = %.2f" % result)
$ python tf_save.py
h_est = 1.01, v_est = -1.96

بسیار خوب، پارامترها کاملاً دقیق برآورد شدند. اگر سیستم فایل خود را بررسی کنیم، فایل هایی برای 4 تکرار آخر و همچنین مدل نهایی ذخیره شده اند.

هنگام ذخیره مدل، متوجه خواهید شد که برای ذخیره آن به 4 نوع فایل نیاز است:

  • فایل های “.meta”: حاوی ساختار نمودار
  • فایل های “.data”: حاوی مقادیر متغیرها هستند
  • فایل های “.index”: شناسایی ایست بازرسی
  • فایل “نقطه بازرسی”: یک بافر پروتکل با لیستی از نقاط بازرسی اخیر

فایل های مدل ذخیره شده

شکل 1: فایل های ایست بازرسی ذخیره شده در دیسک

تماس گرفتن با tf.train.Saver() روش، همانطور که در بالا نشان داده شده است، تمام متغیرها را در یک فایل ذخیره می کند. ذخیره زیرمجموعه ای از متغیرهای شما با انتقال آنها به عنوان آرگومان از طریق یک لیست یا یک دیکت امکان پذیر است، به عنوان مثال: tf.train.Saver({'hor_estimate': h_est}).

چند استدلال مفید دیگر از Saver سازنده، که کنترل کل را امکان پذیر می کند process، هستند:

  • max_to_keep: حداکثر تعداد ایست های بازرسی برای نگهداری،
  • keep_checkpoint_every_n_hours: فاصله زمانی برای ذخیره پست های بازرسی

برای اطلاعات بیشتر، بررسی کنید اسناد رسمی برای Saver کلاس، که استدلال های مفید دیگری را ارائه می دهد که می توانید کشف کنید.

بازیابی مدل ها

اولین کاری که باید هنگام بازیابی یک مدل TensorFlow انجام دهید، بارگذاری ساختار نمودار از فایل “.meta” در نمودار فعلی است.

tf.reset_default_graph()
imported_meta = tf.train.import_meta_graph("model_final.meta")

نمودار فعلی را می توان با استفاده از دستور زیر کاوش کرد tf.get_default_graph(). اکنون مرحله دوم بارگذاری مقادیر متغیرها است.

یک یادآوری: مقادیر فقط در یک جلسه وجود دارند.

with tf.Session() as sess:
    imported_meta.restore(sess, tf.train.latest_checkpoint('./'))
    h_est2 = sess.run('hor_estimate:0')
    v_est2 = sess.run('ver_estimate:0')
    print("h_est: %.2f, v_est: %.2f" % (h_est2, v_est2))
$ python tf_restore.py
INFO:tensorflow:Restoring parameters from ./model_final
h_est: 1.01, v_est: -1.96

همانطور که قبلاً ذکر شد، این رویکرد فقط ساختار نمودار و متغیرها را ذخیره می‌کند، به این معنی که داده‌های آموزشی که از طریق متغیرهای “X” و “Y” ما وارد می‌شوند ذخیره نمی‌شوند.

به هر حال، برای این مثال، از داده‌های آموزشی تعریف‌شده از خارج استفاده می‌کنیم tf، و تناسب مدل را تجسم کنید.

plt.scatter(x_train, y_train, label='train data')
plt.plot(x_train, (x_train - h_est2) ** 2 + v_est2, color='red', label='model')
plt.xlabel('x_train')
plt.ylabel('y_train')
plt.legend()

مناسب مدل تجسم شده

به عنوان یک خط پایانی برای این بخش، Saver کلاس یک راه آسان برای ذخیره و بازیابی مدل TensorFlow (گراف و متغیرها) در/از یک فایل، و نگه داشتن چندین چک پوینت از کار شما که می تواند برای آزمایش مدل شما مفید باشد، اجازه می دهد. روی داده های جدید، ادامه آموزش آن و تنظیم دقیق بیشتر.

فرمت SavedModel

یک رویکرد جدید برای ذخیره و بازیابی یک مدل در TensorFlow استفاده از آن است SavedModel، سازنده و لودر عملکرد. این در واقع پیچیده است Saver کلاس به منظور ارائه سریال سازی سطح بالاتر که برای اهداف تولید مناسب تر است.

در حالی که SavedModel به نظر می رسد رویکرد هنوز به طور کامل توسط توسعه دهندگان پذیرفته نشده است، سازندگان آن اشاره می کنند که به وضوح آینده است. در مقایسه با Saver کلاس، که عمدتاً تمرکز دارد روی متغیرها، SavedModel سعی می کند بسیاری از ویژگی های مفید را در یک بسته قرار دهد، مانند Signatures، که امکان ذخیره نمودارهایی را که دارای مجموعه ای از ورودی و خروجی هستند و Assets حاوی فایل های خارجی مورد استفاده در مقداردهی اولیه

ذخیره مدل ها با SavedModel Builder

ذخیره یک مدل با استفاده از SavedModelBuilder کلاس در مثال ما از هیچ امضا یا دارایی استفاده نمی کنیم، اما برای نشان دادن آن کافی است process.

tf.reset_default_graph()


h_est = tf.Variable(h_est2, name='hor_estimate2')
v_est = tf.Variable(v_est2, name='ver_estimate2')


builder = tf.saved_model.builder.SavedModelBuilder('./SavedModel/')


with tf.Session() as sess:
    sess.run(h_est.initializer)
    sess.run(v_est.initializer)
    builder.add_meta_graph_and_variables(sess,
                                       (tf.saved_model.tag_constants.TRAINING),
                                       signature_def_map=None,
                                       assets_collection=None)
builder.save()
$ python tf_saved_model_builder.py
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: b'./SavedModel/saved_model.pb'

با اجرای این کد متوجه خواهید شد که مدل ما در فایلی که در “./SavedModel/saved_model.pb” قرار دارد ذخیره می شود.

بازیابی مدل ها با SavedModel Loader

بازیابی مدل با استفاده از tf.saved_model.loader و متغیرها، امضاها و دارایی های ذخیره شده را در محدوده یک جلسه بازیابی می کند.

در مثال زیر مدل و را بارگذاری می کنیم print مقادیر دو ضریب ما را خارج کنید h_est و v_est.

with tf.Session() as sess:
    tf.saved_model.loader.load(sess, (tf.saved_model.tag_constants.TRAINING), './SavedModel/')
    h_est = sess.run('hor_estimate2:0')
    v_est = sess.run('ver_estimate2:0')
    print("h_est: %.2f, v_est: %.2f" % (h_est, v_est))
$ python tf_saved_model_loader.py
INFO:tensorflow:Restoring parameters from b'./SavedModel/variables/variables'
h_est: 1.01, v_est: -1.96

و دوباره، همانطور که انتظار می رفت، مدل ما با موفقیت با پارامترهای آموزش داده شده درست بازیابی شد.

نتیجه

ذخیره و بازیابی یک مدل TensorFlow یک ویژگی بسیار مفید است، زیرا می دانید که آموزش شبکه های عمیق می تواند زمان زیادی را ببرد. موضوع آنقدر گسترده است که نمی‌توان در یک پست وبلاگ به تفصیل آن را پوشش داد، بنابراین ممکن است در پست بعدی دوباره آن را بررسی کنیم.

به هر حال در این پست دو ابزار را معرفی کردیم: پایه Saver کلاسی که مدل را به شکل ایست بازرسی ذخیره می کند و SavedModel builder/loader که می سازد روی بالای Saver و یک ساختار فایل ایجاد می کند که استفاده از آن در تولید آسان است. برای نشان دادن مثال ها از رگرسیون خطی ساده استفاده شد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-29 15:50:06

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید