0

我目前正在研究用于时间序列数据的 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).

有人知道如何解决吗?甚至可能吗?

4

0 回答 0