ذخیره و بارگذاری مدل در پایتون
ذخیره و بارگذاری مدلها در یادگیری عمیق یک اصل مهم است با توجه به این که فرآیند آموزش مدل یک پروسه زمانبر میباشد.ذخیره و بارگذاری مدل در پایتون را در ادامه شرح و آموزش میدهیم.
در این مطلب به دنبال روشی برای ذخیره و بارگذاری مدل هستیم.این آموزش را با کمک کتابخانه کراس ادامه میدهیم.این کتابخانه امکان ذخیره نمودن وزنهای مدل را نیز دارا میباشد.
وزن مدل در فرمت HDF5 ذخیره می شود. HDF5 یک قالب شبکه ای است که برای ذخیره آرایه های چند بعدی اعداد ایده آل است.
ساختار مدل را می توان با استفاده از دو فرمت مختلف JSON و YAML توصیف و ذخیره کرد.
در این مطلب دو نمونه از ذخیره و بارگذاری مدل در فایل را بررسی می کنیم:
- ذخیره مدل در JSON.
- ذخیره مدل در YAML.
هر دو روش ذخیره و بارگذاری وزن مدل را در فایل های فرمت HDF5 نشان می دهند.
در ادامه از این دیتاست استفاده میکنیم.
توجه: برای ذخیره مدل ها باید کتابخانه h5py را نصب کرده باشید. به صورت زیر می توانید آن را به راحتی نصب کنید:
sudo pip install h5py
ذخیره مدل شبکه عصبی با JSON :
کراس توانایی توصیف هر مدلی را با استفاده از فرمت 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, 8 ], "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:
حال مثال قبل را با استفاده از روش دوم انجام میدهیم.مانند قبل ایتدا به نصب کتابخانه از طریق ذستور زیر داریم:
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 - 8 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 روی مدل و تعیین نام فایل ذخیره کنید.
مثال زیر این حالت را با نصب یک مدل، ارزیابی آن و ذخیره آن در فایل 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))
مدل به همان مقدار دقت می رسد که در این مورد 77٪ است.
_________________________________________________________________ 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%
دیدگاهتان را بنویسید