2017-01-06 8 views
3

私はケアで演算を実装しています。これは、theanoとtensorflowバックエンドの両方で動作するようになっています。操作の入力があると仮定します。tensorflow theano.tensor.set_subtensor相当の

array([[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]], dtype=int64) 

その出力は次のようになります。

array([[ 0, 1, 2, 3, 4, 5], 
     [ 3, 4, 5, 0, 1, 2], 
     [ 6, 7, 8, 9, 10, 11], 
     [ 9, 10, 11, 6, 7, 8]], dtype=int64) 

私のコードは次のとおりです。私はtheanoことによってそれを成功裏に実施している

from keras import backend as K 
def pairreshape(x,target_dim,input_shape): 
    x1, x2 = x[0::2,], x[1::2,] 
    x1_concate = K.concatenate((x1,x2), axis=target_dim) 
    x2_concate = K.concatenate((x2,x1), axis=target_dim) 
    if K.image_dim_ordering() == 'th': 
     import theano.tensor as T 
     x_new = T.repeat(x,2,axis=target_dim) 
     x_new = T.set_subtensor(x_new[0::2], x1_concate) 
     x_new = T.set_subtensor(x_new[1::2], x2_concate) 
    elif K.image_dim_ordering() == 'tf': 
     import tensorflow as tf 
     repeats = [1] * len(input_shape) 
     repeats[target_dim] = 2 
     x_new = tf.tile(x, repeats) 
     x_new[0::2] = x1_concate #TypeError: 'Tensor' object does not support item assignment 
     x_new[1::2] = x2_concate #TypeError: 'Tensor' object does not support item assignment 

が、私はテンソルをテンソルフローで割り当てる方法を理解できません。テンソルフローのテンソル割り当ての最後の2行はエラーを報告します。テンソルフローにT.set_subtensorの等価性がありますか?または操作のより良い実装をお勧めしますか?ありがとう。

答えて

1

TensorFlowテンソルは読み取り専用です。あなたは、変数を使用するために必要なものを修正するためにと.assignそれは検索の多くを取った

tensor = tf.Variable(tf.ones((3,3))) 
sess.run(tf.initialize_all_variables()) 
sess.run(tensor[1:, 1:].assign(2*tensor[1:,1:])) 
print(tensor.eval()) 

出力

[[ 1. 1. 1.] 
[ 1. 2. 2.] 
[ 1. 2. 2.]] 
+1

こんにちはヤロスラフ。ご回答有難うございます。私は私の質問ではっきりしていないと思います。入力xは、深いニューラルネットワークのトレーニングサンプルであり、私が知っている限り、それはテンソルとして表現されるべきです。それで解決策はありますか?ありがとう。 –

+0

Tensorsは読み取り専用なので、 'set_subtensor'を実行する唯一の方法は、最初に変数にコピーしてから、その変数を変更することです。 –

+0

' tensor_copy.assign(tensor) 'を実行して、あなたの 'set_subtensor'アナログの前にこれが実行されるように依存関係を制御してください –

0

(= Pythonでオーバーライドすることはできません)が、theano.tensor.set_subtensorに最も近い機能がありますgather,gather_nd,scatterおよびscatter_nd。変数への疎な更新を実行しようとしている場合、他の答えが働く可能性があります。しかし、別のテンソルを索引付けすることでテンソルを動的に作成しようとする場合は、それらを使用する関数です。

これらの関数のポイントは、他のものからテンソル(変数ではない)を動的に作成できることです。私のユースケースは、フラットなテンソルを生成しており、それをさまざまな三角行列に再構成しようとしています。

gatherは、大きなスパース行列から小さな行列を作成しようとしている場合に使用します。 scatterは、小さな行列を大きなゼロ行列に埋め込みたい場合に使用します。

gather,のいくつかの組み合わせと加算と乗算はtheano.tensor.set_subtensorを再作成できます。あなたはまた、スライシングや連結の非常に複雑なセットを使用していますが、収集および散布が好ましいであろう可能性が

https://www.tensorflow.org/api_docs/python/tf/scatter_nd https://www.tensorflow.org/api_guides/python/array_ops#Slicing_and_Joining

乾杯