From 35ba014ba55b92a36f48f67004b5508bfb0fdd80 Mon Sep 17 00:00:00 2001 From: Hunor Laczko Date: Tue, 28 Feb 2023 22:03:08 +0000 Subject: [PATCH] more training --- aaa_helpers.txt | 6 ++++ auto_encoder_body.py | 13 +++---- auto_encoder_curv.py | 13 +++---- auto_encoder_static.py | 13 +++---- configs/iccv/config_abl_pyr_32.py | 2 +- configs/iccv/config_ae_body_10p.py | 53 ++++++++++++++++++++++++++++ configs/iccv/config_ae_body_25p.py | 53 ++++++++++++++++++++++++++++ configs/iccv/config_ae_curv_10p.py | 52 +++++++++++++++++++++++++++ configs/iccv/config_ae_curv_25p.py | 52 +++++++++++++++++++++++++++ configs/iccv/config_ae_static_10p.py | 52 +++++++++++++++++++++++++++ configs/iccv/config_ae_static_25p.py | 52 +++++++++++++++++++++++++++ cvae.py | 2 +- cvae_pyramid.py | 8 ++--- 13 files changed, 347 insertions(+), 24 deletions(-) create mode 100644 configs/iccv/config_ae_body_10p.py create mode 100644 configs/iccv/config_ae_body_25p.py create mode 100644 configs/iccv/config_ae_curv_10p.py create mode 100644 configs/iccv/config_ae_curv_25p.py create mode 100644 configs/iccv/config_ae_static_10p.py create mode 100644 configs/iccv/config_ae_static_25p.py diff --git a/aaa_helpers.txt b/aaa_helpers.txt index 7e377bf..9e2ef81 100644 --- a/aaa_helpers.txt +++ b/aaa_helpers.txt @@ -4,13 +4,19 @@ nohup python auto_encoder_static.py --name="lhunor_static_iccv_1" > nohup/iccv/e nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_skirt" > nohup/iccv/encoders/static_iccv_1_skirt.out 2>&1 & nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_cape_f" > nohup/iccv/encoders/static_iccv_1_cape_f.out 2>&1 & nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_cape_m" > nohup/iccv/encoders/static_iccv_1_cape_m.out 2>&1 & +nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_10p" > nohup/iccv/encoders/static_iccv_1_10p.out 2>&1 & +nohup python auto_encoder_static.py --name="lhunor_static_iccv_1_25p" > nohup/iccv/encoders/static_iccv_1_25p.out 2>&1 & nohup python auto_encoder_body.py --name="lhunor_body_iccv_1" > nohup/iccv/encoders/body_iccv_1.out 2>&1 & nohup python auto_encoder_body.py --name="lhunor_body_iccv_1_skirt" > nohup/iccv/encoders/body_iccv_1_skirt.out 2>&1 & nohup python auto_encoder_body.py --name="lhunor_body_iccv_1_cape_m" > nohup/iccv/encoders/body_iccv_1_cape_m.out 2>&1 & +nohup python auto_encoder_body.py --name="lhunor_body_iccv_1_10p" > nohup/iccv/encoders/body_iccv_1_10p.out 2>&1 & +nohup python auto_encoder_body.py --name="lhunor_body_iccv_1_25p" > nohup/iccv/encoders/body_iccv_1_25p.out 2>&1 & nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1" > nohup/iccv/encoders/curv_iccv_1.out 2>&1 & nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_skirt" > nohup/iccv/encoders/curv_iccv_1_skirt.out 2>&1 & nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_cape_f" > nohup/iccv/encoders/curv_iccv_1_cape_f.out 2>&1 & nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_cape_m" > nohup/iccv/encoders/curv_iccv_1_cape_m.out 2>&1 & +nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_10p" > nohup/iccv/encoders/curv_iccv_1_10p.out 2>&1 & +nohup python auto_encoder_curv.py --name="lhunor_curv_iccv_1_25p" > nohup/iccv/encoders/curv_iccv_1_25p.out 2>&1 & nohup python cvae.py --name="lhunor_cvae_iccv_gnn_1" > nohup/iccv/cvae_iccv_gnn_1.out 2>&1 & nohup python cvae.py --name="lhunor_abl_all" > nohup/iccv/ablation/abl_all_2.out 2>&1 & diff --git a/auto_encoder_body.py b/auto_encoder_body.py index 2fb4324..96c367b 100644 --- a/auto_encoder_body.py +++ b/auto_encoder_body.py @@ -1,6 +1,6 @@ import os import sys -from configs.iccv.config_ae_body_cape_m import config +from configs.iccv.config_ae_body_25p import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] import tensorflow as tf @@ -129,12 +129,13 @@ def train(): train_loss = train_step(batch) train_accumulator.update(train_loss) - data_valid = valid_iterator.get_next() - data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) - valid_loss = valid_step(data_valid) - valid_accumulator.update(valid_loss) + if step % 25 == 0: + data_valid = valid_iterator.get_next() + data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) + valid_loss = valid_step(data_valid) + valid_accumulator.update(valid_loss) - if step % 1000 == 0 or (step < 1000 and step % 10 == 0): + if step % 1000 == 0 or (step < 1000 and step % 100 == 0): to_log = dict({ **train_loss, **valid_loss, **{ 'current_step': step } }) if step % 5000 == 0 or (step < 5000 and step % 1000 == 0): train_figs = plot_everything(batch, 'train') diff --git a/auto_encoder_curv.py b/auto_encoder_curv.py index de62206..33467fd 100644 --- a/auto_encoder_curv.py +++ b/auto_encoder_curv.py @@ -1,6 +1,6 @@ import os import sys -from configs.iccv.config_ae_curv_cape_m import config +from configs.iccv.config_ae_curv_25p import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] import tensorflow as tf @@ -169,12 +169,13 @@ def train(): train_loss = train_step(batch) train_accumulator.update(train_loss) - data_valid = valid_iterator.get_next() - data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) - valid_loss = valid_step(data_valid) - valid_accumulator.update(valid_loss) + if step % 25 == 0: + data_valid = valid_iterator.get_next() + data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) + valid_loss = valid_step(data_valid) + valid_accumulator.update(valid_loss) - if step % 1000 == 0 or (step < 1000 and step % 10 == 0): + if step % 1000 == 0 or (step < 1000 and step % 100 == 0): to_log = dict({ **train_loss, **valid_loss, **{ 'current_step': step } }) if step % 5000 == 0 or (step < 5000 and step % 1000 == 0): train_figs = plot_everything(batch, 'train') diff --git a/auto_encoder_static.py b/auto_encoder_static.py index 4008917..a3a779f 100644 --- a/auto_encoder_static.py +++ b/auto_encoder_static.py @@ -1,6 +1,6 @@ import os import sys -from configs.iccv.config_ae_static_cape_m import config +from configs.iccv.config_ae_static_25p import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] import tensorflow as tf @@ -130,12 +130,13 @@ def train(): train_loss = train_step(batch) train_accumulator.update(train_loss) - data_valid = valid_iterator.get_next() - data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) - valid_loss = valid_step(data_valid) - valid_accumulator.update(valid_loss) + if step % 25 == 0: + data_valid = valid_iterator.get_next() + data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) + valid_loss = valid_step(data_valid) + valid_accumulator.update(valid_loss) - if step % 1000 == 0 or (step < 1000 and step % 10 == 0): + if step % 1000 == 0 or (step < 1000 and step % 100 == 0): to_log = dict({ **train_loss, **valid_loss, **{ 'current_step': step } }) if step % 5000 == 0 or (step < 5000 and step % 1000 == 0): train_figs = plot_everything(batch, 'train') diff --git a/configs/iccv/config_abl_pyr_32.py b/configs/iccv/config_abl_pyr_32.py index 705bf60..aff2e51 100644 --- a/configs/iccv/config_abl_pyr_32.py +++ b/configs/iccv/config_abl_pyr_32.py @@ -1,6 +1,6 @@ config = dict() -config['gpu'] = '0' +config['gpu'] = '3' config['name'] = 'iccv_pyr_32' config['notes'] = '' config['tags'] = ['pyr', 'iccv'] diff --git a/configs/iccv/config_ae_body_10p.py b/configs/iccv/config_ae_body_10p.py new file mode 100644 index 0000000..3aa9660 --- /dev/null +++ b/configs/iccv/config_ae_body_10p.py @@ -0,0 +1,53 @@ +config = dict() + + +config['batch_size'] = 4 +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/data/dataset/test_ready' +config['frames_file'] = 'frames_10p.txt' +config['use_filled'] = False +config['resolution'] = 512 +config['is_skirt'] = False +config['dataset_in_memory'] = False +config['is_cape'] = False +config['remove_global_orientation'] = True + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 +config['bottleneck_scale'] = 2 + +config['cond_ae'] = dict() +config['cond_ae']['is_label'] = False +config['cond_ae']['upscale_output'] = False +config['cond_ae']['latent_dim'] = config['latent_dim'] +config['cond_ae']['kernel_size'] = 7 +config['cond_ae']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae']['bottleneck_size']] +config['cond_ae']['decoder_depths'] = config['cond_ae']['encoder_depths'] +config['cond_ae']['decoder_dims'] = config['cond_ae']['encoder_dims'] +config['cond_ae']['activation'] = 'tanh' + + +config['gpu'] = '3' +config['lr'] = 0.0001 +config['name'] = 'body_iccv_1_10p' +config['notes'] = '' +config['tags'] = ['iccv', 'body', '10p'] + +config['cond_ae']['upscale_output'] = False +config['pretrained_model'] = '' + + +config['signature_dynamic'] = { 'id': (), 'frame_nr': (), + 'pose_shape': (72 + 11,), + 'uv_body_posed': (3, 512, 256,), + 'mesh_body_posed': (config['smpl_res'], 3,), + } +config['signature_static'] = { + 'mesh_mask': (config['smpl_res'],), + } \ No newline at end of file diff --git a/configs/iccv/config_ae_body_25p.py b/configs/iccv/config_ae_body_25p.py new file mode 100644 index 0000000..9ae59c9 --- /dev/null +++ b/configs/iccv/config_ae_body_25p.py @@ -0,0 +1,53 @@ +config = dict() + + +config['batch_size'] = 4 +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/data/dataset/test_ready' +config['frames_file'] = 'frames_25p.txt' +config['use_filled'] = False +config['resolution'] = 512 +config['is_skirt'] = False +config['dataset_in_memory'] = False +config['is_cape'] = False +config['remove_global_orientation'] = True + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 +config['bottleneck_scale'] = 2 + +config['cond_ae'] = dict() +config['cond_ae']['is_label'] = False +config['cond_ae']['upscale_output'] = False +config['cond_ae']['latent_dim'] = config['latent_dim'] +config['cond_ae']['kernel_size'] = 7 +config['cond_ae']['bottleneck_size'] = 16 * config['bottleneck_scale'] +config['cond_ae']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae']['bottleneck_size']] +config['cond_ae']['decoder_depths'] = config['cond_ae']['encoder_depths'] +config['cond_ae']['decoder_dims'] = config['cond_ae']['encoder_dims'] +config['cond_ae']['activation'] = 'tanh' + + +config['gpu'] = '5' +config['lr'] = 0.0001 +config['name'] = 'body_iccv_1_25p' +config['notes'] = '' +config['tags'] = ['iccv', 'body', '25p'] + +config['cond_ae']['upscale_output'] = False +config['pretrained_model'] = '' + + +config['signature_dynamic'] = { 'id': (), 'frame_nr': (), + 'pose_shape': (72 + 11,), + 'uv_body_posed': (3, 512, 256,), + 'mesh_body_posed': (config['smpl_res'], 3,), + } +config['signature_static'] = { + 'mesh_mask': (config['smpl_res'],), + } \ No newline at end of file diff --git a/configs/iccv/config_ae_curv_10p.py b/configs/iccv/config_ae_curv_10p.py new file mode 100644 index 0000000..ebd9dcb --- /dev/null +++ b/configs/iccv/config_ae_curv_10p.py @@ -0,0 +1,52 @@ +config = dict() + + +config['batch_size'] = 4 +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/data/dataset/test_ready' +config['frames_file'] = 'frames_10p.txt' +config['use_filled'] = False +config['resolution'] = 512 +config['is_skirt'] = False +config['dataset_in_memory'] = False +config['is_cape'] = False +config['remove_global_orientation'] = True + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 +config['bottleneck_scale'] = 2 + +config['cond_ae'] = dict() +config['cond_ae']['is_label'] = True +config['cond_ae']['upscale_output'] = False +config['cond_ae']['latent_dim'] = config['latent_dim'] +config['cond_ae']['kernel_size'] = 7 +config['cond_ae']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae']['bottleneck_size']] +config['cond_ae']['decoder_depths'] = config['cond_ae']['encoder_depths'] +config['cond_ae']['decoder_dims'] = config['cond_ae']['encoder_dims'] +config['cond_ae']['activation'] = 'tanh' + + +config['gpu'] = '2' +config['lr'] = 0.001 +config['name'] = 'curv_iccv_1_10p' +config['notes'] = '' +config['tags'] = ['iccv', 'curv', '10p'] + +config['cond_ae']['upscale_output'] = False +config['pretrained_model'] = '' + + +config['signature_dynamic'] = { 'id': (), 'frame_nr': (), + 'uv_curvature': (512, 256, 7), + 'mesh_curvature': (config['smpl_res']) + } +config['signature_static'] = { 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } \ No newline at end of file diff --git a/configs/iccv/config_ae_curv_25p.py b/configs/iccv/config_ae_curv_25p.py new file mode 100644 index 0000000..9fdbc5f --- /dev/null +++ b/configs/iccv/config_ae_curv_25p.py @@ -0,0 +1,52 @@ +config = dict() + + +config['batch_size'] = 4 +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/data/dataset/test_ready' +config['frames_file'] = 'frames_25p.txt' +config['use_filled'] = False +config['resolution'] = 512 +config['is_skirt'] = False +config['dataset_in_memory'] = False +config['is_cape'] = False +config['remove_global_orientation'] = True + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 +config['bottleneck_scale'] = 2 + +config['cond_ae'] = dict() +config['cond_ae']['is_label'] = True +config['cond_ae']['upscale_output'] = False +config['cond_ae']['latent_dim'] = config['latent_dim'] +config['cond_ae']['kernel_size'] = 7 +config['cond_ae']['bottleneck_size'] = 40 * config['bottleneck_scale'] +config['cond_ae']['encoder_depths'] = [3, 3, 9, 9, 3] +config['cond_ae']['encoder_dims'] = [16, 32, 64, 128, config['cond_ae']['bottleneck_size']] +config['cond_ae']['decoder_depths'] = config['cond_ae']['encoder_depths'] +config['cond_ae']['decoder_dims'] = config['cond_ae']['encoder_dims'] +config['cond_ae']['activation'] = 'tanh' + + +config['gpu'] = '4' +config['lr'] = 0.001 +config['name'] = 'curv_iccv_1_25p' +config['notes'] = '' +config['tags'] = ['iccv', 'curv', '25p'] + +config['cond_ae']['upscale_output'] = False +config['pretrained_model'] = '' + + +config['signature_dynamic'] = { 'id': (), 'frame_nr': (), + 'uv_curvature': (512, 256, 7), + 'mesh_curvature': (config['smpl_res']) + } +config['signature_static'] = { 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } \ No newline at end of file diff --git a/configs/iccv/config_ae_static_10p.py b/configs/iccv/config_ae_static_10p.py new file mode 100644 index 0000000..86e5fa7 --- /dev/null +++ b/configs/iccv/config_ae_static_10p.py @@ -0,0 +1,52 @@ +config = dict() + + +config['batch_size'] = 4 +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/data/dataset/test_ready' +config['frames_file'] = 'frames_10p.txt' +config['use_filled'] = False +config['resolution'] = 512 +config['is_skirt'] = False +config['dataset_in_memory'] = True +config['is_cape'] = False +config['remove_global_orientation'] = True + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 + +config['bottleneck_scale'] = 2 + +config['cond_ae'] = dict() +config['cond_ae']['is_label'] = False +config['cond_ae']['upscale_output'] = False +config['cond_ae']['latent_dim'] = config['latent_dim'] +config['cond_ae']['kernel_size'] = 7 +config['cond_ae']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae']['bottleneck_size']] +config['cond_ae']['decoder_depths'] = config['cond_ae']['encoder_depths'] +config['cond_ae']['decoder_dims'] = config['cond_ae']['encoder_dims'] +config['cond_ae']['activation'] = 'tanh' + + +config['gpu'] = '1' +config['lr'] = 0.0005 +config['name'] = 'static_iccv_1_10p' +config['notes'] = ' ' +config['tags'] = ['iccv', 'static', '10p'] + +config['cond_ae']['upscale_output'] = False +config['pretrained_model'] = '' + + +config['signature_dynamic'] = { 'id': (), 'frame_nr': (), } +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_static': (config['smpl_res'], 3,), + 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } \ No newline at end of file diff --git a/configs/iccv/config_ae_static_25p.py b/configs/iccv/config_ae_static_25p.py new file mode 100644 index 0000000..3c57656 --- /dev/null +++ b/configs/iccv/config_ae_static_25p.py @@ -0,0 +1,52 @@ +config = dict() + + +config['batch_size'] = 4 +config['train_dir'] = '/home/workspace/local-data/train' +config['valid_dir'] = '/home/workspace/local-data/valid' +config['test_dir'] = '/home/workspace/data/dataset/test_ready' +config['frames_file'] = 'frames_25p.txt' +config['use_filled'] = False +config['resolution'] = 512 +config['is_skirt'] = False +config['dataset_in_memory'] = True +config['is_cape'] = False +config['remove_global_orientation'] = True + +config['smpl_res'] = 14475 +if config['is_cape']: + config['smpl_res'] = 3638 + +config['latent_dim'] = 128 + +config['bottleneck_scale'] = 2 + +config['cond_ae'] = dict() +config['cond_ae']['is_label'] = False +config['cond_ae']['upscale_output'] = False +config['cond_ae']['latent_dim'] = config['latent_dim'] +config['cond_ae']['kernel_size'] = 7 +config['cond_ae']['bottleneck_size'] = 8 * config['bottleneck_scale'] +config['cond_ae']['encoder_depths'] = [3, 3, 3, 27, 3] +config['cond_ae']['encoder_dims'] = [8, 16, 32, 64, config['cond_ae']['bottleneck_size']] +config['cond_ae']['decoder_depths'] = config['cond_ae']['encoder_depths'] +config['cond_ae']['decoder_dims'] = config['cond_ae']['encoder_dims'] +config['cond_ae']['activation'] = 'tanh' + + +config['gpu'] = '6' +config['lr'] = 0.0005 +config['name'] = 'static_iccv_1_25p' +config['notes'] = ' ' +config['tags'] = ['iccv', 'static', '25p'] + +config['cond_ae']['upscale_output'] = False +config['pretrained_model'] = '' + + +config['signature_dynamic'] = { 'id': (), 'frame_nr': (), } +config['signature_static'] = { 'uv_static': (512, 256, 3), + 'mesh_static': (config['smpl_res'], 3,), + 'mesh_mask': (config['smpl_res'],), + 'uv_mask': (512, 256,), + } \ No newline at end of file diff --git a/cvae.py b/cvae.py index f32bf97..298a3d5 100644 --- a/cvae.py +++ b/cvae.py @@ -1,6 +1,6 @@ import os import sys -from configs.iccv.config_abl_skin_curv import config +from configs.iccv.config_abl_skin import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] import tensorflow as tf diff --git a/cvae_pyramid.py b/cvae_pyramid.py index 2918afd..7945ac5 100644 --- a/cvae_pyramid.py +++ b/cvae_pyramid.py @@ -1,6 +1,6 @@ import os import sys -from configs.iccv.config_abl_pyr_32_skin import config +from configs.iccv.config_abl_pyr_32 import config os.environ["CUDA_VISIBLE_DEVICES"] = config['gpu'] import tensorflow as tf @@ -794,7 +794,7 @@ if __name__ == '__main__': # generate_results() ckpt = tf.train.Checkpoint(model=model) - manager = tf.train.CheckpointManager(ckpt, 'checkpoints/post/' + config['name'], max_to_keep=20) + manager = tf.train.CheckpointManager(ckpt, 'checkpoints/iccv/' + config['name'], max_to_keep=20) train_accumulator = Accumulator() valid_accumulator = Accumulator() @@ -854,7 +854,7 @@ if __name__ == '__main__': train_loss = train_step(batch) train_accumulator.update(train_loss) - if step % 50 == 0: + if step % 25 == 0: data_valid = valid_iterator.get_next() data_valid = static_dataset_valid.expand_batch(batch_to_dict(data_valid, config['signature_dynamic'])) valid_loss = valid_step(data_valid) @@ -882,7 +882,7 @@ if __name__ == '__main__': if step % 5000 == 0: manager.save(checkpoint_number=step) - + print(step) step += 1