2017-02-13 2 views
-1

私の操作の1つに整数が必要ですが、畳み込みの出力は浮動です。
これを処理するには、tf.floortf.ceiltf.cast ...などを使用する必要があることを意味します。 tf.floorようoperactionsがtf.floorの代替計画

微分可能ではありませんので、
しかし、これらのoperactionsだから、None勾配を引き起こし、私は

まず以下のようなものを試してみました。迂回test.compute_gradient_error

out1 = tf.subtract(vif, tf.subtract(vif, tf.floor(vif))) 

しかし、出力は500または0である、私は、これは合理的な勾配であるとは思いません。

第2test.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です)

答えて

2

、それは勾配降下と離散問題を解決するためにはお勧めできませんではありません。 TFの整数ソルバを表現することはできますが、あなたは多かれ少なかれ自分のものです。

FWIWでは、フロア機能はソーのように見えます。その導関数は1で一定の関数であり、すべての整数に小さな穴があります。あなたが望むならば、これらの位置では、下向きのDirac機能を持っています。 Diracの機能は有限のエネルギーを持ちますが、有限の値はありません。

これらの問題に取り組む標準的な方法は、ハードフロア制約を(少なくとも1回)微分可能(平滑)なもので「緩和」することによって問題を緩和することです。

これを行う方法は複数あります。おそらく最も人気があります:

  1. あなたが望むように見える機能をハッキングします。例えば、素早く下降するが、縦には傾かない、区分的な線形関数。
  2. それは時系列
+0

だ場合は、 'ステップ関数のようにfloor'意味ですか、私のような線形関数の外観を見つけることを試みることも理解されているフィルタの近似を使用してシグモイド

  • でステップ関数を置き換え'_/- 'なので、関数は 'floor'としてほとんど機能します – xxi

  • +0

    はい、まさに。トレーニング中は、徐々に坂を上げてください。 – drpng

    +0

    「傾斜を徐々に増やす」という意味を理解できません。私がこの種の機能を持っていると、なぜ勾配を徐々に増やす必要があるのですか?または、この機能はトレーニングによって得られますか?ありがとう – xxi