1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

はじめてのTensorflow.js

Last updated at Posted at 2020-02-19

本記事では、Webブラウザで使用できる機械学習ライブラリである、Tensorflow.jsについてまとめました。

参考: TensorFlow.js

環境構築は、Vueを使っていた関係で、Nuxt v2.9 + Typescriptの環境構築を参考にしています。

特徴

  • Webで使える
    画像のDOM要素をテンソルとしてインポートできる。=> ウェブカメラの情報が使える.など、、、

  • WebGLなどを使用したハードウェアアクセラレーション

  • Tensorflowとの互換性

  • データのプライバシー
    データをサーバーに送る必要がない。また、クライアント側で学習も可能

インストール

npm install @tensorflow/tfjs-node

また,'WebGL2RenderingContext' was also declared here.のようなエラーが発生する場合は、以下もダウンロードが必要。

npm install -D '@types/webgl2'

以下が実行できるか試す

import * as tf from '@tensorflow/tfjs-node';

const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [2]}));

model.compile({loss: 'meanSquaredError', optimizer: 'adam'});

const xs = tf.tensor2d([[0, 0], [0, 1], [1, 0], [1, 1]], [4, 2]);
const ys = tf.tensor2d([0, 1, 1, 0], [4, 1]);

model.fit(xs, ys).then(() => {
 (model.predict(tf.tensor2d([[0, 1]], [1, 2])) as tf.Tensor).print(); //as tf.Tensorとしなければエラーが出た
});

以下のコマンドで実行

tsc ./path_to_ts.ts
node ./path_to_js.js

>>Tensor
     [[0.6098874],]

基礎

以下、基礎的な操作をまとめています。

import * as tf from '@tensorflow/tfjs-node'; 

const t1 = tf.tensor1d([1, 2, 3]); 
t1.print(); 
// Tensor
//    [1, 2, 3]

const t2 = tf.tensor2d([1, 2, 3, 4], [2, 2]);
t2.print();
// Tensor
//    [[1, 2],
//     [3, 4]]

const t = tf.tensor1d([1, 2, 3]);

// 非同期
t.data().then(b => {
  console.log(b); // Float32Array(3) [1, 2, 3]
});

// 同期
console.log(t.dataSync()); // Float32Array(3) [1, 2, 3]

// Operation
const t3 = tf.tensor([1, 2, 3, 4]);
const t4 = tf.tensor([10, 20, 30, 40]);

t3.add(t4).print();
// Or
tf.add(t3, t4).print();
//Tensor
//[11, 22, 33, 44]


//メモリー開放
console.log(tf.memory()); //メモリー情報を検査
// -> {unreliable: true,  numTensors: 7, numDataBuffers: 7, numBytes: 104}
const a = tf.tensor([1, 2, 3]);
console.log(tf.memory()); 
// -> {unreliable: true, numTensors: 8, numDataBuffers: 8, numBytes: 116}
a.dispose();
console.log(tf.memory()); 
// -> {unreliable: true,  numTensors: 7, numDataBuffers: 7, numBytes: 104}

//上記のメモリー開放は手作業でめんどくさい => tidyを用いて、関数の実行後、クリーンアップ
const a1 = tf.tensor([1, 2, 3]);

const y = tf.tidy(() => {
  const result = a1.square().log().neg();
  return result;  
});

レイヤーの構築

層を追加していく方法についてまとめています。

import * as tf from '@tensorflow/tfjs-node'; 

//レイヤー

const model = tf.sequential({
  layers: [
    tf.layers.dense({inputShape: [784], units: 16, activation: 'relu'}),
    tf.layers.dense({units: 10, activation: 'softmax'}),
  ]
 });

/* レイヤー構築後にレイヤを追加
const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
*/

//機能ごとにレイヤーを構成
const input = tf.input({shape: [784]});
const dense1 = tf.layers.dense({units: 16, activation: 'relu'}).apply(input);
const dense2 = tf.layers.dense({units: 10, activation: 'softmax'}).apply(dense1);
const model2 = tf.model({inputs: input, outputs: dense2 as tf.SymbolicTensor});

model2.summary()
/*
_________________________________________________________________
Layer (type)                 Output shape              Param #   
=================================================================
input1 (InputLayer)          [null,784]                0         
_________________________________________________________________
dense_Dense3 (Dense)         [null,16]                 12560     
_________________________________________________________________
dense_Dense4 (Dense)         [null,10]                 170       
=================================================================
Total params: 12730
Trainable params: 12730
Non-trainable params: 0
_________________________________________________________________
*/

//アクティベーションなど
const input2 = tf.tensor([-2, 1, 0, 5]);
const output = tf.layers.activation({activation: 'relu'}).apply(input2);
(output as tf.Tensor).print(); // [0, 1, 0, 5]

まとめ

TypeScriptを使っている関係か、as tf.Tensorとしてprintを使用したりしています。TypeScriptは、かなり初心者(はじめて2日くらい)なので、問題点の指摘やアドバイスをいただければ、嬉しいです。また、今後継続して、Tensorflow.jsは記事にしていきたいと思っています。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?