今回はオートエンコーダについてやってみた。
オートエンコーダについて簡単に説明すると、入力層と出力層の次元数を一致させて中間層をそれよりも少ない次元で学習させる仕組みのこと。
実際の活用には異常検知であったり、ノイズ除去等の特徴抽出において使われるそう。
#オートエンコーダのモデル
nn.py
model = Sequential()
model.add(Dense(50, activation='relu', input_dim=len(x_train[0])))
model.add(Dense(len(x_train[0]), activation='sigmoid'))
model.compile(optimizer='adadelta',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=100,
epochs=10,
verbose=1,
validation_data=(x_test, y_test))
上記でオートエンコーダモデルを作成・学習
中間層は50にしたがどの程度が良いのかは不明
#中間層の抽出
ふと気になり中間層はどうやって取り出したらいいのか気になった。
調べてみたところ、何のことはない。出力層を変えればいいだけのこと。
ちなみに普通に出力する場合はこう。
model.predict(data)
これを中間層の出力に変えるためにmodelを編集する必要がある。
まず作成したモデルの概要を見てみる
model.summary()
'''
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 50) 424500
_________________________________________________________________
dense_2 (Dense) (None, 848) 424848
=================================================================
Total params: 849,348
Trainable params: 849,348
Non-trainable params: 0
_________________________________________________________________
'''
中間層の名前はdense_1となっている事を確認
そしたらモデルを変える
middle_model = Model(inputs=model.input,
outputs=model.get_layer(layer_name).output)
middle_output = middle_model.predict(data)
middle_modelは入力層と出力層だけの1層になるね
これで中間層の値がmiddle_outputに出る
おしまい