TensorFlow.jsではテンソル上で実行できる演算が提供されています。これらの演算は、そのテンソルの値を変えるのではなく、新しいテンソルを返します。
目次
算術演算
– tf.add (a, b), tf.sub (a, b), tf.mul (a, b), tf.div (a, b)
– tf.mod (a, b)
– tf.pow (base, exp)
const x1 = tf.tensor2d([[1, 1], [1, 1]]);
const y11 = tf.tensor2d([[2, 2], [2, 2]]);
const y12 = tf.scalar(5);
tf.add(x1, y11).print();
x1.add(y11).print();
/*
Tensor
[[3, 3],
[3, 3]]
*/
tf.add(x1, y12).print();
x1.add(y12).print();
/*
Tensor
[[6, 6],
[6, 6]]
*/
– tf.maximum (a, b), tf.minimum (a, b)
const x2 = tf.tensor1d([2, 4, 3]);
const y21 = tf.tensor1d([1, 2, 9]);
const y22 = tf.scalar(3);
tf.maximum(x2, y21).print();
x2.maximum(y21).print();
/*
Tensor
[2, 4, 9]
*/
tf.maximum(x2, y22).print();
x2.maximum(y22).print();
/*
Tensor
[3, 4, 3]
*/
– tf.squaredDifference (a, b): 要素ごとの(a – b) * (a – b)を返す。
const x3 = tf.tensor1d([2, 4, 3]);
const y31 = tf.tensor1d([1, 2, 9]);
const y32 = tf.scalar(2);
tf.squaredDifference(x3, y31).print();
x3.squaredDifference(y31).print();
/*
Tensor
[1, 4, 36]
*/
tf.squaredDifference(x3, y32).print();
x3.squaredDifference(y32).print();
/*
Tensor
[0, 4, 1]
*/
数学演算
– tf.reciprocal (x)
– tf.square (x)
– tf.sqrt (x)
– tf.rsqrt (x): 平方根の逆数
– tf.exp (x)
– tf.log (x)
const x4 = tf.tensor2d([[-1, 2], [-3, 4]]);
tf.square(x4).print();
x4.square().print();
/*
Tensor
[[1, 4 ],
[9, 16]]
*/
tf.sqrt(x4).print();
x4.sqrt().print();
/*
Tensor
[[NaN, 1.4142135],
[NaN, 2 ]]
*/
– tf.abs (x)
– tf.sign (x)
– tf.neg (x): (-1 * x)
– tf.round (x)
– tf.floor (x)
– tf.ceil (x)
const x5 = tf.tensor1d([-1, 2, -3]);
tf.abs(x5)
x5.abs().print();
/*
Tensor
[1, 2, 3]
*/
– tf.sigmoid, tf.logSigmoid
– tf.elu (exponential linear), tf.selu (x) (scaled exponential linear)
– tf.relu (x), tf.leakyRelu (x, alpha?), tf.prelu (x, alpha) (leaky rectified linear)
– tf.erf (ガウス誤差関数)
const x6 = tf.tensor1d([-1, 2, -3, 4]);
tf.relu(x6).print();
x6.relu().print();
/*
Tensor
[0, 2, 0, 4]
*/
– tf.cos, tf.acos, tf.cosh, tf.acosh
– tf.sin, tf.asin, tf.sinh, tf.asinh
– tf.tan, tf.atan, tf.tanh, tf.atanh
行列演算
tf.matMul
tf.matMul (a, b, transposeA?, transposeB?): 2つの行列のドット積(A * B)
If transposeパラメータがtrueの場合、行列は乗算前に転置される。
const x7 = tf.tensor2d([1, 2], [1, 2]);
/*
Tensor
[[1, 2],]
*/
const y7 = tf.tensor2d([1, 2, 3, 4], [2, 2]);
/*
Tensor
[[1, 2],
[3, 4]]
*/
tf.matMul(x7, y7).print();
x7.matMul(y7).print();
/*
Tensor
[[7, 10],]
*/
tf.outerProduct
tf.outerProduct (v1, v2)
const x8 = tf.tensor1d([1, 2, 3]);
const y8 = tf.tensor1d([1, 2, 3]);
tf.outerProduct(x8, y8).print();
/*
Tensor
[[1, 2, 3],
[2, 4, 6],
[3, 6, 9]]
*/
tf.transpose
tf.transpose (x, perm?): 次元をpermに準じて置き換える。
返されるtf.Tensorの次元iは、入力の次元perm[i]に一致する。permが与えられない場合は、[n-1…0]に設定される(nは入力tf.Tensorのランク)。
例:入力tf.Tensorのシェイプが[1,3,4]の場合、
+ permが与えられない: perm=[2,1,0] => シェイプが[4,3,1]のtf.Tensorが返される。
+ perm=[0,2,1] => シェイプが[1,4,3]のtf.Tensorが返される。
+ perm=[1,2,0] => シェイプが[3,4,1]のtf.Tensorが返される。
const x9 = tf.tensor3d([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [1, 3, 4]);
x9.print(true);
/*
Tensor
rank: 3
shape: [1,3,4]
values:
[[[1, 2 , 3 , 4 ],
[5, 6 , 7 , 8 ],
[9, 10, 11, 12]]]
*/
x9.transpose().print(true); // or tf.transpose(x9)
/*
Tensor
rank: 3
shape: [4,3,1]
values:
[[[1 ],
[5 ],
[9 ]],
[[2 ],
[6 ],
[10]],
[[3 ],
[7 ],
[11]],
[[4 ],
[8 ],
[12]]]
*/
x9.transpose([0, 2, 1]).print(true);
/*
Tensor
rank: 3
shape: [1,4,3]
values:
[[[1, 5, 9 ],
[2, 6, 10],
[3, 7, 11],
[4, 8, 12]]]
*/
x9.transpose([1, 2, 0]).print(true);
/*
Tensor
rank: 3
shape: [3,4,1]
values:
[[[1 ],
[2 ],
[3 ],
[4 ]],
[[5 ],
[6 ],
[7 ],
[8 ]],
[[9 ],
[10],
[11],
[12]]]
*/
tf.norm
tf.norm (x, ord?, axis?, keepDims?): さまざまな異なるベクトルのノルム(1-norm、ユークリッドノルムつまり2-norm、無限大ノルム、p > 0でのp-norm)や行列ノルム(フロベニウスノルム、1-norm、無限大ノルム)を計算する。
ord | ノルム(行列) | ノルム(ベクトル) |
---|---|---|
‘euclidean’ | フロベニウスノルム | 2-norm |
‘fro’ | フロベニウスノルム | |
Infinity | max(sum(abs(x), axis=1)) | max(abs(x)) |
-Infinity | min(sum(abs(x), axis=1)) | min(abs(x)) |
1 | max(sum(abs(x), axis=0)) | sum(abs(x)) |
2 | sum(abs(x)^2)^1/2 |
axis (number|number[]):
+ axisがnull(デフォルト)の場合:入力はベクトルと見なされ、ノルムはtf.Tensorの値のセット全体で計算される。
+ axisが整数の場合:入力はベクトルのまとまりと見なされ、axisがベクトルノルムを計算するxの軸を決める
+ axisが整数の2-tupleの場合([a,b]というペア):入力は行列のまとまりと見なされ、axisが行列ノルムを計算するNDArrayの軸を決める。
keepDims (boolean): trueの場合、ノルムは入力と同じ次元を持つ。
サンプル1:
// (-3)^2 + 4^2 = 5^2
const x = tf.tensor1d([-3, 4]);
x.norm().print();
/*
Tensor
5
*/
x.norm(2).print();
/*
Tensor
5
*/
x.norm(1).print();
/*
Tensor
7
*/
x.norm('euclidean').print();
/*
Tensor
5
*/
x.norm(Infinity).print();
/*
Tensor
4
*/
x.norm(-Infinity).print();
/*
Tensor
3
*/
サンプル2:
// (-3)^2 + 4^2 = 5^2
// (-5)^2 + 12^2 = 13^2
const y = tf.tensor2d([[-3, 4], [-5, 12]]);
y.norm().print();
/*
Tensor
13.928388595581055
*/
y.norm(2).print();
/*
Tensor
13.928388595581055
*/
y.norm(1).print();
/*
Tensor
24
*/
y.norm('euclidean').print();
/*
Tensor
13.928388595581055
*/
y.norm(Infinity).print();
/*
Tensor
12
*/
y.norm(-Infinity).print();
/*
Tensor
3
*/
サンプル3:
// (-3)^2 + 4^2 = 5^2
// (-5)^2 + 12^2 = 13^2
const y = tf.tensor2d([[-3, 4], [-5, 12]]);
y.norm(2, 0).print();
/*
Tensor
[5.8309517, 12.6491117]
*/
y.norm(2, 1).print();
/*
Tensor
[5, 13]
*/
y.norm(1, 0).print();
/*
Tensor
[8, 16]
*/
y.norm(1, 1).print();
/*
Tensor
[7, 17]
*/
y.norm(Infinity, 0).print();
/*
Tensor
[5, 12]
*/
y.norm(Infinity, 1).print();
/*
Tensor
[4, 12]
*/
y.norm(Infinity, [0, 1]).print();
/*
Tensor
17
*/
y.norm(-Infinity, 0).print();
/*
Tensor
[3, 4]
*/
y.norm(-Infinity, 1).print();
/*
Tensor
[3, 5]
*/
y.norm(-Infinity, [0, 1]).print();
/*
Tensor
7
*/
論理演算
– tf.equal (a, b)
– tf.greater (a, b)
– tf.greaterEqual (a, b)
– tf.less (a, b)
– tf.lessEqual (a, b)
const a1 = tf.tensor1d([1, 3, 5]);
const b11 = tf.tensor1d([1, 2, 3]);
const b12 = tf.scalar(4);
tf.greater(a1, b11).print();
a1.greater(b11).print();
/*
Tensor
[0, 1, 1]
*/
tf.greater(a1, b12).print();
a1.greater(b12).print();
/*
Tensor
[0, 0, 1]
*/
– tf.logicalAnd (a, b)
– tf.logicalNot (a, b)
– tf.logicalOr (a, b)
– tf.logicalXor (a, b)
const a2 = tf.tensor1d([1, 1, 0, 0], 'bool');
const b2 = tf.tensor1d([1, 0, 1, 0], 'bool');
tf.logicalAnd(a2, b2).print();
a2.logicalAnd(b2).print();
/*
Tensor
[1, 0, 0, 0]
*/
– tf.where (condition, a, b): conditionがtrueの場合はaから、falseの場合はbから選ばれた要素から成るtf.Tensorを返す。
const a3 = tf.tensor1d([1, 3, 5, 7]);
const b3 = tf.tensor1d([2, 3, 4, 9]);
tf.where(tf.greater(a3, b3), a3, b3).print();
/*
Tensor
[2, 3, 5, 9]
*/
const a4 = tf.tensor1d([1, 3, 5, 7]);
const b4 = tf.scalar(4);
const alt = tf.fill([4], 9999);
/*
Tensor
[9999, 9999, 9999, 9999]
*/
tf.where(tf.less(a4, b4), a4, alt).print();
/*
Tensor
[1, 3, 9999, 9999]
*/