Я обучаю 8 моделей в цикле for и сохраняю каждый файл журнала тензорной платы в отдельном каталоге. Структура папок похожа на Graph
мой основной каталог для графиков и каталогов в Graph
, таких как net01
net02
... net08
- это те, которые я выводю мои файлы событий. Делая это, я могу визуализировать журналы тренировок в Tensorboard таким причудливым образом, при этом каждый тренировочный процесс приобретает свой цвет.
Моя проблема - растущие размеры eventfiles
. Первый файл событий имеет размер примерно 300 КБ, но второй файл событий имеет размер 600 КБ, третий - 900 КБ и так далее. Каждый из них находится в своем собственном отдельном каталоге, и каждый из них отличается друг от друга тренировочными сессиями, но каким-то образом tenorboard добавляет более ранние сессии в последнюю. В итоге у меня должен быть общий размер файлов сеанса 12 * 300 КБ = 3600 КБ, но в итоге получается что-то вроде 10800 КБ файлов сеанса. По мере того, как сети становятся глубже, я получаю файлы сеанса размером около 600 МБ. Ясно, что я что-то упускаю.
Я попытался визуализировать последний файл с самым большим размером, чтобы проверить, включает ли он все предыдущие тренировочные сессии и может ли он рисовать как 8 сетей, но это не удалось. ТАК, в этом файле сеанса хранится большая куча нерелевантной информации.
Я использую Anaconda3-Spyder на Win7-64. База данных разделена на 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)
2 ответа
Не уверен в этом, но я предполагаю, что это связано с тем, что ваши графики сохраняются после каждой итерации цикла. Чтобы проверить, отвечают ли ваши графики за это, вы можете попробовать write_graph = False
и посмотреть, есть ли у вас та же проблема. Чтобы убедиться, что график сброшен, вы можете попытаться очистить график тензорного потока в конце каждой итерации, используя следующее:
keras.backend.clear_session()
Проблема в том, что при обучении каждой модели следующая модель по-прежнему содержит все графические элементы предыдущих тренировок. Таким образом, перед обучением каждой модели сбросьте график Tensorflow, а затем продолжите обучение.
Похожие вопросы
Новые вопросы
tensorflow
TensorFlow - это библиотека с открытым исходным кодом и API, разработанная для глубокого обучения, написанная и поддерживаемая Google. Используйте этот тег с тегом для конкретного языка ([python], [c ++], [javascript], [r] и т. Д.) Для вопросов об использовании API для решения задач машинного обучения. Языки программирования, которые можно использовать с TensorFlow API, различаются, поэтому вы должны указать язык программирования. Укажите также область применения, например [обнаружение объекта].