カテゴリー
【tensorflowjs入門】生のJavascript配列からTensor型に変換するときに覚えておきたいテクニック集
※ 当ページには【広告/PR】を含む場合があります。
2020/12/31
2022/08/18
TensorFlowの導入からKerasまでを実践的に解説 現場で使える!TensorFlow開発入門 Kerasによる深層学習モデル構築手法
配列とテンソルの違い
テンソル
TensorFlowを動かしながら学ぶ TensorFlowとKerasで動かしながら学ぶ ディープラーニングの仕組み 畳み込みニューラルネットワーク徹底解説
配列 > テンソル型にするときの便利なテクニック集
テンソルとスカラーの四則演算
import * as tf from '@tensorflow/tfjs';
//👇1次元配列から1次元テンソル, Shape(形状): [3] に変換
const x = tf.tensor1d([1,2,3]);
//👇実数(Number型)からスカラー型に変換
const a = tf.scalar(4);
//👇テンソルxにスカラーaを足す
x.add(a).print(); // -> [5, 6, 7]
//👇テンソルxにスカラーaを引く
x.sub(a).print(); // -> [-3, -2, -1]
//👇テンソルxにスカラーaを掛ける
x.mul(a).print(); // -> [4, 8, 12]
//👇テンソルxにスカラーaを割る
x.div(a).print(); // -> [0.25, 0.5, 0.75]
[1,2,3]
[3]
import * as tf from '@tensorflow/tfjs';
const b = tf.scalar(1/4);
x.mul(b).print(); // -> [0.25, 0.5, 0.75]
x.mul([1/4]).print(); // -> [0.25, 0.5, 0.75]
x.mul(1/4).print(); // -> [0.25, 0.5, 0.75]
tf.scalar
stackでテンソル成分の合成
import * as tf from '@tensorflow/tfjs';
const xarr = [0, 1, 2, 3, 4, 5];
const yarr = [-1, 3, 2, 0, -2, 1];
const x = tf.tensor2d(xarr, [6, 1]); // Shape: [6,1]
const y = tf.tensor2d(yarr, [6, 1]); // Shape: [6,1]
x.print();
// 👇
// [[0],
// [1],
// [2],
// [3],
// [4],
// [5]]
y.print();
// 👇
// [[-1],
// [3 ],
// [2 ],
// [0 ],
// [-2],
// [1 ]]
x
y
import * as tf from '@tensorflow/tfjs';
const xarr = [0, 1, 2, 3, 4, 5];
const yarr = [-1, 3, 2, 0, -2, 1];
const xyarr = xarr.map((e, i) => [e, yarr[i]]);
const xy = tf.tensor2d(xyarr, [6, 2]); // Shape: [6,2]
xy.print();
// 👇
// [[0, -1],
// [1, 3 ],
// [2, 2 ],
// [3, 0 ],
// [4, -2],
// [5, 1 ]]
import * as tf from '@tensorflow/tfjs';
const xarr = [0, 1, 2, 3, 4, 5];
const yarr = [-1, 3, 2, 0, -2, 1];
tf.stack([xarr, yarr], 1).print();
// 👇
// [[0, -1],
// [1, 3 ],
// [2, 2 ],
// [3, 0 ],
// [4, -2],
// [5, 1 ]]
axis=0
axis=1
[6,1] --> [6,2]
axis=1
unstackでテンソルの形状を一つひん剥く
import * as tf from '@tensorflow/tfjs';
const xarr = [[[5,3]],[[8,1]],[[2,7]],[[3,0]]];
const x= tf.tensor3d(xarr, [4, 1, 2]); // Shape: [4,1,2]
x.print();
// 👇
// [ [[5, 3],],
// [[8, 1],],
// [[2, 7],],
// [[3, 0],] ]
//👇最初の次元をunstack:
// [4,1,2] --> 4 x [1,2]
const xUnstackAlongAxis1 = x.unstack(0);
console.log(xUnstackAlongAxis1.length); // 4(=ひん剥いた次元の要素数と一致)
for (const tensor of xUnstackAlongAxis1) {
tensor.print();
}
// 👇
// [[5, 3],]
// [[8, 1],]
// [[2, 7],]
// [[3, 0],]
//👇2番目の次元をunstack:
// [4,1,2] --> 1 x [4,2]
const xUnstackAlongAxis2 = x.unstack(1);
console.log(xUnstackAlongAxis2.length); // 1(=ひん剥いた次元の要素数と一致)
for (const tensor of xUnstackAlongAxis2) {
tensor.print();
}
// 👇
// [[5, 3],
// [8, 1],
// [2, 7],
// [3, 0]]
//👇3番目の次元をunstack:
// [4,1,2] --> 2 x [4,1]
const xUnstackAlongAxis3 = x.unstack(2);
console.log(xUnstackAlongAxis3.length); // 2(=ひん剥いた次元の要素数と一致)
for (const tensor of xUnstackAlongAxis3) {
tensor.print();
}
// 👇
// [[5],
// [8],
// [2],
// [3]]
// [[3],
// [1],
// [7],
// [0]]
一次元テンソルの要素を左シフト
[1,2,3,4,5]
[2,3,4,5,6]
import * as tf from '@tensorflow/tfjs';
const xarr = [1,2,3,4,5];
const x = tf.tensor1d(xarr);
x.print();
//👇
//[1, 2, 3, 4, 5]
//新たに付け加えるテンソル
const a = tf.tensor1d([6]);
a.print();
//👇
//[6]
//先頭の要素をスライスして、末尾にテンソルを加える
x.slice([1], [-1]).concat([a]).print();
// x.slice([1]).concat([a]).print(); // -1は省略可
//👇
// [2, 3, 4, 5, 6]
[1]
[2,3,4,5]
-1
[-1]
[2, 3, 4, 5, 6]
二次元テンソルの要素を左シフト
import * as tf from '@tensorflow/tfjs';
// [[1,2],[3,4],[5,6]] から [[3,4],[5, 6],[7, 8]]へ左シフト
const x = tf.tensor2d([[1, 2], [3, 4], [5, 6]]);
const a = tf.tensor2d([[7, 8]]);
x.slice([1], [-1]).concat([a]).print();
//👇
// [[3, 4], [5, 6], [7, 8]]
import * as tf from '@tensorflow/tfjs';
// [[1,2],[3,4],[5,6]] から [[2,3],[4, 5],[6, 7]]へ左シフト
const x = tf.tensor2d([[1, 2], [3, 4], [5, 6]]);
const b = tf.tensor2d([[3],[5],[7]]);
//ワンライナーで左シフトする
x.slice([0, 1], [-1,-1]).stack([b], 1).squeeze([2]).print();
//👇
// [[2, 3], [4, 5], [6, 7]]
///上のワンライナー操作で個別に分解してみる
//①2番目の軸の最初の要素から切り出し
x.slice([0,1],[-1,-1]).print();
//👇
// [[2],
// [4],
// [6]]
//②テンソルbと2番目の軸で結合
//形状[3,1]と[3,1]の結合は[3,2,1]の拡張として解釈
x.slice([0,1],[-1,-1]).stack([b], 1).print();
//👇
// [[[2],[3]],
// [[4],[5]],
// [[6],[7]]]
//③余分に出た3番目の軸を圧縮し次元を一つ落とす
//[3,2,1] --> [3,2]
x.slice([0,1],[-1,-1]).stack([b], 1).squeeze([2]).print();
//👇
// [[2, 3], [4, 5], [6, 7]]
x.slice([0,1],[-1,-1]).stack([b],1).unstack(2)[0].print();
reshapeで汎用性の高いテンソル変換
tensor1d
tensor6d
import * as tf from '@tensorflow/tfjs';
const x = tf.tensor1d([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
x.print();
//👇 Shape: [16]
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
x.reshape([1, 8, 2]).print();
//👇 [16] --> [1,8,2]
// [[[1 , 2 ],
// [3 , 4 ],
// [5 , 6 ],
// [7 , 8 ],
// [9 , 10],
// [11, 12],
// [13, 14],
// [15, 16]]]
x.reshape([1, 8, 2]).reshape([16, 1]).print();
//👇 [16] --> [1,8,2] --> [16,1]
// [[1 ],
// [2 ],
// [3 ],
// [4 ],
// [5 ],
// [6 ],
// [7 ],
// [8 ],
// [9 ],
// [10],
// [11],
// [12],
// [13],
// [14],
// [15],
// [16]]
x.reshape([1, 8, 2]).reshape([16, 1]).reshape([2, 2, 2, 2]).print();
//👇 [16] --> [1,8,2] --> [16,1] --> [2,2,2,2]
// [[[[1 , 2 ],
// [3 , 4 ]],
// [[5 , 6 ],
// [7 , 8 ]]],
// [[[9 , 10],
// [11, 12]],
// [[13, 14],
// [15, 16]]]]
テンソルを分割するsplit
import * as tf from '@tensorflow/tfjs';
const x = tf.tensor2d([1,2,3,4,5,6,7,8,9,10,11,12], [4,3]);
x.print();
// [[1 , 2 , 3 ],
// [4 , 5 , 6 ],
// [7 , 8 , 9 ],
// [10, 11, 12]]
//👇最初の次元で2つのテンソルに分割
const [a, b] = x.split([3,1], 0);
a.print();
// [[1, 2, 3],
// [4, 5, 6],
// [7, 8, 9]]
b.print();
// [[10, 11, 12],]
axis=0
[3,1]
テンソル型からNumber型配列への逆変換
import * as tf from '@tensorflow/tfjs';
const x: tf.Scalar = tf.scalar(3);
console.log(x.dataSync()[0]); // 3
console.log(x.dataSync()[0] - 2); // 1 (Number型になっている)
const y: tf.Tensor = tf.tensor1d([4]);
console.log(y.dataSync()[0] - 2); // 2
const arr = [];
const a: tf.Scalar = tf.scalar(1);
const b: tf.Scalar = tf.scalar(2);
array.push(a);
array.push(b);
const values = array.map(t => t.dataSync()[0]);
console.log(values); // [ 1, 2 ]
TensorFlowの導入からKerasまでを実践的に解説 現場で使える!TensorFlow開発入門 Kerasによる深層学習モデル構築手法
まとめ
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー