今回はkerasで学習時にOneHotベクトル化するレイヤーの作り方を書きます。
学習前にOneHotにしてしまうとかなりメモリ食うと思います。
それなら学習前はOneHotベクトルのフラグの立つインデックスのみを保持し、学習時にOneHotベクトル化をしたほうがメモリ効率は断然いいです。
目次
OneHotレイヤーの実装方法
Lambdaレイヤは引数に関数オブジェクトを渡し、Layerオブジェクトのような振る舞いをさせるレイヤです。
Lambdaレイヤにkerasのbackedのone_hot関数を渡すことでデータをOneHot化するレイヤを追加できます。
Lambdaの引数のarguments[‘numclasses’]は1つのOneHotベクトルの次元数で、input_shapeは1つのデータにOneHotベクトルをいくつ保持するかを表します。そのため、output_shapeは(data_length, vec_size)とします。
1つの入力データは長さがdata_lengthで、フラグの立つインデックスを保持した配列になります。
from keras.models import Sequential
from keras.layers.recurrent import LSTM
from keras import backend as K
from keras.layers.core import Lambda, Dense, Activation
def init_model(self, vec_size, data_length, output_num):
model = Sequential()
# OneHot化するレイヤー
model.add(Lambda(K.one_hot, dtype='int32', arguments={'num_classes': vec_size},
input_shape=(data_length, ), output_shape=(data_length, vec_size))
model.add(LSTM(output_num, activation='relu', dropout=0.5))
model.add(Dense(output_num))
model.add(Activation('softmax'))
return model
OneHotレイヤーを使用したモデルの注意点
kerasでネットワークモデルを保存するとき、model.saveをすると、紹介したOnehotレイヤは外部の関数(keras.backend.one_hot)を利用しているため、そのような関数はないというエラーがロード時に起こります。
そのため、モデルを保存したいときはmodel.save_weightでパラメータのみを保存してください。