از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
TensorFlow: ذخیره و بازیابی مدل ها
سرفصلهای مطلب
بسته به اینکه آموزش یک مدل شبکه عصبی عمیق ممکن است کمی طول بکشد روی پیچیدگی مدل شما، مقدار داده ای که دارید، سخت افزاری که مدل های خود را اجرا می کنید 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