keras2.0版本已经添加了一些贡献者的新建议,用keras调用tensorboard对训练过程进行跟踪观察非常方便了。
直接上例子:
# coding: utf-8 import numpy as np from keras.datasets import mnist from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation from keras.optimizers import SGD from keras.utils import np_utils import keras.callbacks import os import tensorflow as tf import keras.backend.tensorflow_backend as KTF ###################################### # TODO: set the gpu memory using fraction # ##################################### def get_session(gpu_fraction=0.3): """ This function is to allocate GPU memory a specific fraction Assume that you have 6GB of GPU memory and want to allocate ~2GB """ num_threads = os.environ.get('OMP_NUM_THREADS') gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_fraction) if num_threads: return tf.Session(config=tf.ConfigProto( gpu_options=gpu_options, intra_op_parallelism_threads=num_threads)) else: return tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) KTF.set_session(get_session(0.6)) # using 60% of total GPU Memory os.system("nvidia-smi") # Execute the command (a string) in a subshell raw_input("Press Enter to continue...") ###################### batch_size = 128 nb_classes = 10 nb_epoch = 10 nb_data = 28 * 28 log_filepath = '/tmp/keras_log' # load data (X_train, y_train), (X_test, y_test) = mnist.load_data() # reshape print X_train.shape X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2]) X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2]) # rescale X_train = X_train.astype(np.float32) X_train /= 255 X_test = X_test.astype(np.float32) X_test /= 255 # convert class vectors to binary class matrices (one hot vectors) Y_train = np_utils.to_categorical(y_train, nb_classes) Y_test = np_utils.to_categorical(y_test, nb_classes) model = Sequential() model.add(Dense(512, input_shape=(nb_data,), init='normal', name='dense1')) # a sample is a row 28*28 model.add(Activation('relu', name='relu1')) model.add(Dropout(0.2, name='dropout1')) model.add(Dense(512, init='normal', name='dense2')) model.add(Activation('relu', name='relu2')) model.add(Dropout(0.2, name='dropout2')) model.add(Dense(10, init='normal', name='dense3')) model.add(Activation('softmax', name='softmax1')) model.summary() model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.001), metrics=['accuracy']) tb_cb = keras.callbacks.TensorBoard(log_dir=log_filepath, write_images=1, histogram_freq=1) # 设置log的存储位置,将网络权值以图片格式保持在tensorboard中显示,设置每一个周期计算一次网络的 #权值,每层输出值的分布直方图 cbks = [tb_cb] history = model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, verbose=1, callbacks=cbks, validation_data=(X_test, Y_test)) score = model.evaluate(X_test, Y_test, verbose=0) print('Test score:', score[0]) print('Test accuracy;', score[1])
其实可以自己给每一层layer命名一个name, 也可以由keras根据自己的命名规则自动取名,自动命名的规则在Layer类中,代码如下:
name = kwargs.get('name') if not name: prefix = self.__class__.__name__ name = _to_snake_case(prefix) + '_' + str(K.get_uid(prefix)) self.name = name
而在keras的call back模块中,tensorborad class实现源码可以看出,keras默认将模型的所有层的所有weights, bias以及每一层输出的distribution, histogram等传送到tensorborad,方便在浏览器中观察网络的运行情况。实现源码如下:
def set_model(self, model): self.model = model self.sess = K.get_session() if self.histogram_freq and self.merged is None: for layer in self.model.layers: for weight in layer.weights: tf.summary.histogram(weight.name, weight) if self.write_images: w_img = tf.squeeze(weight) shape = w_img.get_shape() if len(shape) > 1 and shape[0] > shape[1]: w_img = tf.transpose(w_img) if len(shape) == 1: w_img = tf.expand_dims(w_img, 0) w_img = tf.expand_dims(tf.expand_dims(w_img, 0), -1) tf.summary.image(weight.name, w_img) if hasattr(layer, 'output'): tf.summary.histogram('{}_out'.format(layer.name), layer.output) self.merged = tf.summary.merge_all()
现在运行最开始的例子,在terminal运行
tensorboard --logdir=/tmp/keras_log
在terminal打开浏览器地址,进入tensorboard可以随意浏览graph, distribution, histogram, 以及sclar列表中的loss, acc等等了