如何在训练操作的每个步骤之间剪切密集层的权重

时间:2018-08-17 14:27:00

标签: python tensorflow

是否有可能进行自定义操作(例如,在每个训练步骤中手动裁剪密集层的权重值)

if mode == tf.estimator.ModeKeys.TRAIN:
    optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
    weights = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='logits/kernel')[0]
    clip_op = tf.assign(weights, tf.clip_by_value(weights, 0.01, 0.1))
    train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step())
    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

以上,我想在每次训练操作之间限制logits /内核层的权重,但是它不能按预期工作,该层的权重仍然会超出(0.01,0.1)的范围。我不知道我在这里想念什么。

1 个答案:

答案 0 :(得分:1)

好吧,您永远不会在任何地方使用clip_op。由于您似乎正在使用tf.layers,因此请注意,这些用户接受kernel_constraint参数(与偏向相同),这很容易实现。该函数需要将内核作为参数并返回“受约束的”内核。
就您而言,您可以将kernel_constraint=lambda x: tf.clip_by_value(x, 0.01, 0.1)传递给图层定义。