私の操作の1つに整数が必要ですが、畳み込みの出力は浮動です。
これを処理するには、tf.floor
、tf.ceil
、tf.cast
...などを使用する必要があることを意味します。 tf.floor
ようoperactionsがtf.floorの代替計画
微分可能ではありませんので、
しかし、これらのoperactionsだから、None
勾配を引き起こし、私は
まず以下のようなものを試してみました。迂回test.compute_gradient_error
の
out1 = tf.subtract(vif, tf.subtract(vif, tf.floor(vif)))
しかし、出力は500または0である、私は、これは合理的な勾配であるとは思いません。
第2。 test.compute_gradient_error
の
@ops.RegisterGradient("CustomFloor")
def _custom_floor_grad(op, grads):
return [grads]
A, B = 50, 7
shape = [A, B]
f = np.ones(shape, dtype=np.float32)
vif = tf.constant(f, dtype=tf.float32)
# out1 = tf.subtract(vif, tf.subtract(vif, tf.floor(vif)))
with tf.get_default_graph().gradient_override_map({"Floor": "CustomFloor"}):
out1 = tf.floor(vif)
with tf.Session() as sess:
err1 = tf.test.compute_gradient_error(vif, shape, out1, shape)
print err1
出力は500または1である床面の勾配関数をオーバーライドし、あまりにも動作しません。
質問:一般的には整数を取得し、伝播作業罰金バック維持する方法(2.0のような値、5.0はOKです)
だ場合は、 'ステップ関数のようにfloor'意味ですか、私のような線形関数の外観を見つけることを試みることも理解されているフィルタの近似を使用してシグモイド
はい、まさに。トレーニング中は、徐々に坂を上げてください。 – drpng
「傾斜を徐々に増やす」という意味を理解できません。私がこの種の機能を持っていると、なぜ勾配を徐々に増やす必要があるのですか?または、この機能はトレーニングによって得られますか?ありがとう – xxi