if __name__ == '__main__':
    opt = TrainOptions().parse()  # get training options
    # Seed RNG
    seed_rng(opt.seed)
    torch.backends.cudnn.benchmark = True
    dataset = create_dataset(
        opt)  # create a dataset given opt.dataset_mode and other options
    dataset_size = len(dataset)  # get the number of images in the dataset.
    print('The number of training images = %d' % dataset_size)

    model = create_model(
        opt)  # create a model given opt.model and other options
    model.setup(
        opt)  # regular setup: load and print networks; create schedulers
    if opt.single_writer:
        opt.G_init = 'N02'
        opt.D_init = 'N02'
        model.netG.init_weights()
        model.netD.init_weights()
    visualizer = Visualizer(
        opt)  # create a visualizer that display/save images and plots
    total_iters = 0  # the total number of training iterations
    opt.iter = 0
    # seed_rng(opt.seed)
    for epoch in range(
            opt.epoch_count, opt.niter + opt.niter_decay + 1
    ):  # outer loop for different epochs; we save the model by <epoch_count>, <epoch_count>+<save_latest_freq>
        epoch_start_time = time.time()  # timer for entire epoch
        iter_data_time = time.time()  # timer for data loading per iteration
        epoch_iter = 0  # the number of training iterations in current epoch, reset to 0 every epoch