はじめに(不要)
テンソルを今さら勉強したのでプログラマ向けにイメージの共有をします。
実装からテンソルがなにかの雰囲気を読み取れるかと思います。
結論:テンソルは多次元配列で表現できる
実装
ベクトルの具体例
# 2次元のベクトル;sizeが2のList
vector2 = [1,2]
# 3次元のベクトル;sizeが3のList
vector3 = [3,4,5]
テンソルの具体例
# 0階のテンソル;数値型
tensor0 = 5
# 1階のテンソル;sizeは自由なList;ベクトル
tensor1 = [1,2,3,4,5,6]
# 2階のテンソル;Listが1階入れ子になったList
# 各Listのsizeは自由
tensor2 = [[1,2,3],[4,5,6],[7,8,9]]
# 3階のテンソル;Listが2階入れ子になったList
# 各Listのsizeは自由
tensor2 = [ [[1,1,1],[2,2,2]] , [[3,3,3],[4,4,4]] ]
モノクロ画像は2階のテンソルで表現できる
# 3*3のListを全部0で埋める
bw = Array.new(3){ Array.new(3,0)}
p bw
# => [[0,0,0],[0,0,0],[0,0,0]]
p bw[2][2]
# => 0
RGB画像は3階のテンソルで表現できる
# 3*3*3のListを全部0で埋める
rgb = Array.new(3){ Array.new(3){ Array.new(3,0)}}
p rgb
# =>
# [[[0,0,0],[0,0,0],[0,0,0]], #赤色
# [[0,0,0],[0,0,0],[0,0,0]], #緑色
# [[0,0,0],[0,0,0],[0,0,0]]] #青色
p rgb[2][2][2]
# => 0
テンソル計算のイメージ
テンソルは空間と空間の積で得られる空間の元だと言えるが、いまいちピンと来ないので、イメージとしてベクトル空間同士の積をみてみる。
ベクトルは1階のテンソルであり、それらをかけ合わせたものは2階のテンソルとなる。
(積、と丸めているが、テンソル積のこと)
# 任意の(x,y,z)と(p,q,r)
double x,y,z,p,q,r
# ベクトル空間の元(1階のテンソル空間)
vctr2xy = [x,y,z]
vctr2pq = [p,q,r]
# ベクトルの掛け算を***で表現すると
# tnsr = vctr2xy *** vctr2xy
# 2階のテンソル空間の元
tnsr =
[[x*p,x*q,x*r],
[y*p,y*q,y*r],
[z*p,z*q,z*r]]
あとがき
大学の授業全部寝ていた
なぜかテンソルを全く知らなかったので0から勉強しました、間違い等あれば教えてください。