diff --git a/sources/getting-started/faq.md b/sources/getting-started/faq.md index 55dc860..a749d43 100644 --- a/sources/getting-started/faq.md +++ b/sources/getting-started/faq.md @@ -1,25 +1,28 @@ -# Keras FAQ: +# Keras FAQ: Kerasに関するよくある質問 - [Kerasを引用するには?](#keras) - [KerasをGPUで動かすには?](#kerasgpu) -- [Keras modelの保存](#keras-model) -- [なぜtraining lossがtesting lossよりもずっと大きいのですか?](#training-losstesting-loss) -- [中間層の出力を可視化するには?](#_1) -- [メモリに乗らない大きさのデータを扱うには?](#_2) +- ["sample","batch","epoch" の意味は?](#samplebatchepoch) +- [Keras modelを保存するには?](#keras-model) +- [training lossがtesting lossよりもはるかに大きいのはなぜ?](#training-losstesting-loss) +- [中間層の出力を得るには?](#_1) +- [メモリに載らない大きさのデータを扱うには?](#_2) - [validation lossが減らなくなったときに学習を中断するには?](#validation-loss) - [validation splitはどのように実行されますか?](#validation-split) - [訓練時にデータはシャッフルされますか?](#_3) -- [各epochのtraining/validation lossやaccuracyを記録するには?](#epochtrainingvalidation-lossaccuracy) +- [各epochのtraining/validationのlossやaccuracyを記録するには?](#epochtrainingvalidationlossaccuracy) - [層を "freeze" するには?](#freeze) - [stateful RNNを利用するには?](#stateful-rnn) - [Sequentialモデルから層を取り除くには?](#sequential) - [Kerasで事前学習したモデルを使うには?](#keras_1) +- [KerasでHDF5ファイルを入力に使うには?](#kerashdf5) +- [Kerasの設定ファイルの保存場所は?](#keras_2) --- ### Kerasを引用するには? -Kerasがあなたのお役に立てたら,ぜひ著書のなかでKerasを引用してください.BibTexの例は以下の通りです. +Kerasがあなたの仕事の役に立ったなら,ぜひ著書のなかでKerasを引用してください.BibTexの例は以下の通りです: ``` @misc{chollet2015keras, @@ -41,11 +44,12 @@ Kerasがあなたのお役に立てたら,ぜひ著書のなかでKerasを引 THEANO_FLAGS=device=gpu,floatX=float32 python my_keras_script.py ``` -'gpu'の部分はデバイス識別子に合わせて変更してください(例: gpu0,gpu1など). +'gpu'の部分はデバイス識別子に合わせて変更してください(例: `gpu0`,`gpu1`など). -方法2: `.theanorc`を使う: [使い方](http://deeplearning.net/software/theano/library/config.html) +方法2: `.theanorc`を使う: +[使い方](http://deeplearning.net/software/theano/library/config.html) -方法3: コードの先頭で,`theano.config.device`,`theano.config.floatX`を設定する: +方法3: コードの先頭で,`theano.config.device`,`theano.config.floatX`を手動で設定する: ```python import theano theano.config.device = 'gpu' @@ -54,19 +58,34 @@ theano.config.floatX = 'float32' --- -### Keras modelの保存 +### "sample","batch","epoch" の意味は? + +Kerasを正しく使うためには,以下の定義を知り,理解しておく必要があります: + +- **Sample**: データセットの一つの要素. + - *例:* 一つの画像は畳み込みネットワークの一つの **sample** です + - *例:* 一つの音声ファイルは音声認識モデルのための一つの **sample** です +- **Batch**: *N* のsampleのまとまり. **batch** 内のサンプルは独立して並列に処理されます. 訓練中は,batchの処理結果によりモデルが一回更新されます. + - 一般的に **batch** は,それぞれの入力のみの場合に比べて,入力データのばらつきをよく近似します.batchが大きいほど,その近似は精度が良くなります.しかし,そのようなbatchの処理には時間がかかるにも関わらず更新が一度しかされません.推論(もしくは評価,予測)のためには,メモリ領域を超えなくて済む最大のbatchサイズを選ぶのをおすすめします.(なぜなら,batchが大きければ,通常は高速な評価や予測につながるからです) +- **Epoch**: "データセット全体に対する一回の処理単位"と一般的に定義されている,任意の区切りのこと.訓練のフェーズを明確に区切って,ロギングや周期的な評価するのに利用されます. + - `evaluation_data` もしくは `evaluation_split` がKeras modelの `fit` 関数とともに使われるとき,その評価は,各 **epoch** が終わる度に行われます. + - Kerasでは, **epoch** の終わりに実行されるように [callbacks](https://keras.io/callbacks/) を追加することができます.これにより例えば,学習率を変化させることやモデルのチェックポイント(保存)が行えます. + +--- + +### Keras modelを保存するには? *Kerasのモデルを保存するのに,pickleやcPickleを使うことは推奨されません.* -`model.save(filepath)`を使うことで,以下の含む単一のHDF5ファイルにKerasのモデルを保存できます. +`model.save(filepath)`を使うことで,単一のHDF5ファイルにKerasのモデルを保存できます.このHDF5ファイルは以下を含みます. - 再構築可能なモデルの構造 - モデルの重み -- 学習時の設定 (損失関数,最適化アルゴリズム) -- 最適化アルゴリズムの状態,学習を終えた時点から正確に継続して学習可能 +- 学習時の設定 (loss,optimizer) +- optimizerの状態.これにより,学習を終えた時点から正確に学習を再開できます -`keras.models.load_model(filepath)`でモデルを再インスタンス化できます. -`load_model` は,保存してモデルの設定を使い,コンパイルも行います(ただし最初にモデルを定義した際に一度もコンパイルされなかった場合を除く). +`keras.models.load_model(filepath)`によりモデルを再インスタンス化できます. +`load_model` は,学習時の設定を利用して,モデルのコンパイルも行います(ただし,最初にモデルを定義した際に,一度もコンパイルされなかった場合を除く). 例: @@ -81,7 +100,7 @@ del model # deletes the existing model model = load_model('my_model.h5') ``` -**モデルのアーキテクチャ** のみ(weightパラメータを含まない)を保存する場合は以下の通りです: +**モデルのアーキテクチャ** (weightパラメータや学習時の設定は含まない)のみを保存する場合は,以下のように行ってください: ```python # save as JSON @@ -91,7 +110,7 @@ json_string = model.to_json() yaml_string = model.to_yaml() ``` -生成されたJSON / YAMLファイルは,人間可読であり,必要に応じて人手で編集可能です. +生成されたJSON / YAMLファイルは,人が読むことができ,必要に応じて編集可能です. 保存したデータから,以下のように新しいモデルを作成できます: @@ -101,36 +120,78 @@ from keras.models import model_from_json model = model_from_json(json_string) # model reconstruction from YAML +from keras.models import model_from_yaml model = model_from_yaml(yaml_string) ``` -**モデルの重み** を保存する場合,以下のようにHDF5を使います. +**モデルの重み** を保存する必要がある場合,以下のコードのようにHDF5を利用できます. -注: HDF5とPythonライブラリの h5pyがインストールされている必要があります(Kerasには同梱されていません). +注: 予め,HDF5とPythonライブラリの h5pyがインストールされている必要があります(Kerasには同梱されていません). ```python model.save_weights('my_model_weights.h5') ``` -モデルのインスタンス作成後,同じモデルアーキテクチャのweightパラメータを以下のようにロードします: +モデルのインスタンス作成後, *同じ* アーキテクチャのモデルへ,予め保存しておいたweightパラメータをロードできます: ```python model.load_weights('my_model_weights.h5') ``` +例えば,ファインチューニングや転移学習のために, *異なる* アーキテクチャのモデル(ただし幾つか共通の層を保持)へweightsパラメータをロードする必要がある場合, *層の名前* を指定することでweightsパラメータをロードできます: + + +```python +model.load_weights('my_model_weights.h5', by_name=True) +``` + +例: + +```python +""" +Assume original model looks like this: + model = Sequential() + model.add(Dense(2, input_dim=3, name="dense_1")) + model.add(Dense(3, name="dense_2")) + ... + model.save_weights(fname) +""" + +# new model +model = Sequential() +model.add(Dense(2, input_dim=3, name="dense_1")) # will be loaded +model.add(Dense(10, name="new_dense")) # will not be loaded + +# load weights from first model; will only affect the first layer, dense_1. +model.load_weights(fname, by_name=True) +``` + --- -### なぜtraining lossがtesting lossよりもずっと大きいのですか? +### training lossがtesting lossよりもはるかに大きいのはなぜ? -Kerasモデルにはtrainingとtestingの二つのモードがあります.DropoutやL1/L2正則化はtesting時には機能しません. +Kerasモデルにはtrainingとtestingという二つのモードがあります.DropoutやL1/L2正則化のような,正則化手法はtestingの際には機能しません. -さらに,training lossは訓練データの各バッチのlossの平均です.モデルは変化していくため,各epochの最初のバッチのlossは最後のバッチのlossよりもかなり大きくなります.一方,testing lossは各epochの最後に計算されるため,lossが小さくなります. +さらに,training lossは訓練データの各バッチのlossの平均です.モデルは変化していくため,各epochの最初のバッチのlossは最後のバッチのlossよりもかなり大きくなります.一方,testing lossは各epochの最後の状態のモデルを使って計算されるため,lossが小さくなります. --- -### 中間層の出力を可視化するには? +### 中間層の出力を得るには? + +シンプルな方法は,着目している層の出力を行うための新しい `Model` を作成することです: + +```python +from keras.models import Model + +model = ... # create the original model + +layer_name = 'my_layer' +intermediate_layer_model = Model(inputs=model.input, + outputs=model.get_layer(layer_name).output) +intermediate_output = intermediate_layer_model.predict(data) +``` -以下のように,ある入力を与えたときの,ある層の出力を返すKeras functionを記述できます: +別の方法として,ある入力が与えられたときにに,ある層の出力を返すKeras functionを以下のように記述することでも可能です: ```python from keras import backend as K @@ -141,9 +202,9 @@ get_3rd_layer_output = K.function([model.layers[0].input], layer_output = get_3rd_layer_output([X])[0] ``` -直接TheanoやTensorFlowのfunctionを利用することもできます. +同様に,TheanoやTensorFlowのfunctionを直接利用することもできます. -注: 訓練時とテスト時でモデルの振る舞いが異なる場合(例: `Dropout`や`BatchNormalization`利用時など),以下のようにlearning phaseフラグを利用してください: +ただし,学習時とテスト時でモデルの振る舞いが異なる場合(例えば `Dropout`や`BatchNormalization` の利用時など),以下のようにlearning phaseフラグを利用してください: ```python get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()], @@ -156,29 +217,13 @@ layer_output = get_3rd_layer_output([X, 0])[0] layer_output = get_3rd_layer_output([X, 1])[0] ``` -その他の中間層の出力を取得する方法については,[functional API](/getting-started/functional-api-guide)を参照してください.例えばMNISTに対してautoencoderを作成したとします: - -```python -inputs = Input(shape=(784,)) -encoded = Dense(32, activation='relu')(inputs) -decoded = Dense(784)(encoded) -model = Model(input=inputs, output=decoded) -``` - -コンパイルと学習後のモデルから,次のようにしてencoderからの出力を得ることができます: - -```python -encoder = Model(input=inputs, output=encoded) -X_encoded = encoder.predict(X) -``` - --- -### メモリに乗らない大きさのデータを扱うには? +### メモリに載らない大きさのデータを扱うには? -`model.train_on_batch(X, y)`と`model.test_on_batch(X, y)`でバッチ学習ができます.詳細は[models documentation](/models/sequential)を参照してください. +`model.train_on_batch(X, y)`と`model.test_on_batch(X, y)` を使うことでバッチ学習ができます.詳細は[モデルに関するドキュメント](/models/sequential)を参照してください. -その他に,ジェネレータを使うこともできます. `model.fit_generator(data_generator, samples_per_epoch, nb_epoch)` +代わりに,訓練データのバッチを生成するジェネレータを記述して, `model.fit_generator(data_generator, samples_per_epoch, nb_epoch)` の関数を使うこともできます. 実際のバッチ学習の方法については,[CIFAR10 example](https://github.com/fchollet/keras/blob/master/examples/cifar10_cnn.py)を参照してください. @@ -194,29 +239,30 @@ early_stopping = EarlyStopping(monitor='val_loss', patience=2) model.fit(X, y, validation_split=0.2, callbacks=[early_stopping]) ``` -詳細は[callbacks documentation](/callbacks)を参照してください. +詳細は[コールバックに関するドキュメント](/callbacks)を参照してください. --- ### validation splitはどのように実行されますか? -`model.fit`の引数`validation_split`を例えば0.1に設定すると,データの*最後の10%*が検証用に利用されます(0.25なら最後の25%). +`model.fit` の引数 `validation_split` を例えば0.1に設定すると,データの *最後の10%* が検証のために利用されます.例えば,0.25に設定すると,データの最後の25%が検証に使われます.ここで,validation splitからデータを抽出する際にはデータがシャッフルされないことに注意してください.なので,検証は文字通り入力データの *最後の* x% のsampleに対して行われます. +(同じ `fit` 関数が呼ばれるならば)全てのepochにおいて,同じ検証用データが使われます. --- ### 訓練時にデータはシャッフルされますか? -`model.fit`の引数`shuffle`が`True`であればシャッフルされます(初期値はTrueです).各epochでデータはランダムにシャッフルされます. +`model.fit` の引数 `shuffle` が `True` であればシャッフルされます(初期値はTrueです).各epochで訓練データはランダムにシャッフルされます. -検証用データ(validation data)はシャッフルされません. +検証用データはシャッフルされません. --- -### 各epochのtraining/validation lossやaccuracyを記録するには? +### 各epochのtraining/validationのlossやaccuracyを記録するには? -`model.fit`が返す`History`コールバックの`history`を参照してください. +`model.fit` が返す `History` コールバックの `history` を参照してください. `history` はlossや他の指標のリストを含んでいます. ```python hist = model.fit(X, y, validation_split=0.2) @@ -227,16 +273,16 @@ print(hist.history) ### 層を "freeze" するには? -層を "freeze" することは学習から層を除外することを意味します,すなわちその重みは決して更新されません. -このことはモデルのfine-tuningやテキスト入力のための固定されたembeddingsを使用するという文脈において有用です. +層を "freeze" することは学習からその層を除外することを意味します,その場合,その層の重みは更新されなくなります. +このことはモデルのファインチューニングやテキスト入力のための固定されたembeddingsを使用する際に有用です. -層のコンストラクタの`trainable`に真偽値をに渡すことで,層を学習しないようにできます. +層のコンストラクタの `trainable` 引数に真偽値を渡すことで,層が学習しないようにできます. ```python frozen_layer = Dense(32, trainable=False) ``` -加えて,インスタンス化後に層の`trainable`propertyに`True`か`False` を与えることができます.このことによる影響としては,`trainable`propertyの変更後のモデルで`compile()`を呼ぶ必要があります.以下にその例を示します: +加えて,インスタンス化後に層の `trainable` propertyに `True` か `False` を設定することができます.設定の有効化のためには, `trainable` propertyの変更後のモデルで `compile()` を呼ぶ必要があります.以下にその例を示します: ```python x = Input(shape=(32,)) @@ -262,32 +308,34 @@ trainable_model.fit(data, labels) # this updates the weights of `layer` ### stateful RNNを利用するには? -stateful RNNでは各バッチの内部状態を次のバッチの初期状態として再利用します. +RNNをstatefulにするとは,各バッチのサンプルの状態が,次のバッチのサンプルのための初期状態として再利用されるということを意味します. -sateful RNNを利用する際は,以下を仮定します: +stateful RNNが使われるときには以下のような状態となっているはずです: -- 全てのバッチのサンプル数が同じ -- `X1`と`X2`が連続するバッチであるとき,各`i`について`X2[i]`は`X1[i]`のfollow-upシーケンスになっている +- 全てのバッチのサンプル数が同じである +- `X1` と `X2` が連続するバッチであるとき,各 `i`に ついて `X2[i]` は `X1[i]` のfollow-upシーケンスになっている -stateful RNNを利用するには: +実際にstateful RNNを利用するには,以下を行う必要があります: -- 最初の層の引数`batch_input_shape`で明示的にバッチサイズを指定してください.バッチサイズはタプルで,例えば32 samples,10 timesteps,特徴量16次元の場合,`(32, 10, 16)`となります -- RNN層で`stateful=True`を指定してください +- `batch_size` 引数をモデルの最初の層に渡して,バッチサイズを明示的に指定してください. 例えば,サンプル数が32,タイムステップが10,特徴量の次元が16の場合には,`batch_size=32` としてください. +- RNN層で`stateful=True`を指定してください. +- fit() を呼ぶときには `shuffle=False` を指定してください. -積算された状態をリセットするには: +蓄積された状態をリセットするには: -- 全層の状態をリセットするには,`model.reset_states()`を利用してください +- モデルの全ての層の状態をリセットするには,`model.reset_states()`を利用してください - 特定のstateful RNN層の状態をリセットするには,`layer.reset_states()`を利用してください 例: + ```python X # this is our input data, of shape (32, 21, 16) # we will feed it to our model in sequences of length 10 model = Sequential() -model.add(LSTM(32, batch_input_shape=(32, 10, 16), stateful=True)) +model.add(LSTM(32, input_shape=(10, 16), batch_size=32, stateful=True)) model.add(Dense(16, activation='softmax')) model.compile(optimizer='rmsprop', loss='categorical_crossentropy') @@ -305,12 +353,13 @@ model.reset_states() model.layers[0].reset_states() ``` -注: `predict`, `fit`, `train_on_batch`, `predict_classes`メソッドなどは全て,stateful層の状態を更新します.そのため,訓練だけでなく,statefulな予測も可能となります. +`predict`, `fit`, `train_on_batch`, `predict_classes` などの関数は *いずれも* stateful層の状態を更新することに注意してください.そのため,statefulな訓練だけでなく,statefulな予測も可能となります. --- ### Sequentialモデルから層を取り除くには? -`.pop()`を使うことで,Sequentialモデルへ最後に追加した層を削除できます. + +`.pop()`を使うことで,Sequentialモデルへ最後に追加した層を削除できます: ```python model = Sequential() @@ -327,19 +376,83 @@ print(len(model.layers)) # "1" ### Kerasで事前学習したモデルを使うには? -以下の画像分類用のモデルのコードと事前学習した重みが利用可能です. +以下の画像分類のためのモデルのコードと事前学習した重みが利用可能です: +- Xception - VGG-16 - VGG-19 - ResNet50 - Inception v3 -コードと重みは[このリポジトリ](https://github.com/fchollet/deep-learning-models)にあります. +これらのモデルは `keras.applications` からインポートできます: + +```python +from keras.applications.xception import Xception +from keras.applications.vgg16 import VGG16 +from keras.applications.vgg19 import VGG19 +from keras.applications.resnet50 import ResNet50 +from keras.applications.inception_v3 import InceptionV3 + +model = VGG16(weights='imagenet', include_top=True) +``` + +シンプルな使用例については, [Applications moduleについてのドキュメント](/applications)を参照してください. -特徴量抽出やfine-tuningのために事前学習したモデルを使う例は,[このブログ記事](http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html)をみてください. + +特徴量抽出やfine-tuningのために事前学習したモデルの使用例の詳細は,[このブログ記事](http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html)を見てください. また,VGG16はいくつかのKerasのサンプルスクリプトの基礎になっています. - [Style transfer](https://github.com/fchollet/keras/blob/master/examples/neural_style_transfer.py) - [Feature visualization](https://github.com/fchollet/keras/blob/master/examples/conv_filter_visualization.py) - [Deep dream](https://github.com/fchollet/keras/blob/master/examples/deep_dream.py) + +--- + +### KerasでHDF5ファイルを入力に使うには? + +`keras.utils.io_utils` から `HDF5Matrix` を使うことができます. +詳細は[HDF5Matrixに関するドキュメント](/utils/#hdf5matrix) を確認してください. + +また,HDF5のデータセットを直接使うこともできます: + +```python +import h5py +with h5py.File('input/file.hdf5', 'r') as f: + X_data = f['X_data'] + model.predict(X_data) +``` + +--- + +### Kerasの設定ファイルの保存場所は? + +Kerasの全てのデータが格納されているデフォルトのディレクトリは以下の場所です: + +```bash +$HOME/.keras/ +``` + +Windowsユーザは `$HOME` を `%USERPROFILE%` に置換する必要があることに注意してください. +(パーミッション等の問題によって,)Kerasが上記のディレクトリを作成できない場合には, `/tmp/.keras/` がバックアップとして使われます. + +Kerasの設定ファイルはJSON形式で `$HOME/.keras/keras.json` に格納されます. +デフォルトの設定ファイルは以下のようになっています: + +``` +{ + "image_data_format": "channels_last", + "epsilon": 1e-07, + "floatx": "float32", + "backend": "tensorflow" +} +``` + +この設定ファイルは次のような項目を含んでいます: + +- The image data format: デフォルトでは画像処理の層やユーティリティで使われます(`channels_last` もしくは `channels_first` です). +- `epsilon`: 数値演算におけるゼロによる割算を防ぐために使われる,数値のファジー要素です. +- デフォルトのfloatのデータ種類. +- デフォルトのバックエンド.[backendに関するドキュメント](/backend)を確認してください. + +同様に,[`get_file()`](/utils/#get_file)でダウンロードされた,キャッシュ済のデータセットのファイルは,デフォルトでは `$HOME/.keras/datasets/` に格納されます.