examples/mnist/advanced_model_training.py (53 lines of code) (raw):
#!/usr/bin/env python
# coding: utf-8
# # Multiple Model Training Example
#
# This example trains multiple models and extracts training statistics
import glob
import logging
import os
import shutil
from collections import namedtuple
import yaml
# ## Import required libraries
from ludwig.api import LudwigModel
from ludwig.visualize import learning_curves
# clean out old results
try:
shutil.rmtree('./results')
except FileNotFoundError:
pass
try:
shutil.rmtree('./visualizations')
except FileNotFoundError:
pass
file_list = glob.glob('./data/*.json')
file_list += glob.glob('./data/*.hdf5')
for f in file_list:
try:
os.remove(f)
except FileNotFoundError:
pass
# read in base model definition
with open('./model_definition.yaml', 'r') as f:
base_model = yaml.safe_load(f.read())
# Specify named tuple to keep track of training results
TrainingResult = namedtuple('TrainingResult', ['name', 'train_stats'])
# specify alternative architectures to test
FullyConnectedLayers = namedtuple('FullyConnectedLayers',['name', 'fc_layers'])
list_of_fc_layers = [
FullyConnectedLayers(name='Option1', fc_layers=[{'fc_size':64, 'dropout': 'true'}]),
FullyConnectedLayers(name='Option2', fc_layers=[{'fc_size':128, 'dropout':'true'},
{'fc_size':64, 'dropout': 'true'}]),
FullyConnectedLayers(name='Option3', fc_layers=[{'fc_size':128, 'dropout':'true'}])
]
#
list_of_train_stats = []
# ## Train models
for model_option in list_of_fc_layers:
print('>>>> training: ', model_option.name)
# set up Python dictionary to hold model training parameters
model_definition = base_model.copy()
model_definition['input_features'][0]['fc_layers'] = model_option.fc_layers
model_definition['training']['epochs'] = 8
# Define Ludwig model object that drive model training
model = LudwigModel(model_definition,
logging_level=logging.INFO)
# initiate model training
train_stats = model.train(data_csv='./data/mnist_dataset_training.csv',
experiment_name='multiple_experiment',
model_name=model_option.name)
# save training stats for later use
list_of_train_stats.append(TrainingResult(name=model_option.name, train_stats=train_stats))
print('>>>>>>> completed: ', model_option.name, '\n')
model.close()
# generating learning curves from training
option_names = [trs.name for trs in list_of_train_stats]
train_stats = [trs.train_stats for trs in list_of_train_stats]
learning_curves(train_stats, 'Survived',
model_names=option_names,
output_directory='./visualizations',
file_format='png')