是否有可能进行自定义操作(例如,在每个训练步骤中手动裁剪密集层的权重值)
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)的范围。我不知道我在这里想念什么。
答案 0 :(得分:1)
好吧,您永远不会在任何地方使用clip_op
。由于您似乎正在使用tf.layers
,因此请注意,这些用户接受kernel_constraint
参数(与偏向相同),这很容易实现。该函数需要将内核作为参数并返回“受约束的”内核。
就您而言,您可以将kernel_constraint=lambda x: tf.clip_by_value(x, 0.01, 0.1)
传递给图层定义。