ذخیره سازی مدل یادگیری عمیق کرس — راهنمای کاربردی

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%

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

منبع [+]

پاسخی بگذارید

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