ذخیره سازی مدل یادگیری عمیق کرس — راهنمای کاربردی
JSON یک فرمت فایل ساده برای توصیف سلسلهمراتب دادهها است. «کرس» (Keras) این قابلیت را فراهم میکند که هر مدلی را با استفاده از قالب JSON با تابع to_json() توصیف کند. این مورد را میتوان روی یک فایل ذخیره کرد و سپس، با تابع model_from_json() که یک مدل جدید از مشخصهسازی JSON میسازد، بارگذاری کرد. وزنها به طور مستقیم و با استفاده از تابع save_weights() ذخیره میشوند و سپس، با استفاده از تابع load_weights() بارگذاری میشوند. در مثال زیر، یک مدل ساده روی مجموعه داده Pima Indians آموزش داده میشود. سپس، مدل به فرمت فایل JSON تبدیل میشود و در model.json در پوشه محلی نوشته میشود. وزنهای شبکه در model.h5 در پوشه محلی نوشته میشوند.
مدل و دادههای وزن از فایلهای ذخیره شده بارگذاری میشوند و یک مدل جدید ساخته میشود. حائز اهمیت است که مدل بارگذاری شده پیش از استفاده از آن، کامپایل شود. بنابراین، پیشبینی با استفاده از مدل انجام میشود و میتواند از محاسبات مناسب موثر از بکاند کرس استفاده کند. مدل به شیوهای مشابه آنچه امتیاز ارزیابی چاپ میشود، ارزیابی میشود.
# MLP for Pima Indians Dataset Serialize to JSON and HDF5 from keras.models import Sequential from keras.layers import Dense from keras.models import model_from_json import numpy import os # fix random seed for reproducibility numpy.random.seed(7) # load pima indians dataset dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # create model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # Compile model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Fit the model model.fit(X, Y, epochs=150, batch_size=10, verbose=0) # evaluate the model scores = model.evaluate(X, Y, verbose=0) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) # serialize model to JSON model_json = model.to_json() with open("model.json", "w") as json_file: json_file.write(model_json) # serialize weights to HDF5 model.save_weights("model.h5") print("Saved model to disk") # later... # load json and create model json_file = open('model.json', 'r') loaded_model_json = json_file.read() json_file.close() loaded_model = model_from_json(loaded_model_json) # load weights into new model loaded_model.load_weights("model.h5") print("Loaded model from disk") # evaluate loaded model on test data loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) score = loaded_model.evaluate(X, Y, verbose=0) print("%s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))
خروجی حاصل از اجرای قطعه کد بالا، به صورت زیر است.
acc: 78.78% Saved model to disk Loaded model from disk acc: 78.78%
فرمت JSON مدل شبیه به زیر است.
{ "class_name":"Sequential", "config":{ "name":"sequential_1", "layers":[ { "class_name":"Dense", "config":{ "name":"dense_1", "trainable":true, "batch_input_shape":[ null, ۸ ], "dtype":"float32", "units":12, "activation":"relu", "use_bias":true, "kernel_initializer":{ "class_name":"VarianceScaling", "config":{ "scale":1.0, "mode":"fan_avg", "distribution":"uniform", "seed":null } }, "bias_initializer":{ "class_name":"Zeros", "config":{ } }, "kernel_regularizer":null, "bias_regularizer":null, "activity_regularizer":null, "kernel_constraint":null, "bias_constraint":null } }, { "class_name":"Dense", "config":{ "name":"dense_2", "trainable":true, "dtype":"float32", "units":8, "activation":"relu", "use_bias":true, "kernel_initializer":{ "class_name":"VarianceScaling", "config":{ "scale":1.0, "mode":"fan_avg", "distribution":"uniform", "seed":null } }, "bias_initializer":{ "class_name":"Zeros", "config":{ } }, "kernel_regularizer":null, "bias_regularizer":null, "activity_regularizer":null, "kernel_constraint":null, "bias_constraint":null } }, { "class_name":"Dense", "config":{ "name":"dense_3", "trainable":true, "dtype":"float32", "units":1, "activation":"sigmoid", "use_bias":true, "kernel_initializer":{ "class_name":"VarianceScaling", "config":{ "scale":1.0, "mode":"fan_avg", "distribution":"uniform", "seed":null } }, "bias_initializer":{ "class_name":"Zeros", "config":{ } }, "kernel_regularizer":null, "bias_regularizer":null, "activity_regularizer":null, "kernel_constraint":null, "bias_constraint":null } } ] }, "keras_version":"2.2.5", "backend":"tensorflow" }
ذخیرهسازی مدل شبکه عصبی در YAML
این مثال مشابه مثال JSON بالا است، با این تفاوت که فرمت YAML برای مشخصهسازی مدل مورد استفاده قرار میگیرد. شایان توجه است که این مثال فرض میکند که PyYAML 5 نصب شده است؛ برای مثال:
sudo pip install PyYAML
در این مثال، مدل با استفاده از YAML توصیف میشود و در فایل model.yaml ذخیره میشود و سپس، در یک مدل جدید با تابع model_from_yaml() ذخیره میشود. وزنها به شیوهای مشابه بالا با فرمت HDF5 و با نام model.h5 مدیریت میشوند.
# MLP for Pima Indians Dataset serialize to YAML and HDF5 from keras.models import Sequential from keras.layers import Dense from keras.models import model_from_yaml import numpy import os # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) # load pima indians dataset dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # create model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # Compile model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Fit the model model.fit(X, Y, epochs=150, batch_size=10, verbose=0) # evaluate the model scores = model.evaluate(X, Y, verbose=0) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) # serialize model to YAML model_yaml = model.to_yaml() with open("model.yaml", "w") as yaml_file: yaml_file.write(model_yaml) # serialize weights to HDF5 model.save_weights("model.h5") print("Saved model to disk") # later... # load YAML and create model yaml_file = open('model.yaml', 'r') loaded_model_yaml = yaml_file.read() yaml_file.close() loaded_model = model_from_yaml(loaded_model_yaml) # load weights into new model loaded_model.load_weights("model.h5") print("Loaded model from disk") # evaluate loaded model on test data loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) score = loaded_model.evaluate(X, Y, verbose=0) print("%s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))
خروجی حاصل از اجرای قطعه کد بالا، به صورت زیر است.
acc: 78.78% Saved model to disk Loaded model from disk acc: 78.78%
مدل توصیف شده در فرمت YAML شبیه به زیر است.
backend: tensorflow class_name: Sequential config: layers: - class_name: Dense config: activation: relu activity_regularizer: null batch_input_shape: !!python/tuple - null - ۸ bias_constraint: null bias_initializer: class_name: Zeros config: {} bias_regularizer: null dtype: float32 kernel_constraint: null kernel_initializer: class_name: VarianceScaling config: distribution: uniform mode: fan_avg scale: 1.0 seed: null kernel_regularizer: null name: dense_1 trainable: true units: 12 use_bias: true - class_name: Dense config: activation: relu activity_regularizer: null bias_constraint: null bias_initializer: class_name: Zeros config: {} bias_regularizer: null dtype: float32 kernel_constraint: null kernel_initializer: class_name: VarianceScaling config: distribution: uniform mode: fan_avg scale: 1.0 seed: null kernel_regularizer: null name: dense_2 trainable: true units: 8 use_bias: true - class_name: Dense config: activation: sigmoid activity_regularizer: null bias_constraint: null bias_initializer: class_name: Zeros config: {} bias_regularizer: null dtype: float32 kernel_constraint: null kernel_initializer: class_name: VarianceScaling config: distribution: uniform mode: fan_avg scale: 1.0 seed: null kernel_regularizer: null name: dense_3 trainable: true units: 1 use_bias: true name: sequential_1 keras_version: 2.2.5
ذخیرهسازی وزنها و معماری مدل با یکدیگر
کرس از رابط سادهتری برای ذخیرهسازی وزنها و معماری مدل با یکدیگر، در یک فایل مجر H5 پشتیبانی میکند. ذخیرهسازی مدل به این شکل، حاوی هر چیزی است که برای دانستن پیرامون مدل لازم است، شامل:
- وزنهای مدل
- معماری مدل
- جزئیات کامپایل مدل (زیان و سنجهها)
- وضعیت بهینهساز مدل
این یعنی میتوان مدل را بارگذاری کرد و از آن به طور مستقیم و بدون نیاز به کامپایل مجدد آن، همانطور که در مثال بالا مشاهده شد، استفاده کرد.
نکته: این راهکار برگزیده برای ذخیرهسازی و بارگذاری مدل کرس است.
روش ذخیرهسازی یک مدل کرس
میتوان مدل را با فراخوانی تابع save() روی مدل و تعیین نام فایل ذخیره کرد. مثال زیر این مورد را با «برازش» (Fitting)، ارزیابی و ذخیرهسازی آن در فایل model.h5 نشان میدهد.
# MLP for Pima Indians Dataset saved to single file from numpy import loadtxt from keras.models import Sequential from keras.layers import Dense # load pima indians dataset dataset = loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # define model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # compile model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Fit the model model.fit(X, Y, epochs=150, batch_size=10, verbose=0) # evaluate the model scores = model.evaluate(X, Y, verbose=0) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) # save model and architecture to single file model.save("model.h5") print("Saved model to disk")
با اجرای قطعه کد بالا، مدل برازش پیدا میکند، کارایی آن روی مجموعه داده آموزش خلاصهسازی میشود و در فایل ذحیره میشود.
acc: 77.73% Saved model to disk
میتوان بعدا این مدل را از فایل بارگذاری و از آن استفاده کرد.
چگونگی بارگذاری یک مدل کرس
مدل ذخیره شده میتواند بعدا با فراخوانی تابع load_model() و پاس دادن نام فایل، بارگذاری شود. تابع، مدل با معماری و وزن مشابه را باز میگرداند. در این شرایط، میتوان مدل را بارگذاری کرد، معماری آن را ذخیره کرد و آن را روی مجموعه داده مشابهی ارزیابی کرد تا تایید شود که وزنها و معماری مشابه هستند.
# load and evaluate a saved model from numpy import loadtxt from keras.models import load_model # load model model = load_model('model.h5') # summarize model. model.summary() # load dataset dataset = loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # evaluate the model score = model.evaluate(X, Y, verbose=0) print("%s: %.2f%%" % (model.metrics_names[1], score[1]*100))
با اجرای قطعه کد بالا، ابتدا مدل بارگذاری میشود، یک خلاصه از معماری آن چاپ میشود، سپس مدل بارگذاری شده روی مجموعه داده مشابهی ارزیابی میشود. مدل دارای امتیاز صحت مشابهی است که برابر با ۷۷% است.
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 12) 108 _________________________________________________________________ dense_2 (Dense) (None, 8) 104 _________________________________________________________________ dense_3 (Dense) (None, 1) 9 ================================================================= Total params: 221 Trainable params: 221 Non-trainable params: 0 _________________________________________________________________ acc: 77.73%
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون
- آموزش تکمیلی برنامهنویسی پایتون
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
- آموزش پایتون (Python) — مجموعه مقالات جامع وبلاگ فرادرس
مجموعه: داده کاوی, هوش مصنوعی برچسب ها: Deep Learning, Machine Learning, پایتون, ذخیره مدل یادگیری عمیق, کتابخانه کرس, کرس, یادگیری عمیق, یادگیری ماشین





