TensorFlowを使った自作ラッパーを作成しました

Abstract

TensorFlowそのものの動作を学ぶために作った機械学習用の自作ラッパーを紹介します。現在はいくつか機能(RNN対応、活性化関数の追加)が増えているのですが、今回のエントリーでは一番初めにベースとなったDNNの自作ラッパーをもとに設計の時に考えたこと文章として残しておきます。

ラッパー作成に関してはTensorFlowやchainerのフロントエンドとして使われているKerasのインターフェイスをある程度参考に実装を行っています。

Background

機械学習によって画像処理分野を中心に様々な成果が上がっています。また、TensorFlowやchainerなどの機械学習のためのライブラリや書籍も充実してきたことにより、個人のアイディアを機械学習(ディープラーニング)で試すことが比較的容易になってきました。機械学習を使う上でできることとできないこと、従来のアルゴリズムとの違いを知ることが重要になっています。

 

Purpose

  • ある程度低いレベルの実装まで記述できるTensorFlowのコーディングに慣れるため
  • TensorFlow側でエラーが起きた場合の対処法を学ぶため
  • 自分である程度カスタマイズできる機械学習のコードが欲しかったため

モデルとして効果が示されているmnistの文字認識を用いることで、実装によるエラーのみに集中できるようにしました。

 

Design

TensorFlow用の自作ラッパーは3つのクラスによって実装されています

  • どのような推論を行うかを定義するクラス
  • 活性化関数を定義するクラス
  • 損失関数を定義するクラス

推論を定義するクラスですが、推論のエンジン部となります。実際にクラスの内部で実装した関数を以下に示します。

line18/line23のようにTensorFlow内では活性化関数は関数名で識別されるのですが(set_layer_reluやset_layer_softmax)、中間層や出力層の活性化関数の変更を行う際はこの推論部のコードを直接変更する必要があります。しかし、モデルの変更をするたびに機械学習のコアになる部分のコードの書き換えを行うと人為的ミスによるエラーが発生する可能性が高まります。また、モデルの変更の際にコードの修正箇所があちこちに散らばるとエラーのもとになります。そこで、コードの変更箇所を局所化、かつコアの推論部をカプセル化するために「活性化関数を定義するクラス」と「損失関数を定義するクラス」を作成しました。

活性化関数を定義するクラスを以下に示します。

抽象クラスであるLayerクラスのコンストラクタに活性化関数の名前を渡すことで、あらかじめ用意しておいたreluやsoftmaxなどの活性化関数のクラスのインスタンスを呼び出します。使用する活性化関数を事前に定義しておくことで、関数名を書き換えることなく活性化関数の変更が可能となります。運用する際はモデルを定義する関数を別に作っておくことで局所化も可能になります。

損失関数を定義するクラスも活性化関数と似たような実装になっています。

 

Parameter

パラメータは次のものを与えることにしました

  • 入力データの次元
  • 出力データの次元
  • 隠れ層の各層の層数のリスト
  • 使用する活性化関数のリスト
  • 使用する損失関数
  • ドロップアウトする割合
  • epoch数
  • batchサイズ

ここで示されたパラメータを変更する分には基本的には推論のエンジン部を触る必要はありません

 

Function

機能は次のものを取り入れました

  • 訓練用の”train”モードと、評価用の”eval”モードの切り替え
  • 学習結果を保存するかしないか(save)
  • 保存されている学習結果を読み込むか、無視するか(load)

学習済みのデータをloadするときは必要なplaceholderをあらかじめ定義しておく必要があったような気がします。

Result

githubに公開しています。NN.pyを実行することで試すことができます。初回はdatasetディレクトリ内にあるmnist.pyが手書き文字データをダウンロードするためネットワークへの接続が必要です。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to top