首页 > 解决方案 > Keras - Hyper Tuning 模型的初始状态

问题描述

我编写了一个预测顺序数据的LSTM模型。

def get_model(config, num_features, output_size):
    opt = Adam(learning_rate=get_deep(config, 'hp.learning_rate'), beta_1=get_deep(config, 'hp.beta_1'))

    inputs = Input(shape=[None, num_features], dtype=tf.float32, ragged=True)
    layers = LSTM(get_deep(config, 'hp.lstm_neurons'), activation=get_deep(config, 'hp.lstm_activation'))(
        inputs.to_tensor(), mask=tf.sequence_mask(inputs.row_lengths()))

    layers = BatchNormalization()(layers)
    if 'dropout_rate' in config['hp']:
        layers = Dropout(get_deep(config, 'hp.dropout_rate'))(layers)

    for layer in get_deep(config, 'hp.dense_layers'):
        layers = Dense(layer['neurons'], activation=layer['activation'])(layers)
        layers = BatchNormalization()(layers)
        if 'dropout_rate' in layer:
            layers = Dropout(layer['dropout_rate'])(layers)

    layers = Dense(output_size, activation='sigmoid')(layers)
    model = Model(inputs, layers)
    model.compile(loss='mse', optimizer=opt, metrics=['mse'])
    model.summary()
    return model

我已经使用AWS SageMaker调整了该层的一些参数。在验证模型时,我已经多次运行具有特定配置的模型。大多数时候结果是相似的,但是,一次运行比其他运行好得多,这让我认为模型的初始状态可能对于获得最佳性能至关重要。

正如本视频中所建议的,权重初始化可以提供一些性能提升。我用谷歌搜索并找到了layer weight initializers,但我不确定我应该调整什么范围。


更新: 正如一些评论/答案中所建议的,我正在使用固定种子来“锁定”模型结果:

# Set `python` built-in pseudo-random generator at a fixed value
random.seed(seed_value)
# Set `numpy` pseudo-random generator at a fixed value
np.random.seed(seed_value)
# Set `tensorflow` pseudo-random generator at a fixed value
tf.random.set_seed(seed_value)

每个新火车的结果都会重复,但是,不同的种子可以产生比其他种子更好的结果。那么我如何找到/调整最好的种子呢?

标签: pythontensorflowmachine-learningkeras

解决方案


我认为这个问题没有“一刀切”的解决方案。初始权重很大程度上取决于手头的问题类型以及我们用来解决该问题的数据。我们所能做的就是将您指向一个好的资源,您可以从中尝试查看提到的哪种方法适合您的问题。下面的文章是一个很好的资源,它不仅可以让您详细了解如何以及为什么要初始化权重,还可以指出可以帮助建立学术理解的同行评审研究。


推荐阅读