2017-08-07 8 views
0

私はテーラーの引数として2つのベクトルの形の違いでT.zeros()という簡単な操作をしようとしています。テナノのテンソルでのエラーテンソル・シェイプ()とテンソル・シェイプ()のアクセント

このような何か:

import theano as theano 
import theano.tensor as T 

x1 = T.ivector('x1') 
x2 = T.ivector('x2') 
shape_sub = T.sub(T.shape(x1),T.shape(x2)) 

zeros = T.zeros(shape_sub) 

f = theano.function([x1, x2], zeros)   

しかし、私は値エラーに

ValueError: length not known: Elemwise{sub,no_inplace} [id A] '' 
|Shape [id B] '' 
| |x1 [id C] 
|Shape [id D] '' 
    |x2 [id E] 

を取得していますT.zerosの引数は()形状を含むタプルやリストでなければなりませんので、おそらくですshape_subの出力である、減算された形状を含むivector tensorTypeではありません。しかし、私はどのようにこのコードを実装するのですか?私はT.zeros_like()をここで使うことはできません。テンソル全体が入力であり、その形状ではないからです。

私がこれを解決すると考えることができる唯一の方法は、shape_subの値に共有変数を使用して評価し、T.zeros()関数に渡すことですが、非常に効率的ではありません。

答えて

0

この問題の核心は、コンパイル時に、次のとおりです。

  • Theanoはテンソルのランクを知っている必要があります。
  • Theanoはテンソルの形の正確な数について何も知らない。 [1]

私はTensorflowの静的テンソルの形状に対して、これを欠陥とみなしています。

あなたのコードでは、Theanoはshape_subがベクターであることを知っていますが、ベクトルのの長さはではありません。したがって、zerosコールのランクを判断することはできません。

shp = T.ivector() 
zs = T.zeros(shp) 

一つの可能​​な解決策は、それがハードコードになります。(実際にはそれしかし、それだけで忘れその情報による内部欠陥を、知っている必要があります)

あなたはこのコードで同じエラーを取得することができます:

x1_shp = T.shape(x1) 
x2_shp = T.shape(x2) 
assert x1.ndim == x2.ndim 
zeros = T.zeros([x1_shp[i] - x2_shp[i] for i in range(x1.ndim)]) 

それはですので、実際にTheanoは、放送寸法について知っている[1]

形のどの軸がサイズ1を持っているかを知る可能性がありますが、それ以上はありません。

関連する問題