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

حفظ معلومات التدريب training history في كيراس Keras

Chollet ML

السؤال

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...