• 0

ظهور الخطأ TypeError: can't pickle weakref objects  أثناء محاولة حفظ النموذج في كيراس Keras

أحاول حفظ معلومات التدريب training history (نتائج ال loss وال accuracy خلال عملية التدريب بعد كل epoch) لكن يظهر لي الخطأ التالي:

# تحميل الداتا
from keras.datasets import boston_housing
import keras
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
# توحيد البيانات
mean = train_data.mean(axis=0)
train_data -= mean
std = train_data.std(axis=0)
train_data /= std
test_data -= mean
test_data /= std
from keras import models
from keras import layers
# بناء النموذج
def build_model():
    model = models.Sequential()
    model.add(layers.Dense(64, activation='relu',
    input_shape=(train_data.shape[1],)))
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(1))
    model.compile(optimizer='rmsprop', loss="mae", metrics=['mae'])
    return model
# تدريب النموذج
model = build_model()
# قمنا بتدريب النموذج
history=model.fit(train_data, train_targets,epochs=2, batch_size=64)
import pickle
with open('/f', 'wb') as f:
     pickle.dump(history, f)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-25-87b712a3ea34> in <module>()
      1 import pickle
      2 with open('/HistoryDict', 'wb') as f:
----> 3      pickle.dump(history, f)
TypeError: can't pickle weakref objects   

 

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


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

لو قمت بعرض نوع البيانات لل history فستجد:

type(history)
# keras.callbacks.History

وهو يعتبر مرجع ضعيف weakref أو weak rederence (المرجع الضعيف لكائن ما هو المرجع الذي لا يمنع الكائن من أن يتم استعادته بواسطة أداة تجميع البيانات المهملة garbage collector) وفي هذه الحالة لن تتمكن من حفظه بهذه الطريقة. لذا يظهر الخطأ والحل هو بتخزين القاموس الذي يحتويه هذا المرجع من خلال الواصفة history وهي كل مايهمنا حيث تحتوي على المعلومات المطلوبة. أي يصبح الحل:

#history انظر كيف سنحصل على المعلومات المطلوبة من خلال الواصفة 
history.history
"""
{'loss': [21.15315055847168, 19.5343074798584],
 'mae': [21.15315055847168, 19.5343074798584]}
"""
import pickle
with open('/HistoryDict', 'wb') as f:
     pickle.dump(history.history, f)
history = pickle.load(open('/HistoryDict', "rb"))
history
"""
{'loss': [21.15315055847168, 19.5343074798584],
 'mae': [21.15315055847168, 19.5343074798584]}
"""

كما يمكنك حفظ النتائج بعدة طرق أخرى تجدها في الرابط التالي:

 

تمّ تعديل بواسطة Ali Haidar Ahmad

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


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

فقط طريقة استخدامها غير صحيح ، أنت هنا تحاول أن تستخدمها في حفظ واسترجاع البيانات (على الرغم انها ليست افضل طريقة لذلك) ، لكن حلها بسيط: انظر الكود المعدل التالي:

# تحميل الداتا
from keras.datasets import boston_housing
import keras
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
# توحيد البيانات
mean = train_data.mean(axis=0)
train_data -= mean
std = train_data.std(axis=0)
train_data /= std
test_data -= mean
test_data /= std
from keras import models
from keras import layers
# بناء النموذج
def build_model():
    model = models.Sequential()
    model.add(layers.Dense(64, activation='relu',
    input_shape=(train_data.shape[1],)))
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(1))
    model.compile(optimizer='rmsprop', loss="mae", metrics=['mae'])
    return model
# تدريب النموذج
model = build_model()
# قمنا بتدريب النموذج
history=model.fit(train_data, train_targets,epochs=2, batch_size=64)
import pickle
with open('/HistoryDict', 'wb') as f:
     pickle.dump(history.history, f)
history = pickle.load(open('/HistoryDict', "rb"))

يجب ان تقوم اولا بتحميل الملف الذي قمت بقرائته عن طريق فتحه بالطريقه ذاتها التي نقوم بها في قراءه اي ملف txt، بعد ذلك تقوم باستدعاء ما قمت بتحميه باستخدام pickle.load.

اما عن طرق حفظ النموذج فهذه ليست افضل طريقة حيث أن الطريقة الرائجة هي باستخدام json  و h5 لحفظ هيكل النموذج والاوزان المدربة.

تمّ تعديل بواسطة Ahmed Sharshar

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


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

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

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

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


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

تسجيل الدخول

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


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