获得训练好的keras模型的超参数

时间:2020-04-07 13:37:08

标签: tensorflow keras neural-network tensorflow2.0 hyperparameters

我有一个使用tensorflow 2.x keras API的简单顺序模型。我还使用了随机生成的数据,并进行了训练/验证拆分,并以耐心= 10个纪元的时间提前停止了。

我的超级参数是l2正则化参数以及隐藏层的大小。

我设置了调谐器,然后运行它,并且得到了按其最佳性能排序的模型列表。

我想获得一张表格,其中包含训练有素的最佳模型的超参数,以及其他类似时期数(即是否触发了提前停止)的信息。

模型,l2coef,隐藏大小,历元,提早停止,train_loss,train_mae,valid_loss,valid_mae

原因是我希望在以后的运行中根据顶级模型参数来缩小搜索范围。

我可以为2个系数和单位打印model.get_config(),并为损失返回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)

0 个答案:

没有答案