2016-05-15 12 views
0

+と*を使用したテンソルフローでの暗黙のブロードキャストはどのように機能しますか? TensorFlow:要素ごとの加算/乗算による暗黙的なブロードキャスト

a.get_shape() = [64, 10, 1, 100] 
b.get_shape() = [64, 100] 
(a+b).get_shape = [64, 10, 64, 100] 
(a*b).get_shape = [64, 10, 64, 100] 

がどのようにそれがなるん

私は2つのテンソルをお持ちの場合は、そのような[64、10、64、100]?

答えて

2

documentationによれば、addのような操作が放送操作である。

放送操作

そのテンソル引数の形状が互換性を持たせるためにnumpyのスタイルの放送を使用して操作を:glossaryを引用

numpyのスタイルの放送はよくdocumentationに記載されています:簡単に

[...]彼らはそのように小さい配列は、より大きなアレイ全体で「放送」であります互換性のある形状を有する。

放送は、PythonではなくC言語でループが発生するように配列操作をベクトル化する手段を提供します。

1

あなたが意図したとおりに放送していないと思います。それは実際に両方の方向を放送しています。あなたの例を変更して意味することを教えてください。

a = tf.ones([64, 10, 1, 100]) 
b = tf.ones([128, 100]) 
print((a+b).shape) # prints "(64, 10, 128, 100)" 

これから、最後の次元を最初に一致させることでブロードキャストすることがわかります。 bの最初のディメンションのサイズに一致するように3番目のディメンションを含めると暗黙のうちにaがタイルされ、次に暗黙的にシングルトンが追加されて、が表示されます。の最初の2つのディメンションにはbがあります。

私があなたがすると思ったのは、の2番目の次元に暗黙のうちにbを埋め込むことでした。あなたはこの形状に合わせて2つのシングルトン次元を追加するために、あなたのBに二回tf.expand_dims()を使用することができます

a = tf.ones([64, 10, 1, 100]) 
b = tf.ones([64, 1, 1, 100]) 
print((a+b).shape) # prints "(64, 10, 1, 100)" 

:これを行うには、あなたは異なる形状であることをbを必要としています。

関連する問題