我有一个使用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)