• 0

ظهور الخطأ التالي You must compile a model before training/testing. Use `model.compile(optimizer, loss) في كيراس Keras

قمت بتحميل نموذج لي قمت بتدريبه مسبقاً  بعد أن كنت قد قمت بحفظ أوزانه، وعندما أحاول استخدمه لتوقع النتائج مع التابع predict فإنه يحسب لي الخرج بدون مشاكل لكن عند استخدام التابع evaluate يظهر لي هذا الخطأ:

Model.evaluate(data,label)
--------------------------------------
You must compile a model before training/testing. Use `model.compile(optimizer, loss)

ما المشكلة؟

تمّ تعديل بواسطة Meezo ML

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

التابع predict  يقوم فقط بتمرير بيانات الدخل إلى النموذج فتحصل على الخرج (القيمة المتوقعة بناءان على أوزان التدريب التي تم حفظها في الملفات).  لذا لايعطيك أي مشكلة. أما عند استخدام  evaluate ، فهذا التابع يقوم بحساب  الخطأ loss و  ال metrics،  ودالة التكلفة التي نحسب من خلالها ال loss لايكون لدينا معلومات عنها حتى تقوم بتجميع النموذج  compile. فهم وسطاء لتابع ال compile:

model.compile(optimizer=.., loss=.., metrics=..) 

إن كل مايهمنا من تدريب النموذج هو استخلاص الأوزان المدربة: إن مخرجات النموذج النهائية هي عبارة عن أوزان هذه الأوزان تكون مدربة لتنفيذ المهمة التي قمنا بتدريبها من أجل حلها، في البداية نقوم بتهيئتها بقيم عشوائية (بين ال 0 و 1).  ثم عن طريق النموذج الذي بنيناه وعن طريق خوارزمية Backbropagation يتم تحديث قيم هذه الأوزان (تدريبها لحل المشكلة)، وبعد انتهاء التدريب نقوم بإدخال العينة التي نريد تجربتها أو اختبار الأداء عليها، فيحسب النموذج الناتج لنا بناءان على قيم هذه الأوزان. وهذا هو كل ما يهمنا (بناء نموذج قادر عتلى تصنيف الصور مثلاً بحيث نعطيه صورة ويعطينا الخرج أما التفاصيل الأخرى لاتهمنا كمستخدمين). حسناً إن التكلفة "loss" هي دالة نقوم باستخدامها خلال عملية التدريب حيث تستلم هذه الدالة القيم المتوقعة من النموذج والقيم الحقيقية ثم تقارنهما وتعطي قيمة تعبر عن مدى اختلاف القيمتين (الفرق بينهما). وطبعاً يكون الهدف هو تصغير قيمة التكلفة (الخطأ)  لأنه كلما قل الاختلاف بين القيم التي يتوقعها النموذج والقيم الحقيقية يصبح نموذجك أفضل. إذاً  ال loss ليست مفيدة للغرض النهائي للنموذج، لكنها ضرورية للتدريب. وهذا هو السبب في أنه يمكنك الحصول على توقعات من النموذج لكن دون ال loss. لكن إذا أردت لسبب ما أن تحسب ال loss أيضاً فيجب عليك تنفيذ ال compile لنموذجك، انظر للمثال التالي الذي سأقوم فيه بحفظ نموذج ثم سأعيد تحميله وأنفذ عليه التابع evaluate:

from keras.models import Sequential
from keras.layers import Dense
from keras.models import model_from_yaml
import numpy
import os
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]
# بناء النموذج
model = Sequential()
model.add(Dense(16, input_dim=8, activation='tanh'))
model.add(Dense(1, activation='sigmoid'))
# تجميع النموذج
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['acc'])
# تدريب النموذج
model.fit(X, Y, epochs=120, batch_size=10, verbose=0)
# تقييم النموذج
scores = model.evaluate(X, Y, verbose=0) 
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) # acc: 78.78%
# حفظه
model_j = model.to_json()
with open("model.json", "w") as f:
    f.write(model_j)
model.save_weights("model.h5")
# الآن إعادة تحميله
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
model = model_from_json(loaded_model_json)
# تحمبل الأوزان
model.load_weights("model.h5")
#نقوم الآن بتجميع النموذج
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['acc']) # قم بتحديد دالة التكلفة والمعيار
# على بيانات الاختبار evaluate
score = model.evaluate(X, Y, verbose=0)
# حساب ال loss
print('Test loss:', score[0]) 
#metrics حساب ال 
print('Test accuracy:', score[1])

 

تمّ تعديل بواسطة Ali Haidar Ahmad
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

ظهر هذا الخطأ لانه evaluate تقوم  بحساب  الخطأ loss و  ال metrics، بينما انت في النموذج الذي قمت بتحميله، لم تقم بتعريف ال loss أو metrics لهذا يحدث هذا الخطأ.

على صعيد أخر فان predict  يقوم بتمريم البيانات التي تريد أن تظهر نواتجها الى داخل النموذج المدرب ومن ثم تخرج على الناتج دون أي عمليات اضافية. لذا لا تظهر فيه أي مشكلة.

وفيه اثناء عملية التدريب ، تحتاج كذلك الى تعريف ال loss ، ولذلك يجب ان تقوم بعمل compile للنموذج، حتى وان كان هذا سيغير قيم الاوزان.

و تعتمد مخرجات النموذج على تعريفه بالأوزان، و هذا يتم بشكل تلقائي ويمكنك التنبؤ به من أي نموذج ،حتى بدون أي تدريب. وذلك لان كل نموذج في Keras لديه بالفعل بأوزان (إما تمت تهيئتها بواسطتك أو تمت تهيئتها عشوائيًا).

عندما تقوم بإدخال بيانات شيء ما ، يقوم النموذج بحساب الناتج. وهذا هو كل ما يهم. النموذج الجيد تكون له أوزان مناسبة ويخرج النواتج بشكل صحيح. ولكن قبل الوصول إلى هذه الغاية ، يجب تدريب نموذجك.

يمكن تدريب النموذج وحفظ الاوزان لاعادة استخدامها كالتالي:

اولا قم بناء النموذج:

def create_model():
  model = tf.keras.Sequential([
      tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu', input_shape=[IMG_SIZE,IMG_SIZE, 3]),
      
      tf.keras.layers.Conv2D(kernel_size=3, filters=64, padding='same', activation='relu'),
      tf.keras.layers.MaxPooling2D(pool_size=2),
    
      tf.keras.layers.Conv2D(kernel_size=3, filters=128, padding='same', activation='relu'),
      tf.keras.layers.Conv2D(kernel_size=1, filters=256, padding='same', activation='relu'),
      tf.keras.layers.GlobalAveragePooling2D(),
    
      tf.keras.layers.Dense(10,'softmax')])

  model.compile(optimizer=tf.keras.optimizers.RMSprop(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
  return model

ثم قم بحفظ الاوزان بعد كل دورة:

model=create_model()

model_checkpoint=tf.keras.callbacks.ModelCheckpoint('CIFAR10{epoch:02d}.h5',period=3,save_weights_only=True)

history = model.fit(x_train[:2000], y_train[:2000],
              batch_size=BATCH_SIZE,
              epochs=6,
              callbacks=[model_checkpoint],
              validation_data=(x_val[:100], y_val[:100]),
              shuffle=True)

قم بتحميل الموديل الذذي قمت بحفظه ثم اختبره مجددا:

new_model=create_model()

new_model.evaluate(x_val,y_val)

new_model.load_weights('CIFAR1006.h5')
new_model.evaluate(x_val,y_val)

هذا سوف يعطيك ناتج التوقع على البيانات المدخلة بشكل صحيح.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن