<目次>
(1) tensorflowのmatmulの使い方について(次元別の仕様やnumpy.matmulとの違いを整理)
(1-1) tensorflow.matmulの次元別の挙動
(1-2) tensorflow.matmulの次元別の挙動(詳細)
(1-3) tensorflow.matmulの次元別の挙動確認に使用したプログラム
(1-4) (参考)numpyのmatmulについて
(1) tensorflowのmatmulの使い方について(次元別の仕様やnumpy.matmulとの違いを整理)
(1-1) tensorflow.matmulの次元別の挙動
(表)
次元 (行列1\行列2) |
n=1 | n=2 | n>2 |
n=1 (例:[1]) |
① ・エラー (In[0] and In[1] ndims must be >= 2) |
② ・エラー (In[0] and In[1] has different ndims: [2] vs. [2,1]) |
③ ・エラー (In[0] ndims must be >= 2) |
n=2 (例:[[1],[1]]) |
④ ・エラー (In[0] and In[1] has different ndims: [1,2] vs. [2]) |
⑤ ・行列の掛け算 |
⑥ ・最後の2次元の行列をスタックした扱い。 ・掛け算の考え方はブロードキャスト |
n>2 (例:[[[1],[1]],[[1],[1]]]) |
⑦ ・エラー (In[1] ndims must be >= 2) |
⑧ ・最後の2次元の行列をスタックした扱い。 ・掛け算の考え方はブロードキャスト |
⑨ ・最後の2次元の行列をスタックした扱い。 ・先頭の次元が同じ場合に限り、対応する要素の行列同士を掛け算 |
(1-2) tensorflow.matmulの次元別の挙動(詳細)


↓




↓

(1-3) tensorflow.matmulの次元別の挙動確認に使用したプログラム
import tensorflow as tf import numpy as np def main(): a_1d_2 = np.array([1,2]) a_2d_1x2 = np.array([[1,2]]) a_2d_2x1 = np.array([[1],[2]]) a_3d_2x1x2 = np.array([[[1,2]],[[1,2]]]) a_3d_2x2x1 = np.array([[[1],[2]],[[1],[2]]]) # print("①:",tf.matmul(a_1d_2,a_1d_2).numpy()) # print("②:",tf.matmul(a_1d_2,a_2d_2x1).numpy()) # print("③:",tf.matmul(a_1d_2,a_3d_2x2x1).numpy()) # print("④:",tf.matmul(a_2d_1x2,a_1d_2).numpy()) # print("⑦:",tf.matmul(a_3d_2x1x2,a_1d_2).numpy()) print("⑤:",tf.matmul(a_2d_1x2,a_2d_2x1).numpy()) print("⑥:",tf.matmul(a_2d_1x2,a_3d_2x2x1).numpy()) print("⑧:",tf.matmul(a_3d_2x2x1,a_2d_1x2).numpy()) print("⑨:",tf.matmul(a_3d_2x2x1,a_3d_2x1x2).numpy()) if __name__ == "__main__": main()
(1-4) (参考)numpyのmatmulについて
次元 (行列1\行列2) |
n=1 | n=2 | n>2 |
n=1 (例:[1]) |
① ・ベクトルの内積 |
② ・ベクトルの内積(の繰り返し) ⇒第1引数行列と第2引数列の最初の次元の内積を取る |
③ ・ベクトルの内積(の繰り返し) ⇒第1引数行列と第2引数列の最初の次元の内積を取る |
n=2 (例:[[1],[1]]) |
④ ・ベクトルの内積(の繰り返し) ⇒第1引数行列の最後の次元と第2引数列の内積を取る |
⑤ ・行列の掛け算 |
⑥ ・最後の2次元の行列をスタックした扱い。 ・掛け算の考え方はブロードキャスト |
n>2 (例:[[[1],[1]],[[1],[1]]]) |
⑦ ・ベクトルの内積(の繰り返し) ⇒第1引数行列の最後の次元と第2引数列の内積を取る |
⑧ ・最後の2次元の行列をスタックした扱い。 ・掛け算の考え方はブロードキャスト |
⑨ ・最後の2次元の行列をスタックした扱い。 ・先頭の次元が同じ場合に限り、対応する要素の行列同士を掛け算 |