行列積周りで混乱したところをメモ
#画像の畳み込み計算
imgのテンソルとkernelのテンソルの積にnp.tensordot
を使う。引数のaxis
は1つの画像が格納されている次元(1,2)
を指定する。
img_tensor = [[[0, 0],
[0, 0]],
[[1, 1],
[1, 1]],
[[3, 3],
[3, 3]]]
kernel = [[[0, 0],
[0, 0]],
[[1, 1],
[1, 1]],
[[2, 2],
[2, 2]]]
out = np.tensordot(img_tensor, kernel, axes=((1, 2), (1, 2)))
print(out)
print(np.shape(img_tensor), np.shape(kernel), '=>', np.shape(out))
-----------------
[[ 0 0 0]
[ 0 4 8]
[ 0 12 24]]
((3L, 2L, 2L), (3L, 2L, 2L), '=>', (3L, 3L))
#データ間の内積をまとめてやりたい
$({\bf i,j})$と$({\bf k,l})$から$({\bf i}\cdot{\bf k},~{\bf j}\cdot{\bf l})$を計算したい場合、アダマール積とnp.sum
で各要素の内積を計算する。(もっといいやり方ある?)
a = np.arange(4).reshape((2,2))
b = a[::-1,::-1]
c = np.sum(a*b,axis=1)
print("---a---")
print(a)
print("---b---")
print(b)
print("---c---")
print(c)
---a---
[[0 1]
[2 3]]
---b---
[[3 2]
[1 0]]
---c---
[2 2]