У меня есть простая последовательная модель использования API-интерфейса tenorflow 2.x. Я также использую случайно сгенерированные данные с разделением поезда / проверки и ранней остановкой с терпением = 10 эпох.
Моими гиперпараметрами являются l2 параметры регуляризации и размер скрытых слоев.
Я настраиваю тюнер, запускаю его и получаю список моделей, отсортированных по их лучшей производительности.
Я хочу получить таблицу с гиперпараметрами обученной лучшей модели и другие вещи, такие как количество эпох (т. е. была ли ранняя остановка запущена или нет).
модель, l2coef, hidden_size, эпохи, early_stop, train_loss, train_mae, valid_loss, valid_mae
Причина в том, что я хочу Сузить поиск по верхним параметрам модели при более позднем запуске.
Я могу напечатать model.get_config () для l2 коэффициентов и единиц и вернуть model.evaluate () для потерь, но я не вижу количество эпох где угодно. И поскольку эти количества вычисляются в любом случае, сохраняются ли они где-нибудь для быстрого доступа, или мне нужно повторно выполнить?
импорт:
import tensorflow as tf
from kerastuner import HyperModel
import kerastuner
import numpy as np
import pandas as pd
симулированные данные
def symulated_data(N=1200):
data = pd.DataFrame(np.random.normal(size=(N, 3)), columns=['X1', 'X2', 'X3'])
data['y'] = data.apply(lambda x: x[0] - x[1] if x[2]<0.5 else x[0] + x[1], axis=1)
data['y'] += (np.random.normal(0.0, 0.05, N))
train_data = data[:int(N * 10 / 12)].copy()
valid_data = data[int(N * 10 / 12) : int(N * 11 / 12)].copy()
test_data = data[int(11 / 12 * N):].copy()
return train_data, valid_data, test_data
гипермодель (не обращайте внимания на тот факт, что пользовательские потери могут быть больше, я планирую изменить позже):
class HyperModelETF(HyperModel):
def __init__(self, size_x, size_y):
self.size_x = size_x
self.size_y = size_y
def build(self, hp):
l2coef = hp.Float('l2coeff', min_value=1e-12, max_value=1e-2, sampling='LOG', default=1e-5)
hidden_size = hp.Choice('hidden_size', values=[32, 64, 128])
def custom_loss(y_actual, y_predicted):
return tf.keras.backend.mean(tf.keras.backend.abs(y_actual - y_predicted))
model = tf.keras.Sequential([
# input is the equivalent of placeholders
tf.keras.layers.Input(shape=(self.size_x, )),
tf.keras.layers.Dense(units=hidden_size, activation='tanh', name='input_layer'),
tf.keras.layers.Dense(units=hidden_size, activation='tanh', name='hidden_1',
kernel_regularizer=tf.keras.regularizers.l2(l2coef)),
tf.keras.layers.Dense(units=self.size_y, activation='tanh', name='hidden_2',
kernel_regularizer=tf.keras.regularizers.l2(l2coef))
])
model.compile(optimizer='adam', loss=custom_loss, metrics=['mae'])
return model
функция настройки:
def tune_nn_with_random_data():
train, valid, test = symulated_data()
hypermodel = HyperModelETF(3, 1)
early_stop = tf.keras.callbacks.EarlyStopping(verbose=True, patience=10, monitor='val_mae')
X_train_np = train[['X1', 'X2', 'X3']].values
y_train_np = train[['y']].values
X_valid_np = valid[['X1', 'X2', 'X3']].values
y_valid_np = valid[['y']].values
tuner = kerastuner.Hyperband(hypermodel, objective='val_mae',
executions_per_trial=3, max_epochs=200,
directory='/Users/florin/Google Drive/work/coursera/tensorflow_in_practice/tuner/',
project_name='test_tuner2')
something = tuner.search(X_train_np, y_train_np, validation_data=(X_valid_np, y_valid_np),
shuffle=True, batch_size=32, callbacks=[early_stop])
tuner.results_summary()
best_models = tuner.get_best_models(num_models=10)