6_1 モデルの中身 その1

5_1_2 モデルの構築」で示したbuildModel()関数のコードを上から順に見ていきます。

const model = tf.sequential();

tf.sequential()関数はtf.Sequentialクラスのモデルを作成して返します。このモデルは、レイヤー(tf.layers.Layerクラスのインスタンス)を追加することで、層状に積み重ねることができます。

次のコードでは、tf.Sequentialクラスのadd()メソッドを使って、tf.layers.dense()関数が返すDenseレイヤーを追加しています。Denseレイヤーは、下図で示すように、機械学習でニューロンと呼ばれる基本単位を全部結合させます。

model.add(tf.layers.dense({
    units: 10,
    activation: 'sigmoid',
    inputShape: [2]
}));

unitsプロパティに指定している10はニューロンの数です。前のあやめデータの例のように、5.1と3.5が入力値として渡されると、2 x 10 = 20本の線で、全結合されます。initShapeプロパティに指定している[2]は、[5.1, 3.5]や[0, 1]の次元数(要素の数)です。モデルに追加する最初のレイヤーには、initShapeプロパティを指定する必要があります。activationプロパティには、活性化関数と呼ばれるものを指定します。

2つめのadd()メソッドでも、tf.layers.dense()関数を使って、全結合のDenseレイヤーを追加しています。ここでは、出力を2クラス分の2つにしたいので、unitsに2を指定しています。また活性化関数にはsoftmaxを指定しています。

model.add(tf.layers.dense({
    units: 2,
    activation: 'softmax'
}));

[5.1, 3.5]というデータがこのモデルに入ると、5.1と3.5は別個のニューロンに取り込まれ、全結合の線をたどって右に流れます。そのときには、Denseレイヤー固有の計算が行われます。具体的には値に重みが掛けられ、バイアスが足されて、sigmoid活性化関数によって値が整えられて、結果の数値が全部加算されます。

2つめのDenseレイヤーにはこの計算結果が渡され、ここでもDenseレイヤーの計算が行われて、softmax活性化関数によって確率と見なされる値に整えられます。

モデルの内部では、下図に示す計算が高速で行われています。

  1. 入力データxが来る
  2. Denseレイヤーで、xに重み(w)が掛けられ、バイアス(b)が足される(a)
  3. aは活性化関数sigmoidによって整えられ(z)、次のレイヤーに渡される
  4. Denseレイヤーで、zに重みが掛けられ、バイアス(b)が足される(a)
  5. aは活性化関数softmaxによって、確率を表す値となる(y)
  6. yを教師データのtと比べ、答え合わせをする
  7. 正解との差が小さくなる方向に、重みの値を少しだけ調整し、また2から繰り返す

コメントを残す

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

CAPTCHA