Copyright 2018 The TensorFlow Authors.
Keras
Note: これらのドキュメントは私たちTensorFlowコミュニティが翻訳したものです。コミュニティによる 翻訳はベストエフォートであるため、この翻訳が正確であることや英語の公式ドキュメントの 最新の状態を反映したものであることを保証することはできません。 この翻訳の品質を向上させるためのご意見をお持ちの方は、GitHubリポジトリtensorflow/docsにプルリクエストをお送りください。 コミュニティによる翻訳やレビューに参加していただける方は、 [email protected] メーリングリストにご連絡ください。
Kerasは、深層学習モデルを構築・学習するための高水準APIです。 迅速なプロトタイピングから先端研究、実運用にも使用されており、3つの特徴があります:
ユーザーフレンドリー
一般的なユースケースに最適化したKerasのAPIは、シンプルで統一性があります。誤った使い方をした場合のエラー出力も明快で、どう対応すべきか一目瞭然です。モジュール性
Kerasのモデルは、設定可能なモジュールをつなぎ合わせて作られます。モジュールのつなぎ方には、ほとんど制約がありません。拡張性
簡単にモジュールをカスタマイズできるため、研究の新しいアイデアを試すのに最適です。新しい層、損失関数を自作し、最高水準のモデルを開発しましょう。
tf.keras のインポート
tf.keras
は、TensorFlow版 Keras API 仕様 です。 モデルを構築・学習するための高水準APIであり、TensorFlow特有の機能である Eagerモードやtf.data
パイプライン、 Estimators にも正式に対応しています。 tf.keras
は、TensorFlowの柔軟性やパフォーマンスを損ねることなく使いやすさを向上しています。
TensorFlowプログラムの準備として、先ずは tf.keras
をインポートしましょう:
tf.keras
ではKerasと互換性のあるコードを実行できますが、注意点もあります:
最新リリースのTensorFlowに同梱されている
tf.keras
のバージョンと、pipインストールした最新のkeras
のバージョンが同一とは限りません。バージョンはtf.keras.__version__
の出力をご確認ください。モデルの重みを保存する場合、
tf.keras
のデフォルトの保存形式は チェックポイント形式です。 HDF5形式にて保存する場合は、save_format='h5'
オプションを指定してください。
単純なモデルの構築
シーケンシャル モデル
Kerasでは、層を組み合わせてモデルを構築します。 モデルは通常、複数の層から成るグラフ構造をしています。 最も一般的なモデルは、単純に層を積み重ねる類の tf.keras.Sequential
モデルです。
単純な全結合ネットワーク(いわゆる マルチ レイヤー パーセプトロン)を構築してみましょう:
層の設定
tf.keras.layers
はさまざまな層を提供していますが、共通のコンストラクタ引数があります:
activation
: 層の活性化関数を設定します。組み込み関数、もしくは呼び出し可能オブジェクトの名前で指定します。デフォルト値は、活性化関数なし。kernel_initializer
・bias_initializer
: 層の重み(カーネルとバイアス)の初期化方式。名前、もしくは呼び出し可能オブジェクトで指定します。デフォルト値は、"Glorot uniform"
。kernel_regularizer
・bias_regularizer
:層の重み(カーネルとバイアス)に適用する、L1やL2等の正則化方式。デフォルト値は、正則化なし。
コンストラクタ引数を使って tf.keras.layers.Dense
層をインスタンス化する例を以下に示します:
学習と評価
学習の準備
モデルを構築したあとは、compile
メソッドを呼んで学習方法を構成します:
tf.keras.Model.compile
には3つの重要な引数があります:
optimizer
: このオブジェクトが訓練方式を規定します。tf.train
モジュールからtf.train.AdamOptimizer
やtf.train.RMSPropOptimizer
、tf.train.GradientDescentOptimizer
等のオプティマイザ インスタンスを指定します。loss
: 最適化の過程で最小化する関数を指定します。平均二乗誤差(mse
)やcategorical_crossentropy
、binary_crossentropy
等が好んで使われます。損失関数は名前、もしくはtf.keras.losses
モジュールから呼び出し可能オブジェクトとして指定できます。metrics
: 学習の監視に使用します。 名前、もしくはtf.keras.metrics
モジュールから呼び出し可能オブジェクトとして指定できます。
学習用モデルの構成例を2つ、以下に示します:
NumPy データの入力
小規模なデータセットであれば、モデルを学習・評価する際にインメモリの NumPy配列を使いましょう。 モデルは fit
メソッドを使って学習データに適合させます。
tf.keras.Model.fit
は3つの重要な引数があります:
epochs
: エポック は学習の構成単位で、(バッチに分割した)全入力データを一巡したものを1エポックと換算します。batch_size
: NumPyデータを渡されたモデルは、データをバッチに分割し、それを順繰りに舐めて学習を行います。一つのバッチに配分するサンプル数を、バッチサイズとして整数で指定します。全サンプル数がバッチサイズで割り切れない場合、最後のバッチだけ小さくなる可能性があることに注意しましょう。validation_data
: モデルの試作中に評価データを使って簡単にパフォーマンスを監視したい場合は、この引数に入力とラベルの対を渡すことで、各エポックの最後に推論モードで評価データの損失と評価指標を表示することができます。
validation_data
の使用例:
tf.data データセットの入力
大規模なデータセット、もしくは複数デバイスを用いた学習を行う際は Datasets API を使いましょう。 fit
メソッドにtf.data.Dataset
インスタンスを渡します:
fit
メソッドの引数 steps_per_epoch
には、1エポックあたりの学習ステップ数を指定します。 Dataset
がバッチを生成するため batch_size
の指定は不要です。
Dataset
は評価データにも使えます:
評価と推論
tf.keras.Model.evaluate
と tf.keras.Model.predict
メソッドは、NumPyデータとtf.data.Dataset
に使えます。
推論モードでデータの損失と評価指標を評価する例を示します:
推論 結果を最終層のNumPy配列として出力する例を示します:
高度なモデルの構築
Functional API
tf.keras.Sequential
モデルは層を積み重ねる単純なつくりであり、あらゆるモデルに対応しているわけではありません。 以下に挙げる複雑な構成のモデルを構築するには Keras functional API を使いましょう:
入力ヘッドが複数あるモデル
出力ヘッドが複数あるモデル
共有層(おなじ層が複数回呼び出される)を含むモデル
(残差結合のように)データの流れが分岐するモデル
Functional API を用いたモデル構築の流れ:
層のインスタンスは呼び出し可能で、テンソルを返します。
入力テンソルと出力テンソルを使って
tf.keras.Model
インスタンスを定義します。モデルは
Sequential
モデルと同様の方法で学習します。
Functional API を使って全結合ネットワークを構築する例を示します:
inputsとoutputsを引数にモデルをインスタンス化します。
モデルの派生
tf.keras.Model
を継承し順伝播を定義することでカスタムモデルを構築できます。 __init__
メソッドにクラス インスタンスの属性として層をつくります。 call
メソッドに順伝播を定義します。
順伝播を命令型で記載できるため、モデルの派生は Eagerモード でより威力を発揮します。
キーポイント:目的にあったAPIを選択しましょう。派生モデルは柔軟性を与えてくれますが、その代償にモデルはより複雑になりエラーを起こしやすくなります。目的がFunctional APIで賄えるのであれば、そちらを使いましょう。
tf.keras.Model
を継承して順伝播をカスタマイズした例を以下に示します:
今定義した派生モデルをインスンス化します。
層のカスタマイズ
tf.keras.layers.Layer
を継承して層をカスタマイズするには、以下のメソッドを実装します:
build
: 層の重みを定義します。add_weight
メソッドで重みを追加します。call
: 順伝播を定義します。compute_output_shape
: 入力の形状をもとに出力の形状を算出する方法を指定します。必須ではありませんが、
get_config
メソッド とfrom_config
クラスメソッドを実装することで層をシリアライズすることができます。
入力のカーネル行列を matmul
(行列乗算)するカスタム層の実装例:
カスタマイズした層を使ってモデルを構築します:
コールバック
コールバックは、学習中のモデルの挙動をカスタマイズするためにモデルに渡されるオブジェクトです。 コールバック関数は自作する、もしくは以下に示すtf.keras.callbacks
が提供する組み込み関数を利用できます:
tf.keras.callbacks.ModelCheckpoint
:モデルのチェックポイントを一定間隔で保存します。tf.keras.callbacks.LearningRateScheduler
:学習率を動的に変更します。tf.keras.callbacks.EarlyStopping
:評価パフォーマンスが向上しなくなったら学習を中断させます。tf.keras.callbacks.TensorBoard
: モデルの挙動を TensorBoardで監視します。
tf.keras.callbacks.Callback
を使用するには、モデルの fit
メソッドにコールバック関数を渡します:
重みのみ
tf.keras.Model.save_weights
を使ってモデルの重みの保存やロードを行います。
デフォルトでは、モデルの重みは TensorFlow チェックポイント 形式で保存されます。 重みはKerasのHDF5形式でも保存できます(マルチバックエンド実装のKerasではHDF5形式がデフォルト):
構成のみ
モデルの構成も保存可能です。 モデル構造を重み抜きでシリアライズします。 元のモデルのコードがなくとも、保存された構成で再構築できます。 Kerasがサポートしているシリアライズ形式は、JSONとYAMLです。
JSONから(新たに初期化して)モデルを再構築します:
YAML形式でモデルを保存するには、 TensorFlowをインポートする前に あらかじめpyyaml
をインストールしておく必要があります:
YAMLからモデルを再構築します:
注意:call
メソッド内ににPythonコードでモデル構造を定義するため、派生モデルはシリアライズできません。
モデル全体
モデルの重み、構成からオプティマイザ設定までモデル全体をファイルに保存できます。 そうすることで、元のコードなしに、チェックポイントで保存したときと全く同じ状態から学習を再開できます。
Eagerモード
Eagerモード は、オペレーションを即時に評価する命令型のプログラミング環境です。 Kerasでは必要ありませんが、tf.keras
でサポートされておりプログラムを検査しデバッグするのに便利です。
すべてのtf.keras
モデル構築用APIは、Eagerモード互換性があります。 Sequential
や Functional APIも使用できますが、 Eagerモードは特に派生モデル の構築や 層のカスタマイズに有益です。 (既存の層の組み合わせでモデルを作成するAPIの代わりに) 順伝播をコードで実装する必要があります。
詳しくは Eagerモード ガイド (カスタマイズした学習ループとtf.GradientTape
を使ったKerasモデルの適用事例)をご参照ください。
分散
Estimators
Estimators は分散学習を行うためのAPIです。 実運用に耐えるモデルを巨大なデータセットを用いて分散学習するといった産業利用を目的にすえています。
tf.keras.Model
でtf.estimator
APIによる学習を行うには、 tf.keras.estimator.model_to_estimator
を使ってKerasモデルを tf.estimator.Estimator
オブジェクトに変換する必要があります。
KerasモデルからEstimatorsを作成するをご参照ください。
注意:Estimator input functionsをデバッグしてデータの検査を行うにはEagerモードで実行してください。
マルチGPU
tf.keras
モデルはtf.contrib.distribute.DistributionStrategy
を使用することでマルチGPU上で実行できます。 このAPIを使えば、既存コードをほとんど改変することなく分散学習へ移行できます。
目下、分散方式としてtf.contrib.distribute.MirroredStrategy
のみサポートしています。 MirroredStrategy
は、シングルマシン上でAllReduce を使った同期学習によりin-grapnレプリケーションを行います。 KerasでDistributionStrategy
を使用する場合は、tf.keras.estimator.model_to_estimator
を使って tf.keras.Model
をtf.estimator.Estimator
に変換し、Estimatorインスタンスを使って分散学習を行います。
以下の例では、シングルマシンのマルチGPUにtf.keras.Model
を分散します。
まず、単純なモデルを定義します:
入力パイプラインを定義します。input_fn
は、複数デバイスにデータを配置するのに使用する tf.data.Dataset
を返します。 各デバイスは、入力バッチの一部(デバイス間で均等に分割)を処理します。
次に、 tf.estimator.RunConfig
を作成し、 train_distribute
引数にtf.contrib.distribute.MirroredStrategy
インスタンスを設定します。MirroredStrategy
を作成する際、デバイスの一覧を指定する、もしくは引数でnum_gpus
(GPU数)を設定することができます。デフォルトでは、使用可能なすべてのGPUを使用する設定になっています:
Kerasモデルを tf.estimator.Estimator
インスタンスへ変換します。
最後に、input_fn
と steps
引数を指定して Estimator
インスタンスを学習します: