اذهب إلى المحتوى

السؤال

نشر

قمت ببناء نموذج في تنسرفلو وأريد طريقة يتم فيها حفظ الأوزان المقابلة لأفضل نتيجة حصلت عليها خلال التدريب، كيف يمكننا القيام بذلك في تنسرفلو؟ على سبيل المثال هنا حصلت على أفضل دقة للنموذج في ال epoch رقم 84. وأنا أريد أن يتم حفظ النموذج عند تلك النقطة.

from sklearn.datasets import make_moons
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.callbacks import ModelCheckpoint
from matplotlib import pyplot
from tensorflow.keras.models import load_model
# generate 2d classification dataset
X, y = make_moons(n_samples=100, noise=0.2, random_state=1)
# split into train and test
n_train = 30
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
# define model
model = Sequential()
model.add(Dense(500, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=100)
# load the saved model
saved_model = load_model('best_model.h5')
# evaluate the model
_, train_acc = saved_model.evaluate(trainX, trainy, verbose=0)
_, test_acc = saved_model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
"""
Epoch 1/100
1/1 [==============================] - 1s 849ms/step - loss: 0.7086 - accuracy: 0.1667 - val_loss: 0.6950 - val_accuracy: 0.4571
Epoch 2/100
1/1 [==============================] - 0s 51ms/step - loss: 0.6922 - accuracy: 0.6333 - val_loss: 0.6842 - val_accuracy: 0.6857
Epoch 3/100
1/1 [==============================] - 0s 56ms/step - loss: 0.6763 - accuracy: 0.8333 - val_loss: 0.6738 - val_accuracy: 0.7143
...
.
.
Epoch 84/100
1/1 [==============================] - 0s 28ms/step - loss: 0.2014 - accuracy: 0.9000 - val_loss: 0.4368 - val_accuracy: 0.7829
"""


 

Recommended Posts

  • 1
نشر

يمكنك القيام بذلك من خلال ModelCheckpoint وهو عبارة عن callback. حيث يقوم بحفظ النموذج الأفضل ضمن ملف h5 ونقوم بتعريفه بالشكل التالي:

mc = ModelCheckpoint('best_model.h5')

لكن هذا لايكفي حيث يجب علينا أن نقوم بتحديد المقياس الذي ستتم مراقبته لكي يتم حفظ أفضل نموذج على أساسه (غالباً validation accuracy) ويتم ذلك من خلال الوسيط monitor:

mc = ModelCheckpoint('best_model.h5', monitor='val_loss') # أو val_acc

أي أنه سيتم اعتماد المقياس val_loss لحفظ أفضل نموذج تمت ملاحظته خلال عملية التدريب.
أيضاً يجب أن نحدد له ال mode أي الهدف الذي نسعى له وهو إما أقل قيمة للمقياس أو أعلى قيمة له (طبعاً في حالة ال loss سيكون الهدف minimaiz وفي حالة ال accuracy ستكون maximaiz):

mc = ModelCheckpoint('best_model.h5', monitor='val_loss', mode='min')

أي سيتم حفظ النموذج عند ال epoch الذي يملك أقل قيمة لل validation loss، وفي حالة لم نحدد له ال mod سيأخذ قيمة auto وسيعتبر دوماً min في حالة كانت ال monitor هي loss و max في حالة Accuracy. وأخيراً نحن نريد فقط أفضل نموذج لذا سنستخدم الوسيط save_best_only ونضبطه على True:

mc = ModelCheckpoint('best_model.h5', monitor='val_loss', mode='min', save_best_only=True)

في حالة عدم ضبطه على true سيتم حفظ النموذج الأفضل مقارنة بال Epoch السابق. والذي قد لايكون الأفضل خلال كامل عملية التدريب. وأخيراً لتطبيقه خلال عملية التدريب يجب أن نقوم بتمريره إلى الدالة fit كالتالي:

model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4, verbose=0, callbacks=[mc])

وإذا أردنا معرفة ال Epoch الذي تم حفظ النموذج عنده نضيف الوسيط verbose ونضبطه على 1، وبالتالي يصبح نموذجك كالتالي:

from sklearn.datasets import make_moons
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.callbacks import ModelCheckpoint
from matplotlib import pyplot
from keras.models import load_model
X, y = make_moons(n_samples=100, noise=0.2, random_state=1)
n_train = 30
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
# define model
model = Sequential()
model.add(Dense(500, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
#callback إضافة ال 
mc = ModelCheckpoint('best_model.h5', monitor='val_accuracy', mode='max', verbose=1, save_best_only=True)
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4, verbose=0, callbacks=[mc])

ويمكنك استخدامه جنباً إلى جمب مع ال Earlystoping كالتالي:

from sklearn.datasets import make_moons
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.callbacks import ModelCheckpoint
from matplotlib import pyplot
from keras.models import load_model
# generate 2d classification dataset
X, y = make_moons(n_samples=100, noise=0.2, random_state=1)
# split into train and test
n_train = 30
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
# define model
model = Sequential()
model.add(Dense(500, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1)
mc = ModelCheckpoint('best_model.h5', monitor='val_accuracy', mode='max', verbose=1, save_best_only=True)
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4, verbose=0, callbacks=[mc,es])

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...