2016-10-21 7 views
0

私はプログラミングには新しく、特にtensorflowでプログラミングします。私はそれを使用して理解するおもちゃの問題を作り出しています。 その場合、分母はすべてのクラスの合計ではなく、サンプリングされたいくつかのクラスの合計であるsoftmaxのような関数を作りたいと思います。tensorflowで関数を実装する

これはtensorflowで実施することができる方法
def my_softmax(X,W, num_of_samples): 
    K = 4 
    S = np.zeros(((np.dot(X,np.transpose(W))).shape)) 
    for line in range(X.shape[0]): 
     XW = np.dot(X[line],np.transpose(W)) 
     m = np.max(XW) 
     samples_sum = 0 
     for s in range(num_of_samples): 
      r = (randint(0,K-1)) 
      samples_sum += np.exp(XW[r]- m) 

     S[line] = (np.exp(XW-m))/(samples_sum) 

    return S 

:numpyのを使用してPythonで

は次のようになるでしょうか? もっと一般的には、そのような新しい「カスタム」関数を作成する方法がありますか?

答えて

0

テンソルの演算子としてPython/numpy関数をラップすることができます。 tf.py_funcを参照してください。 https://www.tensorflow.org/versions/r0.9/api_docs/python/script_ops.html

ただし、パフォーマンスが(大幅に)影響を受けるため、本番環境では使用しない方が良いです。ほとんどのnp。*関数では、対応するtf。*関数を見つけることができます。 forループの代わりに行列/ベクトルの点ですべての計算を表現しようとする。

また、応答のための https://www.tensorflow.org/versions/r0.11/api_docs/python/constant_op.html

+0

感謝を参照してください。私はあなたが正しいと思うし、forループの代わりに行列/ベクトルコーディングを試してみるべきですが、私はプログラミングを初めて経験しているので、そうする方法を考えることができません。どうすれば "for line in range(X.shape [0]):"のような行を避けることができますか?私はすべての行についてランダムサンプルで異なる分母を計算しなければならないからです。混乱している! –

+0

おそらく見てみましょう:https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#sampled_softmax_loss?ドキュメント内のその関数のすぐ隣にある候補サンプリングライブラリ関数のいくつかが、ここでも役立ちます。ソースがどのように実装されているかを見ることができます。 –