Keras でモデルを保存するには model.savekeras.models.save_model を使い、ファイル形式は HDF5 で保存されます。これは自分のように keras.callbacks.ModelCheckpoint で 1 epoch 毎にモデルを保存していると結構ディスク容量を食います。そこで、容量を抑えるためにモデルを圧縮して保存できるようにします。

keras.models.save_modelh5py.File を呼んでいます。h5py.File はファイルオブジェクトを取れないので一旦テンポラリファイルに書き出してからそれを圧縮します。

import os
import lzma
import tempfile
import shutil
from functools import partial
from keras import models


def save_model(model, path):
    directory = os.path.dirname(path)
    with tempfile.NamedTemporaryFile(dir=directory) as f, lzma.open(path, 'wb') as wf:
        models.save_model(model, f.name)
        f.seek(0)
        shutil.copyfileobj(f, wf)

model.save = partial(save_model, model)
model.save('model.h5.xz')

圧縮されたファイルのままでは keras.models.load_model で読めないので、読み込み側も作ります。

def load_model(path, custom_objects=None):
    with lzma.open(path, 'rb') as f, tempfile.NamedTemporaryFile(dir=directory) as wf:
        shutil.copyfileobj(f, wf)
        wf.seek(0)
        return models.load_model(wf.name, custom_objects=custom_objects)

手元にあったモデルでどのぐらい縮んだか見てみます。

-rw-r--r-- 1 naoina users 17679144 May  5 22:57 updown-both-01483-m5.h5
-rw-r--r-- 1 naoina users 13140532 May  5 22:58 updown-both-01483-m5.h5.xz
-rw-r--r-- 1 naoina users 29194056 May  5 22:58 updown-both-01812-m5.h5
-rw-r--r-- 1 naoina users 23654004 May  5 22:58 updown-both-01812-m5.h5.xz

約 4 MB ですね。思ったより縮みませんでした。1000 epochs 回して 4GB 程度の節約でしょうか。

ちなみに学習データとして使っている pickle 化した為替データだと約 16% ぐらいに縮みました。

-rw-r--r-- 1 naoina users 134088149 May  5 23:01 train_EURUSD_m1.pkl
-rw-r--r-- 1 naoina users  21536728 May  5 23:01 train_EURUSD_m1.pkl.xz