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

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

Chollet ML

السؤال

أحاول حفظ معلومات التدريب 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   

 

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

Recommended Posts

  • 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
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...