Получить обученные гиперпараметры для настроенной модели керас - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть простая последовательная модель использования 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)
...