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

السؤال

نشر

كيف نقوم بحفظ معلومات التدريب training history في كيراس Keras؟ فقد قمت بتدريب النموذج وقمت بتخزين النتائج، لكن كيف يمكننا حفظها لاستخدامها لاحقاً؟

history = Model.fit(X_train, y_train, batch_size=32, 
                    nb_epoch=41)

 

Recommended Posts

  • 2
نشر

بفرض لدينا النموذج التالي، الذي قمنا بتدريبه:

# تحميل الداتا
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()
# قمنا بتدريب النموذج
hisyory=model.fit(train_data, train_targets,epochs=2, batch_size=64)
---------------------------------------------------------------------------------------------
"""
Epoch 1/2
7/7 [==============================] - 1s 2ms/step - loss: 21.4842 - mae: 21.4842
Epoch 2/2
7/7 [==============================] - 0s 3ms/step - loss: 20.2813 - mae: 20.2813
"""

يمكنك حفظ النتائج في ملفات pickle بالشكل التالي:

hisyory.history
"""
{'loss': [21.15315055847168, 19.5343074798584],
 'mae': [21.15315055847168, 19.5343074798584]}
"""
import pickle
with open('/HistoryDict', 'wb') as f:
     pickle.dump(hisyory.history, f)
history = pickle.load(open('/HistoryDict', "rb"))
history
"""
{'loss': [21.15315055847168, 19.5343074798584],
 'mae': [21.15315055847168, 19.5343074798584]}
"""

أو كملفات json:

import json
with open('file.json', 'w') as f:
    json.dump(hisyory.history, f)
history1 = json.load(open('file.json'))
history1
"""
{'loss': [21.15315055847168, 19.5343074798584],
 'mae': [21.15315055847168, 19.5343074798584]}
"""

أو بالشكل التالي:

# حفظها
np.save('my_history.npy',hisyory.history)
load=np.load('my_history.npy',allow_pickle='TRUE').item()
load
"""
{'loss': [21.15315055847168, 19.5343074798584],
 'mae': [21.15315055847168, 19.5343074798584]}
"""

أو يمكنك تحويلها لداتافريم Dataframe ثم يمكنك حفظها كملفات CSV:

import pandas as pd
df = pd.DataFrame(hisyory.history) 
print(df.head(n=1))
"""
        loss        mae
0  21.153151  21.153151
"""
with open('history.csv', mode='w') as f:
    df.to_csv(f)
# إعادة تحميله
data = pd.read_csv("history.csv") 
data.head()
"""
Unnamed: 0 	loss 	mae
0 	0 	21.153151 	21.153151
1 	1 	19.534307 	19.534307
"""

 

  • 1
نشر

هناك  اكثر من طريقة لحفظها لكن اشهرها واكثرها استخداما هي باستخدام json لحفظ هيكل النموذج و h5 لحفظ الاوزان، انظر الكود التالي:

# MLP for Pima Indians Dataset Serialize to JSON and HDF5
from keras.models import Sequential
from keras.layers import Dense
from keras.models import model_from_json
import numpy
import os
# هنا نقوم ببناء النموذج الخاص بنا
# fix random seed for reproducibility
numpy.random.seed(7)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, epochs=150, batch_size=10, verbose=0)
# evaluate the model
scores = model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
 
# نقوم بتحويل النموذج الي json وحفظه
model_json = model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)
# نقوم بتحويل الاوزان الي h5 وحفظها
model.save_weights("model.h5")
print("Saved model to disk")

 
# نقوم بتحميل ملف ال json عندما نحتاجه
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
# نقوم بتحميل الاوزان من ملف h5 عندما نحتاجها
loaded_model.load_weights("model.h5")
print("Loaded model from disk")
 
# نقوم بتجريب النموذج الذي قمنا بتحميله
loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
score = loaded_model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))

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

{  
   "class_name":"Sequential",
   "config":{  
      "name":"sequential_1",
      "layers":[  
         {  
            "class_name":"Dense",
            "config":{  
               "name":"dense_1",
               "trainable":true,
               "batch_input_shape":[  
                  null,
                  8
               ],
               "dtype":"float32",
               "units":12,
               "activation":"relu",
               "use_bias":true,
               "kernel_initializer":{  
                  "class_name":"VarianceScaling",
                  "config":{  
                     "scale":1.0,
                     "mode":"fan_avg",
                     "distribution":"uniform",
                     "seed":null
                  }
               },
               "bias_initializer":{  
                  "class_name":"Zeros",
                  "config":{  

                  }
               },
               "kernel_regularizer":null,
               "bias_regularizer":null,
               "activity_regularizer":null,
               "kernel_constraint":null,
               "bias_constraint":null
            }
         },
         {  
            "class_name":"Dense",
            "config":{  
               "name":"dense_2",
               "trainable":true,
               "dtype":"float32",
               "units":8,
               "activation":"relu",
               "use_bias":true,
               "kernel_initializer":{  
                  "class_name":"VarianceScaling",
                  "config":{  
                     "scale":1.0,
                     "mode":"fan_avg",
                     "distribution":"uniform",
                     "seed":null
                  }
               },
               "bias_initializer":{  
                  "class_name":"Zeros",
                  "config":{  

                  }
               },
               "kernel_regularizer":null,
               "bias_regularizer":null,
               "activity_regularizer":null,
               "kernel_constraint":null,
               "bias_constraint":null
            }
         },
         {  
            "class_name":"Dense",
            "config":{  
               "name":"dense_3",
               "trainable":true,
               "dtype":"float32",
               "units":1,
               "activation":"sigmoid",
               "use_bias":true,
               "kernel_initializer":{  
                  "class_name":"VarianceScaling",
                  "config":{  
                     "scale":1.0,
                     "mode":"fan_avg",
                     "distribution":"uniform",
                     "seed":null
                  }
               },
               "bias_initializer":{  
                  "class_name":"Zeros",
                  "config":{  

                  }
               },
               "kernel_regularizer":null,
               "bias_regularizer":null,
               "activity_regularizer":null,
               "kernel_constraint":null,
               "bias_constraint":null
            }
         }
      ]
   },
   "keras_version":"2.2.5",
   "backend":"tensorflow"
}

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...