连续模型训练后,Tensorboard 事件文件大小正在增长

Posted

技术标签:

【中文标题】连续模型训练后,Tensorboard 事件文件大小正在增长【英文标题】:Tensorboard event file size is growing after consecutive model training 【发布时间】:2018-08-20 22:55:53 【问题描述】:

我正在一个 for 循环中训练 8 个模型,并将每个 tensorboard 日志文件保存到一个单独的目录中。文件夹结构就像Graph 是我的图形主目录和Graph 下的目录,例如net01 net02...net08 是我输出我的事件文件的那些。通过这样做,我可以以奇特的方式在 Tensorboard 中可视化训练日志,每个训练过程都有自己的颜色。

我的问题是eventfiles 的大小越来越大。第一个事件文件大约为 300KB,但第二个事件文件的大小为 600KB,第三个为 900KB,依此类推。他们每个人都驻留在自己的单独目录中,并且每个人都是彼此不同的培训课程,但不知何故,tensorboard 将较早的课程附加到最后一个课程中。最后我应该有 12*300Kb= 3600 KB 的会话文件,但我最终得到了 10800KB 的会话文件。随着网络越来越深,我最终得到了大约 600 MB 的会话文件大小。很明显我错过了一些东西。

我试图可视化最后一个最大尺寸的文件,以检查它是否包含所有之前的训练课程并且可以绘制 8 个网,但它失败了。所以一大堆不相关的信息存储在这个会话文件中。

我在 Win7-64 上使用 Anaconda3-Spyder。数据库分为 8 个,每次运行我都会留下一个用于验证,其余的用作训练。这是我的代码的简化版本:

from keras.models import Model
from keras.layers import Dense, Flatten, Input, Conv2D, MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import TensorBoard, ModelCheckpoint, CSVLogger
import os.path
import shutil
import numpy
#  ------------------------------------------------------------------
img_width, img_height = 48, 48
num_folds=8
folds_path= "8fold_folds"
nets_path = "8fold_nets_simplenet" 
csv_logpath = 'simplenet_log.csv'
nets_string = "simplenet_nets0"
nb_epoch = 50
batch_size = 512
cvscores = []
#%%
def foldpath(foldnumber):
    pathbase= os.path.join(folds_path,'F')
    train_data_dir = os.path.join(pathbase+str(foldnumber),"train")
    valid_data_dir = os.path.join(pathbase+str(foldnumber),"test")
    return train_data_dir,valid_data_dir

#%%
for i in range(1, num_folds+1):
    modelpath= os.path.join(nets_path,nets_string+str(i))
    if os.path.exists(modelpath):
        shutil.rmtree(modelpath)
    os.makedirs(modelpath)
    [train_data_dir, valid_data_dir]=foldpath(i)
    img_input = Input(shape=(img_width,img_height,1),name='input')

    x = Conv2D(32, (3,3), activation='relu', padding='same', name='conv1-'+str(i))(img_input)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='pool1-'+str(i))(x)
    x = Conv2D(64, (3,3), activation='relu', padding='same', name='conv2-'+str(i))(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='pool2-'+str(i))(x)
    x = Conv2D(128, (3,3), activation='relu', padding='same', name='conv3-'+str(i))(x)
    x = MaxPooling2D((2, 2), strides=(2, 2), name='pool3-'+str(i))(x)
    x = Flatten()(x)
    x = Dense(512, name='dense1-'+str(i))(x)
    #x = Dropout(0.5)(x)
    x = Dense(512, name='dense2-'+str(i))(x)
    #x = Dropout(0.5)(x)
    predictions = Dense(6, activation='softmax', name='predictions-'+str(i))(x)
    model = Model(inputs=img_input, outputs=predictions)
    #  compile model-----------------------------------------------------------
    model.compile(optimizer='Adam', loss='binary_crossentropy', 
                  metrics=['accuracy'])
    #  ----------------------------------------------------------------
    # prepare data augmentation configuration
    train_datagen = ImageDataGenerator(rescale=1./255,
                                       featurewise_std_normalization=True,
                                       featurewise_center=True)
    valid_datagen = ImageDataGenerator(rescale=1./255)
    train_generator = train_datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        color_mode='grayscale',
        classes = ['1','3','4','5','6','7'],
        class_mode='categorical',
        shuffle='False'
    )
    validation_generator = valid_datagen.flow_from_directory(
        valid_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        color_mode='grayscale',
        classes = ['1','3','4','5','6','7'],
        class_mode='categorical',
        shuffle='False'
    )
    #  --------------------callbacks---------------------------
    csv_logger = CSVLogger(csv_logpath, append=True, separator=';')
    graph_path = os.path.join('Graphs',modelpath)
    os.makedirs(graph_path)
    tensorboard = TensorBoard(log_dir= graph_path, write_graph=True, write_images=False)
    callbacks_list=[csv_logger,tensorboard]

    #  ------------------
    print("Starting to fit the model")

    model.fit_generator(train_generator,
                        steps_per_epoch = train_generator.samples/batch_size,
                        validation_data = validation_generator,
                        validation_steps = validation_generator.samples/batch_size,
                        epochs = nb_epoch, verbose=1, callbacks=callbacks_list)

【问题讨论】:

【参考方案1】:

不确定这一点,但我的猜测是它与每次循环迭代后存储的图形有关。要检查您的图表是否对此负责,您可以尝试write_graph = False,看看您是否仍然遇到同样的问题。为确保图表已重置,您可以尝试在每次迭代结束时使用以下命令清除 tensorflow 图:

keras.backend.clear_session()  

【讨论】:

谢谢库库。我保留了write_graps = True,并在每个模型的末尾添加了清晰的会话。像魅力一样工作!【参考方案2】:

问题在于,随着每个模型的训练,下一个模型仍然包含之前训练的所有图形元素。因此,在训练每个模型之前,重置 Tensorflow 图,然后继续训练。

【讨论】:

以上是关于连续模型训练后,Tensorboard 事件文件大小正在增长的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tensorboard 实时监控训练并可视化模型架构

如何使用 Tensorboard 检查训练模型的准确性?

使用python代码读取准确性而不是tensorboard

TensorBoard: 可视化学习

Tensorboard 未显示最后训练模型的自定义指标

在 MESS 中使用 pytorch 的 Tensorboard