提问人:Rafał Wyszyński 提问时间:11/9/2023 更新时间:11/9/2023 访问量:14
自定义回调以保存少量模型
Custom Callback to save few models
问:
我正在开发新的深度学习模型,我需要创建自定义回调,该回调将 GridSearch 中每个 hiperparameters 组合的最佳权重保存到单独的文件中。例如,当它在训练结束时用 batch_size=16 和 activation='relu' 检查模型时,它应该将最佳权重保存到文件batch_16_activation_relu_hdf5。然后batch_32_activation_tanh_hdf5等。理想情况下,它还应该在 txt 文件中添加新行,其中包含这些信息以及val_accuracy在训练期间获得的信息。这就是我完成的内容:
import os
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.datasets import mnist
from keras.utils import to_categorical
from scikeras.wrappers import KerasClassifier
from sklearn.model_selection import GridSearchCV
from keras.callbacks import Callback
# Definiuj customowy callback do zapisywania najlepszych wag
class SaveBestModelPerIteration(Callback):
def __init__(self):
super(SaveBestModelPerIteration, self).__init__()
self.best_val_loss = float('inf')
def on_epoch_end(self, logs=None):
current_val_loss = logs.get('val_loss')
if current_val_loss is not None and current_val_loss < self.best_val_loss:
self.best_val_loss = current_val_loss
current_val_accuracy = logs.get('val_accuracy')
optimizer = self.params['optimizer']
activation = self.params['activation']
batch_size = self.params['batch_size']
model_filename = f"optimizer_{optimizer}_activation_{activation}_batch_size_{batch_size}_val_loss_{current_val_loss:.4f}.hdf5"
self.model.save(model_filename)
print(f"Model saved as {model_filename} with validation loss: {current_val_loss:.4f}")
with open('model.txt', 'w') as f:
f.write(f"Optimizer: {optimizer}, Activation: {activation}, Batch Size: {batch_size}, Val Loss: {current_val_loss:.4f}, Val Accuracy: {current_val_accuracy:.4f}\n")
# Załaduj dane do klasyfikacji
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# Definiuj funkcję tworzącą model
def create_model(neurons, activation, optimizer):
model = Sequential()
model.add(Dense(neurons, input_dim=784, activation=activation))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return model
# Utwórz model KerasClassifier
model = KerasClassifier(model=create_model, epochs=10, batch_size=128)
# Definiuj przestrzeń parametrów do przeszukiwań
params={
'model__neurons':[32,64,128,256],
'model__activation':['relu', 'tanh', 'sigmoid', 'linear'],
'model__optimizer':['adam','rmsprop'],
}
save_weights_callback = SaveBestModelPerIteration()
# Utwórz obiekt przeszukiwań siatki
grid = GridSearchCV(estimator=model, param_grid=params, n_jobs=1, cv=3)
# Wykonaj przeszukiwania siatki
grid_result = grid.fit(X_train, y_train, callbacks=[save_weights_callback])
# Wydrukuj najlepsze wyniki przeszukiwań
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
不幸的是,我很难做到这一点,我没有任何其他想法。
答: 暂无答案
评论