Path: blob/master/site/ja/tutorials/customization/custom_layers.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
カスタムレイヤー
ニューラルネットワークの構築には、高レベルの API である tf.keras
を使うことを推奨しますが、TensorFlow API のほとんどは、eager execution でも使用可能です。
レイヤー:有用な演算の共通セット
機械学習モデルのコーディングでは、個々の演算やひとつひとつの変数を操作するよりは、より高度に抽象化された演算を実行することが望ましい場合が多くあります。
多くの機械学習モデルは、比較的単純なレイヤーの合成やスタックとして表現することができますが、TensorFlow には一般的なレイヤーが多数用意されているだけでなく、独自のアプリケーション固有のレイヤーをゼロからまたは既存のレイヤーの合成として記述する簡単な方法が提供されています。
TensorFlow では、tf.keras パッケージに Keras API のすべてが含まれています。Keras のレイヤーは、独自のモデルを構築する際に大変便利です。
既存のレイヤーのすべての一覧は、ドキュメントを参照してください。Dense(全結合レイヤー)、Conv2D、LSTM、BatchNormalization、Dropoutなどのたくさんのレイヤーが含まれています。
カスタムレイヤーの実装
独自のレイヤーを実装する最良の方法は、tf.keras.Layer クラスを拡張し、下記のメソッドを実装することです。
__init__
:入力に依存しないすべての初期化を実行できますbuild
:入力テンソルの形状を知っている場合、残りの初期化を行うことができます。call
:フォワード計算を行います。
build
が呼ばれるまで変数の生成を待つ必要はなく、__init__
で作成できることに注意してください。しかしながら、build
で変数を生成することの優位な点は、レイヤーが演算する入力の形状に基づいて、後から定義できる点です。これに対して、__init__
で変数を生成するには、必要な形状を明示的に指定する必要があります。
できるだけ標準のレイヤーを使ったほうが、概してコードは読みやすく保守しやすくなります。コードを読む人は標準的なレイヤーの振る舞いに慣れているからです。tf.keras.layers
にはないレイヤーを使うことを希望する場合には、github の課題を作成するか、プルリクエスト (推薦) を送ってください。
モデル:レイヤーの組み合わせ
機械学習では、多くのレイヤーに類するものが、既存のレイヤーを組み合わせることで実装されています。例えば、ResNet の残差ブロックは、畳込み、バッチ正規化とショートカットの組み合わせです。レイヤーは他のレイヤー内にネストできます。
通常、Model.fit
、Model.evaluate
、および、Model.save
などのモデルメソッドが必要な場合は、keras.Model
から継承します。
keras.Model
により提供されるもう 1 つの機能(keras.layers.Layer
の代わりに)として、変数の追跡に加えて、keras.Model
もその内部レイヤーを追跡し、検査を容易にします。
たとえば、ResNet ブロックは次のとおりです。
しかし、ほとんどの場合には、モデルはレイヤーを次々に呼び出すことで構成されます。tf.keras.Sequential クラスを使うことで、これをかなり短いコードで実装できます。
次のステップ
それでは、前のノートブックに戻り、レイヤーとモデルを使って、線形回帰の例をより構造化された形で実装してみてください。