インストール

KerasとTensorflowのインストールを行います。

pip install keras
pip install tensorflow

OpenCLバックエンド用にPlaidMLを入れます。

pip install plaidml-keras
plaidml-setup 

サンプルの実行

MNISTのサンプルコードをダウンロードします。
keras/examples/mnist_cnn.py

import kerasの前にバックエンドを選択します。

import plaidml.keras
plaidml.keras.install_backend()

実行します。

python mnist_cnn.py

学習が行われます。

python mnist_cnn.py 
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
INFO:plaidml:Opening device "amd_radeon_hd_-_firepro_d300_compute_engine.1"
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
INFO:plaidml:Analyzing Ops: 85 of 285 operations complete
59904/60000 [============================>.] - ETA: 0s - loss: 0.3243 - acc: 0.9024INFO:plaidml:Analyzing Ops: 85 of 285 operations complete
60000/60000 [==============================] - 43s - loss: 0.3241 - acc: 0.9025 - val_loss: 0.0758 - val_acc: 0.9751
Epoch 2/12
60000/60000 [==============================] - 34s - loss: 0.1109 - acc: 0.9673 - val_loss: 0.0546 - val_acc: 0.9831
Epoch 3/12
60000/60000 [==============================] - 34s - loss: 0.0847 - acc: 0.9753 - val_loss: 0.0444 - val_acc: 0.9847
Epoch 4/12
60000/60000 [==============================] - 34s - loss: 0.0723 - acc: 0.9789 - val_loss: 0.0377 - val_acc: 0.9873
Epoch 5/12
60000/60000 [==============================] - 34s - loss: 0.0622 - acc: 0.9813 - val_loss: 0.0350 - val_acc: 0.9882
Epoch 6/12
60000/60000 [==============================] - 34s - loss: 0.0563 - acc: 0.9839 - val_loss: 0.0326 - val_acc: 0.9890
Epoch 7/12
60000/60000 [==============================] - 34s - loss: 0.0525 - acc: 0.9839 - val_loss: 0.0314 - val_acc: 0.9888
Epoch 8/12
60000/60000 [==============================] - 34s - loss: 0.0474 - acc: 0.9857 - val_loss: 0.0302 - val_acc: 0.9892
Epoch 9/12
60000/60000 [==============================] - 34s - loss: 0.0446 - acc: 0.9868 - val_loss: 0.0312 - val_acc: 0.9896
Epoch 10/12
60000/60000 [==============================] - 34s - loss: 0.0418 - acc: 0.9878 - val_loss: 0.0304 - val_acc: 0.9897
Epoch 11/12
60000/60000 [==============================] - 34s - loss: 0.0379 - acc: 0.9886 - val_loss: 0.0294 - val_acc: 0.9906
Epoch 12/12
60000/60000 [==============================] - 34s - loss: 0.0377 - acc: 0.9890 - val_loss: 0.0295 - val_acc: 0.9901
Test loss: 0.0294891050935
Test accuracy: 0.9901

重み保存と変換

重み保存と読み込みをするには、以下のコマンドを使用します。
Keras FAQ: Kerasに関するよくある質問

json_string = model.to_json()
model.save_weights('my_model_weights.h5')

from keras.models import model_from_json
model = model_from_json(json_string)
model.load_weights('my_model_weights.h5')

重み変換をするには、以下のスクリプトを使用します。
keras2caffe (MIT license)
import keras2caffe
keras2caffe.convert(model,"my_model.prototxt","my_model.caffemodel")

尚、重み変換をする場合はInputLayerが存在しないとエラーになります。また、activationは分離して記載する必要があります。KerasのSequentialモデルでInputLayerを明示的に追加するを参考に以下のようにInputLayerの追加と、activationの分離を行います。

model = Sequential()
model.add(InputLayer(input_shape=input_shape))
model.add(Conv2D(32, kernel_size=(3, 3)))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

Fine Tuning

少ない画像から画像分類を学習させる方法(kerasで転移学習:fine tuning)
Kerasではtrainフォルダとvalidationフォルダにカテゴリ別のフォルダを作成し、画像を入れておくと、カテゴリ識別を学習させることができます。例えば、AnimeFace Character Datasetのthumbを適当なスクリプトでtrainとvalidationに分解します。また、その他のカテゴリを学習させるには、Bing Search APIが教師データ作成に便利です。

Yolo

basic-yolo-kerasを使用してYoloの係数を学習することができます。実際の学習を走らせる時はconfig.jsonのwarmup_epochsを0にします。ただし、plaidmlのバックエンドだと動作しないため、実用的な速度で動かすにはCUDAが必要です。

python train.py -c config.json
python predict.py -c config.json -w full_yolo_raccoon.h5 -i raccoon_dataset/images/raccoon-1.jpg