kerasでtensorboardの表示とmodelの保存

More than 1 year has passed since last update.


環境

ubuntu: 17.04

python: 3.6

keras: 2.0.8

tensorflow: 1.3.0

tensorflow-tensorboard: 0.1.5


実装


tensorboard用callbackの指定

model.fit()のcallbacks引数に、keras.callbacks.TensorBoard()を指定する

また、histogram_freqを指定する場合はvalidation_data引数が必要になる

具体的には以下のようにする

tb_cb = keras.callbacks.TensorBoard(log_dir=log_filepath, 

histogram_freq=1, write_graph=True, write_images=True)

model.fit(x_train, y_train,
epochs=20, batch_size=128,
callbacks=[tb_cb], validation_data=(x_test, y_test))


modelファイルの保存

model.save("ファイルパス")

とすればよい


ソースコード

学習モデルは

https://keras.io/ja/getting-started/sequential-model-guide/#sequentialkeras

の"多層パーセプトロン (MLP) を用いた多値分類:"を用いた


main.py

# config utf-8

import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.optimizers import SGD

import numpy as np

classes = 10
def create_dummy():
# 20種類からなる1000個のデータ
x_train = np.random.random((1000, 20))
# 1000個のデータにランダムでラベル付
# categorical 4 = [0,0,0,1,0,0,0,0,0,0] みたいにする
y_train = keras.utils.to_categorical(np.random.randint(classes, size=(1000, 1)), num_classes=classes)
x_test = np.random.random((100, 20))
y_test = keras.utils.to_categorical(np.random.randint(classes, size=(100, 1)), num_classes=classes)
return x_train, y_train, x_test, y_test

def add_model():
model = Sequential()

model.add(Dense(units=64, activation='relu', input_dim=20))
model.add(Dropout(0.5))
model.add(Dense(units=64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(units=classes, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
return model

def main():
print("loading data...")
x_train, y_train, x_test, y_test = create_dummy()

log_filepath = "./logs/"
tb_cb = keras.callbacks.TensorBoard(log_dir=log_filepath, histogram_freq=1, write_graph=True, write_images=True)

print("create model...")
model = add_model()
model.fit(x_train, y_train,
epochs=20, batch_size=128,
callbacks=[tb_cb], validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, batch_size=128)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

model.save("model.h5")

if __name__ == '__main__':
main()



実行

$ python main.py

Using TensorFlow backend.
loading data...
create model...
Train on 1000 samples, validate on 100 samples
...

終了するとlogsディレクトリとモデルファイルが作成される

$ ls

logs main.py model.h5


tensorboard表示

--logdirオプションにログファイルの入ったディレクトリを指定

$ tensorboard --logdir=./logs

TensorBoard 0.1.5 at http://xxxx:6006 (Press CTRL+C to quit)

http://localhost:6006

にアクセスすると表示される

Screenshot-2017-11-26 TensorBoard.png

学習データとテストデータはランダムに生成したデータなので、互いに無関係である

実際、学習してもテストデータのaccuracyは上がらない様子が確認できる


参考