我目前正在研究用于时间序列数据的 LSTM 网络。我想使用 keras-tuner 进行超参数优化。我想使用以下超参数:
# Number of layers:
hp_layers = hp.Int('layers', min_value=1, max_value=4)
# Number of cell in layer 1
hp_units_lay1 = hp.Int('units', min_value=1, max_value=200)
# Number of cell in layer 2
if hp_layers >= 2:
hp_units_lay2 = hp.Int('units', min_value=1, max_value=hp_units_lay1)
# Number of cell in layer 3
if hp_layers >= 3:
hp_units_lay3 = hp.Int('units', min_value=1, max_value=hp_units_lay2)
# Number of cell in layer 4
if hp_layers >= 4:
hp_units_lay4 = hp.Int('units', min_value=1, max_value=hp_units_lay3)
我还想使用 input_size[1] 作为超参数:
# HP: Number of time steps to be considered for the input data
hp_step_size = hp.Int('step_size', min_value=5, max_value=500)
我定义模型的功能如下:
def build(self, hp):
# HP: Number of time steps to be considered for the input data
hp_step_size = hp.Int('step_size', min_value=5, max_value=500)
# HP: Number of layers
hp_layers = hp.Int('layers', min_value=1, max_value=4)
layers = []
# HP: Number of cell in layer 1
hp_units_lay1 = hp.Int('units', min_value=1, max_value=200)
layers.append(hp_units_lay1)
# HP: Number of cell in layer 2
if hp_layers >= 2:
hp_units_lay2 = hp.Int('units', min_value=1, max_value=hp_units_lay1)
layers.append(hp_units_lay2)
# HP: Number of cell in layer 3
if hp_layers >= 3:
hp_units_lay3 = hp.Int('units', min_value=1, max_value=hp_units_lay2)
layers.append(hp_units_lay3)
# HP: Number of cell in layer 4
if hp_layers >= 4:
hp_units_lay4 = hp.Int('units', min_value=1, max_value=hp_units_lay3)
layers.append(hp_units_lay4)
# Create RNN model
input_dim = (hp_step_size, 1)
rnn_model = create_rnn('LSTM', layers, input_dim, [], 0)
# HP: Learning rate for the optimizer
hp_learning_rate = hp.Float('learning_rate', min_value=1e-4, max_value=1e-2,
sampling='LOG', default=1e-3)
rnn_model.compile(loss='mae', optimizer=Adam(learning_rate=hp_learning_rate))
# Set constant parameter
sample_time = 0.01 # [s]
data_column = 'signal'
seq_column = 'num_sequence'
# create name string
step_size_string = str(hp_step_size)
# Create sequenced data
X_train, y_train, idxSeq_train = create_sequences(df_train, data_column, data_column,
hp_step_size, seq_column, verbose=0)
X_test, y_test, idxSeq_test = create_sequences(df_test, data_column, data_column,
hp_step_size, seq_column, verbose=0)
X_val, y_val, idxSeq_val = create_sequences(df_val, data_column, data_column,
hp_step_size, seq_column, verbose=0)
return rnn_model, X_train, y_train, idxSeq_train, X_test, y_test, idxSeq_test, X_val,
y_val, idxSeq_val
因此,为了获得正确大小的训练/测试和验证数据,我必须根据 hp_step_size 创建数据序列。
但是当我尝试运行 keras 调谐器时:
hypermodel = RNNHyperModel()
# Define Keras Tuner for Hyperparameter Optimization
MAX_TRIALS = 20
tuner = kt.BayesianOptimization(hypermodel,
objective='loss', # 'val_loss' or 'loss'
max_trials=MAX_TRIALS,
seed=42,
project_name='Test1',
directory=os.path.normpath('D:/'))
tuner.search_space_summary()
tuner.search(X_train, y_train,
epochs=100,
validation_data=(X_val, y_val),
use_multiprocessing=False,
callbacks=callbacks)
我收到以下警告,这表明基于当前 hp_step_size 排序的数据未用于训练:
WARNING:tensorflow:Model was constructed with shape (None, 323, 3) for input
Tensor("lstm_input:0", shape=(None, 323, 3), dtype=float32), but it was called on an input
with incompatible shape (None, 100, 3).
有人知道如何解决吗?甚至可能吗?