【发布时间】:2021-06-25 01:52:14
【问题描述】:
我编写了一个 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 调整了层的一些参数。在验证模型时,我已经多次运行具有特定配置的模型。大多数时候结果是相似的,但是,一次运行比其他运行好得多,这让我认为模型的初始状态可能对于获得最佳性能至关重要。
正如this video 中所建议的,权重初始化可以提供一些性能提升。 我在谷歌上搜索并找到了layer weight initializers,但我不确定我应该调整什么范围。
更新: 正如一些 cmets / answers 中所建议的,我正在使用固定种子来“锁定”模型结果:
# 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)
每个新火车的结果都会重复,但是,不同的种子可以产生比其他种子更好的结果。那么如何找到/调整最好的种子呢?
【问题讨论】:
-
@Shlomi 你没有在你的问题中说任何关于种子的东西,但只关心初始状态。请您对此进行 cpnfirn 吗?
-
您之前在我的答案评论框中提到您确实使用了 sagamaker(也许),您能详细说明一下吗? (IDK 为什么删除那些评论,如果她/他是诚实的,举报者应该排在前面)。
-
@M.Innat 我不确定为什么我的 cmets 被删除了,不是我。我使用 SageMaker (docs.aws.amazon.com/sagemaker/latest/dg/…) 调整所有其他参数
标签: python tensorflow machine-learning keras