<目次>
(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次元の行列をスタックした扱い。 ・先頭の次元が同じ場合に限り、対応する要素の行列同士を掛け算 | 
 
											 
											 
											