Keras : FAQ(翻訳/要約)
* 本ページは、Keras 本家サイトの Keras : FAQ の簡単な要約です。
Keras FAQ: Frequently Asked Keras Questions
GPU 上で Keras をどのように実行しますか?
Tensorflow バックエンド上で実行しているのであれば、利用可能な GPU が検知されれば貴方のコードは自動的に GPU で動作します。Theano バックエンド上で実行しているのであれば、次のメソッドの一つが使用できます :
メソッド 1: Theano フラグを使用する。
THEANO_FLAGS=device=gpu,floatX=float32 python my_keras_script.py
名前 ‘gpu’ はデバイスの識別子に依存して変更する必要があるかもしれません (e.g. gpu0, gpu1, etc)。
メソッド 2: .theanorc を設定する: Instructions
メソッド 3: コードの冒頭で theano.config.device, theano.config.floatX を手動設定します :
import theano theano.config.device = 'gpu' theano.config.floatX = 'float32'
Keras モデルをどのように保存できますか?
Keras モデルを保存するために pickle または cPickle を使うことは推奨されません。
モデルのアーキテクチャのみを、その重みではなく、保存する必要がある場合は、次のようにできます :
# JSON として保存 json_string = model.to_json() # YAML として保存 yaml_string = model.to_yaml()
そしてこのデータからフレッシュなモデルを構築できます :
# JSON からモデル再構築: from keras.models import model_from_json model = model_from_json(json_string) # YAML からモデルを再構築 model = model_from_yaml(yaml_string)
モデルの重みを保存する必要がある場合は、下のコードで HDF5 でそのようにできます。
HDF5 と Python ライブラリ h5py を最初にインストールする必要があることに注意してください、これらは Keras にバンドルされて入ってはきません。
model.save_weights('my_model_weights.h5')
モデルをインスタンス化するためのコードがあるとすれば、保存した重みを同じアーキテクチャのモデルにロードすることができます :
model.load_weights('my_model_weights.h5')
これはモデルを保存してシリアライズされたデータのみから再構築する方法へとつながります :
json_string = model.to_json() open('my_model_architecture.json', 'w').write(json_string) model.save_weights('my_model_weights.h5') # elsewhere... model = model_from_json(open('my_model_architecture.json').read()) model.load_weights('my_model_weights.h5')
何故、訓練中の損失はテスト中の損失よりもかなり高いのでしょうか?
Keras モデルは2つのモードがあります: 訓練 (training) とテスト (testing) です。Dropout と L1/L2 重み正則化のような、正則化メカニズムはテスト時には無効にされます。更に、訓練中の損失は訓練データの各バッチ上の損失の平均です。貴方のモデルは時間をかえて変わっていきますから、エポックの最初のバッチ群上の損失は一般に最後のバッチ群のものよりも高くなります。その一方で、エポックに対するテスト中のロスはエポックの最後におけるモデルを使用して計算されますので、より低い損失になります。
どのようにして中間層 (intermediate layer) の出力を視覚化できますか?
ある入力が与えられた時のある層の出力を返す Keras 関数を構築できます、例えば :
from keras import backend as K # Sequential モデルで get_3rd_layer_output = K.function([model.layers[0].input], [model.layers[3].get_output(train=False)]) layer_output = get_3rd_layer_output([X])[0] # Graph モデルで get_conv_layer_output = K.function([model.inputs[i].input for i in model.input_order], [model.nodes['conv'].get_output(train=False)]) conv_output = get_conv_layer_output([input_data_dict[i] for i in model.input_order])[0]
同様に、Theano と TensorFlow 関数を直接構築することもできます。
メモリに fit in しないデータセットで Keras がどのように使えますか?
model.train_on_batch(X, y) そして model.test_on_batch(X, y) を使用してバッチ訓練を行なうことができます。モデル 文書参照。
See the models documentation.
代わりに、訓練データのバッチを生成する generator を書いてメソッド model.fit_generator(data_generator, samples_per_epoch, nb_epoch) を使うこともできます。
実際に CIFAR 10 サンプル でバッチ訓練を見ることができます。
検証ロスがそれ以上減少しない時、どのように訓練を中断できますか?
EarlyStopping callback が使用できます :
from keras.callbacks import EarlyStopping early_stopping = EarlyStopping(monitor='val_loss', patience=2) model.fit(X, y, validation_split=0.2, callbacks=[early_stopping])
callbacks 文書 で詳細が見つかります。
どのように検証分割が計算されるのでしょう?
model.fit の validation_split 引数を例えば 0.1 に設定すれば、使用される検証データはデータの最後の 10% になります。それを 0.25 に設定すれば、データの最後の 25 % になります等々。
データは訓練中にシャッフルされますか?
はい、model.fit の shuffle 引数が True (これはデフォルト)に設定されていれば、訓練データは各エポックでランダムにシャッフルされます。
検証データはシャッフルされません。
各エポックでどのように訓練 / 検証損失 / 精度を記録できますか?
model.fit メソッドは History callback を返し、これは連続的な損失 / 精度のリストを含む history 属性を持ちます。
hist = model.fit(X, y, validation_split=0.2) print(hist.history)
ステートフル RNN をどのように使用できますか?
RNN をステートフルにするということは、各バッチのサンプルのための状態が次のバッチのサンプルのための初期状態として再利用されることを意味しています。
ステートフル RNN を使用する時は、それゆえに次を仮定します :
- 全てのバッチは同じ数のサンプルを持ちます。
- もし X1 と X2 がサンプルの連続するバッチであるならば、全ての i について、X2[i] は X1[i] に対する follow-up シーケンスです。
RNN でステートフルネスを使用するためには、次が必要です :
- batch_input_shape 引数をモデルの最初の層に渡すことによって、明示的に使用するバッチサイズを指定します、それは整数のタプルで、例えば、時間ステップ毎に 16 の特徴で 10 時間ステップのシーケンスの 32-サンプル バッチのためには、(32, 10, 16) 。
- RNN 層(群)で stateful=True を設定します。
積算された状態をリセットするには :
- モデルの全ての層の状態をリセットするために model.reset_states() を使用します。
- 特定のステートフル RNN 層の状態をリセットするためには layer.reset_states() を使用します。
サンプル:
X # これは shape (32, 21, 16) の入力データ # 長さ 10 のシーケンスの中でそれをモデルに供給します。 model = Sequential() model.add(LSTM(32, batch_input_shape=(32, 10, 16), stateful=True)) model.add(Dense(16, activation='softmax')) model.compile(optimizer='rmsprop', loss='categorical_crossentropy') # 最初の 10 が与えられた時の 11 番目の時間ステップを予測するネットワークを訓練します。 model.train_on_batch(X[:, :10, :], np.reshape(X[:, 10, :], (32, 16))) # the state of the network has changed. We can feed the follow-up sequences: model.train_on_batch(X[:, 10:20, :], np.reshape(X[:, 20, :], (32, 16))) # LSTM 層の状態をリセットしましょう : model.reset_states() # この場合にそれを行なう他の方法 model.layers[0].reset_states()
メソッド predict, fit, train_on_batch, predict_classes, etc. は全てモデルのステートフル層の状態を更新することに注意してください。これはステートフル訓練だけでなく、ステートフル予測も行なうことを可能にします。
どのように Keras を cite(引用/参照) すべきでしょう?
Please cite Keras in your publications if it helps your research. Here is an example BibTeX entry:
@misc{chollet2015keras,
author = {Chollet, François},
title = {Keras},
year = {2015},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/fchollet/keras}}
}
以上