TensorFlow.JSでアヤメの分類を学習させてみた(初歩の初歩/その2)


2、TensorFlow.JSでアヤメの分類を学習

 定番であるアヤメの分類の学習を作成してみます。 これは、アヤメの花びらの幅、長さとがくの幅、長さの4つの数値及びアヤメの種類(setosa,versicolor,virginica)の情報を元に各数値からアヤメの種類の確率を予測するものです。 その学習手法については多数の方が各URLに記載していますので特に説明はしませんが、その多くが学習が綺麗に収束する確立された学習モデルを使用しています。 ここでは、学習が収束する「通常版」と自分で学習モデルを構築する「学習モデル検討用」の2種類のプログラムを作成しました。
 実際の動作は、ここ(アヤメの分類の学習/通常版)あるいはここ(アヤメに分類の学習/学習モデル検討用)をクリックして下さい。

2-1、アヤメの分類を学習(通常版)

 手順としては、前回の記事「TensorFlow.JSを使用してみた(初歩の初歩/その1)」とほぼ同様で次の通りです。
(1) 学習モデルを作成する。
 先人たちの学習モデルを参考に1層分の中間層を有する次の図のようなモデルを作成します。

TensorFlow.JS用学習モデル作成
let model = tf.sequential();
model.add(tf.layers.dense({
    inputShape: [ 4 ],
    activation: "sigmoid",
    units: 10
}));
model.add(tf.layers.dense({
    activation: "softmax",
    units: 3
}));

(2) 学習用入力データと教師データを準備する。
 アヤメ分類用の学習データは、「Iris flower data set」としてインターネット上の各所にありますが、今回は次のURLからCSVファイルをダウンロードしました。
https://gist.github.com/netj/8836201」
 入力データとして、アヤメの花びらの幅、長さとがくの幅、長さの4つの数値の配列(xTrainData)を教師データとして3つのアヤメの種類(setosa,versicolor,virginica)に対応した配列(yTrainData)を準備し、それぞれに所要数のデータを格納しました。 検証用データについても同様です。
(3) 作成したデータをTensorFlow.JS用に変換する。
 学習用データ(xTrainData, yTrainData)と検証用データ(xTestData, yTestData)をそれぞれTensorFlow.JS用データに変換します。

TensorFlow.JS用データに変換
  const xTrain = tf.tensor2d( xTrainData, [ xTrainData.length, 4 ], 'float32' );
  const yTrain = tf.tensor2d( yTrainData, [ yTrainData.length, 3 ], 'int32' );
  const xTest = tf.tensor2d( xTestData, [ xTestData.length, 4 ], 'float32' );
  const yTest = tf.tensor2d( yTestData, [ yTestData.length, 3 ], 'int32' );

(4) 学習の実行
 作成した学習データ(xTrain、yTrain)を使用して学習させ、検証データとして xTest と yTest を指定しています。 なお、callbacksの中身は、途中経過の表示です。

学習の実行
// 学習過程の設定
  model.compile({
    loss: "categoricalCrossentropy",
    optimizer: tf.train.adam(optimize),
    metrics: ['accuracy']
  });

// 学習と学習経過をdspに格納
  const history = await model.fit( xTrain, yTrain, {
    epochs: epochData,
    validationData:[ xTest, yTest ],
    callbacks: {
        onEpochEnd: async (epoch, logs) => {
        if(((epoch + 1) % (epochData/5)) == 0) {
            dsp = dsp + ("      " + (Train_count + epoch)).slice(-7) + " : " + (logs.loss + "000000000000").slice(0,12) + " / " + (logs.acc + "000000000000").slice(0,12) + "  /  " + (logs.val_loss + "000000000000").slice(0,12) + " / " + (logs.val_acc + "000000000000").slice(0,12) + "\n";
            document.getElementById("dump").value = dsp;
        }
        },
    }
  });

(5) 評価用データをTensorFlow.JS用に変換する。
 評価用として入力したアヤメの花びらの幅、長さとがくの幅、長さの4つの数値(d_0, d_1, d_2, d_3)をTensorFlow.JS用に変換します。

TensorFlow.JS用データに変換
    const inputData = tf.tensor2d( [ d_0, d_1, d_2, d_3 ], [ 1, 4 ], 'float32' );

(6) 評価の実行
 ここでresultsにアヤメの種類(setosa,versicolor,virginica)に対応した評価結果が配列として格納されます。

TensorFlow.JS用データに変換
    const outputData = model.predict(inputData);
    var results = outputData.dataSync();

 実際の動作は、ここ(アヤメの分類の学習/通常版)をクリックして下さい。

2-2、アヤメの分類を学習(学習モデル検討用)

 次に自分で学習モデルを構築するプログラムを作成しました。  基本的な手順は上記と同様ですが、学習モデルは中間層2層まで指定できるようにしました。 各層のユニット数ならびに活性化関数を指定することにより学習モデルを指定することができます。

学習モデルの構築
    if(Dense == 2) {               // 中間層2層の場合
    model.add(tf.layers.dense({units: UN_1, activation: Act_01, inputShape: [4]}));
    model.add(tf.layers.dense({units: UN_2, activation: Act_02}));
    model.add(tf.layers.dense({units: 3, activation: Act_00}));
    } else if(Dense == 1) {        // 中間層1層の場合
    model.add(tf.layers.dense({units: UN_1, activation: Act_01, inputShape: [4]}));
    model.add(tf.layers.dense({units: 3, activation: Act_00}));
    } else {                       // 中間層なしの場合
    model.add(tf.layers.dense({units: 3, activation: Act_00, inputShape: [4]}));
    }

 色々な組み合わせで学習モデルを構築し、学習の進み具合を確認してみてください。 中間層なしでもそれなりに学習するようです。

 実際の動作は、ここ(アヤメに分類の学習/学習モデル検討用)をクリックして下さい。


TensorFlow.JSを使用してみたの記事内容

1、TensorFlow.JSで簡単な関数を学習させてみた
2、TensorFlow.JSでアヤメの分類を学習させてみた
3、TensorFlow.JSで手入力数字の認識を学習させてみた
4、TensorFlow.JSで画像の認識(分類)を学習させてみた

ここに記載したHTML/JavaScriptの動作を確認したい方は、「http://hal322.html.xdomain.jp/」を参照ください。