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

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

Meezo ML

السؤال

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

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

ما المشكلة؟

تم التعديل في بواسطة Meezo ML
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 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

ظهر هذا الخطأ لانه 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)

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

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...