2016-08-06 9 views
5

私はミニバッチのサイズの何倍もタイルしたい次元(1,5)の変数aを持っています。たとえば、ミニバッチサイズが32の場合、元の(1,5)変数aと同じ値を持つ次元(32,5)のテンソルcを作成します。タイル張りテンソルのテンソルフロー形状

しかし、私は実行時にのみミニバッチサイズを知っている:それはプレースホルダbの大きさ0のサイズです:tf.shape(b)[0]

は、ここで、Cを構築するために私のコードです:

a = tf.Variable(np.random.uniform(size=(1,5))) 
b = tf.placeholder(shape=[None, 12], dtype=tf.float32) 
batch_size = tf.shape(b)[0] 
c = tf.tile(a, tf.pack([batch_size, 1])) 

これは正常に動作します。しかし、c.get_shape()は(?、?)を返します。私はなぜこれが戻ってこないのか分からない(?、5)。

マトリックス変数Wを作成したときに、これは私のコードの後に​​問題を引き起こしています。列数がc.get_shape()[1]で、5よりもむしろ?

ご協力いただければ幸いです。ありがとう。

+0

どのバージョンですか?同様の問題が0.10rcで解決されました。また回避策としてset_shapeを使用することができます –

+0

ありがとう、set_shapeは仕事をします。 。バージョン0.8.0rc0です。 –

答えて

3

[EDIT:これは、8月10日TensorFlowにcommitに固定された2016]

このTensorFlowの形状推論の既知の制限がある:tf.tile()からmultiples引数は、計算された値は、(ある場合これはtf.pack()の結果です)、その値はグラフ構築時にはほとんど計算できません(この場合、それが供給されるまで値を持たないtf.placeholder()に依存しているため)、現在の形状推定がその手を上げます形状は不明であると宣言します(ただし、入力と同じランク、a)。

現時点での回避策は、Tensor.set_shape()を使用することです。これにより、プログラマが形状推論以外のことを知っているときに追加の形状情報を提供することができます。たとえば、あなたが行うことができます:

a = tf.Variable(np.random.uniform(size=(1, 5))) 
b = tf.placeholder(shape=[None, 12], dtype=tf.float32) 
batch_size = tf.shape(b)[0] 
c = tf.tile(a, tf.pack([batch_size, 1])) 
c.set_shape([None, a.get_shape()[1]]) # or `c.set_shape([None, 5])` 

をしかし、我々は最近、形状として使用することができる部分的に計算された値を伝搬することを可能にするいくつかの機能を追加し、これはtf.tile()のために形状関数を支援するために適合させることができます。私はこれを追跡するためにGitHub issueを作成しましたが、私は現在テストされている修正を持っています。

+0

仕事は仕事をします。詳細な説明には特に感謝します。 –

+0

'pack'は' stack'に置き換えられました。 –

関連する問題