Keras: Save and Load Your Keras Deep Learning Model
Sumber: https://machinelearningmastery.com/save-load-keras-deep-learning-models/
Keras adalah library Python yang sederhana tapi powerful untuk deep learning.
Mengingat bahwa model deep learning dapat memakan waktu berjam-jam, berhari-hari, dan bahkan berminggu-minggu untuk di training, penting untuk mengetahui bagaimana cara menyimpan dan memuatnya dari disk.
Dalam tulisan ini, kita akan menemukan bagaimana kita dapat menyimpan model Keras ke file dan memuatnya lagi untuk membuat prediksi.
Setelah membaca tutorial ini, kita akan tahu:
- Bagaimana cara menyimpan weight model dan arsitektur model dalam file terpisah.
- Bagaimana cara menyimpan model architecture dalam format YAML dan JSON.
- Bagaimana cara menyimpan model weight dan architecture dalam sebuah file untuk penggunaan kemudian.
Tutorial Overview
Keras memisahkan masalah save arsitektur model dan save weight bobot model.
Weight model disimpan ke format HDF5. Ini adalah format grid yang ideal untuk menyimpan array angka multi-dimensi.
Struktur model dapat dijelaskan dan disimpan menggunakan dua format yang berbeda: JSON dan YAML.
Dalam tulisan ini kita akan melihat dua contoh untuk save dan load model ke file:
- Save Model ke JSON.
- Save Model ke YAML.
Setiap contoh juga akan menunjukkan teknik save dan load weight model ke file format HDF5.
Contoh-contoh akan menggunakan network sederhana yang di train menggunakan dilatih pada Pima Indians onset of diabetes binary classification dataset. Ini adalah dataset kecil yang berisi semua data numerik dan mudah digunakan. Kita dapat mengunduh dataset ini dan meletakkannya di direktori kerja kita dengan nama file "pima-indians-diabetes.csv" (download dari: https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv ).
Pastikan anda mempunyai versi Keras terakhir, dan library h5py. Library h5py bisa di instalasi melalui:
sudo pip install h5py
Save Model ke JSON
JSON adalah format file sederhana untuk menggambarkan data secara hierarkis.
Keras memberikan kemampuan untuk menggambarkan model apa pun menggunakan format JSON dengan fungsi to_json(). Ini dapat disimpan ke file dan kemudian dimuat melalui fungsi model_from_json () yang akan membuat model baru dari spesifikasi JSON.
Weight dapat di save langsung dari model menggunakan fungsi save_weights() dan kemudian di load menggunakan fungsi load_weights() .
Contoh di bawah ini melatih dan mengevaluasi model sederhana pada dataset Pima Indian. Model ini kemudian dikonversi ke format JSON dan ditulis ke model.json di direktori lokal. Weight network ditulis ke model.h5 di direktori lokal.
Model dan weight data diambil dari file yang disimpan dan model baru dibuat. Penting untuk mengkompilasi model yang dimuat sebelum digunakan. Ini agar prediksi yang dibuat dengan menggunakan model dapat menggunakan perhitungan efisien yang tepat dari backend Keras.
Model dievaluasi dengan cara yang sama akan mencetak skor evaluasi yang sama.
# 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, kernel_initializer='uniform', activation='relu')) model.add(Dense(8, kernel_initializer='uniform', activation='relu')) model.add(Dense(1, kernel_initializer='uniform', 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)) # serialize model to JSON model_json = model.to_json() with open("model.json", "w") as json_file: json_file.write(model_json) # serialize weights to HDF5 model.save_weights("model.h5") print("Saved model to disk") # later... # load json and create model json_file = open('model.json', 'r') loaded_model_json = json_file.read() json_file.close() loaded_model = model_from_json(loaded_model_json) # load weights into new model loaded_model.load_weights("model.h5") print("Loaded model from disk") # evaluate loaded model on test data 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))
Jalankan contoh akan memberikan output seperti,
acc: 78.78% Saved model to disk Loaded model from disk acc: 78.78%
JSON format dari model akan tampak sebagai berikut,
{ "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":"RandomUniform", "config":{ "minval":-0.05, "maxval":0.05, "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, "units":8, "activation":"relu", "use_bias":true, "kernel_initializer":{ "class_name":"RandomUniform", "config":{ "minval":-0.05, "maxval":0.05, "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, "units":1, "activation":"sigmoid", "use_bias":true, "kernel_initializer":{ "class_name":"RandomUniform", "config":{ "minval":-0.05, "maxval":0.05, "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.4", "backend":"tensorflow" }
Save Model ke YAML
Contoh ini hampir sama dengan contoh JSON di atas, kecuali format YAML digunakan untuk spesifikasi model.
Model ini dijelaskan menggunakan YAML, disimpan ke file model.yaml dan kemudian di load ke model baru melalui fungsi model_from_yaml(). Weight ditangani dengan cara yang sama seperti di atas dalam format HDF5 seperti model.h5.
# MLP for Pima Indians Dataset serialize to YAML and HDF5 from keras.models import Sequential from keras.layers import Dense from keras.models import model_from_yaml import numpy import os # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) # 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, kernel_initializer='uniform', activation='relu')) model.add(Dense(8, kernel_initializer='uniform', activation='relu')) model.add(Dense(1, kernel_initializer='uniform', 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)) # serialize model to YAML model_yaml = model.to_yaml() with open("model.yaml", "w") as yaml_file: yaml_file.write(model_yaml) # serialize weights to HDF5 model.save_weights("model.h5") print("Saved model to disk") # later... # load YAML and create model yaml_file = open('model.yaml', 'r') loaded_model_yaml = yaml_file.read() yaml_file.close() loaded_model = model_from_yaml(loaded_model_yaml) # load weights into new model loaded_model.load_weights("model.h5") print("Loaded model from disk") # evaluate loaded model on test data 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))
Jalankan contoh akan memberikan output seperti,
acc: 78.78% Saved model to disk Loaded model from disk acc: 78.78%
YAML format dari model akan tampak sebagai berikut,
backend: tensorflow class_name: Sequential config: layers: - class_name: Dense config: activation: relu activity_regularizer: null batch_input_shape: !!python/tuple [null, 8] bias_constraint: null bias_initializer: class_name: Zeros config: {} bias_regularizer: null dtype: float32 kernel_constraint: null kernel_initializer: class_name: RandomUniform config: {maxval: 0.05, minval: -0.05, seed: null} kernel_regularizer: null name: dense_1 trainable: true units: 12 use_bias: true - class_name: Dense config: activation: relu activity_regularizer: null bias_constraint: null bias_initializer: class_name: Zeros config: {} bias_regularizer: null kernel_constraint: null kernel_initializer: class_name: RandomUniform config: {maxval: 0.05, minval: -0.05, seed: null} kernel_regularizer: null name: dense_2 trainable: true units: 8 use_bias: true - class_name: Dense config: activation: sigmoid activity_regularizer: null bias_constraint: null bias_initializer: class_name: Zeros config: {} bias_regularizer: null kernel_constraint: null kernel_initializer: class_name: RandomUniform config: {maxval: 0.05, minval: -0.05, seed: null} kernel_regularizer: null name: dense_3 trainable: true units: 1 use_bias: true name: sequential_1 keras_version: 2.2.4
Save Model Weights dan Architecture Bersamaan
Keras juga mendukung interface yang lebih sederhana untuk menyimpan weight model dan arsitektur model bersamaan menjadi satu file H5.
Saving model dengan cara ini akan mencakup semua yang perlu kita ketahui tentang model, termasuk:
- Model weight.
- Model architecture.
- Model compilation details (loss & metrics).
- Model optimizer state.
Ini berarti bahwa kita dapat memuat dan menggunakan model secara langsung, tanpa harus melakukan kompilasi ulang seperti yang kita lakukan pada contoh di atas.
Catatan: ini adalah cara yang disukai untuk men-save dan me-load model Keras.
Cara Save Model Keras
Kita dapat menyimpan model kita dengan memanggil fungsi save() pada model dan menentukan nama file.
Contoh di bawah ini menunjukkan ini dengan terlebih dahulu fit model, mengevaluasi dan menyimpannya ke file model.h5.
# MLP for Pima Indians Dataset saved to single file from numpy import loadtxt from keras.models import Sequential from keras.layers import Dense # load pima indians dataset dataset = loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # define 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)) # save model and architecture to single file model.save("model.h5") print("Saved model to disk")
Jalankan contoh untuk fit model, merangkum kinerja model pada set data train dan men-save model ke file.
acc: 77.73% Saved model to disk
Kita nanti dapat memuat model ini dari file dan menggunakan pada kesempatan lain.
Cara Load Model Keras
Model anda yang di save dapat di load kembali dengan memanggil fungsi load_model() dan passing nama file. Fungsi akan mengembalikan model dengan arsitektur dan weight yang sama.
Dalam hal ini, kita me-load model, meringkas arsitektur dan mengevaluasinya pada dataset yang sama untuk mengkonfirmasi weight dan arsitektur yang sama.
# load and evaluate a saved model from numpy import loadtxt from keras.models import load_model # load model model = load_model('model.h5') # summarize model. model.summary() # load dataset dataset = loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # evaluate the model score = model.evaluate(X, Y, verbose=0) print("%s: %.2f%%" % (model.metrics_names[1], score[1]*100))
Menjalankan contoh pertama me-load model, mem-print ringkasan arsitektur model kemudian mengevaluasi model yang dimuat pada dataset yang sama.
Model mencapai skor akurasi yang sama yang dalam hal ini adalah 77%.
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 12) 108 _________________________________________________________________ dense_2 (Dense) (None, 8) 104 _________________________________________________________________ dense_3 (Dense) (None, 1) 9 ================================================================= Total params: 221 Trainable params: 221 Non-trainable params: 0 _________________________________________________________________ acc: 77.73%
Summary
In this post, you discovered how to serialize your Keras deep learning models.
You learned how you can save your trained models to files and later load them up and use them to make predictions.
You also learned that model weights are easily stored using HDF5 format and that the network structure can be saved in either JSON or YAML format.