14_6:モデルとレイヤー

モデル

モデルは、プログラミング概念で言う関数のようなものです。モデルに入力を与えると、モデルは希望する出力を生み出します。
TensorFlow.jsには、モデルの作成方法が2通りあります。

直接演算を使用する
// 関数を定義する
function predict(input) {
    // tf.tidyはtf.Tensorが使用したGPUメモリすべてをクリーンアップする
    return tf.tidy(() => {
        const x = tf.scalar(input);

        // y = a * x ^ 2 + b * x + c
        const ax2 = a.mul(x.square());
        const bx = b.mul(x);
        const y = ax2.add(bx).add(c);

        return y;
    });
}

// y = x^2 + 2x + 1 with x = 2
const a = tf.scalar(1);
const b = tf.scalar(2);
const c = tf.scalar(1);

const result = predict(2);
result.print();
/*
Tensor
    9
*/
高レベルAPIを使用する

モデルは、レイヤー(層)で構成される主要な抽象(primary abstraction)と考えることができます。
モデルは訓練ができ、評価でき、推測に使うことができます。

モデルを作成する関数には次の2つがあります。
– tf.sequential(): tf.Sequential(tf.Modelを拡張した)オブジェクトを返す。1つのレイヤーの出力が次のレイヤーになるときに使用する(レイヤーの線形の重なりのみサポートする)。
– tf.model(): tf.Modelを作成する。これはレイヤーの任意のグラフ(サイクルのない)をサポートする。

TensorFlow.jsでは、tf.Modelが訓練や推測、評価の基本単位となります。
以下はその役立つメソッドです。
– compile(): optimizer(オプティマイザー)やloss(損失関数)、metrics(評価関数)を加えてモデルを構成し、訓練と評価の準備をする。
– evaluate(): テストモードのとき、モデルの損失値と評価値(compile()時に指定された)を返す。
– predict(), predictOnBatch(): 入力や、サンプルの単一バッチに対する推測の出力を生成する。
– fit(): 固定されたエポック(データセットを一巡すること)数だけモデルを訓練する。
– getLayer(): 名前やインデックスでレイヤーを取得する。

以下は、tf.sequentialを使って、畳み込みイメージ分類モデル(convolutional image classifier model)を構成する例です。

const model = tf.sequential();

model.add(tf.layers.conv2d({
    inputShape: [28, 28, 1],
    kernelSize: 5,
    filters: 8,
    strides: 1,
    activation: 'relu',
    kernelInitializer: 'varianceScaling'
}));
model.add(tf.layers.maxPooling2d({ poolSize: [2, 2], strides: [2, 2] }));
model.add(tf.layers.conv2d({
    kernelSize: 5,
    filters: 16,
    strides: 1,
    activation: 'relu',
    kernelInitializer: 'varianceScaling'
}));
model.add(tf.layers.maxPooling2d({ poolSize: [2, 2], strides: [2, 2] }));
model.add(tf.layers.flatten());
model.add(tf.layers.dense(
    { units: 10, kernelInitializer: 'varianceScaling', activation: 'softmax' }));

const LEARNING_RATE = 0.15;
const optimizer = tf.train.sgd(LEARNING_RATE);
model.compile({
  optimizer: optimizer,
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy'],
});

レイヤー(層)

上記モデルは、連続する次の6つのレイヤーを持っています。

– 2次元の畳み込みレイヤー:イメージ上でフィルターウィンドウをスライドさせて変換を学習する。
– マックスプーリングレイヤー:その結果をダウンサンプリングする。
– 2つめの畳み込みレイヤー:次にもう1つプーリングレイヤーをつなげる。レイヤー構造の繰り返し。
– 平滑化レイヤー:前のレイヤーの出力をベクトルにする。
– 全結合レイヤー:最終的な分類を実行する。

では、レイヤーとは何なのでしょう?

レイヤーは、モデルを構成するための主要な基本要素です。
各レイヤーは入力を得て、何らかの計算を実行し、出力を生成します。レイヤー内部のさまざまな変数や重みは自動的に作成され、初期化されます。

TensorFlow.jsにはさまざまなタイプのレイヤーが数多くあります。

基本

tf.layers.activation
tf.layers.dense
tf.layers.dropout
tf.layers.embedding
tf.layers.flatten
tf.layers.repeatVector
tf.layers.reshape

畳み込み

tf.layers.conv1d
tf.layers.conv2d
tf.layers.conv2dTranspose
tf.layers.depthwiseConv2d
tf.layers.separableConv2d

マージ

tf.layers.add
tf.layers.average
tf.layers.concatenate
tf.layers.maximum
tf.layers.minimum
tf.layers.multiply

正規化

tf.layers.batchNormalization

プーリング

tf.layers.averagePooling1d
tf.layers.averagePooling2d
tf.layers.globalAveragePooling1d
tf.layers.globalAveragePooling2d
tf.layers.globalMaxPooling1d
tf.layers.globalMaxPooling2d
tf.layers.maxPooling1d
tf.layers.maxPooling2d

リカレント

tf.layers.gru
tf.layers.gruCell
tf.layers.lstm
tf.layers.lstmCell
tf.layers.rnn
tf.layers.simpleRNN
tf.layers.simpleRNNCell
tf.layers.stackedRNNCells

高度な活性化

tf.layers.elu
tf.layers.leakyReLU
tf.layers.softmax
tf.layers.thresholdedReLU

もっと詳しく知りたい場合は、TensorFlow.js Layers APIを参照してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA