From 370fdff9da48fdda5aef36d2c40f07486068edbe Mon Sep 17 00:00:00 2001 From: Eric Lai Date: Tue, 11 May 2021 14:32:09 +0800 Subject: [PATCH] update --- .codacy.yaml | 9 + .dockerignore | 1 + .gitignore | 206 +- .pyup.yml | 75 + .readthedocs.yml | 14 + .travis.yml | 119 + CHANGELOG.md | 585 +++ CONTRIBUTING.md | 199 + LICENSE | 208 - LICENSE.rst | 211 + Makefile | 35 + README.md | 181 +- README.rst | 201 + docker/DockerLint.bat | 4 + docker/Dockerfile | 35 + docker/docs/Dockerfile | 14 + docker/docs/sources.list.ustc | 15 + docker/pypi_list.py | 68 + docker/version_prefix.py | 37 + docs/Makefile | 225 + docs/_static/fix_rtd.css | 8 + docs/conf.py | 469 ++ docs/images/affine_transform_comparison.jpg | Bin 0 -> 93023 bytes docs/images/affine_transform_why.jpg | Bin 0 -> 92093 bytes docs/index.rst | 100 + docs/make.bat | 281 ++ docs/modules/activation.rst | 73 + docs/modules/array_ops.rst | 20 + docs/modules/cli.rst | 6 + docs/modules/cost.rst | 100 + docs/modules/db.rst | 260 ++ docs/modules/distributed.rst | 23 + docs/modules/files.rst | 295 ++ docs/modules/initializers.rst | 51 + docs/modules/iterate.rst | 36 + docs/modules/layers.rst | 701 +++ docs/modules/models.rst | 59 + docs/modules/nlp.rst | 148 + docs/modules/optimizers.rst | 19 + docs/modules/prepro.rst | 641 +++ docs/modules/rein.rst | 33 + docs/modules/utils.rst | 73 + docs/modules/visualize.rst | 76 + docs/user/contributing.rst | 184 + docs/user/examples.rst | 121 + docs/user/faq.rst | 79 + docs/user/get_involved.rst | 76 + docs/user/get_start_advance.rst | 217 + docs/user/get_start_model.rst | 249 + docs/user/installation.rst | 210 + docs/user/my_figs/basic_seq2seq.png | Bin 0 -> 34047 bytes docs/user/my_figs/img_tensorlayer.png | Bin 0 -> 14657 bytes docs/user/my_figs/img_tlayer.png | Bin 0 -> 4259 bytes docs/user/my_figs/img_tlayer_big.png | Bin 0 -> 4263383 bytes docs/user/my_figs/img_tunelayer.png | Bin 0 -> 4259 bytes docs/user/my_figs/karpathy_rnn.jpeg | Bin 0 -> 749054 bytes docs/user/my_figs/mnist.jpeg | Bin 0 -> 232865 bytes docs/user/my_figs/pong_game.jpeg | Bin 0 -> 38474 bytes docs/user/my_figs/seq2seq.png | Bin 0 -> 30112 bytes docs/user/my_figs/tl_black_logo.png | Bin 0 -> 127091 bytes docs/user/my_figs/tl_transparent_logo.png | Bin 0 -> 150323 bytes docs/user/my_figs/tl_white_logo.png | Bin 0 -> 83507 bytes docs/user/my_figs/tsne.png | Bin 0 -> 200160 bytes docs/user/my_figs/word2vec_basic.pdf | Bin 0 -> 113953 bytes .../basic_tutorials/tutorial_LayerList.py | 43 + ...tutorial_cifar10_cnn_dynamic_MS_backend.py | 166 + ...tutorial_cifar10_cnn_dynamic_TF_backend.py | 186 + .../tutorial_mnist_mlp_dynamci_dragon.py | 100 + .../tutorial_mnist_mlp_dynamic_MS_backend.py | 92 + .../tutorial_mnist_mlp_dynamic_TF_backend.py | 91 + .../tutorial_mnist_mlp_mindspore.py | 117 + .../basic_tutorials/tutorial_mnist_simple.py | 68 + .../tutorial_nested_usage_of_Layer.py | 211 + .../tutorial_paddle_tensorlayer_mlp.py | 57 + examples/model_zoo/__init__.py | 0 examples/model_zoo/common.py | 287 ++ examples/model_zoo/imagenet_classes.py | 1003 ++++ examples/model_zoo/model/coco.names | 80 + examples/model_zoo/model/weights_2.txt | 541 +++ examples/model_zoo/model/weights_3.txt | 541 +++ .../model/yolov4_weights3_config.txt | 541 +++ .../model_zoo/model/yolov4_weights_config.txt | 541 +++ examples/model_zoo/pretrained_resnet50.py | 32 + examples/model_zoo/pretrained_vgg16.py | 29 + examples/model_zoo/pretrained_yolov4.py | 28 + examples/model_zoo/resnet.py | 225 + examples/model_zoo/vgg.py | 347 ++ examples/model_zoo/yolo.py | 376 ++ img/TL_gardener.png | Bin 0 -> 267078 bytes img/TL_gardener.psd | Bin 0 -> 1838933 bytes img/awesome-mentioned.png | Bin 0 -> 60636 bytes img/github_mascot.png | Bin 0 -> 65327 bytes img/img_tensorflow.png | Bin 0 -> 27730 bytes img/img_tensorlayer.png | Bin 0 -> 14657 bytes img/img_tlayer1.png | Bin 0 -> 4259 bytes img/join_slack.png | Bin 0 -> 61461 bytes img/join_slack.psd | Bin 0 -> 275471 bytes img/medium/Readme.md | 19 + img/medium/medium_header.png | Bin 0 -> 28430 bytes img/medium/medium_header.psd | Bin 0 -> 96167 bytes img/tl_black_logo.png | Bin 0 -> 127091 bytes img/tl_transparent_logo.png | Bin 0 -> 150323 bytes img/tl_white_logo.png | Bin 0 -> 83507 bytes requirements/requirements.txt | 10 + requirements/requirements_contrib_loggers.txt | 1 + requirements/requirements_db.txt | 1 + requirements/requirements_dev.txt | 1 + requirements/requirements_doc.txt | 8 + requirements/requirements_extra.txt | 6 + requirements/requirements_test.txt | 9 + requirements/requirements_tf_cpu.txt | 1 + requirements/requirements_tf_gpu.txt | 1 + run_compile.py | 74 + .../download_and_install_openmpi3_ubuntu.sh | 34 + scripts/install-horovod-for-doc-test.sh | 15 + scripts/install-requirements-for-rtd.sh | 28 + setup.cfg | 79 + setup.py | 194 + setup.travis.cfg | 111 + setup.travis_doc.cfg | 81 + tensorlayer/__init__.py | 72 + tensorlayer/array_ops.py | 110 + tensorlayer/backend/__init__.py | 6 + tensorlayer/backend/ops/__init__.py | 126 + tensorlayer/backend/ops/dragon_backend.py | 1039 +++++ tensorlayer/backend/ops/dragon_nn.py | 910 ++++ tensorlayer/backend/ops/load_backend.py | 81 + tensorlayer/backend/ops/mindspore_backend.py | 1239 +++++ tensorlayer/backend/ops/mindspore_nn.py | 1323 ++++++ tensorlayer/backend/ops/paddle_backend.py | 972 ++++ tensorlayer/backend/ops/paddle_nn.py | 926 ++++ tensorlayer/backend/ops/tensorflow_backend.py | 1021 ++++ tensorlayer/backend/ops/tensorflow_nn.py | 1519 ++++++ tensorlayer/cli/__init__.py | 3 + tensorlayer/cli/__main__.py | 17 + tensorlayer/cli/train.py | 171 + tensorlayer/cost/__init__.py | 15 + tensorlayer/cost/mindspore_cost.py | 763 +++ tensorlayer/cost/paddle_cost.py | 548 +++ tensorlayer/cost/tensorflow_cost.py | 860 ++++ tensorlayer/dataflow/__init__.py | 23 + tensorlayer/dataflow/dataflow_examples.py | 56 + tensorlayer/dataflow/image/__init__.py | 2 + tensorlayer/dataflow/mindspore_data.py | 277 ++ tensorlayer/dataflow/mindspore_image.py | 305 ++ tensorlayer/dataflow/tensorflow_data.py | 254 + tensorlayer/dataflow/tensorflow_image.py | 200 + tensorlayer/db.py | 746 +++ tensorlayer/decorators/__init__.py | 16 + tensorlayer/decorators/deprecated.py | 61 + tensorlayer/decorators/deprecated_alias.py | 46 + tensorlayer/decorators/method_decorator.py | 44 + tensorlayer/decorators/utils.py | 122 + tensorlayer/distributed.py | 545 +++ tensorlayer/files/__init__.py | 77 + tensorlayer/files/dataset_loaders/__init__.py | 34 + .../files/dataset_loaders/celebA_dataset.py | 43 + .../files/dataset_loaders/cifar10_dataset.py | 134 + .../files/dataset_loaders/cyclegan_dataset.py | 58 + .../dataset_loaders/flickr_1M_dataset.py | 116 + .../dataset_loaders/flickr_25k_dataset.py | 81 + .../files/dataset_loaders/imdb_dataset.py | 115 + .../dataset_loaders/matt_mahoney_dataset.py | 48 + .../files/dataset_loaders/mnist_dataset.py | 31 + .../dataset_loaders/mnist_fashion_dataset.py | 33 + .../files/dataset_loaders/mnist_utils.py | 75 + .../files/dataset_loaders/mpii_dataset.py | 252 + .../dataset_loaders/nietzsche_dataset.py | 42 + .../files/dataset_loaders/ptb_dataset.py | 72 + .../files/dataset_loaders/voc_dataset.py | 335 ++ .../dataset_loaders/wmt_en_fr_dataset.py | 80 + tensorlayer/files/utils.py | 2932 ++++++++++++ tensorlayer/initializers/__init__.py | 25 + .../initializers/load_initializers_backend.py | 16 + .../initializers/paddle_initializers.py | 178 + .../initializers/tensorflow_initializers.py | 243 + tensorlayer/iterate.py | 283 ++ tensorlayer/layers/__init__.py | 26 + tensorlayer/layers/activation.py | 605 +++ tensorlayer/layers/convolution/__init__.py | 83 + .../layers/convolution/deformable_conv.py | 324 ++ .../layers/convolution/depthwise_conv.py | 170 + tensorlayer/layers/convolution/quan_conv.py | 173 + .../layers/convolution/quan_conv_bn.py | 240 + .../layers/convolution/simplified_conv.py | 893 ++++ .../layers/convolution/super_resolution.py | 214 + .../layers/convolution/ternary_conv.py | 166 + tensorlayer/layers/core/__init__.py | 15 + tensorlayer/layers/core/common.py | 174 + tensorlayer/layers/core/core_dragon.py | 765 +++ tensorlayer/layers/core/core_mindspore.py | 355 ++ tensorlayer/layers/core/core_paddle.py | 206 + tensorlayer/layers/core/core_tensorflow.py | 765 +++ tensorlayer/layers/dense/__init__.py | 28 + tensorlayer/layers/dense/base_dense.py | 122 + tensorlayer/layers/dense/binary_dense.py | 109 + tensorlayer/layers/dense/dorefa_dense.py | 116 + tensorlayer/layers/dense/dropconnect.py | 125 + tensorlayer/layers/dense/quan_dense.py | 119 + tensorlayer/layers/dense/quan_dense_bn.py | 188 + tensorlayer/layers/dense/ternary_dense.py | 109 + tensorlayer/layers/deprecated.py | 416 ++ tensorlayer/layers/dropout.py | 56 + tensorlayer/layers/embedding.py | 517 +++ tensorlayer/layers/extend.py | 105 + tensorlayer/layers/image_resampling.py | 170 + tensorlayer/layers/inputs.py | 70 + tensorlayer/layers/lambda_layers.py | 280 ++ tensorlayer/layers/merge.py | 142 + tensorlayer/layers/noise.py | 80 + tensorlayer/layers/normalization.py | 258 ++ tensorlayer/layers/padding.py | 235 + tensorlayer/layers/pooling.py | 979 ++++ tensorlayer/layers/quantize.py | 49 + tensorlayer/layers/recurrent.py | 8 + tensorlayer/layers/scale.py | 57 + tensorlayer/layers/shape.py | 219 + tensorlayer/layers/spatial_transformer.py | 280 ++ tensorlayer/layers/stack.py | 114 + tensorlayer/layers/utils.py | 440 ++ tensorlayer/lazy_imports.py | 99 + tensorlayer/logging/__init__.py | 34 + tensorlayer/logging/contrib/__init__.py | 12 + tensorlayer/logging/contrib/hyperdash.py | 63 + tensorlayer/logging/tl_logging.py | 262 ++ tensorlayer/models/__init__.py | 12 + tensorlayer/models/core.py | 392 ++ ...et50_weights_tf_dim_ordering_tf_kernels.h5 | Bin 0 -> 24576 bytes tensorlayer/nlp.py | 1174 +++++ tensorlayer/optimizers/__init__.py | 25 + tensorlayer/optimizers/amsgrad.py | 195 + tensorlayer/optimizers/dragon_optimizers.py | 56 + .../optimizers/load_optimizers_backend.py | 16 + .../optimizers/mindspore_optimizers.py | 158 + tensorlayer/optimizers/paddle_optimizers.py | 44 + .../optimizers/tensorflow_optimizers.py | 45 + tensorlayer/package_info.py | 24 + tensorlayer/prepro.py | 4114 +++++++++++++++++ tensorlayer/rein.py | 159 + tensorlayer/utils.py | 683 +++ tensorlayer/visualize.py | 664 +++ tests/__init__.py | 0 tests/files/model_basic.h5 | Bin 0 -> 282704 bytes tests/files/test_utils_saveload.py | 117 + tests/layers/__init__.py | 0 tests/layers/test_layers_activation.py | 125 + tests/layers/test_layers_convolution.py | 149 + tests/layers/test_layers_core_act.py | 104 + .../test_layers_core_basedense_dropout.py | 74 + tests/layers/test_layers_core_nested.py | 66 + .../test_layers_deformable_convolution.py | 51 + tests/layers/test_layers_dense.py | 181 + tests/layers/test_layers_embedding.py | 97 + tests/layers/test_layers_extend.py | 39 + tests/layers/test_layers_lambda.py | 215 + tests/layers/test_layers_merge.py | 78 + tests/layers/test_layers_noise.py | 41 + tests/layers/test_layers_normalization.py | 209 + tests/layers/test_layers_padding.py | 88 + tests/layers/test_layers_pooling.py | 145 + tests/layers/test_layers_recurrent.py | 926 ++++ tests/layers/test_layers_resampling.py | 73 + tests/layers/test_layers_scale.py | 49 + tests/layers/test_layers_shape.py | 124 + tests/layers/test_layers_stack.py | 107 + tests/models/test_auto_naming.py | 283 ++ tests/models/test_keras_save.py | 46 + tests/models/test_model_core.py | 426 ++ tests/models/test_model_save.py | 288 ++ tests/models/test_model_save_graph.py | 547 +++ tests/models/test_seq2seq_model.py | 96 + tests/models/test_seq2seq_with_attention.py | 102 + tests/pending/__init__.py | 0 tests/pending/test_array_ops.py | 244 + tests/pending/test_decorators.py | 48 + tests/pending/test_documentation.py | 55 + tests/pending/test_layers_basic.py | 64 + tests/pending/test_layers_flow_control.py | 75 + tests/pending/test_layers_importer.py | 90 + tests/pending/test_layers_normalization.py | 81 + tests/pending/test_layers_padding.py | 99 + .../test_layers_spatial_transformer.py | 86 + tests/pending/test_layers_stack.py | 63 + tests/pending/test_layers_super_resolution.py | 68 + tests/pending/test_layers_time_distributed.py | 68 + tests/pending/test_logging.py | 55 + tests/pending/test_logging_hyperdash.py | 141 + tests/pending/test_mnist_simple.py | 93 + tests/pending/test_models.py | 108 + tests/pending/test_optimizer_amsgrad.py | 75 + tests/pending/test_pydocstyle.py | 72 + tests/pending/test_reuse_mlp.py | 56 + tests/pending/test_tf_layers.py | 217 + tests/pending/test_timeout.py | 89 + tests/pending/test_utils_predict.py | 55 + tests/pending/test_yapf_format.py | 65 + tests/performance_test/__init__.py | 0 tests/performance_test/vgg/README.md | 34 + tests/performance_test/vgg/__init__.py | 0 tests/performance_test/vgg/exp_config.py | 16 + tests/performance_test/vgg/keras_test.py | 66 + tests/performance_test/vgg/pytorch_test.py | 75 + tests/performance_test/vgg/tf2-autograph.py | 77 + tests/performance_test/vgg/tf2-eager.py | 78 + tests/performance_test/vgg/tl2-autograph.py | 79 + tests/performance_test/vgg/tl2-eager.py | 79 + .../vgg/tl2-static-autograph.py | 79 + .../performance_test/vgg/tl2-static-eager.py | 79 + tests/test_activations.py | 122 + tests/test_initializers.py | 90 + tests/test_nlp.py | 80 + tests/utils/__init__.py | 9 + tests/utils/custom_layers/__init__.py | 5 + tests/utils/custom_layers/basic_layers.py | 136 + tests/utils/custom_layers/inception_blocks.py | 279 ++ tests/utils/custom_networks/__init__.py | 4 + tests/utils/custom_networks/inceptionv4.py | 195 + tests/utils/custom_testcase.py | 18 + tests/utils/list_py_files.py | 26 + tests/utils/timeout_utils.py | 36 + tl | 13 + 321 files changed, 60231 insertions(+), 299 deletions(-) create mode 100644 .codacy.yaml create mode 100644 .dockerignore create mode 100644 .pyup.yml create mode 100644 .readthedocs.yml create mode 100644 .travis.yml create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE create mode 100644 LICENSE.rst create mode 100644 Makefile create mode 100644 README.rst create mode 100644 docker/DockerLint.bat create mode 100644 docker/Dockerfile create mode 100644 docker/docs/Dockerfile create mode 100644 docker/docs/sources.list.ustc create mode 100644 docker/pypi_list.py create mode 100644 docker/version_prefix.py create mode 100644 docs/Makefile create mode 100644 docs/_static/fix_rtd.css create mode 100644 docs/conf.py create mode 100644 docs/images/affine_transform_comparison.jpg create mode 100644 docs/images/affine_transform_why.jpg create mode 100644 docs/index.rst create mode 100644 docs/make.bat create mode 100644 docs/modules/activation.rst create mode 100644 docs/modules/array_ops.rst create mode 100644 docs/modules/cli.rst create mode 100644 docs/modules/cost.rst create mode 100644 docs/modules/db.rst create mode 100644 docs/modules/distributed.rst create mode 100644 docs/modules/files.rst create mode 100644 docs/modules/initializers.rst create mode 100644 docs/modules/iterate.rst create mode 100644 docs/modules/layers.rst create mode 100644 docs/modules/models.rst create mode 100644 docs/modules/nlp.rst create mode 100644 docs/modules/optimizers.rst create mode 100644 docs/modules/prepro.rst create mode 100644 docs/modules/rein.rst create mode 100644 docs/modules/utils.rst create mode 100644 docs/modules/visualize.rst create mode 100644 docs/user/contributing.rst create mode 100644 docs/user/examples.rst create mode 100644 docs/user/faq.rst create mode 100644 docs/user/get_involved.rst create mode 100644 docs/user/get_start_advance.rst create mode 100644 docs/user/get_start_model.rst create mode 100644 docs/user/installation.rst create mode 100644 docs/user/my_figs/basic_seq2seq.png create mode 100644 docs/user/my_figs/img_tensorlayer.png create mode 100644 docs/user/my_figs/img_tlayer.png create mode 100644 docs/user/my_figs/img_tlayer_big.png create mode 100644 docs/user/my_figs/img_tunelayer.png create mode 100644 docs/user/my_figs/karpathy_rnn.jpeg create mode 100644 docs/user/my_figs/mnist.jpeg create mode 100644 docs/user/my_figs/pong_game.jpeg create mode 100644 docs/user/my_figs/seq2seq.png create mode 100644 docs/user/my_figs/tl_black_logo.png create mode 100644 docs/user/my_figs/tl_transparent_logo.png create mode 100644 docs/user/my_figs/tl_white_logo.png create mode 100644 docs/user/my_figs/tsne.png create mode 100644 docs/user/my_figs/word2vec_basic.pdf create mode 100644 examples/basic_tutorials/tutorial_LayerList.py create mode 100644 examples/basic_tutorials/tutorial_cifar10_cnn_dynamic_MS_backend.py create mode 100644 examples/basic_tutorials/tutorial_cifar10_cnn_dynamic_TF_backend.py create mode 100644 examples/basic_tutorials/tutorial_mnist_mlp_dynamci_dragon.py create mode 100644 examples/basic_tutorials/tutorial_mnist_mlp_dynamic_MS_backend.py create mode 100644 examples/basic_tutorials/tutorial_mnist_mlp_dynamic_TF_backend.py create mode 100644 examples/basic_tutorials/tutorial_mnist_mlp_mindspore.py create mode 100644 examples/basic_tutorials/tutorial_mnist_simple.py create mode 100644 examples/basic_tutorials/tutorial_nested_usage_of_Layer.py create mode 100644 examples/basic_tutorials/tutorial_paddle_tensorlayer_mlp.py create mode 100644 examples/model_zoo/__init__.py create mode 100644 examples/model_zoo/common.py create mode 100644 examples/model_zoo/imagenet_classes.py create mode 100644 examples/model_zoo/model/coco.names create mode 100644 examples/model_zoo/model/weights_2.txt create mode 100644 examples/model_zoo/model/weights_3.txt create mode 100644 examples/model_zoo/model/yolov4_weights3_config.txt create mode 100644 examples/model_zoo/model/yolov4_weights_config.txt create mode 100644 examples/model_zoo/pretrained_resnet50.py create mode 100644 examples/model_zoo/pretrained_vgg16.py create mode 100644 examples/model_zoo/pretrained_yolov4.py create mode 100644 examples/model_zoo/resnet.py create mode 100644 examples/model_zoo/vgg.py create mode 100644 examples/model_zoo/yolo.py create mode 100644 img/TL_gardener.png create mode 100644 img/TL_gardener.psd create mode 100644 img/awesome-mentioned.png create mode 100644 img/github_mascot.png create mode 100644 img/img_tensorflow.png create mode 100644 img/img_tensorlayer.png create mode 100644 img/img_tlayer1.png create mode 100644 img/join_slack.png create mode 100644 img/join_slack.psd create mode 100644 img/medium/Readme.md create mode 100644 img/medium/medium_header.png create mode 100644 img/medium/medium_header.psd create mode 100644 img/tl_black_logo.png create mode 100644 img/tl_transparent_logo.png create mode 100644 img/tl_white_logo.png create mode 100644 requirements/requirements.txt create mode 100644 requirements/requirements_contrib_loggers.txt create mode 100644 requirements/requirements_db.txt create mode 100644 requirements/requirements_dev.txt create mode 100644 requirements/requirements_doc.txt create mode 100644 requirements/requirements_extra.txt create mode 100644 requirements/requirements_test.txt create mode 100644 requirements/requirements_tf_cpu.txt create mode 100644 requirements/requirements_tf_gpu.txt create mode 100644 run_compile.py create mode 100644 scripts/download_and_install_openmpi3_ubuntu.sh create mode 100644 scripts/install-horovod-for-doc-test.sh create mode 100644 scripts/install-requirements-for-rtd.sh create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 setup.travis.cfg create mode 100644 setup.travis_doc.cfg create mode 100644 tensorlayer/__init__.py create mode 100644 tensorlayer/array_ops.py create mode 100644 tensorlayer/backend/__init__.py create mode 100644 tensorlayer/backend/ops/__init__.py create mode 100644 tensorlayer/backend/ops/dragon_backend.py create mode 100644 tensorlayer/backend/ops/dragon_nn.py create mode 100644 tensorlayer/backend/ops/load_backend.py create mode 100644 tensorlayer/backend/ops/mindspore_backend.py create mode 100644 tensorlayer/backend/ops/mindspore_nn.py create mode 100644 tensorlayer/backend/ops/paddle_backend.py create mode 100644 tensorlayer/backend/ops/paddle_nn.py create mode 100644 tensorlayer/backend/ops/tensorflow_backend.py create mode 100644 tensorlayer/backend/ops/tensorflow_nn.py create mode 100644 tensorlayer/cli/__init__.py create mode 100644 tensorlayer/cli/__main__.py create mode 100644 tensorlayer/cli/train.py create mode 100644 tensorlayer/cost/__init__.py create mode 100644 tensorlayer/cost/mindspore_cost.py create mode 100644 tensorlayer/cost/paddle_cost.py create mode 100644 tensorlayer/cost/tensorflow_cost.py create mode 100644 tensorlayer/dataflow/__init__.py create mode 100644 tensorlayer/dataflow/dataflow_examples.py create mode 100644 tensorlayer/dataflow/image/__init__.py create mode 100644 tensorlayer/dataflow/mindspore_data.py create mode 100644 tensorlayer/dataflow/mindspore_image.py create mode 100644 tensorlayer/dataflow/tensorflow_data.py create mode 100644 tensorlayer/dataflow/tensorflow_image.py create mode 100644 tensorlayer/db.py create mode 100644 tensorlayer/decorators/__init__.py create mode 100644 tensorlayer/decorators/deprecated.py create mode 100644 tensorlayer/decorators/deprecated_alias.py create mode 100644 tensorlayer/decorators/method_decorator.py create mode 100644 tensorlayer/decorators/utils.py create mode 100644 tensorlayer/distributed.py create mode 100644 tensorlayer/files/__init__.py create mode 100644 tensorlayer/files/dataset_loaders/__init__.py create mode 100644 tensorlayer/files/dataset_loaders/celebA_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/cifar10_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/cyclegan_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/flickr_1M_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/flickr_25k_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/imdb_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/matt_mahoney_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/mnist_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/mnist_fashion_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/mnist_utils.py create mode 100644 tensorlayer/files/dataset_loaders/mpii_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/nietzsche_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/ptb_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/voc_dataset.py create mode 100644 tensorlayer/files/dataset_loaders/wmt_en_fr_dataset.py create mode 100644 tensorlayer/files/utils.py create mode 100644 tensorlayer/initializers/__init__.py create mode 100644 tensorlayer/initializers/load_initializers_backend.py create mode 100644 tensorlayer/initializers/paddle_initializers.py create mode 100644 tensorlayer/initializers/tensorflow_initializers.py create mode 100644 tensorlayer/iterate.py create mode 100644 tensorlayer/layers/__init__.py create mode 100644 tensorlayer/layers/activation.py create mode 100644 tensorlayer/layers/convolution/__init__.py create mode 100644 tensorlayer/layers/convolution/deformable_conv.py create mode 100644 tensorlayer/layers/convolution/depthwise_conv.py create mode 100644 tensorlayer/layers/convolution/quan_conv.py create mode 100644 tensorlayer/layers/convolution/quan_conv_bn.py create mode 100644 tensorlayer/layers/convolution/simplified_conv.py create mode 100644 tensorlayer/layers/convolution/super_resolution.py create mode 100644 tensorlayer/layers/convolution/ternary_conv.py create mode 100644 tensorlayer/layers/core/__init__.py create mode 100644 tensorlayer/layers/core/common.py create mode 100644 tensorlayer/layers/core/core_dragon.py create mode 100644 tensorlayer/layers/core/core_mindspore.py create mode 100644 tensorlayer/layers/core/core_paddle.py create mode 100644 tensorlayer/layers/core/core_tensorflow.py create mode 100644 tensorlayer/layers/dense/__init__.py create mode 100644 tensorlayer/layers/dense/base_dense.py create mode 100644 tensorlayer/layers/dense/binary_dense.py create mode 100644 tensorlayer/layers/dense/dorefa_dense.py create mode 100644 tensorlayer/layers/dense/dropconnect.py create mode 100644 tensorlayer/layers/dense/quan_dense.py create mode 100644 tensorlayer/layers/dense/quan_dense_bn.py create mode 100644 tensorlayer/layers/dense/ternary_dense.py create mode 100644 tensorlayer/layers/deprecated.py create mode 100644 tensorlayer/layers/dropout.py create mode 100644 tensorlayer/layers/embedding.py create mode 100644 tensorlayer/layers/extend.py create mode 100644 tensorlayer/layers/image_resampling.py create mode 100644 tensorlayer/layers/inputs.py create mode 100644 tensorlayer/layers/lambda_layers.py create mode 100644 tensorlayer/layers/merge.py create mode 100644 tensorlayer/layers/noise.py create mode 100644 tensorlayer/layers/normalization.py create mode 100644 tensorlayer/layers/padding.py create mode 100644 tensorlayer/layers/pooling.py create mode 100644 tensorlayer/layers/quantize.py create mode 100644 tensorlayer/layers/recurrent.py create mode 100644 tensorlayer/layers/scale.py create mode 100644 tensorlayer/layers/shape.py create mode 100644 tensorlayer/layers/spatial_transformer.py create mode 100644 tensorlayer/layers/stack.py create mode 100644 tensorlayer/layers/utils.py create mode 100644 tensorlayer/lazy_imports.py create mode 100644 tensorlayer/logging/__init__.py create mode 100644 tensorlayer/logging/contrib/__init__.py create mode 100644 tensorlayer/logging/contrib/hyperdash.py create mode 100644 tensorlayer/logging/tl_logging.py create mode 100644 tensorlayer/models/__init__.py create mode 100644 tensorlayer/models/core.py create mode 100644 tensorlayer/models/models/resnet50_weights_tf_dim_ordering_tf_kernels.h5 create mode 100644 tensorlayer/nlp.py create mode 100644 tensorlayer/optimizers/__init__.py create mode 100644 tensorlayer/optimizers/amsgrad.py create mode 100644 tensorlayer/optimizers/dragon_optimizers.py create mode 100644 tensorlayer/optimizers/load_optimizers_backend.py create mode 100644 tensorlayer/optimizers/mindspore_optimizers.py create mode 100644 tensorlayer/optimizers/paddle_optimizers.py create mode 100644 tensorlayer/optimizers/tensorflow_optimizers.py create mode 100644 tensorlayer/package_info.py create mode 100644 tensorlayer/prepro.py create mode 100644 tensorlayer/rein.py create mode 100644 tensorlayer/utils.py create mode 100644 tensorlayer/visualize.py create mode 100644 tests/__init__.py create mode 100644 tests/files/model_basic.h5 create mode 100644 tests/files/test_utils_saveload.py create mode 100644 tests/layers/__init__.py create mode 100644 tests/layers/test_layers_activation.py create mode 100644 tests/layers/test_layers_convolution.py create mode 100644 tests/layers/test_layers_core_act.py create mode 100644 tests/layers/test_layers_core_basedense_dropout.py create mode 100644 tests/layers/test_layers_core_nested.py create mode 100644 tests/layers/test_layers_deformable_convolution.py create mode 100644 tests/layers/test_layers_dense.py create mode 100644 tests/layers/test_layers_embedding.py create mode 100644 tests/layers/test_layers_extend.py create mode 100644 tests/layers/test_layers_lambda.py create mode 100644 tests/layers/test_layers_merge.py create mode 100644 tests/layers/test_layers_noise.py create mode 100644 tests/layers/test_layers_normalization.py create mode 100644 tests/layers/test_layers_padding.py create mode 100644 tests/layers/test_layers_pooling.py create mode 100644 tests/layers/test_layers_recurrent.py create mode 100644 tests/layers/test_layers_resampling.py create mode 100644 tests/layers/test_layers_scale.py create mode 100644 tests/layers/test_layers_shape.py create mode 100644 tests/layers/test_layers_stack.py create mode 100644 tests/models/test_auto_naming.py create mode 100644 tests/models/test_keras_save.py create mode 100644 tests/models/test_model_core.py create mode 100644 tests/models/test_model_save.py create mode 100644 tests/models/test_model_save_graph.py create mode 100644 tests/models/test_seq2seq_model.py create mode 100644 tests/models/test_seq2seq_with_attention.py create mode 100644 tests/pending/__init__.py create mode 100644 tests/pending/test_array_ops.py create mode 100644 tests/pending/test_decorators.py create mode 100644 tests/pending/test_documentation.py create mode 100644 tests/pending/test_layers_basic.py create mode 100644 tests/pending/test_layers_flow_control.py create mode 100644 tests/pending/test_layers_importer.py create mode 100644 tests/pending/test_layers_normalization.py create mode 100644 tests/pending/test_layers_padding.py create mode 100644 tests/pending/test_layers_spatial_transformer.py create mode 100644 tests/pending/test_layers_stack.py create mode 100644 tests/pending/test_layers_super_resolution.py create mode 100644 tests/pending/test_layers_time_distributed.py create mode 100644 tests/pending/test_logging.py create mode 100644 tests/pending/test_logging_hyperdash.py create mode 100644 tests/pending/test_mnist_simple.py create mode 100644 tests/pending/test_models.py create mode 100644 tests/pending/test_optimizer_amsgrad.py create mode 100644 tests/pending/test_pydocstyle.py create mode 100644 tests/pending/test_reuse_mlp.py create mode 100644 tests/pending/test_tf_layers.py create mode 100644 tests/pending/test_timeout.py create mode 100644 tests/pending/test_utils_predict.py create mode 100644 tests/pending/test_yapf_format.py create mode 100644 tests/performance_test/__init__.py create mode 100644 tests/performance_test/vgg/README.md create mode 100644 tests/performance_test/vgg/__init__.py create mode 100644 tests/performance_test/vgg/exp_config.py create mode 100644 tests/performance_test/vgg/keras_test.py create mode 100644 tests/performance_test/vgg/pytorch_test.py create mode 100644 tests/performance_test/vgg/tf2-autograph.py create mode 100644 tests/performance_test/vgg/tf2-eager.py create mode 100644 tests/performance_test/vgg/tl2-autograph.py create mode 100644 tests/performance_test/vgg/tl2-eager.py create mode 100644 tests/performance_test/vgg/tl2-static-autograph.py create mode 100644 tests/performance_test/vgg/tl2-static-eager.py create mode 100644 tests/test_activations.py create mode 100644 tests/test_initializers.py create mode 100644 tests/test_nlp.py create mode 100644 tests/utils/__init__.py create mode 100644 tests/utils/custom_layers/__init__.py create mode 100644 tests/utils/custom_layers/basic_layers.py create mode 100644 tests/utils/custom_layers/inception_blocks.py create mode 100644 tests/utils/custom_networks/__init__.py create mode 100644 tests/utils/custom_networks/inceptionv4.py create mode 100644 tests/utils/custom_testcase.py create mode 100644 tests/utils/list_py_files.py create mode 100644 tests/utils/timeout_utils.py create mode 100644 tl diff --git a/.codacy.yaml b/.codacy.yaml new file mode 100644 index 0000000..14735f0 --- /dev/null +++ b/.codacy.yaml @@ -0,0 +1,9 @@ +# https://support.codacy.com/hc/en-us/articles/115002130625-Codacy-Configuration-File +--- +engines: + bandit: + enabled: false # FIXME: make it work +exclude_paths: +- scripts/* +- setup.py +- docker/**/* diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6b8710a --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +.git diff --git a/.gitignore b/.gitignore index 94ca90d..4a6f60f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,87 +1,131 @@ -# ---> Android -# Built application files -*.apk -*.aar -*.ap_ -*.aab - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ -# Uncomment the following line in case you need and you don't have the release build type files in your app -# release/ - -# Gradle files -.gradle/ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +*~ + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 -# Local configuration file (sdk path, etc) -local.properties +# Flask stuff: +instance/ +.webassets-cache -# Proguard folder generated by Eclipse -proguard/ +# Scrapy stuff: +.scrapy -# Log Files -*.log +# Sphinx documentation +docs/_build/ +docs/test_build/ +docs/build_test/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +venv_/ +venv2/ +venv3/ +venv_doc/ +venv_py2/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + + +# IDE Specific directories +.DS_Store +.idea +.vscode/ + +# TensorLayer Directories +checkpoints +data/ +lib_win/ -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/assetWizardSettings.xml -.idea/dictionaries -.idea/libraries -# Android Studio 3 in .gitignore file. -.idea/caches -.idea/modules.xml -# Comment next line if keeping position of elements in Navigation Editor is relevant for you -.idea/navEditor.xml - -# Keystore files -# Uncomment the following lines if you do not want to check your keystore files in. -#*.jks -#*.keystore - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild -.cxx/ - -# Google Services (e.g. APIs or Firebase) -# google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md - -# Version control -vcs.xml - -# lint -lint/intermediates/ -lint/generated/ -lint/outputs/ -lint/tmp/ -# lint/reports/ +# Custom Scripts +update_tl.bat +update_tl.py +# Data Files and ByteCode files +*.gz +*.npz diff --git a/.pyup.yml b/.pyup.yml new file mode 100644 index 0000000..6c96920 --- /dev/null +++ b/.pyup.yml @@ -0,0 +1,75 @@ +############################################################################ +# see https://pyup.io/docs/configuration/ for all available options # +############################################################################ + +# configure updates globally +# default: all +# allowed: all, insecure, False +update: all + +# configure dependency pinning globally +# default: True +# allowed: True, False +pin: False + +# set the default branch +# default: empty, the default branch on GitHub +branch: master + +# update schedule +# default: empty +# allowed: "every day", "every week", .. +schedule: "every day" + +# search for requirement files +# default: True +# allowed: True, False +search: False + +# Specify requirement files by hand, default is empty +# default: empty +# allowed: list +requirements: + # Requirements for the library + - requirements/requirements.txt + + # Requirements for the development + - requirements/requirements_tf_cpu.txt + + # Requirements for the development + - requirements/requirements_tf_gpu.txt + + # Not necessary, but recommended libraries + - requirements/requirements_extra.txt + + # Requirements for contrib loggers + - requirements_contrib_loggers.txt + + # Requirements for the db + - requirements/requirements_db.txt + + # Requirements for the development + - requirements/requirements_dev.txt + + # Requirements for building docs + - requirements/requirements_doc.txt + + # Requirements for running unittests + - requirements/requirements_test.txt + +# add a label to pull requests, default is not set +# requires private repo permissions, even on public repos +# default: empty +#label_prs: update + +# configure the branch prefix the bot is using +# default: pyup- +branch_prefix: pyup- + +# set a global prefix for PRs +# default: empty +pr_prefix: "PyUP - Dependency Update" + +# allow to close stale PRs +# default: True +close_prs: True diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000..0752675 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,14 @@ +# https://docs.readthedocs.io/en/latest/yaml-config.html + +build: + image: latest # For python 3.6 + +formats: + - epub + - pdf + +python: + version: 3.6 + +requirements_file: + requirements/requirements_doc.txt diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..63cda3d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,119 @@ +# https://docs.travis-ci.com/user/languages/python/ +language: python + +# https://docs.travis-ci.com/user/caching/#pip-cache +cache: + directories: + - $HOME/.cache/pip/wheels + +addons: + apt: + update: false + +branches: + only: + - master + - TensorLayer-2.x + - /^\d+\.\d+(\.\d+)?(\S*)?$/ + +python: + - "3.6" + - "3.5" +# - "2.7" # TensorLayer 2.0 does not support python2 now + +env: + + # Backward Compatibility in insured for release less than 1 year old. + # https://pypi.org/project/tensorflow/#history + matrix: + - _TF_VERSION=2.0.0-rc1 +# - _TF_VERSION=1.12.0 # Remove on Oct 22, 2019 +# - _TF_VERSION=1.11.0 # Remove on Sep 28, 2019 +# - _TF_VERSION=1.10.1 # Remove on Aug 24, 2019 +# - _TF_VERSION=1.9.0 # Remove on Jul 10, 2019 +# - _TF_VERSION=1.8.0 # Remove on Apr 28, 2019 +# - _TF_VERSION=1.7.1 # Remove on May 08, 2019 +# - _TF_VERSION=1.7.0 # Remove on Mar 29, 2019 +# - _TF_VERSION=1.6.0 # Remove on Mar 01, 2019 + + global: + + - PYPI_USER='jonathandekhtiar' + + # See https://docs.travis-ci.com/user/encryption-keys/ for more details about secure keys. + + ### == PYPI_PASSWORD === ### + ## To update: travis encrypt PYPI_PASSWORD=################################ + - secure: "fGIRDjfzzP9DhdDshgh/+bWTZ5Y0jTD4aR+gsT1TyAyc6N4f3RRlx70xZZwYMdQ+XC3no/q4na8UzhhuSM0hCCM1EaQ78WF1c6+FBScf4vYGoYgyJ1am+4gu54JXt+4f0bd+s6jyYBafJALUJp5fqHoxCUXqzjrOqGBBU2+JbL71Aaj8yhQuK0VPPABexsQPQM312Gvzg7hy9dh63J0Q02PqINn+CTcwq3gLH9Oua58zWQ7TaT0cdy/hzAc6Yxy3ajo2W5NU+nKROaaG9W57sa7K/v1dshDFFFST2DdGxm9i7vvfPsq0OWM6qWLsec/4mXJWsmai2ygZEv+IhaABb10c7spd2nl7oHFj2UGmldtO5W0zLb1KkCPWDPilFt3lvHM+OS/YaibquL5/5+yGj0LsRJrVyWoMBA8idcQeH4dvTAfySeFpO42VNwW5ez9JaEOh7bBp7naAA8c/fbNJJ5YEW4MEmOZ9dwFTohNNDiN+oITSrcXBS+jukbfTOmtCeYNUker+4G2YwII9cxHXbZeIMrTq9AqTfOVTAYCFaFHKbpSc1+HCyF7n5ZfNC00kBaw93XUnLRzSNKe5Ir791momYL8HecMN3OAI77bz26/pHSfzJnLntq9qx2nLBTnqDuSq5/pHvdZ8hyt+hTDxvF7HJIVMhbnkjoLPxmn4k/I=" + + ### === GITHUB_PERSONAL_TOKEN === ### + ## To update: travis encrypt GITHUB_PERSONAL_TOKEN=################################ + - secure: "kMxg4WfTwhnYMD7WjYk71vgw7XlShPpANauKzfTL6oawDrpQRkBUai4uQwiL3kXVBuVv9rKKKZxxnyAm05iB5wGasPDhlFA1DPF0IbyU3pwQKlw2Xo5qtHdgxBnbms6JJ9z5b+hHCVg+LXYYeUw5qG01Osg5Ue6j1g2juQQHCod00FNuo3fe8ah/Y10Rem6CigH8ofosCrTvN2w1GaetJwVehRYf8JkPC6vQ+Yk8IIjHn2CaVJALbhuchVblxwH0NXXRen915BVBwWRQtsrvEVMXKu7A8sMHmvPz1u3rhXQfjpF2KeVOfy1ZnyiHcLE2HgAPuAGh4kxZAAA8ovmcaCbv8m64bm72BrQApSbt6OEtR9L1UeUwdEgi54FH1XFOHQ9dA6CpiGCyk3wAJZqO0/PkNYVLfb4gPLvnvBRwYBaPgUPvVNhidFu/oODENZmcf8g9ChtuC1GT70EYlVwhgDGqUY7/USZCEvIPe81UToqtIKgcgA+Is51XindumJVMiqTsjgdqeC/wZcw+y37TAjIvvXbtYxeqIKv9zh1JuZppqUhnf+OhI+HHFaY4iu7lQTs3C0WmoLskZAp9srwRtifnVFFkdYzngmPaSjWyko2qiS0cTdFJQB/ljqmnJdksacbv5OOa0Q4qZef/hW774nVx105FlkAIk70D2b5l2pA=" + + ### === GITHUB_PERSONAL_TOKEN === ### + ## To update: travis encrypt HYPERDASH_APIKEY=################################ + - secure: "ez9Ck1VpqWOd2PPu+CMWzd8R4aAIXbjKCk96PCKwWu8VXoHjaPkiy8Nn0LUzSlUg3nKdZmu2JSndwDMy3+lMLG7zE2WlGNY7MF5KM3GrvFpP3cxJQ6OuPcZcEH4j5KtBtNTrNqa8SWglqhc9mr66a92SD8Ydc4aMj6L9nbQvrsvVzIMmMy6weVlpBF35nweYCM8LxlsnqyPLleHPZo3o/k+hsTqQQbiMGjC78tqrGr56u7AjL2+D/m33+dfCGzFvMJFcpLQ5ldbcVU54i5e6V3xJ48P30QOGZaqG3fcpfZsyJEIWjykt6XFA8GfJjaVVbxdlr7zP7Vd9iWBuemnMEX3F9Cy/4x7LmX9PJfsVPC6FQnanDvsZSNO5hpmKe8BTpttJJvxgscOczV4jnI69OzqhSQeyChwtkqhIg1E/53XIO+uLJAAZsCkAco7tjGGXTKyv8ZlpSJwSqsLcmgpmQbfodCoMLcYenTxqKZv78e2B4tOPGQyS2bkSxAqhvAIam7RCq/yEvz5n2/mBFEGwP6OQFIdC7ypO2LyrOlLT7HJjCeYMeKSm+GOD3LW9oIy9QJZpG6N/zAAjnk9C2mYtWRQIBo4qdHjRvyDReevDexI8j0AXySblxREmQ7ZaT6KEDXXZSu5goTlaGm0g2HwAkKu9xYFV/bRtp6+i1mP7CQg=" + +matrix: + include: + - python: '3.6' + env: + - _DOC_AND_YAPF_TEST=True + +install: + - | + if [[ -v _DOC_AND_YAPF_TEST ]]; then + pip install tensorflow==2.0.0-rc1 + pip install yapf + pip install -e .[doc] + else + pip install tensorflow==$_TF_VERSION + pip install -e .[all_cpu_dev] + fi + +script: + # units test + # https://docs.pytest.org/en/latest/ + - rm setup.cfg + - | + if [[ -v _DOC_AND_YAPF_TEST ]]; then + mv setup.travis_doc.cfg setup.cfg + else + mv setup.travis.cfg setup.cfg + fi + - pytest + + +before_deploy: + - python setup.py sdist + - python setup.py bdist_wheel + - python setup.py bdist_wheel --universal + - python setup.py egg_info + + +deploy: + +# Documentation: https://docs.travis-ci.com/user/deployment/pypi/ +- provider: pypi + user: '$PYPI_USER' + password: '$PYPI_PASSWORD' + skip_cleanup: true + on: + tags: true + python: '3.6' + condition: '$_TF_VERSION = 2.0.0-rc1' +# condition: '$_TF_VERSION = 1.11.0' + +# Documentation: https://docs.travis-ci.com/user/deployment/releases/ +- provider: releases + file: + - dist/* + - tensorlayer.egg-info/PKG-INFO + file_glob: true + skip_cleanup: true + api_key: '$GITHUB_PERSONAL_TOKEN' + on: + tags: true + python: '3.6' + condition: '$_TF_VERSION = 2.0.0-rc1' +# condition: '$_TF_VERSION = 1.11.0' diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a19b722 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,585 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + + + + +## [Unreleased] + +### Added + +### Changed + +### Dependencies Update + +### Deprecated + +### Fixed + +- Fix README. (#PR 1044) +- Fix package info. (#PR 1046) + +### Removed + +### Security + +### Contributors + +- @luomai (PR #1044, 1046) + + +## [2.2.0] - 2019-09-13 + +TensorLayer 2.2.0 is a maintenance release. +It contains numerous API improvement and bug fixes. +This release is compatible with TensorFlow 2 RC1. + +### Added +- Support nested layer customization (#PR 1015) +- Support string dtype in InputLayer (#PR 1017) +- Support Dynamic RNN in RNN (#PR 1023) +- Add ResNet50 static model (#PR 1030) +- Add performance test code in static model (#PR 1041) + +### Changed + +- `SpatialTransform2dAffine` auto `in_channels` +- support TensorFlow 2.0.0-rc1 +- Update model weights property, now returns its copy (#PR 1010) + +### Fixed +- RNN updates: remove warnings, fix if seq_len=0, unitest (#PR 1033) +- BN updates: fix BatchNorm1d for 2D data, refactored (#PR 1040) + +### Dependencies Update + +### Deprecated + +### Fixed +- Fix `tf.models.Model._construct_graph` for list of outputs, e.g. STN case (PR #1010) +- Enable better `in_channels` exception raise. (PR #1015) +- Set allow_pickle=True in np.load() (#PR 1021) +- Remove `private_method` decorator (#PR 1025) +- Copy original model's `trainable_weights` and `nontrainable_weights` when initializing `ModelLayer` (#PR 1026) +- Copy original model's `trainable_weights` and `nontrainable_weights` when initializing `LayerList` (#PR 1029) +- Remove redundant parts in `model.all_layers` (#PR 1029) +- Replace `tf.image.resize_image_with_crop_or_pad` with `tf.image.resize_with_crop_or_pad` (#PR 1032) +- Fix a bug in `ResNet50` static model (#PR 1041) + +### Removed + +### Security + +### Contributors + +- @zsdonghao +- @luomai +- @ChrisWu1997: #1010 #1015 #1025 #1030 #1040 +- @warshallrho: #1017 #1021 #1026 #1029 #1032 #1041 +- @ArnoldLIULJ: #1023 +- @JingqingZ: #1023 + +## [2.1.0] + +### Changed +- Add version_info in model.config. (PR #992) +- Replace tf.nn.func with tf.nn.func.\_\_name\_\_ in model config. (PR #994) +- Add Reinforcement learning tutorials. (PR #995) +- Add RNN layers with simple rnn cell, GRU cell, LSTM cell. (PR #998) +- Update Seq2seq (#998) +- Add Seq2seqLuongAttention model (#998) + +### Fixed + +### Contributors +- @warshallrho: #992 #994 +- @quantumiracle: #995 +- @Tokarev-TT-33: #995 +- @initial-h: #995 +- @Officium: #995 +- @ArnoldLIULJ: #998 +- @JingqingZ: #998 + + +## [2.0.2] - 2019-6-5 + +### Changed +- change the format of network config, change related code and files; change layer act (PR #980) + +### Fixed +- Fix dynamic model cannot track PRelu weights gradients problem (PR #982) +- Raise .weights warning (commit) + +### Contributors +- @warshallrho: #980 +- @1FengL: #982 + +## [2.0.1] - 2019-5-17 + + +A maintain release. + +### Changed +- remove `tl.layers.initialize_global_variables(sess)` (PR #931) +- support `trainable_weights` (PR #966) + +### Added + - Layer + - `InstanceNorm`, `InstanceNorm1d`, `InstanceNorm2d`, `InstanceNorm3d` (PR #963) + +* Reinforcement learning tutorials. (PR #995) + +### Changed +- remove `tl.layers.initialize_global_variables(sess)` (PR #931) +- update `tutorial_generate_text.py`, `tutorial_ptb_lstm.py`. remove `tutorial_ptb_lstm_state_is_tuple.py` (PR #958) +- change `tl.layers.core`, `tl.models.core` (PR #966) +- change `weights` into `all_weights`, `trainable_weights`, `nontrainable_weights` + +### Dependencies Update +- nltk>=3.3,<3.4 => nltk>=3.3,<3.5 (PR #892) +- pytest>=3.6,<3.11 => pytest>=3.6,<4.1 (PR #889) +- yapf>=0.22,<0.25 => yapf==0.25.0 (PR #896) +- imageio==2.5.0 progressbar2==3.39.3 scikit-learn==0.21.0 scikit-image==0.15.0 scipy==1.2.1 wrapt==1.11.1 pymongo==3.8.0 sphinx==2.0.1 wrapt==1.11.1 opencv-python==4.1.0.25 requests==2.21.0 tqdm==4.31.1 lxml==4.3.3 pycodestyle==2.5.0 sphinx==2.0.1 yapf==0.27.0(PR #967) + +### Fixed +- fix docs of models @zsdonghao #957 +- In `BatchNorm`, keep dimensions of mean and variance to suit `channels first` (PR #963) + +### Contributors +- @warshallrho: #PR966 +- @zsdonghao: #931 +- @yd-yin: #963 +- @Tokarev-TT-33: # 995 +- @initial-h: # 995 +- @quantumiracle: #995 +- @Officium: #995 +- @1FengL: #958 +- @dvklopfenstein: #971 + + +## [2.0.0] - 2019-05-04 + +To many PR for this update, please check [here](https://github.com/tensorlayer/tensorlayer/releases/tag/2.0.0) for more details. + +### Changed +* update for TensorLayer 2.0.0 alpha version (PR #952) +* support TensorFlow 2.0.0-alpha +* support both static and dynamic model building + +### Dependencies Update +- tensorflow>=1.6,<1.13 => tensorflow>=2.0.0-alpha (PR #952) +- h5py>=2.9 (PR #952) +- cloudpickle>=0.8.1 (PR #952) +- remove matplotlib + +### Contributors +- @zsdonghao +- @JingqingZ +- @ChrisWu1997 +- @warshallrho + + +## [1.11.1] - 2018-11-15 + +### Changed +* guide for pose estimation - flipping (PR #884) +* cv2 transform support 2 modes (PR #885) + +### Dependencies Update +- pytest>=3.6,<3.9 => pytest>=3.6,<3.10 (PR #874) +- requests>=2.19,<2.20 => requests>=2.19,<2.21 (PR #874) +- tqdm>=4.23,<4.28 => tqdm>=4.23,<4.29 (PR #878) +- pytest>=3.6,<3.10 => pytest>=3.6,<3.11 (PR #886) +- pytest-xdist>=1.22,<1.24 => pytest-xdist>=1.22,<1.25 (PR #883) +- tensorflow>=1.6,<1.12 => tensorflow>=1.6,<1.13 (PR #886) + +### Contributors +- @zsdonghao: #884 #885 + +## [1.11.0] - 2018-10-18 + +### Added +- Layer: + - Release `GroupNormLayer` (PR #850) +- Image affine transformation APIs + - `affine_rotation_matrix` (PR #857) + - `affine_horizontal_flip_matrix` (PR #857) + - `affine_vertical_flip_matrix` (PR #857) + - `affine_shift_matrix` (PR #857) + - `affine_shear_matrix` (PR #857) + - `affine_zoom_matrix` (PR #857) + - `affine_transform_cv2` (PR #857) + - `affine_transform_keypoints` (PR #857) +- Affine transformation tutorial + - `examples/data_process/tutorial_fast_affine_transform.py` (PR #857) + +### Changed +- BatchNormLayer: support `data_format` + +### Dependencies Update +- matplotlib>=2.2,<2.3 => matplotlib>=2.2,<3.1 (PR #845) +- pydocstyle>=2.1,<2.2 => pydocstyle>=2.1,<3.1 (PR #866) +- scikit-learn>=0.19,<0.20 => scikit-learn>=0.19,<0.21 (PR #851) +- sphinx>=1.7,<1.8 => sphinx>=1.7,<1.9 (PR #842) +- tensorflow>=1.6,<1.11 => tensorflow>=1.6,<1.12 (PR #853) +- tqdm>=4.23,<4.26 => tqdm>=4.23,<4.28 (PR #862 & #868) +- yapf>=0.22,<0.24 => yapf>=0.22,<0.25 (PR #829) + +### Fixed +- Correct offset calculation in `tl.prepro.transform_matrix_offset_center` (PR #855) + +### Contributors +- @2wins: #850 #855 +- @DEKHTIARJonathan: #853 +- @zsdonghao: #857 +- @luomai: #857 + +## [1.10.1] - 2018-09-07 + +### Added +- unittest `tests\test_timeout.py` has been added to ensure the network creation process does not freeze. + +### Changed + - remove 'tensorboard' param, replaced by 'tensorboard_dir' in `tensorlayer/utils.py` with customizable tensorboard directory (PR #819) + +### Removed +- TL Graph API removed. Memory Leaks Issues with this API, will be fixed and integrated in TL 2.0 (PR #818) + +### Fixed +- Issue #817 fixed: TL 1.10.0 - Memory Leaks and very slow network creation. + +### Dependencies Update +- autopep8>=1.3,<1.4 => autopep8>=1.3,<1.5 (PR #815) +- imageio>=2.3,<2.4 => imageio>=2.3,<2.5 (PR #823) +- pytest>=3.6,<3.8 => pytest>=3.6,<3.9 (PR #823) +- pytest-cov>=2.5,<2.6 => pytest-cov>=2.5,<2.7 (PR #820) + +### Contributors +- @DEKHTIARJonathan: #815 #818 #820 #823 +- @ndiy: #819 +- @zsdonghao: #818 + + +## [1.10.0] - 2018-09-02 + +### Added +- API: + - Add `tl.model.vgg19` (PR #698) + - Add `tl.logging.contrib.hyperdash` (PR #739) + - Add `tl.distributed.trainer` (PR #700) + - Add `prefetch_buffer_size` to the `tl.distributed.trainer` (PR #766) + - Add `tl.db.TensorHub` (PR #751) + - Add `tl.files.save_graph` (PR #751) + - Add `tl.files.load_graph_` (PR #751) + - Add `tl.files.save_graph_and_params` (PR #751) + - Add `tl.files.load_graph_and_params` (PR #751) + - Add `tl.prepro.keypoint_random_xxx` (PR #787) +- Documentation: + - Add binary, ternary and dorefa links (PR #711) + - Update input scale of VGG16 and VGG19 to 0~1 (PR #736) + - Update database (PR #751) +- Layer: + - Release SwitchNormLayer (PR #737) + - Release QuanConv2d, QuanConv2dWithBN, QuanDenseLayer, QuanDenseLayerWithBN (PR#735) + - Update Core Layer to support graph (PR #751) + - All Pooling layers support `data_format` (PR #809) +- Setup: + - Creation of installation flaggs `all_dev`, `all_cpu_dev`, and `all_gpu_dev` (PR #739) +- Examples: + - change folder struction (PR #802) + - `tutorial_models_vgg19` has been introduced to show how to use `tl.model.vgg19` (PR #698). + - fix bug of `tutorial_bipedalwalker_a3c_continuous_action.py` (PR #734, Issue #732) + - `tutorial_models_vgg16` and `tutorial_models_vgg19` has been changed the input scale from [0,255] to [0,1](PR #710) + - `tutorial_mnist_distributed_trainer.py` and `tutorial_cifar10_distributed_trainer.py` are added to explain the uses of Distributed Trainer (PR #700) + - add `tutorial_quanconv_cifar10.py` and `tutorial_quanconv_mnist.py` (PR #735) + - add `tutorial_work_with_onnx.py`(PR #775) +- Applications: + - [Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization](https://arxiv.org/abs/1703.06868) (PR #799) + +### Changed + - function minibatches changed to avoid wasting samples.(PR #762) + - all the input scale in both vgg16 and vgg19 has been changed the input scale from [0,255] to [0,1](PR #710) + - Dockerfiles merged and refactored into one file (PR #747) + - LazyImports move to the most **top level** imports as possible (PR #739) + - some new test functions have been added in `test_layers_convolution.py`, `test_layers_normalization.py`, `test_layers_core.py` (PR #735) + - documentation now uses mock imports reducing the number of dependencies to compile the documentation (PR #785) + - fixed and enforced pydocstyle D210, D200, D301, D207, D403, D204, D412, D402, D300, D208 (PR #784) + +### Deprecated + - `tl.logging.warn` has been deprecated in favor of `tl.logging.warning` (PR #739) + +### Removed + - `conv_layers()` has been removed in both vgg16 and vgg19(PR #710) + - graph API (PR #818) + +### Fixed +- import error caused by matplotlib on OSX (PR #705) +- missing import in tl.prepro (PR #712) +- Dockerfiles import error fixed - issue #733 (PR #747) +- Fix a typo in `absolute_difference_error` in file: `tensorlayer/cost.py` - Issue #753 (PR #759) +- Fix the bug of scaling the learning rate of trainer (PR #776) +- log error instead of info when npz file not found. (PR #812) + +### Dependencies Update +- numpy>=1.14,<1.15 => numpy>=1.14,<1.16 (PR #754) +- pymongo>=3.6,<3.7 => pymongo>=3.6,<3.8 (PR #750) +- pytest>=3.6,<3.7 => tqdm>=3.6,<3.8 (PR #798) +- pytest-xdist>=1.22,<1.23 => pytest-xdist>=1.22,<1.24 (PR #805 and #806) +- tensorflow>=1.8,<1.9 => tensorflow>=1.6,<1.11 (PR #739 and PR #798) +- tqdm>=4.23,<4.25 => tqdm>=4.23,<4.26 (PR #798) +- yapf>=0.21,<0.22 => yapf>=0.22,<0.24 (PR #798 #808) + +### Contributors +- @DEKHTIARJonathan: #739 #747 #750 #754 +- @lgarithm: #705 #700 +- @OwenLiuzZ: #698 #710 #775 #776 +- @zsdonghao: #711 #712 #734 #736 #737 #700 #751 #809 #818 +- @luomai: #700 #751 #766 #802 +- @XJTUWYD: #735 +- @mutewall: #735 +- @thangvubk: #759 +- @JunbinWang: #796 +- @boldjoel: #787 + +## [1.9.1] - 2018-07-30 + +### Fixed +- Issue with tensorflow 1.10.0 fixed + +## [1.9.0] - 2018-06-16 + +### Added +- API: + - `tl.alphas` and `tl.alphas_like` added following the tf.ones/zeros and tf.zeros_like/ones_like (PR #580) + - `tl.lazy_imports.LazyImport` to import heavy libraries only when necessary (PR #667) + - `tl.act.leaky_relu6` and `tl.layers.PRelu6Layer` have been deprecated (PR #686) + - `tl.act.leaky_twice_relu6` and `tl.layers.PTRelu6Layer` have been deprecated (PR #686) +- CI Tool: + - [Stale Probot](https://github.com/probot/stale) added to clean stale issues (PR #573) + - [Changelog Probot](https://github.com/mikz/probot-changelog) Configuration added (PR #637) + - Travis Builds now handling a matrix of TF Version from TF==1.6.0 to TF==1.8.0 (PR #644) + - CircleCI added to build and upload Docker Containers for each PR merged and tag release (PR #648) +- Decorator: + - `tl.decorators` API created including `deprecated_alias` and `private_method` (PR #660) + - `tl.decorators` API enriched with `protected_method` (PR #675) + - `tl.decorators` API enriched with `deprecated` directly raising warning and modifying documentation (PR #691) +- Docker: + - Containers for each release and for each PR merged on master built (PR #648) + - Containers built in the following configurations (PR #648): + - py2 + cpu + - py2 + gpu + - py3 + cpu + - py3 + gpu +- Documentation: + - Clean README.md (PR #677) + - Release semantic version added on index page (PR #633) + - Optimizers page added (PR #636) + - `AMSGrad` added on Optimizers page added (PR #636) +- Layer: + - ElementwiseLambdaLayer added to use custom function to connect multiple layer inputs (PR #579) + - AtrousDeConv2dLayer added (PR #662) + - Fix bugs of using `tf.layers` in CNN (PR #686) +- Optimizer: + + - AMSGrad Optimizer added based on `On the Convergence of Adam and Beyond (ICLR 2018)` (PR #636) +- Setup: + + - Creation of installation flaggs `all`, `all_cpu`, and `all_gpu` (PR #660) +- Test: + - `test_utils_predict.py` added to reproduce and fix issue #288 (PR #566) + - `Layer_DeformableConvolution_Test` added to reproduce issue #572 with deformable convolution (PR #573) + - `Array_Op_Alphas_Test` and `Array_Op_Alphas_Like_Test` added to test `tensorlayer/array_ops.py` file (PR #580) + - `test_optimizer_amsgrad.py` added to test `AMSGrad` optimizer (PR #636) + - `test_logging.py` added to insure robustness of the logging API (PR #645) + - `test_decorators.py` added (PR #660) + - `test_activations.py` added (PR #686) +- Tutorials: + - `tutorial_tfslim` has been introduced to show how to use `SlimNetsLayer` (PR #560). + - add the following to all tutorials (PR #697): + ```python + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + ``` + +### Changed +- Tensorflow CPU & GPU dependencies moved to separated requirement files in order to allow PyUP.io to parse them (PR #573) +- The document of LambdaLayer for linking it with ElementwiseLambdaLayer (PR #587) +- RTD links point to stable documentation instead of latest used for development (PR #633) +- TF Version older than 1.6.0 are officially unsupported and raises an exception (PR #644) +- README.md Badges Updated with Support Python and Tensorflow Versions (PR #644) +- TL logging API has been consistent with TF logging API and thread-safe (PR #645) +- Relative Imports changed for absolute imports (PR #657) +- `tl.files` refactored into a directory with numerous files (PR #657) +- `tl.files.voc_dataset` fixed because of original Pascal VOC website was down (PR #657) +- extra requirements hidden inside the library added in the project requirements (PR #657) +- requirements files refactored in `requirements/` directory (PR #657) +- README.md and other markdown files have been refactored and cleaned. (PR #639) +- Ternary Convolution Layer added in unittest (PR #658) +- Convolution Layers unittests have been cleaned & refactored (PR #658) +- All the tests are now using a DEBUG level verbosity when run individualy (PR #660) +- `tf.identity` as activation is **ignored**, thus reducing the size of the graph by removing useless operation (PR #667) +- argument dictionaries are now checked and saved within the `Layer` Base Class (PR #667) +- `Layer` Base Class now presenting methods to update faultlessly `all_layers`, `all_params`, and `all_drop` (PR #675) +- Input Layers have been removed from `tl.layers.core` and added to `tl.layers.inputs` (PR #675) +- Input Layers are now considered as true layers in the graph (they represent a placeholder), unittests have been updated (PR #675) +- Layer API is simplified, with automatic feeding `prev_layer` into `self.inputs` (PR #675) +- Complete Documentation Refactoring and Reorganization (namely Layer APIs) (PR #691) + +### Deprecated +- `tl.layers.TimeDistributedLayer` argurment `args` is deprecated in favor of `layer_args` (PR #667) +- `tl.act.leaky_relu` have been deprecated in favor of `tf.nn.leaky_relu` (PR #686) + +### Removed +- `assert()` calls remove and replaced by `raise AssertionError()` (PR #667) +- `tl.identity` is removed, not used anymore and deprecated for a long time (PR #667) +- All Code specific to `TF.__version__ < "1.6"` have been removed (PR #675) + +### Fixed +- Issue #498 - Deprecation Warning Fix in `tl.layers.RNNLayer` with `inspect` (PR #574) +- Issue #498 - Deprecation Warning Fix in `tl.files` with truth value of an empty array is ambiguous (PR #575) +- Issue #565 related to `tl.utils.predict` fixed - `np.hstack` problem in which the results for multiple batches are stacked along `axis=1` (PR #566) +- Issue #572 with `tl.layers.DeformableConv2d` fixed (PR #573) +- Issue #664 with `tl.layers.ConvLSTMLayer` fixed (PR #676) +- Typo of the document of ElementwiseLambdaLayer (PR #588) +- Error in `tl.layers.TernaryConv2d` fixed - self.inputs not defined (PR #658) +- Deprecation warning fixed in `tl.layers.binary._compute_threshold()` (PR #658) +- All references to `tf.logging` replaced by `tl.logging` (PR #661) +- Duplicated code removed when bias was used (PR #667) +- `tensorlayer.third_party.roi_pooling.roi_pooling.roi_pooling_ops` is now lazy loaded to prevent systematic error raised (PR #675) +- Documentation not build in RTD due to old version of theme in docs directory fixed (PR #703) +- Tutorial: + - `tutorial_word2vec_basic.py` saving issue #476 fixed (PR #635) + - All tutorials tested and errors have been fixed (PR #635) + +### Dependencies Update +- Update pytest from 3.5.1 to 3.6.0 (PR #647) +- Update progressbar2 from 3.37.1 to 3.38.0 (PR #651) +- Update scikit-image from 0.13.1 to 0.14.0 (PR #656) +- Update keras from 2.1.6 to 2.2.0 (PR #684) +- Update requests from 2.18.4 to 2.19.0 (PR #695) + +### Contributors +- @lgarithm: #563 +- @DEKHTIARJonathan: #573 #574 #575 #580 #633 #635 #636 #639 #644 #645 #648 #657 #667 #658 #659 #660 #661 #666 #667 #672 #675 #683 #686 #687 #690 #691 #692 #703 +- @2wins: #560 #566 #662 +- @One-sixth: #579 +- @zsdonghao: #587 #588 #639 #685 #697 +- @luomai: #639 #677 +- @dengyueyun666: #676 + +## [1.8.5] - 2018-05-09 + +### Added +- Github Templates added (by @DEKHTIARJonathan) + - New issues Template + - New PR Template +- Travis Deploy Automation on new Tag (by @DEKHTIARJonathan) + - Deploy to PyPI and create a new version. + - Deploy to Github Releases and upload the wheel files +- PyUP.io has been added to ensure we are compatible with the latest libraries (by @DEKHTIARJonathan) +- `deconv2d` now handling dilation_rate (by @zsdonghao) +- Documentation unittest added (by @DEKHTIARJonathan) +- `test_layers_core` has been added to ensure that `LayersConfig` is abstract. + +### Changed +- All Tests Refactored - Now using unittests and runned with PyTest (by @DEKHTIARJonathan) +- Documentation updated (by @zsdonghao) +- Package Setup Refactored (by @DEKHTIARJonathan) +- Dataset Downlaod now using library progressbar2 (by @DEKHTIARJonathan) +- `deconv2d` function transformed into Class (by @zsdonghao) +- `conv1d` function transformed into Class (by @zsdonghao) +- super resolution functions transformed into Class (by @zsdonghao) +- YAPF coding style improved and enforced (by @DEKHTIARJonathan) + +### Fixed +- Backward Compatibility Restored with deprecation warnings (by @DEKHTIARJonathan) +- Tensorflow Deprecation Fix (Issue #498): + - AverageEmbeddingInputlayer (by @zsdonghao) + - load_mpii_pose_dataset (by @zsdonghao) +- maxPool2D initializer issue #551 (by @zsdonghao) +- `LayersConfig` class has been enforced as abstract +- Pooling Layer Issue #557 fixed (by @zsdonghao) + +### Dependencies Update +- scipy>=1.0,<1.1 => scipy>=1.1,<1.2 + +### Contributors +@zsdonghao @luomai @DEKHTIARJonathan + +[Unreleased]: https://github.com/tensorlayer/tensorlayer/compare/2.0....master +[2.2.0]: https://github.com/tensorlayer/tensorlayer/compare/2.2.0...2.2.0 +[2.1.0]: https://github.com/tensorlayer/tensorlayer/compare/2.1.0...2.1.0 +[2.0.2]: https://github.com/tensorlayer/tensorlayer/compare/2.0.2...2.0.2 +[2.0.1]: https://github.com/tensorlayer/tensorlayer/compare/2.0.1...2.0.1 +[2.0.0]: https://github.com/tensorlayer/tensorlayer/compare/2.0.0...2.0.0 +[1.11.1]: https://github.com/tensorlayer/tensorlayer/compare/1.11.0...1.11.0 +[1.11.0]: https://github.com/tensorlayer/tensorlayer/compare/1.10.1...1.11.0 +[1.10.1]: https://github.com/tensorlayer/tensorlayer/compare/1.10.0...1.10.1 +[1.10.0]: https://github.com/tensorlayer/tensorlayer/compare/1.9.1...1.10.0 +[1.9.1]: https://github.com/tensorlayer/tensorlayer/compare/1.9.0...1.9.1 +[1.9.0]: https://github.com/tensorlayer/tensorlayer/compare/1.8.5...1.9.0 +[1.8.5]: https://github.com/tensorlayer/tensorlayer/compare/1.8.4...1.8.5 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..6a010a2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,199 @@ +# TensorLayer Contributor Guideline + +## Welcome to contribute! +You are more than welcome to contribute to TensorLayer! If you have any improvement, please send us your [pull requests](https://help.github.com/en/articles/about-pull-requests). You may implement your improvement on your [fork](https://help.github.com/en/articles/working-with-forks). + +## Checklist +* Continuous integration +* Build from sources +* Unittest +* Documentation +* General intro to TensorLayer2 +* How to contribute a new `Layer` +* How to contribute a new `Model` +* How to contribute a new example/tutorial + +## Continuous integration + +We appreciate contributions +either by adding / improving examples or extending / fixing the core library. +To make your contributions, you would need to follow the [pep8](https://www.python.org/dev/peps/pep-0008/) coding style and [numpydoc](https://numpydoc.readthedocs.io/en/latest/) document style. +We rely on Continuous Integration (CI) for checking push commits. +The following tools are used to ensure that your commits can pass through the CI test: + +* [yapf](https://github.com/google/yapf) (format code), compulsory +* [isort](https://github.com/timothycrosley/isort) (sort imports), optional +* [autoflake](https://github.com/myint/autoflake) (remove unused imports), optional + +You can simply run + +```bash +make format +``` + +to apply those tools before submitting your PR. + +## Build from sources + +```bash +# First clone the repository and change the current directory to the newly cloned repository +git clone https://github.com/zsdonghao/tensorlayer2.git +cd tensorlayer2 + +# Install virtualenv if necessary +pip install virtualenv + +# Then create a virtualenv called `venv` +virtualenv venv + +# Activate the virtualenv + +## Linux: +source venv/bin/activate + +## Windows: +venv\Scripts\activate.bat + +# ============= IF TENSORFLOW IS NOT ALREADY INSTALLED ============= # + +# basic installation +pip install . + +# advanced: for a machine **without** an NVIDIA GPU +pip install -e ".[all_cpu_dev]" + +# advanced: for a machine **with** an NVIDIA GPU +pip install -e ".[all_gpu_dev]" +``` + +## Unittest + +Launching the unittest for the whole repo: + +```bash +# install pytest +pip install pytest + +# run pytest +pytest +``` + +Running your unittest code on your implemented module only: + +```bash +# install coverage +pip install coverage + +cd /path/to/your/unittest/code +# For example: cd tests/layers/ + +# run unittest +coverage run --source myproject.module -m unittest discover +# For example: coverage run --source tensorlayer.layers -m unittest discover + +# generate html report +coverage html +``` + +## Documentation +Even though you follow [numpydoc](https://numpydoc.readthedocs.io/en/latest/) document style when writing your code, +this does not ensure those lines appear on TensorLayer online documentation. +You need further modify corresponding RST files in `docs/modules`. + +For example, to add your implemented new pooling layer into documentation, modify `docs/modules/layer.rst`. First, insert layer name under Layer list +```rst +Layer list +---------- + +.. autosummary:: + + NewPoolingLayer +``` + +Second, find pooling layer part and add: +```rst +.. ----------------------------------------------------------- +.. Pooling Layers +.. ----------------------------------------------------------- + +Pooling Layers +------------------------ + +New Pooling Layer +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: NewPoolingLayer +``` + +Finally, test with local documentation: +```bash +cd ./docs + +make clean +make html +# then view generated local documentation by ./html/index.html +``` + +## General intro to TensorLayer2 +* TensorLayer2 is built on [TensorFlow2](https://www.tensorflow.org/alpha), so TensorLayer2 is purely eager, no sessions, no globals. +* TensorLayer2 supports APIs to build static models and dynamic models. Therefore, all `Layers` should be compatible with the two modes. +```python +# An example of a static model +# A static model has inputs and outputs with fixed shape. +inputs = tl.layers.Input([32, 784]) +dense1 = tl.layers.Dense(n_units=800, act=tf.nn.relu, in_channels=784, name='dense1')(inputs) +dense2 = tl.layers.Dense(n_units=10, act=tf.nn.relu, in_channels=800, name='dense2')(dense1) +model = tl.models.Model(inputs=inputs, outputs=dense2) + +# An example of a dynamic model +# A dynamic model has more flexibility. The inputs and outputs may be different in different runs. +class CustomizeModel(tl.models.Model): + def __init__(self): + super(CustomizeModel, self).__init__() + self.dense1 = tl.layers.Dense(n_units=800, act=tf.nn.relu, in_channels=784, name='dense1') + self.dense2 = tl.layers.Dense(n_units=10, act=tf.nn.relu, in_channels=800, name='dense2') + + # a dynamic model allows more flexibility by customising forwarding. + def forward(self, x, bar=None): + d1 = self.dense1(x) + if bar: + return d1 + else: + d2 = self.dense2(d1) + return d1, d2 + +model = CustomizeModel() +``` +* More examples can be found in [examples](examples/) and [tests/layers](tests/layers/). Note that not all of them are completed. + +## How to contribute a new `Layer` +* A `NewLayer` should be a derived from the base class [`Layer`](tensorlayer/layers/core.py). +* Member methods to be overrided: + - `__init__(self, args1, args2, inputs_shape=None, name=None)`: The constructor of the `NewLayer`, which should + - Call `super(NewLayer, self).__init__(name)` to construct the base. + - Define member variables based on the args1, args2 (or even more). + - If the `inputs_shape` is provided, call `self.build(inputs_shape)` and set `self._built=True`. Note that sometimes only `in_channels` should be enough to build the layer like [`Dense`](tensorlayer/layers/dense/base_dense.py). + - Logging by `logging.info(...)`. + - `__repr__(self)`: Return a printable representation of the `NewLayer`. + - `build(self, inputs_shape)`: Build the `NewLayer` by defining weights. + - `forward(self, inputs, **kwargs)`: Forward feeding the `NewLayer`. Note that the forward feeding of some `Layers` may be different during training and testing like [`Dropout`](tensorlayer/layers/dropout.py). +* Unittest: + - Unittest should be done before a pull request. Unittest code can be written in [tests/](tests/) +* Documents: + - Please write a description for each class and method in RST format. The description may include the functionality, arguments, references, examples of the `NewLayer`. +* Examples: [`Dense`](tensorlayer/layers/dense/base_dense.py), [`Dropout`](tensorlayer/layers/dropout.py), [`Conv`](tensorlayer/layers/convolution/simplified_conv.py). + +## How to contribute a new `Model` +* A `NewModel` should be derived from the base class [`Model`](tensorlayer/models/core.py) (if dynamic) or an instance of [`Model`](tensorlayer/models/core.py) (if static). +* A static `NewModel` should have fixed inputs and outputs. Please check the example [`VGG_Static`](tensorlayer/models/vgg.py) +* A dynamic `NewModel` has more flexiblility. Please check the example [`VGG16`](tensorlayer/models/vgg16.py) + +## How to contribute a new example/tutorial +* A new example/tutorial should implement a complete workflow of deep learning which includes (but not limited) + - `Models` construction based on `Layers`. + - Data processing and loading. + - Training and testing. + - Forward feeding by calling the models. + - Loss function. + - Back propagation by `tf.GradientTape()`. + - Model saving and restoring. +* Examples: [MNIST](examples/basic_tutorials/tutorial_mnist_mlp_static.py), [CIFAR10](examples/basic_tutorials/tutorial_cifar10_cnn_static.py), [FastText](examples/text_classification/tutorial_imdb_fasttext.py) diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 4ed90b9..0000000 --- a/LICENSE +++ /dev/null @@ -1,208 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, -AND DISTRIBUTION - - 1. Definitions. - - - -"License" shall mean the terms and conditions for use, reproduction, and distribution -as defined by Sections 1 through 9 of this document. - - - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - - - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct -or indirect, to cause the direction or management of such entity, whether -by contract or otherwise, or (ii) ownership of fifty percent (50%) or more -of the outstanding shares, or (iii) beneficial ownership of such entity. - - - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions -granted by this License. - - - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - - - -"Object" form shall mean any form resulting from mechanical transformation -or translation of a Source form, including but not limited to compiled object -code, generated documentation, and conversions to other media types. - - - -"Work" shall mean the work of authorship, whether in Source or Object form, -made available under the License, as indicated by a copyright notice that -is included in or attached to the work (an example is provided in the Appendix -below). - - - -"Derivative Works" shall mean any work, whether in Source or Object form, -that is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative -Works shall not include works that remain separable from, or merely link (or -bind by name) to the interfaces of, the Work and Derivative Works thereof. - - - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative -Works thereof, that is intentionally submitted to Licensor for inclusion in -the Work by the copyright owner or by an individual or Legal Entity authorized -to submit on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication -sent to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor -for the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - - - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently incorporated -within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this -License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable copyright license to reproduce, prepare -Derivative Works of, publicly display, publicly perform, sublicense, and distribute -the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, -each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) patent -license to make, have made, use, offer to sell, sell, import, and otherwise -transfer the Work, where such license applies only to those patent claims -licensable by such Contributor that are necessarily infringed by their Contribution(s) -alone or by combination of their Contribution(s) with the Work to which such -Contribution(s) was submitted. If You institute patent litigation against -any entity (including a cross-claim or counterclaim in a lawsuit) alleging -that the Work or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses granted to You -under this License for that Work shall terminate as of the date such litigation -is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or -Derivative Works thereof in any medium, with or without modifications, and -in Source or Object form, provided that You meet the following conditions: - -(a) You must give any other recipients of the Work or Derivative Works a copy -of this License; and - -(b) You must cause any modified files to carry prominent notices stating that -You changed the files; and - -(c) You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source -form of the Work, excluding those notices that do not pertain to any part -of the Derivative Works; and - -(d) If the Work includes a "NOTICE" text file as part of its distribution, -then any Derivative Works that You distribute must include a readable copy -of the attribution notices contained within such NOTICE file, excluding those -notices that do not pertain to any part of the Derivative Works, in at least -one of the following places: within a NOTICE text file distributed as part -of the Derivative Works; within the Source form or documentation, if provided -along with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents -of the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works -that You distribute, alongside or as an addendum to the NOTICE text from the -Work, provided that such additional attribution notices cannot be construed -as modifying the License. - -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, -or distribution of Your modifications, or for any such Derivative Works as -a whole, provided Your use, reproduction, and distribution of the Work otherwise -complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any -Contribution intentionally submitted for inclusion in the Work by You to the -Licensor shall be under the terms and conditions of this License, without -any additional terms or conditions. Notwithstanding the above, nothing herein -shall supersede or modify the terms of any separate license agreement you -may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, -trademarks, service marks, or product names of the Licensor, except as required -for reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to -in writing, Licensor provides the Work (and each Contributor provides its -Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied, including, without limitation, any warranties -or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR -A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness -of using or redistributing the Work and assume any risks associated with Your -exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether -in tort (including negligence), contract, or otherwise, unless required by -applicable law (such as deliberate and grossly negligent acts) or agreed to -in writing, shall any Contributor be liable to You for damages, including -any direct, indirect, special, incidental, or consequential damages of any -character arising as a result of this License or out of the use or inability -to use the Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all other commercial -damages or losses), even if such Contributor has been advised of the possibility -of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work -or Derivative Works thereof, You may choose to offer, and charge a fee for, -acceptance of support, warranty, indemnity, or other liability obligations -and/or rights consistent with this License. However, in accepting such obligations, -You may act only on Your own behalf and on Your sole responsibility, not on -behalf of any other Contributor, and only if You agree to indemnify, defend, -and hold each Contributor harmless for any liability incurred by, or claims -asserted against, such Contributor by reason of your accepting any such warranty -or additional liability. END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own identifying -information. (Don't include the brackets!) The text should be enclosed in -the appropriate comment syntax for the file format. We also recommend that -a file or class name and description of purpose be included on the same "printed -page" as the copyright notice for easier identification within third-party -archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); - -you may not use this file except in compliance with the License. - -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software - -distributed under the License is distributed on an "AS IS" BASIS, - -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -See the License for the specific language governing permissions and - -limitations under the License. diff --git a/LICENSE.rst b/LICENSE.rst new file mode 100644 index 0000000..b662f1d --- /dev/null +++ b/LICENSE.rst @@ -0,0 +1,211 @@ +License +======= + +Copyright (c) 2016~2018 The TensorLayer contributors. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016, The TensorLayer Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Contact +======= +Questions? Please contact hao.dong11@imperial.ac.uk diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4fbfd85 --- /dev/null +++ b/Makefile @@ -0,0 +1,35 @@ +default: + @echo "Usage:" + @echo "\tmake lint # run pylint" + @echo "\tmake format # run yapf, autoflake and isort" + @echo "\tmake install3 # install tensorlayer in current workspace with pip3" + +lint: + pylint examples/*.py + pylint tensorlayer + +test: + python3 tests/models/test_model_core.py + python3 tests/layers/test_layernode.py + python3 tests/files/test_utils_saveload.py + +format: + autoflake -i examples/*.py + autoflake -i tensorlayer/*.py + autoflake -i tensorlayer/**/*.py + + isort -rc examples + isort -rc tensorlayer + + yapf -i examples/*.py + yapf -i tensorlayer/*.py + yapf -i tensorlayer/**/*.py + +install3: + pip3 install -U . --user + + +TAG = tensorlayer-docs:snaphot + +doc: + docker build --rm -t $(TAG) -f docker/docs/Dockerfile . diff --git a/README.md b/README.md index 6034f09..13e3ba0 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,181 @@ -#### 从命令行创建一个新的仓库 + +
+ +
+
+ + + + +![GitHub last commit (branch)](https://img.shields.io/github/last-commit/tensorlayer/tensorlayer/master.svg) +[![Supported TF Version](https://img.shields.io/badge/TensorFlow-2.0.0%2B-brightgreen.svg)](https://github.com/tensorflow/tensorflow/releases) +[![Documentation Status](https://readthedocs.org/projects/tensorlayer/badge/)](https://tensorlayer.readthedocs.io/) +[![Build Status](https://travis-ci.org/tensorlayer/tensorlayer.svg?branch=master)](https://travis-ci.org/tensorlayer/tensorlayer) +[![Downloads](http://pepy.tech/badge/tensorlayer)](http://pepy.tech/project/tensorlayer) +[![Docker Pulls](https://img.shields.io/docker/pulls/tensorlayer/tensorlayer.svg)](https://hub.docker.com/r/tensorlayer/tensorlayer/) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/d6b118784e25435498e7310745adb848)](https://www.codacy.com/app/tensorlayer/tensorlayer) + + + + + +TensorLayer is a novel TensorFlow-based deep learning and reinforcement learning library designed for researchers and engineers. It provides an extensive collection of customizable neural layers to build complex AI models. TensorLayer is awarded the 2017 Best Open Source Software by the [ACM Multimedia Society](https://twitter.com/ImperialDSI/status/923928895325442049). +TensorLayer can also be found at [iHub](https://code.ihub.org.cn/projects/328) and [Gitee](https://gitee.com/organizations/TensorLayer). + +# News + +🔥 Reinforcement Learning Model Zoo: [Low-level APIs for Research](https://github.com/tensorlayer/tensorlayer/tree/master/examples/reinforcement_learning) and [High-level APIs for Production](https://github.com/tensorlayer/RLzoo) + +🔥 [Sipeed Maxi-EMC](https://github.com/sipeed/Maix-EMC): Run TensorLayer models on the **low-cost AI chip** (e.g., K210) (Alpha Version) + + + +🔥 [Free GPU and storage resources](https://github.com/fangde/FreeGPU): TensorLayer users can access to free GPU and storage resources donated by SurgicalAI. Thank you SurgicalAI! + +# Design Features + +TensorLayer is a new deep learning library designed with simplicity, flexibility and high-performance in mind. + +- ***Simplicity*** : TensorLayer has a high-level layer/model abstraction which is effortless to learn. You can learn how deep learning can benefit your AI tasks in minutes through the massive [examples](https://github.com/tensorlayer/awesome-tensorlayer). +- ***Flexibility*** : TensorLayer APIs are transparent and flexible, inspired by the emerging PyTorch library. Compared to the Keras abstraction, TensorLayer makes it much easier to build and train complex AI models. +- ***Zero-cost Abstraction*** : Though simple to use, TensorLayer does not require you to make any compromise in the performance of TensorFlow (Check the following benchmark section for more details). + +TensorLayer stands at a unique spot in the TensorFlow wrappers. Other wrappers like Keras and TFLearn +hide many powerful features of TensorFlow and provide little support for writing custom AI models. Inspired by PyTorch, TensorLayer APIs are simple, flexible and Pythonic, +making it easy to learn while being flexible enough to cope with complex AI tasks. +TensorLayer has a fast-growing community. It has been used by researchers and engineers all over the world, including those from Peking University, +Imperial College London, UC Berkeley, Carnegie Mellon University, Stanford University, and companies like Google, Microsoft, Alibaba, Tencent, Xiaomi, and Bloomberg. + +# Multilingual Documents + +TensorLayer has extensive documentation for both beginners and professionals. The documentation is available in +both English and Chinese. + +[![English Documentation](https://img.shields.io/badge/documentation-english-blue.svg)](https://tensorlayer.readthedocs.io/) +[![Chinese Documentation](https://img.shields.io/badge/documentation-%E4%B8%AD%E6%96%87-blue.svg)](https://tensorlayercn.readthedocs.io/) +[![Chinese Book](https://img.shields.io/badge/book-%E4%B8%AD%E6%96%87-blue.svg)](http://www.broadview.com.cn/book/5059/) + +If you want to try the experimental features on the the master branch, you can find the latest document +[here](https://tensorlayer.readthedocs.io/en/latest/). + +# Extensive Examples + +You can find a large collection of examples that use TensorLayer in [here](examples/) and the following space: + + +
+ +
+
+ +# Getting Start + +TensorLayer 2.0 relies on TensorFlow, numpy, and others. To use GPUs, CUDA and cuDNN are required. + +Install TensorFlow: + +```bash +pip3 install tensorflow-gpu==2.0.0-rc1 # TensorFlow GPU (version 2.0 RC1) +pip3 install tensorflow # CPU version +``` + +Install the stable release of TensorLayer: + +```bash +pip3 install tensorlayer +``` + +Install the unstable development version of TensorLayer: ```bash -touch README.md -git init -git add README.md -git commit -m "first commit" -git remote add origin https://git.trustie.net/TensorLayer/tensorlayer3.git -git push -u origin master +pip3 install git+https://github.com/tensorlayer/tensorlayer.git +``` +If you want to install the additional dependencies, you can also run +```bash +pip3 install --upgrade tensorlayer[all] # all additional dependencies +pip3 install --upgrade tensorlayer[extra] # only the `extra` dependencies +pip3 install --upgrade tensorlayer[contrib_loggers] # only the `contrib_loggers` dependencies ``` -#### 从命令行推送已经创建的仓库 +If you are TensorFlow 1.X users, you can use TensorLayer 1.11.0: ```bash -git remote add origin https://git.trustie.net/TensorLayer/tensorlayer3.git -git push -u origin master +# For last stable version of TensorLayer 1.X +pip3 install --upgrade tensorlayer==1.11.0 +``` + + + +# Performance Benchmark + +The following table shows the training speeds of [VGG16](http://www.robots.ox.ac.uk/~vgg/research/very_deep/) using TensorLayer and native TensorFlow on a TITAN Xp. + +| Mode | Lib | Data Format | Max GPU Memory Usage(MB) |Max CPU Memory Usage(MB) | Avg CPU Memory Usage(MB) | Runtime (sec) | +| :-------: | :-------------: | :-----------: | :-----------------: | :-----------------: | :-----------------: | :-----------: | +| AutoGraph | TensorFlow 2.0 | channel last | 11833 | 2161 | 2136 | 74 | +| | Tensorlayer 2.0 | channel last | 11833 | 2187 | 2169 | 76 | +| Graph | Keras | channel last | 8677 | 2580 | 2576 | 101 | +| Eager | TensorFlow 2.0 | channel last | 8723 | 2052 | 2024 | 97 | +| | TensorLayer 2.0 | channel last | 8723 | 2010 | 2007 | 95 | + +# Getting Involved + +Please read the [Contributor Guideline](CONTRIBUTING.md) before submitting your PRs. + +We suggest users to report bugs using Github issues. Users can also discuss how to use TensorLayer in the following slack channel. + +
+ + +
+ +
+
+ +
+ +# Citing TensorLayer + +If you find TensorLayer useful for your project, please cite the following paper: + +``` +@article{tensorlayer2017, + author = {Dong, Hao and Supratak, Akara and Mai, Luo and Liu, Fangde and Oehmichen, Axel and Yu, Simiao and Guo, Yike}, + journal = {ACM Multimedia}, + title = {{TensorLayer: A Versatile Library for Efficient Deep Learning Development}}, + url = {http://tensorlayer.org}, + year = {2017} +} +``` \ No newline at end of file diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..5f424cf --- /dev/null +++ b/README.rst @@ -0,0 +1,201 @@ +|TENSORLAYER-LOGO| + + +|Awesome| |Documentation-EN| |Documentation-CN| |Book-CN| |Downloads| + +|PyPI| |PyPI-Prerelease| |Commits-Since| |Python| |TensorFlow| + +|Travis| |Docker| |RTD-EN| |RTD-CN| |PyUP| |Docker-Pulls| |Code-Quality| + + +|JOIN-SLACK-LOGO| + +TensorLayer is a novel TensorFlow-based deep learning and reinforcement +learning library designed for researchers and engineers. It provides a +large collection of customizable neural layers / functions that are key +to build real-world AI applications. TensorLayer is awarded the 2017 +Best Open Source Software by the `ACM Multimedia +Society `__. + +Why another deep learning library: TensorLayer +============================================== + +As deep learning practitioners, we have been looking for a library that +can address various development purposes. This library is easy to adopt +by providing diverse examples, tutorials and pre-trained models. Also, +it allow users to easily fine-tune TensorFlow; while being suitable for +production deployment. TensorLayer aims to satisfy all these purposes. +It has three key features: + +- **Simplicity** : TensorLayer lifts the low-level dataflow interface + of TensorFlow to *high-level* layers / models. It is very easy to + learn through the rich `example + codes `__ + contributed by a wide community. +- **Flexibility** : TensorLayer APIs are transparent: it does not + mask TensorFlow from users; but leaving massive hooks that help + *low-level tuning* and *deep customization*. +- **Zero-cost Abstraction** : TensorLayer can achieve the *full + power* of TensorFlow. The following table shows the training speeds + of classic models using TensorLayer and native TensorFlow on a Titan + X Pascal GPU. + + +---------------+-----------------+-----------------+-----------------+ + | | CIFAR-10 | PTB LSTM | Word2Vec | + +===============+=================+=================+=================+ + | TensorLayer | 2528 images/s | 18063 words/s | 58167 words/s | + +---------------+-----------------+-----------------+-----------------+ + | TensorFlow | 2530 images/s | 18075 words/s | 58181 words/s | + +---------------+-----------------+-----------------+-----------------+ + +TensorLayer stands at a unique spot in the library landscape. Other +wrapper libraries like Keras and TFLearn also provide high-level +abstractions. They, however, often hide the underlying engine from +users, which make them hard to customize and fine-tune. On the contrary, +TensorLayer APIs are generally flexible and transparent. Users often +find it easy to start with the examples and tutorials, and then dive +into TensorFlow seamlessly. In addition, TensorLayer does not create +library lock-in through native supports for importing components from +Keras, TFSlim and TFLearn. + +TensorLayer has a fast growing usage among top researchers and +engineers, from universities like Imperial College London, UC Berkeley, +Carnegie Mellon University, Stanford University, and University of +Technology of Compiegne (UTC), and companies like Google, Microsoft, +Alibaba, Tencent, Xiaomi, and Bloomberg. + +Install +======= + +TensorLayer has pre-requisites including TensorFlow, numpy, and others. For GPU support, CUDA and cuDNN are required. +The simplest way to install TensorLayer is to use the Python Package Index (PyPI): + +.. code:: bash + + # for last stable version + pip install --upgrade tensorlayer + + # for latest release candidate + pip install --upgrade --pre tensorlayer + + # if you want to install the additional dependencies, you can also run + pip install --upgrade tensorlayer[all] # all additional dependencies + pip install --upgrade tensorlayer[extra] # only the `extra` dependencies + pip install --upgrade tensorlayer[contrib_loggers] # only the `contrib_loggers` dependencies + +Alternatively, you can install the latest or development version by directly pulling from github: + +.. code:: bash + + pip install https://github.com/tensorlayer/tensorlayer/archive/master.zip + # or + # pip install https://github.com/tensorlayer/tensorlayer/archive/.zip + +Using Docker - a ready-to-use environment +----------------------------------------- + +The `TensorLayer +containers `__ are +built on top of the official `TensorFlow +containers `__: + +Containers with CPU support +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: bash + + # for CPU version and Python 2 + docker pull tensorlayer/tensorlayer:latest + docker run -it --rm -p 8888:8888 -p 6006:6006 -e PASSWORD=JUPYTER_NB_PASSWORD tensorlayer/tensorlayer:latest + + # for CPU version and Python 3 + docker pull tensorlayer/tensorlayer:latest-py3 + docker run -it --rm -p 8888:8888 -p 6006:6006 -e PASSWORD=JUPYTER_NB_PASSWORD tensorlayer/tensorlayer:latest-py3 + +Containers with GPU support +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +NVIDIA-Docker is required for these containers to work: `Project +Link `__ + +.. code:: bash + + # for GPU version and Python 2 + docker pull tensorlayer/tensorlayer:latest-gpu + nvidia-docker run -it --rm -p 8888:88888 -p 6006:6006 -e PASSWORD=JUPYTER_NB_PASSWORD tensorlayer/tensorlayer:latest-gpu + + # for GPU version and Python 3 + docker pull tensorlayer/tensorlayer:latest-gpu-py3 + nvidia-docker run -it --rm -p 8888:8888 -p 6006:6006 -e PASSWORD=JUPYTER_NB_PASSWORD tensorlayer/tensorlayer:latest-gpu-py3 + +Contribute +========== + +Please read the `Contributor +Guideline `__ +before submitting your PRs. + +Cite +==== + +If you find this project useful, we would be grateful if you cite the +TensorLayer paper: + +:: + + @article{tensorlayer2017, + author = {Dong, Hao and Supratak, Akara and Mai, Luo and Liu, Fangde and Oehmichen, Axel and Yu, Simiao and Guo, Yike}, + journal = {ACM Multimedia}, + title = {{TensorLayer: A Versatile Library for Efficient Deep Learning Development}}, + url = {http://tensorlayer.org}, + year = {2017} + } + +License +======= + +TensorLayer is released under the Apache 2.0 license. + + +.. |TENSORLAYER-LOGO| image:: https://raw.githubusercontent.com/tensorlayer/tensorlayer/master/img/tl_transparent_logo.png + :target: https://tensorlayer.readthedocs.io/ +.. |JOIN-SLACK-LOGO| image:: https://raw.githubusercontent.com/tensorlayer/tensorlayer/master/img/join_slack.png + :target: https://join.slack.com/t/tensorlayer/shared_invite/enQtMjUyMjczMzU2Njg4LWI0MWU0MDFkOWY2YjQ4YjVhMzI5M2VlZmE4YTNhNGY1NjZhMzUwMmQ2MTc0YWRjMjQzMjdjMTg2MWQ2ZWJhYzc + +.. |Awesome| image:: https://awesome.re/mentioned-badge.svg + :target: https://github.com/tensorlayer/awesome-tensorlayer +.. |Documentation-EN| image:: https://img.shields.io/badge/documentation-english-blue.svg + :target: https://tensorlayer.readthedocs.io/ +.. |Documentation-CN| image:: https://img.shields.io/badge/documentation-%E4%B8%AD%E6%96%87-blue.svg + :target: https://tensorlayercn.readthedocs.io/ +.. |Book-CN| image:: https://img.shields.io/badge/book-%E4%B8%AD%E6%96%87-blue.svg + :target: http://www.broadview.com.cn/book/5059/ +.. |Downloads| image:: http://pepy.tech/badge/tensorlayer + :target: http://pepy.tech/project/tensorlayer + + +.. |PyPI| image:: http://ec2-35-178-47-120.eu-west-2.compute.amazonaws.com/github/release/tensorlayer/tensorlayer.svg?label=PyPI%20-%20Release + :target: https://pypi.org/project/tensorlayer/ +.. |PyPI-Prerelease| image:: http://ec2-35-178-47-120.eu-west-2.compute.amazonaws.com/github/release/tensorlayer/tensorlayer/all.svg?label=PyPI%20-%20Pre-Release + :target: https://pypi.org/project/tensorlayer/ +.. |Commits-Since| image:: http://ec2-35-178-47-120.eu-west-2.compute.amazonaws.com/github/commits-since/tensorlayer/tensorlayer/latest.svg + :target: https://github.com/tensorlayer/tensorlayer/compare/1.10.1...master +.. |Python| image:: http://ec2-35-178-47-120.eu-west-2.compute.amazonaws.com/pypi/pyversions/tensorlayer.svg + :target: https://pypi.org/project/tensorlayer/ +.. |TensorFlow| image:: https://img.shields.io/badge/tensorflow-1.6.0+-blue.svg + :target: https://github.com/tensorflow/tensorflow/releases + +.. |Travis| image:: http://ec2-35-178-47-120.eu-west-2.compute.amazonaws.com/travis/tensorlayer/tensorlayer/master.svg?label=Travis + :target: https://travis-ci.org/tensorlayer/tensorlayer +.. |Docker| image:: http://ec2-35-178-47-120.eu-west-2.compute.amazonaws.com/circleci/project/github/tensorlayer/tensorlayer/master.svg?label=Docker%20Build + :target: https://circleci.com/gh/tensorlayer/tensorlayer/tree/master +.. |RTD-EN| image:: http://ec2-35-178-47-120.eu-west-2.compute.amazonaws.com/readthedocs/tensorlayer/latest.svg?label=ReadTheDocs-EN + :target: https://tensorlayer.readthedocs.io/ +.. |RTD-CN| image:: http://ec2-35-178-47-120.eu-west-2.compute.amazonaws.com/readthedocs/tensorlayercn/latest.svg?label=ReadTheDocs-CN + :target: https://tensorlayercn.readthedocs.io/ +.. |PyUP| image:: https://pyup.io/repos/github/tensorlayer/tensorlayer/shield.svg + :target: https://pyup.io/repos/github/tensorlayer/tensorlayer/ +.. |Docker-Pulls| image:: http://ec2-35-178-47-120.eu-west-2.compute.amazonaws.com/docker/pulls/tensorlayer/tensorlayer.svg + :target: https://hub.docker.com/r/tensorlayer/tensorlayer/ +.. |Code-Quality| image:: https://api.codacy.com/project/badge/Grade/d6b118784e25435498e7310745adb848 + :target: https://www.codacy.com/app/tensorlayer/tensorlayer diff --git a/docker/DockerLint.bat b/docker/DockerLint.bat new file mode 100644 index 0000000..3a4b1f8 --- /dev/null +++ b/docker/DockerLint.bat @@ -0,0 +1,4 @@ +docker pull hadolint/hadolint:latest +docker run --rm -i hadolint/hadolint hadolint --ignore DL3007 - < Dockerfile + +PAUSE; \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..2d3b689 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,35 @@ +# Build args. +# * Accepted Values: +# - Python 2 + CPU: "latest" => --build-arg TF_CONTAINER_VERSION="latest" +# - Python 2 + GPU: "latest-gpu" => --build-arg TF_CONTAINER_VERSION="latest-gpu" +# - Python 3 + CPU: "latest-py3" => --build-arg TF_CONTAINER_VERSION="latest-py3" +# - Python 3 + GPU: "latest-gpu-py3" => --build-arg TF_CONTAINER_VERSION="latest-gpu-py3" + +ARG TF_CONTAINER_VERSION + +FROM tensorflow/tensorflow:${TF_CONTAINER_VERSION} + +LABEL version="1.0" maintainer="Jonathan DEKHTIAR " + +ARG TL_VERSION +ARG TF_CONTAINER_VERSION + +RUN echo "Container Tag: ${TF_CONTAINER_VERSION}" \ + && apt-get update \ + && case $TF_CONTAINER_VERSION in \ + latest-py3 | latest-gpu-py3) apt-get install -y python3-tk ;; \ + *) apt-get install -y python-tk ;; \ + esac \ + && if [ -z "$TL_VERSION" ]; then \ + echo "Building a Nightly Release" \ + && apt-get install -y git \ + && mkdir /dist/ && cd /dist/ \ + && git clone https://github.com/tensorlayer/tensorlayer.git \ + && cd tensorlayer \ + && pip install --disable-pip-version-check --no-cache-dir --upgrade -e .[all]; \ + else \ + echo "Building Tag Release: $TL_VERSION" \ + && pip install --disable-pip-version-check --no-cache-dir --upgrade tensorlayer[all]=="$TL_VERSION"; \ + fi \ + && apt-get autoremove -y \ + && rm -rf /var/lib/apt/lists/* diff --git a/docker/docs/Dockerfile b/docker/docs/Dockerfile new file mode 100644 index 0000000..a20020b --- /dev/null +++ b/docker/docs/Dockerfile @@ -0,0 +1,14 @@ +FROM ubuntu:bionic + +ADD docker/docs/sources.list.ustc /etc/apt/sources.list +ENV DEBIAN_FRONTEND=noninteractive +RUN apt update && \ + apt install -y python3-pip python3-tk python-qt4 wget && \ + pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow +ADD . /tensorlayer +WORKDIR /tensorlayer +RUN ln -s `which pip3` /usr/bin/pip && \ + ./scripts/install-horovod-for-doc-test.sh +RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple . +RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -e .[all] +RUN make -C docs html diff --git a/docker/docs/sources.list.ustc b/docker/docs/sources.list.ustc new file mode 100644 index 0000000..e46be90 --- /dev/null +++ b/docker/docs/sources.list.ustc @@ -0,0 +1,15 @@ +deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted + +deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted + +deb http://mirrors.ustc.edu.cn/ubuntu/ bionic universe +deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates universe + +deb http://mirrors.ustc.edu.cn/ubuntu/ bionic multiverse +deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates multiverse + +deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse + +deb http://mirrors.ustc.edu.cn/ubuntu bionic-security main restricted +deb http://mirrors.ustc.edu.cn/ubuntu bionic-security universe +deb http://mirrors.ustc.edu.cn/ubuntu bionic-security multiverse diff --git a/docker/pypi_list.py b/docker/pypi_list.py new file mode 100644 index 0000000..69a2bad --- /dev/null +++ b/docker/pypi_list.py @@ -0,0 +1,68 @@ +import argparse +import requests +import logging + +import pip._internal + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description='Get the nth version of a given package') + parser.add_argument('--package', type=str, required=True, help='The PyPI you want to inspect') + parser.add_argument('--nth_last_version', type=int, default=1, help='The nth last package will be retrieved') + parser.add_argument('--prerelease', help='Get PreRelease Package Version', action='store_true') + parser.add_argument('--debug', help='Print debug information', action='store_true') + + args = parser.parse_args() + + # create logger + logger = logging.getLogger("PyPI_CLI") + + formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + + ch = logging.StreamHandler() + ch.setLevel(logging.DEBUG) + ch.setFormatter(formatter) + logger.addHandler(ch) + + if args.debug: + logger.setLevel(logging.DEBUG) + + logger.debug("Package: %s" % args.package) + logger.debug("nth_last_version: %s" % args.nth_last_version) + logger.debug("prerelease: %s" % args.prerelease) + logger.debug("debug: %s" % args.debug) + + finder = pip._internal.index.PackageFinder( + [], + ['https://pypi.python.org/simple'], + session=requests.Session() + ) + results = finder.find_all_candidates(args.package) + tmp_versions = [str(p.version) for p in results] + + logger.debug("%s" % tmp_versions) + + versions = list() + for el in tmp_versions: + if el not in versions: + versions.append(el) + + pos = -1 + nth_version = 1 + + while True: + fetched_version = versions[pos] + + logger.debug("Version: %s" % fetched_version) + + if nth_version == args.nth_last_version: + if args.prerelease or not ("rc" in fetched_version or "a" in fetched_version or "b" in fetched_version): + break + else: + pos -= 1 + continue + + pos -= 1 + nth_version += 1 + + print(fetched_version) diff --git a/docker/version_prefix.py b/docker/version_prefix.py new file mode 100644 index 0000000..7ee648d --- /dev/null +++ b/docker/version_prefix.py @@ -0,0 +1,37 @@ +import argparse +import logging + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description='Determine the version prefix to apply depending on the version name') + + parser.add_argument( + '--version', + type=str, + required=True, + help='The Package Version to be installed in the container' + ) + + parser.add_argument('--debug', help='Print debug information', action='store_true') + + args = parser.parse_args() + + # create logger + logger = logging.getLogger("VERSION_PREFIX_CLI") + + formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + + ch = logging.StreamHandler() + ch.setLevel(logging.DEBUG) + ch.setFormatter(formatter) + logger.addHandler(ch) + + if args.debug: + logger.setLevel(logging.DEBUG) + + logger.debug("Package Version: %s" % args.version) + + if "rc" in args.version or "a" in args.version or "b" in args.version: + print("latest-dev") + else: + print("latest") diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..6024bcf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,225 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " epub3 to make an epub3" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + @echo " dummy to check syntax errors of document sources" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/TLayer.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/TLayer.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/TLayer" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/TLayer" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: epub3 +epub3: + $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 + @echo + @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +.PHONY: dummy +dummy: + $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy + @echo + @echo "Build finished. Dummy builder generates no files." diff --git a/docs/_static/fix_rtd.css b/docs/_static/fix_rtd.css new file mode 100644 index 0000000..83623a0 --- /dev/null +++ b/docs/_static/fix_rtd.css @@ -0,0 +1,8 @@ +/* work around https://github.com/snide/sphinx_rtd_theme/issues/149 */ +.rst-content table.field-list .field-body { + padding-top: 8px; +} + +/*.section #basic-2-flip-flop-synchronizer{ + text-align:justify; +}*/ diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..89f1601 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,469 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# TensorLayer documentation build configuration file, created by +# sphinx-quickstart on Tue Aug 2 15:30:55 2016. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os, sys, datetime +sys.path.insert(0, os.path.abspath("../")) # Important +sys.path.insert(0, os.path.abspath(os.path.join("..", "tensorlayer"))) # Important + +from package_info import __shortversion__ +from package_info import __version__ + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. + +# extensions = [ +# 'sphinx.ext.coverage', +# 'sphinx.ext.githubpages', +# 'numpydoc', +# ] + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.doctest', + 'sphinx.ext.ifconfig', + 'sphinx.ext.inheritance_diagram', + 'sphinx.ext.intersphinx', + 'sphinx.ext.mathjax', + 'sphinx.ext.napoleon', + 'sphinx.ext.todo', + 'sphinx.ext.viewcode', +] + +autodoc_mock_imports = [ + 'cv2', + 'gridfs', + 'horovod', + 'hyperdash', + 'imageio', + 'lxml', + 'matplotlib', + 'nltk', + 'numpy', + 'PIL', + 'progressbar', + 'pymongo', + 'scipy', + 'skimage', + 'sklearn', + 'tensorflow', + 'tqdm', + 'h5py', + + # TL C++ Packages + 'tensorlayer.third_party.roi_pooling.roi_pooling.roi_pooling_ops', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. +# +# source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'TensorLayer' +copyright = '2016~%s, TensorLayer Contributors' % (str(datetime.datetime.now().year)) +author = 'TensorLayer Contributors' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = __shortversion__ +# The full version, including alpha/beta/rc tags. +release = __version__ + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# +# today = '' +# +# Else, today_fmt is used as the format for a strftime call. +# +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +# keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +# html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +# html_theme_path = [] + +# The name for this set of Sphinx documents. +# " v documentation" by default. +# +# html_title = 'TensorLayer' + +# A shorter title for the navigation bar. Default is the same as html_title. +# +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# +# html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = [] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +# +# html_extra_path = [] + +# If not None, a 'Last updated on:' timestamp is inserted at every page +# bottom, using the given strftime format. +# The empty string is equivalent to '%b %d, %Y'. +# +# html_last_updated_fmt = None + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# +# html_additional_pages = {} + +# If false, no module index is generated. +# +# html_domain_indices = True + +# If false, no index is generated. +# +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh' +# +# html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# 'ja' uses this config value. +# 'zh' user can custom change `jieba` dictionary path. +# +# html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +# +# html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'TensorLayerdoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'TensorLayer.tex', 'TensorLayer Documentation', + 'TensorLayer contributors', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# +# latex_use_parts = False + +# If true, show page references after internal links. +# +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# +# latex_appendices = [] + +# If false, no module index is generated. +# +# latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'tensorlayer', 'TensorLayer Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +# +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'TensorLayer', 'TensorLayer Documentation', + author, 'TensorLayer', 'Deep learning and Reinforcement learning library for Researchers and Engineers.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +# +# texinfo_appendices = [] + +# If false, no module index is generated. +# +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# +# texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +# +# texinfo_no_detailmenu = False + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project +epub_author = author +epub_publisher = author +epub_copyright = copyright + +# The basename for the epub file. It defaults to the project name. +# epub_basename = project + +# The HTML theme for the epub output. Since the default themes are not +# optimized for small screen space, using the same theme for HTML and epub +# output is usually not wise. This defaults to 'epub', a theme designed to save +# visual space. +# +# epub_theme = 'epub' + +# The language of the text. It defaults to the language option +# or 'en' if the language is not set. +# +# epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +# epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +# +# epub_cover = () + +# A sequence of (type, uri, title) tuples for the guide element of content.opf. +# +# epub_guide = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +# +# epub_pre_files = [] + +# HTML files that should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +# +# epub_post_files = [] + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# The depth of the table of contents in toc.ncx. +# +# epub_tocdepth = 3 + +# Allow duplicate toc entries. +# +# epub_tocdup = True + +# Choose between 'default' and 'includehidden'. +# +# epub_tocscope = 'default' + +# Fix unsupported image types using the Pillow. +# +# epub_fix_images = False + +# Scale large images. +# +# epub_max_image_width = 0 + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# +# epub_show_urls = 'inline' + +# If false, no index is generated. +# +# epub_use_index = True + +pygments_style = 'sphinx' + +html_theme = "sphinx_rtd_theme" + +html_theme_path = [] diff --git a/docs/images/affine_transform_comparison.jpg b/docs/images/affine_transform_comparison.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7da0b82914c26ea2576f3e22f3bb0c34d98aaa0 GIT binary patch literal 93023 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%0DE6o?c5D4+Gs6k`9T>m-$ik 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 literal 0 HcmV?d00001 diff --git a/docs/images/affine_transform_why.jpg b/docs/images/affine_transform_why.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd3b9051f593c755ed8ff6ccc64043763ffcde31 GIT binary patch literal 92093 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. + +**Good News:** We won the **Best Open Source Software Award** `@ACM Multimedia (MM) 2017 `_. + +`TensorLayer`_ is a Deep Learning (DL) and Reinforcement Learning (RL) library extended from `Google TensorFlow `_. It provides popular DL and RL modules that can be easily customized and assembled for tackling real-world machine learning problems. +More details can be found `here `_. + +.. note:: + If you got problem to read the docs online, you could download the repository + on `GitHub`_, then go to ``/docs/_build/html/index.html`` to read the docs + offline. The ``_build`` folder can be generated in ``docs`` using ``make html``. + +User Guide +------------ + +The TensorLayer user guide explains how to install TensorFlow, CUDA and cuDNN, +how to build and train neural networks using TensorLayer, and how to contribute +to the library as a developer. + +.. toctree:: + :maxdepth: 2 + + user/installation + user/examples + user/contributing + user/get_involved + user/faq + +.. toctree:: + :maxdepth: 2 + :caption: Getting started + + user/get_start_model + user/get_start_advance + +API Reference +------------- + +If you are looking for information on a specific function, class or +method, this part of the documentation is for you. + +.. toctree:: + :maxdepth: 2 + :caption: Stable Functionalities + + modules/activation + modules/array_ops + modules/cost + modules/prepro + modules/files + modules/iterate + modules/layers + modules/models + modules/nlp + modules/initializers + modules/rein + modules/utils + modules/visualize + +.. toctree:: + :maxdepth: 2 + :caption: Alpha Version Functionalities + + modules/db + modules/optimizers + modules/distributed + +Command-line Reference +---------------------- + +TensorLayer provides a handy command-line tool `tl` to perform some common tasks. + +.. toctree:: + :maxdepth: 2 + :caption: Command Line Interface + + modules/cli + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + + +.. _GitHub: https://github.com/tensorlayer/tensorlayer +.. _TensorLayer: https://github.com/tensorlayer/tensorlayer/ diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..2daa20d --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,281 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. epub3 to make an epub3 + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + echo. coverage to run coverage check of the documentation if enabled + echo. dummy to check syntax errors of document sources + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +REM Check if sphinx-build is available and fallback to Python version if any +%SPHINXBUILD% 1>NUL 2>NUL +if errorlevel 9009 goto sphinx_python +goto sphinx_ok + +:sphinx_python + +set SPHINXBUILD=python -m sphinx.__init__ +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +:sphinx_ok + + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\TLayer.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\TLayer.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "epub3" ( + %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "coverage" ( + %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage + if errorlevel 1 exit /b 1 + echo. + echo.Testing of coverage in the sources finished, look at the ^ +results in %BUILDDIR%/coverage/python.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +if "%1" == "dummy" ( + %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. Dummy builder generates no files. + goto end +) + +:end diff --git a/docs/modules/activation.rst b/docs/modules/activation.rst new file mode 100644 index 0000000..3965bd0 --- /dev/null +++ b/docs/modules/activation.rst @@ -0,0 +1,73 @@ +API - Activations +========================= + +To make TensorLayer simple, we minimize the number of activation functions as much as +we can. So we encourage you to use TensorFlow's function. TensorFlow provides +``tf.nn.relu``, ``tf.nn.relu6``, ``tf.nn.elu``, ``tf.nn.softplus``, +``tf.nn.softsign`` and so on. +For parametric activation, please read the layer APIs. + +The shortcut of ``tensorlayer.activation`` is ``tensorlayer.act``. + +Your activation +------------------- + +Customizes activation function in TensorLayer is very easy. +The following example implements an activation that multiplies its input by 2. +For more complex activation, TensorFlow API will be required. + +.. code-block:: python + + def double_activation(x): + return x * 2 + + double_activation = lambda x: x * 2 + +.. automodule:: tensorlayer.activation + +.. autosummary:: + + leaky_relu + leaky_relu6 + leaky_twice_relu6 + ramp + swish + sign + hard_tanh + pixel_wise_softmax + +Ramp +------ +.. autofunction:: ramp + +Leaky ReLU +------------ +.. autofunction:: leaky_relu + +Leaky ReLU6 +------------ +.. autofunction:: leaky_relu6 + +Twice Leaky ReLU6 +----------------- +.. autofunction:: leaky_twice_relu6 + +Swish +------------ +.. autofunction:: swish + +Sign +--------------------- +.. autofunction:: sign + +Hard Tanh +--------------------- +.. autofunction:: hard_tanh + +Pixel-wise softmax +-------------------- +.. autofunction:: pixel_wise_softmax + +Parametric activation +------------------------------ +See ``tensorlayer.layers``. diff --git a/docs/modules/array_ops.rst b/docs/modules/array_ops.rst new file mode 100644 index 0000000..ee0aff7 --- /dev/null +++ b/docs/modules/array_ops.rst @@ -0,0 +1,20 @@ +API - Array Operations +====================== + +.. automodule:: tensorlayer.array_ops + +.. autosummary:: + + alphas + alphas_like + +Tensorflow Tensor Operations +---------------------------- + +tl.alphas +^^^^^^^^^ +.. autofunction:: alphas + +tl.alphas_like +^^^^^^^^^^^^^^ +.. autofunction:: alphas_like diff --git a/docs/modules/cli.rst b/docs/modules/cli.rst new file mode 100644 index 0000000..7fd5af6 --- /dev/null +++ b/docs/modules/cli.rst @@ -0,0 +1,6 @@ +CLI - Command Line Interface +============================== + +.. automodule:: tensorlayer.cli + +.. automodule:: tensorlayer.cli.train diff --git a/docs/modules/cost.rst b/docs/modules/cost.rst new file mode 100644 index 0000000..eba52f4 --- /dev/null +++ b/docs/modules/cost.rst @@ -0,0 +1,100 @@ +API - Cost +================== + +To make TensorLayer simple, we minimize the number of cost functions as much as +we can. So we encourage you to use TensorFlow's function, , see `TensorFlow API `_. + +.. note:: + Please refer to `Getting Started `_ for getting specific weights for weight regularization. + +.. automodule:: tensorlayer.cost + +.. autosummary:: + + cross_entropy + sigmoid_cross_entropy + binary_cross_entropy + mean_squared_error + normalized_mean_square_error + absolute_difference_error + dice_coe + dice_hard_coe + iou_coe + cross_entropy_seq + cross_entropy_seq_with_mask + cosine_similarity + li_regularizer + lo_regularizer + maxnorm_regularizer + maxnorm_o_regularizer + maxnorm_i_regularizer + huber_loss + + +Softmax cross entropy +---------------------- +.. autofunction:: cross_entropy + +Sigmoid cross entropy +---------------------- +.. autofunction:: sigmoid_cross_entropy + +Binary cross entropy +------------------------- +.. autofunction:: binary_cross_entropy + +Mean squared error (L2) +------------------------- +.. autofunction:: mean_squared_error + +Normalized mean square error +-------------------------------- +.. autofunction:: normalized_mean_square_error + +Absolute difference error (L1) +-------------------------------- +.. autofunction:: absolute_difference_error + +Dice coefficient +------------------------- +.. autofunction:: dice_coe + +Hard Dice coefficient +------------------------- +.. autofunction:: dice_hard_coe + +IOU coefficient +------------------------- +.. autofunction:: iou_coe + +Cross entropy for sequence +----------------------------- +.. autofunction:: cross_entropy_seq + +Cross entropy with mask for sequence +---------------------------------------- +.. autofunction:: cross_entropy_seq_with_mask + +Cosine similarity +------------------- +.. autofunction:: cosine_similarity + +Regularization functions +-------------------------- + +For ``tf.nn.l2_loss``, ``tf.contrib.layers.l1_regularizer``, ``tf.contrib.layers.l2_regularizer`` and +``tf.contrib.layers.sum_regularizer``, see tensorflow API. +Maxnorm +^^^^^^^^^^ +.. autofunction:: maxnorm_regularizer + +Special +^^^^^^^^^^ +.. autofunction:: li_regularizer +.. autofunction:: lo_regularizer +.. autofunction:: maxnorm_o_regularizer +.. autofunction:: maxnorm_i_regularizer + +Huber Loss +^^^^^^^^^^ +.. autofunction:: huber_loss \ No newline at end of file diff --git a/docs/modules/db.rst b/docs/modules/db.rst new file mode 100644 index 0000000..53a89ac --- /dev/null +++ b/docs/modules/db.rst @@ -0,0 +1,260 @@ +API - Database +========================= + +This is the alpha version of database management system. +If you have any trouble, please ask for help at `tensorlayer@gmail.com `_ . + +Why Database +---------------- + +TensorLayer is designed for real world production, capable of large scale machine learning applications. +TensorLayer database is introduced to address the many data management challenges in the large scale machine learning projects, such as: + +1. Finding training data from an enterprise data warehouse. +2. Loading large datasets that are beyond the storage limitation of one computer. +3. Managing different models with version control, and comparing them(e.g. accuracy). +4. Automating the process of training, evaluating and deploying machine learning models. + +With the TensorLayer system, we introduce this database technology to address the challenges above. + +The database management system is designed with the following three principles in mind. + +Everything is Data +^^^^^^^^^^^^^^^^^^ + +Data warehouses can store and capture the entire machine learning development process. The data can be categorized as: + +1. Dataset: This includes all the data used for training, validation and prediction. The labels can be manually specified or generated by model prediction. +2. Model architecture: The database includes a table that stores different model architectures, enabling users to reuse the many model development works. +3. Model parameters: This database stores all the model parameters of each epoch in the training step. +4. Tasks: A project usually include many small tasks. Each task contains the necessary information such as hyper-parameters for training or validation. For a training task, typical information includes training data, the model parameter, the model architecture, how many epochs the training task has. Validation, testing and inference are also supported by the task system. +5. Loggings: The logs store all the metrics of each machine learning model, such as the time stamp, loss and accuracy of each batch or epoch. + +TensorLayer database in principle is a keyword based search engine. Each model, parameter, or training data is assigned many tags. +The storage system organizes data into two layers: the index layer, and the blob layer. The index layer stores all the tags and references to the blob storage. The index layer is implemented based on NoSQL document database such as MongoDB. The blob layer stores videos, medical images or label masks in large chunk size, which is usually implemented based on a file system. Our database is based on MongoDB. The blob system is based on the GridFS while the indexes are stored as documents. + + +Everything is identified by Query +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Within the database framework, any entity within the data warehouse, such as the data, model or tasks is specified by the database query language. +As a reference, the query is more space efficient for storage and it can specify multiple objects in a concise way. +Another advantage of such a design is enabling a highly flexible software system. +Many system can be implemented by simply rewriting different components, with many new applications can be implemented just by update the query without modification of any application code. + +.. + A pulling based Stream processing pipeline + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + For large training datasets, we provide a stream interface, which can in theory support an unlimitedly large dataset. + A stream interface, implemented as a python generators, keeps on generating new data during training. + When using the stream interface, the idea of epoch does not apply anymore, instead, we specify the batch size and image a epoch will have a fixed large number of steps. + + Many techniques are introduced behind the stream interface for performance optimization. + The stream interface is based on the database cursor technology. + For every data query, only the cursors are returned immediately, not the actual query results. + The actual data are loaded later when the generators are evaluated. + + The data loading is further optimized in many ways: + + 1. Data are compressed and decompressed, + 2. The data are loaded in bulk model to further optimize the IO traffic + 3. The data argumentation or random sampling are computed on the fly, only after the data are loaded into the local computer memory. + 4. We also introduced simple cache system that stores the recent blob data. + + Based on the stream interface, a continuos machine learning system can be easily implemented. + On a distributed system, the model training, validation and deployment can be run by different computing node which are all running continuously. + The trainer keeps on optimizing the models with new added data, the evaluation node keeps on evaluating the recent generated models and the deployment system keeps pulling the best models from the our database warehouse for application. + +Preparation +-------------- + +In principle, the database can be implemented by any document oriented NoSQL database system. +The existing implementation is based on MongoDB. +Further implementations on other databases will be released depending on the progress. +It will be straightforward to port our database system to Google Cloud, AWS and Azure. +The following tutorials are based on the MongoDB implementation. + +Installing and running MongoDB +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The installation instruction of MongoDB can be found at +`MongoDB Docs `__. +There are also many MongoDB services from Amazon or GCP, such as Mongo Atlas from MongoDB +User can also use docker, which is a powerful tool for `deploying software `_ . +After installing MongoDB, a MongoDB management tool with graphic user interface will be extremely useful. +Users can also install Studio3T(MongoChef), which is powerful user interface tool for MongoDB and is free for non-commercial use `studio3t `_. + +Tutorials +---------- + +Connect to the database +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Similar with MongoDB management tools, IP and port number are required for connecting to the database. +To distinguish the different projects, the database instances have a ``project_name`` argument. +In the following example, we connect to MongoDB on a local machine with the IP ``localhost``, and port ``27017`` (this is the default port number of MongoDB). + +.. code-block:: python + + db = tl.db.TensorHub(ip='localhost', port=27017, dbname='temp', + username=None, password='password', project_name='tutorial') + +Dataset management +^^^^^^^^^^^^^^^^^^^^ + +You can save a dataset into the database and allow all machines to access it. +Apart from the dataset key, you can also insert a custom argument such as version and description, for better managing the datasets. +Note that, all saving functions will automatically save a timestamp, allowing you to load staff (data, model, task) using the timestamp. + +.. code-block:: python + + db.save_dataset(dataset=[X_train, y_train, X_test, y_test], dataset_name='mnist', description='this is a tutorial') + +After saving the dataset, others can access the dataset as followed: + +.. code-block:: python + + dataset = db.find_dataset('mnist') + dataset = db.find_dataset('mnist', version='1.0') + +If you have multiple datasets that use the same dataset key, you can get all of them as followed: + +.. code-block:: python + + datasets = db.find_all_datasets('mnist') + + +Model management +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Save model architecture and parameters into database. +The model architecture is represented by a TL graph, and the parameters are stored as a list of array. + +.. code-block:: python + + db.save_model(net, accuracy=0.8, loss=2.3, name='second_model') + +After saving the model into database, we can load it as follow: + +.. code-block:: python + + net = db.find_model(sess=sess, accuracy=0.8, loss=2.3) + +If there are many models, you can use MongoDB's 'sort' method to find the model you want. +To get the newest or oldest model, you can sort by time: + +.. code-block:: python + + ## newest model + + net = db.find_model(sess=sess, sort=[("time", pymongo.DESCENDING)]) + net = db.find_model(sess=sess, sort=[("time", -1)]) + + ## oldest model + + net = db.find_model(sess=sess, sort=[("time", pymongo.ASCENDING)]) + net = db.find_model(sess=sess, sort=[("time", 1)]) + +If you save the model along with accuracy, you can get the model with the best accuracy as followed: + +.. code-block:: python + + net = db.find_model(sess=sess, sort=[("test_accuracy", -1)]) + +To delete all models in a project: + +.. code-block:: python + + db.delete_model() + +If you want to specify which model you want to delete, you need to put arguments inside. + + +Event / Logging management +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Save training log: + +.. code-block:: python + + db.save_training_log(accuracy=0.33) + db.save_training_log(accuracy=0.44) + +Delete logs that match the requirement: + +.. code-block:: python + + db.delete_training_log(accuracy=0.33) + +Delete all logging of this project: + +.. code-block:: python + + db.delete_training_log() + db.delete_validation_log() + db.delete_testing_log() + +Task distribution +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A project usually consists of many tasks such as hyper parameter selection. +To make it easier, we can distribute these tasks to several GPU servers. +A task consists of a task script, hyper parameters, desired result and a status. + +A task distributor can push both dataset and tasks into a database, allowing task runners on GPU servers to pull and run. +The following is an example that pushes 3 tasks with different hyper parameters. + +.. code-block:: python + + ## save dataset into database, then allow other servers to use it + X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 784)) + db.save_dataset((X_train, y_train, X_val, y_val, X_test, y_test), 'mnist', description='handwriting digit') + + ## push tasks into database, then allow other servers pull tasks to run + db.create_task( + task_name='mnist', script='task_script.py', hyper_parameters=dict(n_units1=800, n_units2=800), + saved_result_keys=['test_accuracy'], description='800-800' + ) + + db.create_task( + task_name='mnist', script='task_script.py', hyper_parameters=dict(n_units1=600, n_units2=600), + saved_result_keys=['test_accuracy'], description='600-600' + ) + + db.create_task( + task_name='mnist', script='task_script.py', hyper_parameters=dict(n_units1=400, n_units2=400), + saved_result_keys=['test_accuracy'], description='400-400' + ) + + ## wait for tasks to finish + while db.check_unfinished_task(task_name='mnist'): + print("waiting runners to finish the tasks") + time.sleep(1) + + ## you can get the model and result from database and do some analysis at the end + +The task runners on GPU servers can monitor the database, and run the tasks immediately when they are made available. +In the task script, we can save the final model and results to the database, this allows task distributors to get the desired model and results. + +.. code-block:: python + + ## monitors the database and pull tasks to run + while True: + print("waiting task from distributor") + db.run_task(task_name='mnist', sort=[("time", -1)]) + time.sleep(1) + +Example codes +^^^^^^^^^^^^^^^^ + +See `here `__. + + +TensorHub API +--------------------- + +.. automodule:: tensorlayer.db + +.. autoclass:: TensorHub + :members: diff --git a/docs/modules/distributed.rst b/docs/modules/distributed.rst new file mode 100644 index 0000000..5e30325 --- /dev/null +++ b/docs/modules/distributed.rst @@ -0,0 +1,23 @@ +API - Distributed Training +============================= + +(Alpha release - usage might change later) + +Helper API to run a distributed training. +Check these `examples `_. + +.. automodule:: tensorlayer.distributed + +.. autosummary:: + + Trainer + +Distributed training +-------------------- + +Trainer +^^^^^^^^^^^ + +.. autofunction:: Trainer + + diff --git a/docs/modules/files.rst b/docs/modules/files.rst new file mode 100644 index 0000000..c823b4d --- /dev/null +++ b/docs/modules/files.rst @@ -0,0 +1,295 @@ +API - Files +=================================== + +A collections of helper functions to work with dataset. +Load benchmark dataset, save and restore model, save and load variables. + +.. automodule:: tensorlayer.files + +.. autosummary:: + + load_mnist_dataset + load_fashion_mnist_dataset + load_cifar10_dataset + load_cropped_svhn + load_ptb_dataset + load_matt_mahoney_text8_dataset + load_imdb_dataset + load_nietzsche_dataset + load_wmt_en_fr_dataset + load_flickr25k_dataset + load_flickr1M_dataset + load_cyclegan_dataset + load_celebA_dataset + load_voc_dataset + load_mpii_pose_dataset + download_file_from_google_drive + + save_npz + load_npz + assign_weights + load_and_assign_npz + save_npz_dict + load_and_assign_npz_dict + save_weights_to_hdf5 + load_hdf5_to_weights_in_order + load_hdf5_to_weights + + save_any_to_npy + load_npy_to_any + + file_exists + folder_exists + del_file + del_folder + read_file + load_file_list + load_folder_list + exists_or_mkdir + maybe_download_and_extract + + natural_keys + +.. + save_ckpt + load_ckpt + save_graph + load_graph + save_graph_and_params + load_graph_and_params + + npz_to_W_pdf + + +Load dataset functions +------------------------ + +MNIST +^^^^^^^ +.. autofunction:: load_mnist_dataset + +Fashion-MNIST +^^^^^^^^^^^^^^^^ +.. autofunction:: load_fashion_mnist_dataset + +CIFAR-10 +^^^^^^^^^^^^ +.. autofunction:: load_cifar10_dataset + +SVHN +^^^^^^^ +.. autofunction:: load_cropped_svhn + +Penn TreeBank (PTB) +^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_ptb_dataset + +Matt Mahoney's text8 +^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_matt_mahoney_text8_dataset + +IMBD +^^^^^^^^^^^ +.. autofunction:: load_imdb_dataset + +Nietzsche +^^^^^^^^^^^^^^ +.. autofunction:: load_nietzsche_dataset + +English-to-French translation data from the WMT'15 Website +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_wmt_en_fr_dataset + +Flickr25k +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_flickr25k_dataset + +Flickr1M +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_flickr1M_dataset + +CycleGAN +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_cyclegan_dataset + +CelebA +^^^^^^^^^ +.. autofunction:: load_celebA_dataset + +VOC 2007/2012 +^^^^^^^^^^^^^^^^ +.. autofunction:: load_voc_dataset + +MPII +^^^^^^^^^^^^^^^^ +.. autofunction:: load_mpii_pose_dataset + +Google Drive +^^^^^^^^^^^^^^^^ +.. autofunction:: download_file_from_google_drive + + + + + +Load and save network +---------------------- + +TensorFlow provides ``.ckpt`` file format to save and restore the models, while +we suggest to use standard python file format ``hdf5`` to save models for the +sake of cross-platform. Other file formats such as ``.npz`` are also available. + +.. code-block:: python + + ## save model as .h5 + tl.files.save_weights_to_hdf5('model.h5', network.all_weights) + # restore model from .h5 (in order) + tl.files.load_hdf5_to_weights_in_order('model.h5', network.all_weights) + # restore model from .h5 (by name) + tl.files.load_hdf5_to_weights('model.h5', network.all_weights) + + ## save model as .npz + tl.files.save_npz(network.all_weights , name='model.npz') + # restore model from .npz (method 1) + load_params = tl.files.load_npz(name='model.npz') + tl.files.assign_weights(sess, load_params, network) + # restore model from .npz (method 2) + tl.files.load_and_assign_npz(sess=sess, name='model.npz', network=network) + + ## you can assign the pre-trained parameters as follow + # 1st parameter + tl.files.assign_weights(sess, [load_params[0]], network) + # the first three parameters + tl.files.assign_weights(sess, load_params[:3], network) + +Save network into list (npz) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: save_npz + +Load network from list (npz) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_npz + +Assign a list of parameters to network +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: assign_weights + +Load and assign a list of parameters to network +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_and_assign_npz + + +Save network into dict (npz) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: save_npz_dict + +Load network from dict (npz) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_and_assign_npz_dict + +Save network into OrderedDict (hdf5) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: save_weights_to_hdf5 + +Load network from hdf5 in order +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_hdf5_to_weights_in_order + +Load network from hdf5 by name +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_hdf5_to_weights + +.. + Save network architecture as a graph + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. autofunction:: save_graph + + Load network architecture from a graph + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. autofunction:: load_graph + + Save network architecture and parameters + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. autofunction:: save_graph_and_params + + Load network architecture and parameters + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. autofunction:: load_graph_and_params + +.. + Save network into ckpt + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. autofunction:: save_ckpt + + Load network from ckpt + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. autofunction:: load_ckpt + + + + +Load and save variables +------------------------ + +Save variables as .npy +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: save_any_to_npy + +Load variables from .npy +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_npy_to_any + + + + +Folder/File functions +------------------------ + +Check file exists +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: file_exists + +Check folder exists +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: folder_exists + +Delete file +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: del_file + +Delete folder +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: del_folder + +Read file +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: read_file + +Load file list from folder +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_file_list + +Load folder list from folder +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: load_folder_list + +Check and Create folder +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: exists_or_mkdir + +Download or extract +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: maybe_download_and_extract + + + +Sort +------- + +List of string with number in human order +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: natural_keys + +Visualizing npz file +---------------------- +.. autofunction:: npz_to_W_pdf diff --git a/docs/modules/initializers.rst b/docs/modules/initializers.rst new file mode 100644 index 0000000..6311619 --- /dev/null +++ b/docs/modules/initializers.rst @@ -0,0 +1,51 @@ +API - Initializers +========================= + +To make TensorLayer simple, TensorLayer only warps some basic initializers. For more advanced initializer, +e.g. ``tf.initializers.he_normal``, please refer to TensorFlow provided initializers +`here `_. + +.. automodule:: tensorlayer.initializers + +.. autosummary:: + + Initializer + Zeros + Ones + Constant + RandomUniform + RandomNormal + TruncatedNormal + deconv2d_bilinear_upsampling_initializer + +Initializer +------------ +.. autoclass:: Initializer + +Zeros +------------ +.. autoclass:: Zeros + +Ones +------------ +.. autoclass:: Ones + +Constant +----------------- +.. autoclass:: Constant + +RandomUniform +-------------- +.. autoclass:: RandomUniform + +RandomNormal +--------------------- +.. autoclass:: RandomNormal + +TruncatedNormal +--------------------- +.. autoclass:: TruncatedNormal + +deconv2d_bilinear_upsampling_initializer +------------------------------------------ +.. autofunction:: deconv2d_bilinear_upsampling_initializer diff --git a/docs/modules/iterate.rst b/docs/modules/iterate.rst new file mode 100644 index 0000000..57d2ddc --- /dev/null +++ b/docs/modules/iterate.rst @@ -0,0 +1,36 @@ +API - Iteration +========================== + +Data iteration. + + +.. automodule:: tensorlayer.iterate + +.. autosummary:: + + minibatches + seq_minibatches + seq_minibatches2 + ptb_iterator + + +Non-time series +-------------------- + +.. autofunction:: minibatches + + +Time series +---------------------- + +Sequence iteration 1 +^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: seq_minibatches + +Sequence iteration 2 +^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: seq_minibatches2 + +PTB dataset iteration +^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: ptb_iterator diff --git a/docs/modules/layers.rst b/docs/modules/layers.rst new file mode 100644 index 0000000..f6c86a5 --- /dev/null +++ b/docs/modules/layers.rst @@ -0,0 +1,701 @@ +API - Layers +============ + +.. automodule:: tensorlayer.layers + +.. ----------------------------------------------------------- +.. Layer List +.. ----------------------------------------------------------- + +Layer list +---------- + +.. autosummary:: + + Layer + + Input + + OneHot + Word2vecEmbedding + Embedding + AverageEmbedding + + Dense + Dropout + GaussianNoise + DropconnectDense + + UpSampling2d + DownSampling2d + + Conv1d + Conv2d + Conv3d + DeConv2d + DeConv3d + DepthwiseConv2d + SeparableConv1d + SeparableConv2d + DeformableConv2d + GroupConv2d + + PadLayer + PoolLayer + ZeroPad1d + ZeroPad2d + ZeroPad3d + MaxPool1d + MeanPool1d + MaxPool2d + MeanPool2d + MaxPool3d + MeanPool3d + GlobalMaxPool1d + GlobalMeanPool1d + GlobalMaxPool2d + GlobalMeanPool2d + GlobalMaxPool3d + GlobalMeanPool3d + CornerPool2d + + SubpixelConv1d + SubpixelConv2d + + SpatialTransformer2dAffine + transformer + batch_transformer + + BatchNorm + BatchNorm1d + BatchNorm2d + BatchNorm3d + LocalResponseNorm + InstanceNorm + InstanceNorm1d + InstanceNorm2d + InstanceNorm3d + LayerNorm + GroupNorm + SwitchNorm + + RNN + SimpleRNN + GRURNN + LSTMRNN + BiRNN + + retrieve_seq_length_op + retrieve_seq_length_op2 + retrieve_seq_length_op3 + target_mask_op + + Flatten + Reshape + Transpose + Shuffle + + Lambda + + Concat + Elementwise + ElementwiseLambda + + ExpandDims + Tile + + Stack + UnStack + + Sign + Scale + BinaryDense + BinaryConv2d + TernaryDense + TernaryConv2d + DorefaDense + DorefaConv2d + + PRelu + PRelu6 + PTRelu6 + + flatten_reshape + initialize_rnn_state + list_remove_repeat + +.. ----------------------------------------------------------- +.. Basic Layers +.. ----------------------------------------------------------- + +Base Layer +----------- + +.. autoclass:: Layer + +.. ----------------------------------------------------------- +.. Input Layer +.. ----------------------------------------------------------- + +Input Layers +--------------- + +Input Layer +^^^^^^^^^^^^^^^^ +.. autofunction:: Input + +.. ----------------------------------------------------------- +.. Embedding Layers +.. ----------------------------------------------------------- + + +One-hot Layer +^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: OneHot + +Word2Vec Embedding Layer +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: Word2vecEmbedding + +Embedding Layer +^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: Embedding + +Average Embedding Layer +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: AverageEmbedding + +.. ----------------------------------------------------------- +.. Activation Layers +.. ----------------------------------------------------------- + + +Activation Layers +--------------------------- + +PReLU Layer +^^^^^^^^^^^^^^^^^ +.. autoclass:: PRelu + + +PReLU6 Layer +^^^^^^^^^^^^^^^^^^ +.. autoclass:: PRelu6 + + +PTReLU6 Layer +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: PTRelu6 + + +.. ----------------------------------------------------------- +.. Convolutional Layers +.. ----------------------------------------------------------- + +Convolutional Layers +--------------------- + +Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Conv1d +""""""""""""""""""""" +.. autoclass:: Conv1d + +Conv2d +""""""""""""""""""""" +.. autoclass:: Conv2d + +Conv3d +""""""""""""""""""""" +.. autoclass:: Conv3d + +Deconvolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +DeConv2d +""""""""""""""""""""" +.. autoclass:: DeConv2d + +DeConv3d +""""""""""""""""""""" +.. autoclass:: DeConv3d + + +Deformable Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +DeformableConv2d +""""""""""""""""""""" +.. autoclass:: DeformableConv2d + + +Depthwise Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +DepthwiseConv2d +""""""""""""""""""""" +.. autoclass:: DepthwiseConv2d + + +Group Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +GroupConv2d +""""""""""""""""""""" +.. autoclass:: GroupConv2d + + +Separable Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +SeparableConv1d +""""""""""""""""""""" +.. autoclass:: SeparableConv1d + +SeparableConv2d +""""""""""""""""""""" +.. autoclass:: SeparableConv2d + + +SubPixel Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +SubpixelConv1d +""""""""""""""""""""" +.. autoclass:: SubpixelConv1d + +SubpixelConv2d +""""""""""""""""""""" +.. autoclass:: SubpixelConv2d + + +.. ----------------------------------------------------------- +.. Dense Layers +.. ----------------------------------------------------------- + +Dense Layers +------------- + +Dense Layer +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: Dense + +Drop Connect Dense Layer +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: DropconnectDense + + +.. ----------------------------------------------------------- +.. Dropout Layer +.. ----------------------------------------------------------- + +Dropout Layers +------------------- +.. autoclass:: Dropout + +.. ----------------------------------------------------------- +.. Extend Layers +.. ----------------------------------------------------------- + +Extend Layers +------------------- + +Expand Dims Layer +^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: ExpandDims + + +Tile layer +^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: Tile + +.. ----------------------------------------------------------- +.. Image Resampling Layers +.. ----------------------------------------------------------- + +Image Resampling Layers +------------------------- + +2D UpSampling +^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: UpSampling2d + +2D DownSampling +^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: DownSampling2d + +.. ----------------------------------------------------------- +.. Lambda Layer +.. ----------------------------------------------------------- + +Lambda Layers +--------------- + +Lambda Layer +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: Lambda + +ElementWise Lambda Layer +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: ElementwiseLambda + +.. ----------------------------------------------------------- +.. Merge Layer +.. ----------------------------------------------------------- + +Merge Layers +--------------- + +Concat Layer +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: Concat + +ElementWise Layer +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: Elementwise + +.. ----------------------------------------------------------- +.. Noise Layers +.. ----------------------------------------------------------- + +Noise Layer +--------------- +.. autoclass:: GaussianNoise + +.. ----------------------------------------------------------- +.. Normalization Layers +.. ----------------------------------------------------------- + +Normalization Layers +-------------------- + +Batch Normalization +^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: BatchNorm + +Batch Normalization 1D +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: BatchNorm1d + +Batch Normalization 2D +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: BatchNorm2d + +Batch Normalization 3D +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: BatchNorm3d + +Local Response Normalization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: LocalResponseNorm + +Instance Normalization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: InstanceNorm + +Instance Normalization 1D +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: InstanceNorm1d + +Instance Normalization 2D +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: InstanceNorm2d + +Instance Normalization 3D +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: InstanceNorm3d + +Layer Normalization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: LayerNorm + +Group Normalization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: GroupNorm + +Switch Normalization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: SwitchNorm + +.. ----------------------------------------------------------- +.. Padding Layers +.. ----------------------------------------------------------- + +Padding Layers +------------------------ + +Pad Layer (Expert API) +^^^^^^^^^^^^^^^^^^^^^^^^^ +Padding layer for any modes. + +.. autoclass:: PadLayer + +1D Zero padding +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: ZeroPad1d + +2D Zero padding +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: ZeroPad2d + +3D Zero padding +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: ZeroPad3d + +.. ----------------------------------------------------------- +.. Pooling Layers +.. ----------------------------------------------------------- + +Pooling Layers +------------------------ + +Pool Layer (Expert API) +^^^^^^^^^^^^^^^^^^^^^^^^^ +Pooling layer for any dimensions and any pooling functions. + +.. autoclass:: PoolLayer + +1D Max pooling +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: MaxPool1d + +1D Mean pooling +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: MeanPool1d + +2D Max pooling +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: MaxPool2d + +2D Mean pooling +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: MeanPool2d + +3D Max pooling +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: MaxPool3d + +3D Mean pooling +^^^^^^^^^^^^^^^^^^^ +.. autoclass:: MeanPool3d + +1D Global Max pooling +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: GlobalMaxPool1d + +1D Global Mean pooling +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: GlobalMeanPool1d + +2D Global Max pooling +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: GlobalMaxPool2d + +2D Global Mean pooling +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: GlobalMeanPool2d + +3D Global Max pooling +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: GlobalMaxPool3d + +3D Global Mean pooling +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: GlobalMeanPool3d + +2D Corner pooling +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: CornerPool2d + +.. ----------------------------------------------------------- +.. Quantized Layers +.. ----------------------------------------------------------- + +Quantized Nets +------------------ + +This is an experimental API package for building Quantized Neural Networks. We are using matrix multiplication rather than add-minus and bit-count operation at the moment. Therefore, these APIs would not speed up the inferencing, for production, you can train model via TensorLayer and deploy the model into other customized C/C++ implementation (We probably provide users an extra C/C++ binary net framework that can load model from TensorLayer). + +Note that, these experimental APIs can be changed in the future. + + +Sign +^^^^^^^^^^^^^^ +.. autoclass:: Sign + +Scale +^^^^^^^^^^^^^^ +.. autoclass:: Scale + +Binary Dense Layer +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: BinaryDense + +Binary (De)Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +BinaryConv2d +""""""""""""""""""""" +.. autoclass:: BinaryConv2d + +Ternary Dense Layer +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +TernaryDense +""""""""""""""""""""" +.. autoclass:: TernaryDense + +Ternary Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +TernaryConv2d +""""""""""""""""""""" +.. autoclass:: TernaryConv2d + +DoReFa Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +DorefaConv2d +""""""""""""""""""""" +.. autoclass:: DorefaConv2d + +DoReFa Convolutions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +DorefaConv2d +""""""""""""""""""""" +.. autoclass:: DorefaConv2d + + +.. ----------------------------------------------------------- +.. Recurrent Layers +.. ----------------------------------------------------------- + +Recurrent Layers +--------------------- + +Common Recurrent layer +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +All recurrent layers can implement any type of RNN cell by feeding different cell function (LSTM, GRU etc). + +RNN layer +"""""""""""""""""""""""""" +.. autoclass:: RNN + +RNN layer with Simple RNN Cell +"""""""""""""""""""""""""""""""""" +.. autoclass:: SimpleRNN + +RNN layer with GRU Cell +"""""""""""""""""""""""""""""""""" +.. autoclass:: GRURNN + +RNN layer with LSTM Cell +"""""""""""""""""""""""""""""""""" +.. autoclass:: LSTMRNN + +Bidirectional layer +""""""""""""""""""""""""""""""""" +.. autoclass:: BiRNN + +Advanced Ops for Dynamic RNN +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +These operations usually be used inside Dynamic RNN layer, they can +compute the sequence lengths for different situation and get the last RNN outputs by indexing. + +Compute Sequence length 1 +"""""""""""""""""""""""""" +.. autofunction:: retrieve_seq_length_op + +Compute Sequence length 2 +""""""""""""""""""""""""""""" +.. autofunction:: retrieve_seq_length_op2 + +Compute Sequence length 3 +"""""""""""""""""""""""""""" +.. autofunction:: retrieve_seq_length_op3 + +Compute mask of the target sequence +""""""""""""""""""""""""""""""""""""""" +.. autofunction:: target_mask_op + + + +.. ----------------------------------------------------------- +.. Shape Layers +.. ----------------------------------------------------------- + +Shape Layers +------------ + +Flatten Layer +^^^^^^^^^^^^^^^ +.. autoclass:: Flatten + +Reshape Layer +^^^^^^^^^^^^^^^ +.. autoclass:: Reshape + +Transpose Layer +^^^^^^^^^^^^^^^^^ +.. autoclass:: Transpose + +Shuffle Layer +^^^^^^^^^^^^^^^^^ +.. autoclass:: Shuffle + +.. ----------------------------------------------------------- +.. Spatial Transformer Layers +.. ----------------------------------------------------------- + +Spatial Transformer +----------------------- + +2D Affine Transformation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: SpatialTransformer2dAffine + +2D Affine Transformation function +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: transformer + +Batch 2D Affine Transformation function +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: batch_transformer + +.. ----------------------------------------------------------- +.. Stack Layers +.. ----------------------------------------------------------- + +Stack Layer +------------- + +Stack Layer +^^^^^^^^^^^^^^ +.. autoclass:: Stack + +Unstack Layer +^^^^^^^^^^^^^^^ +.. autoclass:: UnStack + + +.. ----------------------------------------------------------- +.. Helper Functions +.. ----------------------------------------------------------- + +Helper Functions +------------------------ + +Flatten tensor +^^^^^^^^^^^^^^^^^ +.. autofunction:: flatten_reshape + +Initialize RNN state +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: initialize_rnn_state + +Remove repeated items in a list +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: list_remove_repeat + diff --git a/docs/modules/models.rst b/docs/modules/models.rst new file mode 100644 index 0000000..272f1d9 --- /dev/null +++ b/docs/modules/models.rst @@ -0,0 +1,59 @@ +API - Models +================================ + +TensorLayer provides many pretrained models, you can easily use the whole or a part of the pretrained models via these APIs. + +.. automodule:: tensorlayer.models + +.. autosummary:: + + Model + + VGG16 + VGG19 + SqueezeNetV1 + MobileNetV1 + ResNet50 + Seq2seq + Seq2seqLuongAttention + + +Base Model +----------- + +.. autoclass:: Model + +VGG16 +---------------------- + +.. autofunction:: VGG16 + +VGG19 +---------------------- + +.. autofunction:: VGG19 + +SqueezeNetV1 +---------------- +.. autofunction:: SqueezeNetV1 + +MobileNetV1 +---------------- + +.. autofunction:: MobileNetV1 + +ResNet50 +---------------- + +.. autofunction:: ResNet50 + +Seq2seq +------------------------ + +.. autoclass:: Seq2seq + + +Seq2seq Luong Attention +------------------------ + +.. autoclass:: Seq2seqLuongAttention diff --git a/docs/modules/nlp.rst b/docs/modules/nlp.rst new file mode 100644 index 0000000..16486a6 --- /dev/null +++ b/docs/modules/nlp.rst @@ -0,0 +1,148 @@ +API - Natural Language Processing +================================== + +Natural Language Processing and Word Representation. + +.. automodule:: tensorlayer.nlp + +.. autosummary:: + + generate_skip_gram_batch + + sample + sample_top + + SimpleVocabulary + Vocabulary + process_sentence + create_vocab + + simple_read_words + read_words + read_analogies_file + build_vocab + build_reverse_dictionary + build_words_dataset + save_vocab + + words_to_word_ids + word_ids_to_words + + basic_tokenizer + create_vocabulary + initialize_vocabulary + sentence_to_token_ids + data_to_token_ids + + moses_multi_bleu + + +Iteration function for training embedding matrix +------------------------------------------------- +.. autofunction:: generate_skip_gram_batch + + +Sampling functions +------------------- + +Simple sampling +^^^^^^^^^^^^^^^^^^^ +.. autofunction:: sample + +Sampling from top k +^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: sample_top + +Vector representations of words +------------------------------- + +Simple vocabulary class +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: SimpleVocabulary + +Vocabulary class +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autoclass:: Vocabulary + +Process sentence +^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: process_sentence + +Create vocabulary +^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: create_vocab + +Read words from file +---------------------- + +Simple read file +^^^^^^^^^^^^^^^^^^ +.. autofunction:: simple_read_words + +Read file +^^^^^^^^^^^^^^^^^^ +.. autofunction:: read_words + + +Read analogy question file +----------------------------- +.. autofunction:: read_analogies_file + +Build vocabulary, word dictionary and word tokenization +-------------------------------------------------------- + +Build dictionary from word to id +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: build_vocab + +Build dictionary from id to word +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: build_reverse_dictionary + +Build dictionaries for id to word etc +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: build_words_dataset + +Save vocabulary +^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: save_vocab + + +Convert words to IDs and IDs to words +-------------------------------------------------------- +These functions can be done by ``Vocabulary`` class. + +List of Words to IDs +^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: words_to_word_ids + +List of IDs to Words +^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: word_ids_to_words + + + +Functions for translation +--------------------------- + +Word Tokenization +^^^^^^^^^^^^^^^^^^^ +.. autofunction:: basic_tokenizer + +Create or read vocabulary +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: create_vocabulary +.. autofunction:: initialize_vocabulary + +Convert words to IDs and IDs to words +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: sentence_to_token_ids +.. autofunction:: data_to_token_ids + + +Metrics +--------------------------- + +BLEU +^^^^^^^^^^^^^^^^^^^ +.. autofunction:: moses_multi_bleu diff --git a/docs/modules/optimizers.rst b/docs/modules/optimizers.rst new file mode 100644 index 0000000..0ababc8 --- /dev/null +++ b/docs/modules/optimizers.rst @@ -0,0 +1,19 @@ +API - Optimizers +================ + +.. automodule:: tensorlayer.optimizers + +TensorLayer provides simple API and tools to ease research, development and reduce the time to production. +Therefore, we provide the latest state of the art optimizers that work with Tensorflow. + +Optimizers List +--------------- + +.. autosummary:: + + AMSGrad + +AMSGrad Optimizer +----------------- +.. autoclass:: AMSGrad + :members: \ No newline at end of file diff --git a/docs/modules/prepro.rst b/docs/modules/prepro.rst new file mode 100644 index 0000000..ec65da0 --- /dev/null +++ b/docs/modules/prepro.rst @@ -0,0 +1,641 @@ +API - Data Pre-Processing +========================= + +.. automodule:: tensorlayer.prepro + +.. autosummary:: + + affine_rotation_matrix + affine_horizontal_flip_matrix + affine_vertical_flip_matrix + affine_shift_matrix + affine_shear_matrix + affine_zoom_matrix + affine_respective_zoom_matrix + + transform_matrix_offset_center + affine_transform + affine_transform_cv2 + affine_transform_keypoints + projective_transform_by_points + + rotation + rotation_multi + crop + crop_multi + flip_axis + flip_axis_multi + shift + shift_multi + + shear + shear_multi + shear2 + shear_multi2 + swirl + swirl_multi + elastic_transform + elastic_transform_multi + + zoom + respective_zoom + zoom_multi + + brightness + brightness_multi + + illumination + + rgb_to_hsv + hsv_to_rgb + adjust_hue + + imresize + + pixel_value_scale + + samplewise_norm + featurewise_norm + + channel_shift + channel_shift_multi + + drop + + array_to_img + + find_contours + pt2map + binary_dilation + dilation + binary_erosion + erosion + + + obj_box_coord_rescale + obj_box_coords_rescale + obj_box_coord_scale_to_pixelunit + obj_box_coord_centroid_to_upleft_butright + obj_box_coord_upleft_butright_to_centroid + obj_box_coord_centroid_to_upleft + obj_box_coord_upleft_to_centroid + + parse_darknet_ann_str_to_list + parse_darknet_ann_list_to_cls_box + + obj_box_horizontal_flip + obj_box_imresize + obj_box_crop + obj_box_shift + obj_box_zoom + + keypoint_random_crop + keypoint_resize_random_crop + keypoint_random_rotate + keypoint_random_flip + keypoint_random_resize + keypoint_random_resize_shortestedge + + pad_sequences + remove_pad_sequences + process_sequences + sequences_add_start_id + sequences_add_end_id + sequences_add_end_id_after_pad + sequences_get_mask + + +.. + Threading + ------------ + .. autofunction:: threading_data + + +Affine Transform +---------------- + + +Python can be FAST +^^^^^^^^^^^^^^^^^^ + +Image augmentation is a critical step in deep learning. +Though TensorFlow has provided ``tf.image``, +image augmentation often remains as a key bottleneck. +``tf.image`` has three limitations: + +- Real-world visual tasks such as object detection, segmentation, and pose estimation + must cope with image meta-data (e.g., coordinates). + These data are beyond ``tf.image`` + which processes images as tensors. + +- ``tf.image`` operators + breaks the pure Python programing experience (i.e., users have to + use ``tf.py_func`` in order to call image functions written in Python); however, + frequent uses of ``tf.py_func`` slow down TensorFlow, + making users hard to balance flexibility and performance. + +- ``tf.image`` API is inflexible. Image operations are + performed in an order. They are hard to jointly optimize. More importantly, + sequential image operations can significantly + reduces the quality of images, thus affecting training accuracy. + + +TensorLayer addresses these limitations by providing a +high-performance image augmentation API in Python. +This API bases on affine transformation and ``cv2.wrapAffine``. +It allows you to combine multiple image processing functions into +a single matrix operation. This combined operation +is executed by the fast ``cv2`` library, offering 78x performance improvement (observed in +`openpose-plus `_ for example). +The following example illustrates the rationale +behind this tremendous speed up. + + +Example +^^^^^^^ + +The source code of complete examples can be found \ +`here `__. +The following is a typical Python program that applies rotation, shifting, flipping, zooming and shearing to an image, + +.. code-block:: python + + image = tl.vis.read_image('tiger.jpeg') + + xx = tl.prepro.rotation(image, rg=-20, is_random=False) + xx = tl.prepro.flip_axis(xx, axis=1, is_random=False) + xx = tl.prepro.shear2(xx, shear=(0., -0.2), is_random=False) + xx = tl.prepro.zoom(xx, zoom_range=0.8) + xx = tl.prepro.shift(xx, wrg=-0.1, hrg=0, is_random=False) + + tl.vis.save_image(xx, '_result_slow.png') + + +However, by leveraging affine transformation, image operations can be combined into one: + +.. code-block:: python + + # 1. Create required affine transformation matrices + M_rotate = tl.prepro.affine_rotation_matrix(angle=20) + M_flip = tl.prepro.affine_horizontal_flip_matrix(prob=1) + M_shift = tl.prepro.affine_shift_matrix(wrg=0.1, hrg=0, h=h, w=w) + M_shear = tl.prepro.affine_shear_matrix(x_shear=0.2, y_shear=0) + M_zoom = tl.prepro.affine_zoom_matrix(zoom_range=0.8) + + # 2. Combine matrices + # NOTE: operations are applied in a reversed order (i.e., rotation is performed first) + M_combined = M_shift.dot(M_zoom).dot(M_shear).dot(M_flip).dot(M_rotate) + + # 3. Convert the matrix from Cartesian coordinates (the origin in the middle of image) + # to image coordinates (the origin on the top-left of image) + transform_matrix = tl.prepro.transform_matrix_offset_center(M_combined, x=w, y=h) + + # 4. Transform the image using a single operation + result = tl.prepro.affine_transform_cv2(image, transform_matrix) # 76 times faster + + tl.vis.save_image(result, '_result_fast.png') + + +The following figure illustrates the rational behind combined affine transformation. + +.. image:: ../images/affine_transform_why.jpg + :width: 100 % + :align: center + + +Using combined affine transformation has two key benefits. First, it allows \ +you to leverage a pure Python API to achieve orders of magnitudes of speed up in image augmentation, +and thus prevent data pre-processing from becoming a bottleneck in training. \ +Second, performing sequential image transformation requires multiple image interpolations. \ +This produces low-quality input images. In contrast, a combined transformation performs the \ +interpolation only once, and thus +preserve the content in an image. The following figure illustrates these two benefits: + +.. image:: ../images/affine_transform_comparison.jpg + :width: 100 % + :align: center + +The major reason for combined affine transformation being fast is because it has lower computational complexity. +Assume we have ``k`` affine transformations ``T1, ..., Tk``, where ``Ti`` can be represented by 3x3 matrixes. +The sequential transformation can be represented as ``y = Tk (... T1(x))``, +and the time complexity is ``O(k N)`` where ``N`` is the cost of applying one transformation to image ``x``. +``N`` is linear to the size of ``x``. +For the combined transformation ``y = (Tk ... T1) (x)`` +the time complexity is ``O(27(k - 1) + N) = max{O(27k), O(N)} = O(N)`` (assuming 27k << N) where 27 = 3^3 is the cost for combining two transformations. + + +Get rotation matrix +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: affine_rotation_matrix + +Get horizontal flipping matrix +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: affine_horizontal_flip_matrix + +Get vertical flipping matrix +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: affine_vertical_flip_matrix + +Get shifting matrix +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: affine_shift_matrix + +Get shearing matrix +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: affine_shear_matrix + +Get zooming matrix +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: affine_zoom_matrix + +Get respective zooming matrix +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: affine_respective_zoom_matrix + +Cartesian to image coordinates +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: transform_matrix_offset_center + +.. + Apply image transform + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. autofunction:: affine_transform + +Apply image transform +^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: affine_transform_cv2 + +Apply keypoint transform +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: affine_transform_keypoints + + +Images +----------- + +Projective transform by points +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: projective_transform_by_points + +Rotation +^^^^^^^^^ +.. autofunction:: rotation +.. autofunction:: rotation_multi + +Crop +^^^^^^^^^ +.. autofunction:: crop +.. autofunction:: crop_multi + +Flip +^^^^^^^^^ +.. autofunction:: flip_axis +.. autofunction:: flip_axis_multi + +Shift +^^^^^^^^^ +.. autofunction:: shift +.. autofunction:: shift_multi + +Shear +^^^^^^^^^ +.. autofunction:: shear +.. autofunction:: shear_multi + +Shear V2 +^^^^^^^^^^^ +.. autofunction:: shear2 +.. autofunction:: shear_multi2 + +Swirl +^^^^^^^^^ +.. autofunction:: swirl +.. autofunction:: swirl_multi + +Elastic transform +^^^^^^^^^^^^^^^^^^ +.. autofunction:: elastic_transform +.. autofunction:: elastic_transform_multi + +Zoom +^^^^^^^^^ +.. autofunction:: zoom +.. autofunction:: zoom_multi + +Respective Zoom +^^^^^^^^^^^^^^^^^ +.. autofunction:: respective_zoom + +Brightness +^^^^^^^^^^^^ +.. autofunction:: brightness +.. autofunction:: brightness_multi + +Brightness, contrast and saturation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: illumination + +RGB to HSV +^^^^^^^^^^^^^^ +.. autofunction:: rgb_to_hsv + +HSV to RGB +^^^^^^^^^^^^^^ +.. autofunction:: hsv_to_rgb + +Adjust Hue +^^^^^^^^^^^^^^ +.. autofunction:: adjust_hue + +Resize +^^^^^^^^^^^^ +.. autofunction:: imresize + +Pixel value scale +^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: pixel_value_scale + +Normalization +^^^^^^^^^^^^^^^ +.. autofunction:: samplewise_norm +.. autofunction:: featurewise_norm + +Channel shift +^^^^^^^^^^^^^^ +.. autofunction:: channel_shift +.. autofunction:: channel_shift_multi + +Noise +^^^^^^^^^^^^^^ +.. autofunction:: drop + +Numpy and PIL +^^^^^^^^^^^^^^ +.. autofunction:: array_to_img + +Find contours +^^^^^^^^^^^^^^ +.. autofunction:: find_contours + +Points to Image +^^^^^^^^^^^^^^^^^ +.. autofunction:: pt2map + +Binary dilation +^^^^^^^^^^^^^^^^^ +.. autofunction:: binary_dilation + +Greyscale dilation +^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: dilation + +Binary erosion +^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: binary_erosion + +Greyscale erosion +^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: erosion + + + +Object detection +------------------- + +Tutorial for Image Aug +^^^^^^^^^^^^^^^^^^^^^^^ + +Hi, here is an example for image augmentation on VOC dataset. + +.. code-block:: python + + import tensorlayer as tl + + ## download VOC 2012 dataset + imgs_file_list, _, _, _, classes, _, _,\ + _, objs_info_list, _ = tl.files.load_voc_dataset(dataset="2012") + + ## parse annotation and convert it into list format + ann_list = [] + for info in objs_info_list: + ann = tl.prepro.parse_darknet_ann_str_to_list(info) + c, b = tl.prepro.parse_darknet_ann_list_to_cls_box(ann) + ann_list.append([c, b]) + + # read and save one image + idx = 2 # you can select your own image + image = tl.vis.read_image(imgs_file_list[idx]) + tl.vis.draw_boxes_and_labels_to_image(image, ann_list[idx][0], + ann_list[idx][1], [], classes, True, save_name='_im_original.png') + + # left right flip + im_flip, coords = tl.prepro.obj_box_horizontal_flip(image, + ann_list[idx][1], is_rescale=True, is_center=True, is_random=False) + tl.vis.draw_boxes_and_labels_to_image(im_flip, ann_list[idx][0], + coords, [], classes, True, save_name='_im_flip.png') + + # resize + im_resize, coords = tl.prepro.obj_box_imresize(image, + coords=ann_list[idx][1], size=[300, 200], is_rescale=True) + tl.vis.draw_boxes_and_labels_to_image(im_resize, ann_list[idx][0], + coords, [], classes, True, save_name='_im_resize.png') + + # crop + im_crop, clas, coords = tl.prepro.obj_box_crop(image, ann_list[idx][0], + ann_list[idx][1], wrg=200, hrg=200, + is_rescale=True, is_center=True, is_random=False) + tl.vis.draw_boxes_and_labels_to_image(im_crop, clas, coords, [], + classes, True, save_name='_im_crop.png') + + # shift + im_shfit, clas, coords = tl.prepro.obj_box_shift(image, ann_list[idx][0], + ann_list[idx][1], wrg=0.1, hrg=0.1, + is_rescale=True, is_center=True, is_random=False) + tl.vis.draw_boxes_and_labels_to_image(im_shfit, clas, coords, [], + classes, True, save_name='_im_shift.png') + + # zoom + im_zoom, clas, coords = tl.prepro.obj_box_zoom(image, ann_list[idx][0], + ann_list[idx][1], zoom_range=(1.3, 0.7), + is_rescale=True, is_center=True, is_random=False) + tl.vis.draw_boxes_and_labels_to_image(im_zoom, clas, coords, [], + classes, True, save_name='_im_zoom.png') + + +In practice, you may want to use threading method to process a batch of images as follows. + +.. code-block:: python + + import tensorlayer as tl + import random + + batch_size = 64 + im_size = [416, 416] + n_data = len(imgs_file_list) + jitter = 0.2 + def _data_pre_aug_fn(data): + im, ann = data + clas, coords = ann + ## change image brightness, contrast and saturation randomly + im = tl.prepro.illumination(im, gamma=(0.5, 1.5), + contrast=(0.5, 1.5), saturation=(0.5, 1.5), is_random=True) + ## flip randomly + im, coords = tl.prepro.obj_box_horizontal_flip(im, coords, + is_rescale=True, is_center=True, is_random=True) + ## randomly resize and crop image, it can have same effect as random zoom + tmp0 = random.randint(1, int(im_size[0]*jitter)) + tmp1 = random.randint(1, int(im_size[1]*jitter)) + im, coords = tl.prepro.obj_box_imresize(im, coords, + [im_size[0]+tmp0, im_size[1]+tmp1], is_rescale=True, + interp='bicubic') + im, clas, coords = tl.prepro.obj_box_crop(im, clas, coords, + wrg=im_size[1], hrg=im_size[0], is_rescale=True, + is_center=True, is_random=True) + ## rescale value from [0, 255] to [-1, 1] (optional) + im = im / 127.5 - 1 + return im, [clas, coords] + + # randomly read a batch of image and the corresponding annotations + idexs = tl.utils.get_random_int(min=0, max=n_data-1, number=batch_size) + b_im_path = [imgs_file_list[i] for i in idexs] + b_images = tl.prepro.threading_data(b_im_path, fn=tl.vis.read_image) + b_ann = [ann_list[i] for i in idexs] + + # threading process + data = tl.prepro.threading_data([_ for _ in zip(b_images, b_ann)], + _data_pre_aug_fn) + b_images2 = [d[0] for d in data] + b_ann = [d[1] for d in data] + + # save all images + for i in range(len(b_images)): + tl.vis.draw_boxes_and_labels_to_image(b_images[i], + ann_list[idexs[i]][0], ann_list[idexs[i]][1], [], + classes, True, save_name='_bbox_vis_%d_original.png' % i) + tl.vis.draw_boxes_and_labels_to_image((b_images2[i]+1)*127.5, + b_ann[i][0], b_ann[i][1], [], classes, True, + save_name='_bbox_vis_%d.png' % i) + +Image Aug with TF Dataset API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Example code for VOC `here `__. + +Coordinate pixel unit to percentage +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_coord_rescale + +Coordinates pixel unit to percentage +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_coords_rescale + +Coordinate percentage to pixel unit +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_coord_scale_to_pixelunit + +Coordinate [x_center, x_center, w, h] to up-left button-right +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_coord_centroid_to_upleft_butright + +Coordinate up-left button-right to [x_center, x_center, w, h] +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_coord_upleft_butright_to_centroid + +Coordinate [x_center, x_center, w, h] to up-left-width-high +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_coord_centroid_to_upleft + +Coordinate up-left-width-high to [x_center, x_center, w, h] +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_coord_upleft_to_centroid + +Darknet format string to list +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: parse_darknet_ann_str_to_list + +Darknet format split class and coordinate +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: parse_darknet_ann_list_to_cls_box + +Image Aug - Flip +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_horizontal_flip + +Image Aug - Resize +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_imresize + +Image Aug - Crop +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_crop + +Image Aug - Shift +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_shift + +Image Aug - Zoom +^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: obj_box_zoom + +Keypoints +------------ + +Image Aug - Crop +^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: keypoint_random_crop + +Image Aug - Resize then Crop +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: keypoint_resize_random_crop + +Image Aug - Rotate +^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: keypoint_random_rotate + +Image Aug - Flip +^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: keypoint_random_flip + +Image Aug - Resize +^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: keypoint_random_resize + +Image Aug - Resize Shortest Edge +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: keypoint_random_resize_shortestedge + + +Sequence +--------- + +More related functions can be found in ``tensorlayer.nlp``. + +Padding +^^^^^^^^^ +.. autofunction:: pad_sequences + +Remove Padding +^^^^^^^^^^^^^^^^^ +.. autofunction:: remove_pad_sequences + + +Process +^^^^^^^^^ +.. autofunction:: process_sequences + +Add Start ID +^^^^^^^^^^^^^^^ +.. autofunction:: sequences_add_start_id + + +Add End ID +^^^^^^^^^^^^^^^ +.. autofunction:: sequences_add_end_id + +Add End ID after pad +^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: sequences_add_end_id_after_pad + +Get Mask +^^^^^^^^^ +.. autofunction:: sequences_get_mask diff --git a/docs/modules/rein.rst b/docs/modules/rein.rst new file mode 100644 index 0000000..9ee16a6 --- /dev/null +++ b/docs/modules/rein.rst @@ -0,0 +1,33 @@ +API - Reinforcement Learning +============================== + +Reinforcement Learning. + +.. automodule:: tensorlayer.rein + +.. autosummary:: + + discount_episode_rewards + cross_entropy_reward_loss + log_weight + choice_action_by_probs + + +Reward functions +--------------------- +.. autofunction:: discount_episode_rewards + +Cost functions +--------------------- + +Weighted Cross Entropy +^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: cross_entropy_reward_loss + +Log weight +^^^^^^^^^^^^^^ +.. autofunction:: log_weight + +Sampling functions +--------------------- +.. autofunction:: choice_action_by_probs diff --git a/docs/modules/utils.rst b/docs/modules/utils.rst new file mode 100644 index 0000000..dfc5f6b --- /dev/null +++ b/docs/modules/utils.rst @@ -0,0 +1,73 @@ +API - Utility +======================== + +.. automodule:: tensorlayer.utils + +.. autosummary:: + + fit + test + predict + evaluation + class_balancing_oversample + get_random_int + dict_to_one + list_string_to_dict + flatten_list + exit_tensorflow + open_tensorboard + set_gpu_fraction + +Training, testing and predicting +---------------------------------- + +Training +^^^^^^^^^^^ +.. autofunction:: fit + +Evaluation +^^^^^^^^^^^^^ +.. autofunction:: test + +Prediction +^^^^^^^^^^^^ +.. autofunction:: predict + +Evaluation functions +--------------------- +.. autofunction:: evaluation + +Class balancing functions +---------------------------- +.. autofunction:: class_balancing_oversample + +Random functions +---------------------------- +.. autofunction:: get_random_int + +Dictionary and list +-------------------- + +Set all items in dictionary to one +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: dict_to_one + +Convert list of string to dictionary +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: list_string_to_dict + +Flatten a list +^^^^^^^^^^^^^^^^^^^ +.. autofunction:: flatten_list + +Close TF session and associated processes +----------------------------------------- +.. autofunction:: exit_tensorflow + +Open TensorBoard +---------------- +.. autofunction:: open_tensorboard + +Set GPU functions +----------------- +.. autofunction:: set_gpu_fraction diff --git a/docs/modules/visualize.rst b/docs/modules/visualize.rst new file mode 100644 index 0000000..0bbe028 --- /dev/null +++ b/docs/modules/visualize.rst @@ -0,0 +1,76 @@ +API - Visualization +================================ + +TensorFlow provides `TensorBoard `_ +to visualize the model, activations etc. Here we provide more functions for data visualization. + +.. automodule:: tensorlayer.visualize + +.. autosummary:: + + read_image + read_images + save_image + save_images + draw_boxes_and_labels_to_image + draw_mpii_pose_to_image + draw_weights + CNN2d + frame + images2d + tsne_embedding + + +Save and read images +---------------------- + +Read one image +^^^^^^^^^^^^^^^^^ +.. autofunction:: read_image + +Read multiple images +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: read_images + +Save one image +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: save_image + +Save multiple images +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: save_images + +Save image for object detection +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: draw_boxes_and_labels_to_image + + +Save image for pose estimation (MPII) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: draw_mpii_pose_to_image + +Visualize model parameters +------------------------------ + +Visualize CNN 2d filter +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: CNN2d + +Visualize weights +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: draw_weights + +Visualize images +----------------- + +Image by matplotlib +^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: frame + +Images by matplotlib +^^^^^^^^^^^^^^^^^^^^^ +.. autofunction:: images2d + +Visualize embeddings +-------------------- +.. autofunction:: tsne_embedding diff --git a/docs/user/contributing.rst b/docs/user/contributing.rst new file mode 100644 index 0000000..a83767a --- /dev/null +++ b/docs/user/contributing.rst @@ -0,0 +1,184 @@ +.. _contributing: + +=============== +Contributing +=============== + +TensorLayer 2.0 is a major ongoing research project in CFCS, Peking University, the first version was established at Imperial College London in 2016. The goal of the project is to develop a compositional language while complex learning systems +can be built through composition of neural network modules. + +Numerous contributors come from various horizons such as: Imperial College London, Tsinghua University, Carnegie Mellon University, Stanford, University of Technology of Compiegne, Google, Microsoft, Bloomberg and etc. + +You can easily open a Pull Request (PR) on `GitHub`_, every little step counts and will be credited. +As an open-source project, we highly welcome and value contributions! + +**If you are interested in working with us, please contact us at:** `tensorlayer@gmail.com `_. + +.. image:: ../../img/join_slack.png + :width: 30 % + :align: center + :target: https://join.slack.com/t/tensorlayer/shared_invite/enQtMjUyMjczMzU2Njg4LWI0MWU0MDFkOWY2YjQ4YjVhMzI5M2VlZmE4YTNhNGY1NjZhMzUwMmQ2MTc0YWRjMjQzMjdjMTg2MWQ2ZWJhYzc + + +Project Maintainers +-------------------------- + +The TensorLayer project was started by `Hao Dong `_ at Imperial College London in June 2016. + +For TensorLayer 2.x, it is now actively developing and maintaining by the following people who has more than 50 contributions: + +- **Hao Dong** (`@zsdonghao `_) - ``_ +- **Jingqing Zhang** (`@JingqingZ `_) - ``_ +- **Rundi Wu** (`@ChrisWu1997 `_) - ``_ +- **Ruihai Wu** (`@warshallrho `_) - ``_ + +For TensorLayer 1.x, it was actively developed and maintained by the following people *(in alphabetical order)*: + +- **Akara Supratak** (`@akaraspt `_) - ``_ +- **Fangde Liu** (`@fangde `_) - ``_ +- **Guo Li** (`@lgarithm `_) - ``_ +- **Hao Dong** (`@zsdonghao `_) - ``_ +- **Jonathan Dekhtiar** (`@DEKHTIARJonathan `_) - ``_ +- **Luo Mai** (`@luomai `_) - ``_ +- **Simiao Yu** (`@nebulaV `_) - ``_ + +Numerous other contributors can be found in the `Github Contribution Graph `_. + + +What to contribute +------------------ + +Your method and example +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you have a new method or example in terms of Deep learning or Reinforcement learning, you are welcome to contribute. + +* Provide your layers or examples, so everyone can use it. +* Explain how it would work, and link to a scientific paper if applicable. +* Keep the scope as narrow as possible, to make it easier to implement. + + +Report bugs +~~~~~~~~~~~ + +Report bugs at the `GitHub`_, we normally will fix it in 5 hours. +If you are reporting a bug, please include: + +* your TensorLayer, TensorFlow and Python version. +* steps to reproduce the bug, ideally reduced to a few Python commands. +* the results you obtain, and the results you expected instead. + +If you are unsure whether the behavior you experience is a bug, or if you are +unsure whether it is related to TensorLayer or TensorFlow, please just ask on `our +mailing list`_ first. + + +Fix bugs +~~~~~~~~ + +Look through the GitHub issues for bug reports. Anything tagged with "bug" is +open to whoever wants to implement it. If you discover a bug in TensorLayer you can +fix yourself, by all means feel free to just implement a fix and not report it +first. + + +Write documentation +~~~~~~~~~~~~~~~~~~~ + +Whenever you find something not explained well, misleading, glossed over or +just wrong, please update it! The *Edit on GitHub* link on the top right of +every documentation page and the *[source]* link for every documented entity +in the API reference will help you to quickly locate the origin of any text. + + + +How to contribute +----------------- + +Edit on GitHub +~~~~~~~~~~~~~~ + +As a very easy way of just fixing issues in the documentation, use the *Edit +on GitHub* link on the top right of a documentation page or the *[source]* link +of an entity in the API reference to open the corresponding source file in +GitHub, then click the *Edit this file* link to edit the file in your browser +and send us a Pull Request. All you need for this is a free GitHub account. + +For any more substantial changes, please follow the steps below to setup +TensorLayer for development. + + +Documentation +~~~~~~~~~~~~~ + +The documentation is generated with `Sphinx +`_. To build it locally, run the +following commands: + +.. code:: bash + + pip install Sphinx + sphinx-quickstart + + cd docs + make html + +If you want to re-generate the whole docs, run the following commands: + +.. code :: bash + + cd docs + make clean + make html + + +To write the docs, we recommend you to install `Local RTD VM `_. + + + + +Afterwards, open ``docs/_build/html/index.html`` to view the documentation as +it would appear on `readthedocs `_. If you +changed a lot and seem to get misleading error messages or warnings, run +``make clean html`` to force Sphinx to recreate all files from scratch. + +When writing docstrings, follow existing documentation as much as possible to +ensure consistency throughout the library. For additional information on the +syntax and conventions used, please refer to the following documents: + +* `reStructuredText Primer `_ +* `Sphinx reST markup constructs `_ +* `A Guide to NumPy/SciPy Documentation `_ + + +Testing +~~~~~~~ + +TensorLayer has a code coverage of 100%, which has proven very helpful in the past, +but also creates some duties: + +* Whenever you change any code, you should test whether it breaks existing + features by just running the test scripts. +* Every bug you fix indicates a missing test case, so a proposed bug fix should + come with a new test that fails without your fix. + + +Sending Pull Requests +~~~~~~~~~~~~~~~~~~~~~ + +When you're satisfied with your addition, the tests pass and the documentation +looks good without any markup errors, commit your changes to a new branch, push +that branch to your fork and send us a Pull Request via GitHub's web interface. + +All these steps are nicely explained on GitHub: +https://guides.github.com/introduction/flow/ + +When filing your Pull Request, please include a description of what it does, to +help us reviewing it. If it is fixing an open issue, say, issue #123, add +*Fixes #123*, *Resolves #123* or *Closes #123* to the description text, so +GitHub will close it when your request is merged. + + +.. _Release: https://github.com/tensorlayer/tensorlayer/releases +.. _GitHub: https://github.com/tensorlayer/tensorlayer +.. _our mailing list: hao.dong11@imperial.ac.uk diff --git a/docs/user/examples.rst b/docs/user/examples.rst new file mode 100644 index 0000000..91971c0 --- /dev/null +++ b/docs/user/examples.rst @@ -0,0 +1,121 @@ +.. _example: + +============ +Examples +============ + +We list some examples here, but more tutorials and applications can be found in `Github examples `__ and `Awesome-TensorLayer `_. + +Basics +============ + + - Multi-layer perceptron (MNIST), simple usage. Classification task, see `tutorial_mnist_simple.py `__. + - Multi-layer perceptron (MNIST), dynamic model. Classification with dropout using iterator, see `tutorial_mnist_mlp_dynamic.py method2 `__. + - Multi-layer perceptron (MNIST), static model. Classification with dropout using iterator, see `tutorial_mnist_mlp_static.py `__. + - Convolutional Network (CIFAR-10). Classification task, see `tutorial_cifar10_cnn_static.py `_. + - TensorFlow dataset API for object detection see `here `__. + - Data augmentation with TFRecord. Effective way to load and pre-process data, see `tutorial_tfrecord*.py `__ and `tutorial_cifar10_tfrecord.py `__. + - Data augmentation with TensorLayer. See `tutorial_fast_affine_transform.py `__ (for quick test only). + +Pretrained Models +================== + + - VGG 16 (ImageNet). Classification task, see `tutorial_models_vgg16 `__. + - VGG 19 (ImageNet). Classification task, see `tutorial_models_vgg19.py `__. + - SqueezeNet (ImageNet). Model compression, see `tutorial_models_squeezenetv1.py `__. + - MobileNet (ImageNet). Model compression, see `tutorial_models_mobilenetv1.py `__. + - All pretrained models in `pretrained-models `__. + +Vision +================== + + - Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization, see `examples `__. + - ArcFace: Additive Angular Margin Loss for Deep Face Recognition, see `InsignFace `__. + - BinaryNet. Model compression, see `mnist `__ `cifar10 `__. + - Ternary Weight Network. Model compression, see `mnist `__ `cifar10 `__. + - DoReFa-Net. Model compression, see `mnist `__ `cifar10 `__. + - QuanCNN. Model compression, sees `mnist `__ `cifar10 `__. + - Wide ResNet (CIFAR) by `ritchieng `__. + - `Spatial Transformer Networks `__ by `zsdonghao `__. + - `U-Net for brain tumor segmentation `__ by `zsdonghao `__. + - Variational Autoencoder (VAE) for (CelebA) by `yzwxx `__. + - Variational Autoencoder (VAE) for (MNIST) by `BUPTLdy `__. + - Image Captioning - Reimplementation of Google's `im2txt `__ by `zsdonghao `__. + +Adversarial Learning +======================== + - DCGAN (CelebA). Generating images by `Deep Convolutional Generative Adversarial Networks `__ by `zsdonghao `__. + - `Generative Adversarial Text to Image Synthesis `__ by `zsdonghao `__. + - `Unsupervised Image to Image Translation with Generative Adversarial Networks `__ by `zsdonghao `__. + - `Improved CycleGAN `__ with resize-convolution by `luoxier `__. + - `Super Resolution GAN `__ by `zsdonghao `__. + - `BEGAN: Boundary Equilibrium Generative Adversarial Networks `__ by `2wins `__. + - `DAGAN: Fast Compressed Sensing MRI Reconstruction `__ by `nebulaV `__. + +Natural Language Processing +============================== + + - Recurrent Neural Network (LSTM). Apply multiple LSTM to PTB dataset for language modeling, see `tutorial_ptb_lstm_state_is_tuple.py `__. + - Word Embedding (Word2vec). Train a word embedding matrix, see `tutorial_word2vec_basic.py `__. + - Restore Embedding matrix. Restore a pre-train embedding matrix, see `tutorial_generate_text.py `__. + - Text Generation. Generates new text scripts, using LSTM network, see `tutorial_generate_text.py `__. + - Chinese Text Anti-Spam by `pakrchen `__. + - `Chatbot in 200 lines of code `__ for `Seq2Seq `__. + - FastText Sentence Classification (IMDB), see `tutorial_imdb_fasttext.py `__ by `tomtung `__. + +Reinforcement Learning +============================== + + - Policy Gradient / Network (Atari Ping Pong), see `tutorial_atari_pong.py `__. + - Deep Q-Network (Frozen lake), see `tutorial_frozenlake_dqn.py `__. + - Q-Table learning algorithm (Frozen lake), see `tutorial_frozenlake_q_table.py `__. + - Asynchronous Policy Gradient using TensorDB (Atari Ping Pong) by `nebulaV `__. + - AC for discrete action space (Cartpole), see `tutorial_cartpole_ac.py `__. + - A3C for continuous action space (Bipedal Walker), see `tutorial_bipedalwalker_a3c*.py `__. + - `DAGGER `__ for (`Gym Torcs `__) by `zsdonghao `__. + - `TRPO `__ for continuous and discrete action space by `jjkke88 `__. + +Miscellaneous +================= + +- `Sipeed `__ : Run TensorLayer on AI Chips + +.. + - TensorDB by `fangde `__ see `tl_paper `__. + - A simple web service - `TensorFlask `__ by `JoelKronander `__. + +.. + Applications + ============= + + There are some good applications implemented by TensorLayer. + You may able to find some useful examples for your project. + If you want to share your application, please contact tensorlayer@gmail.com. + + 1D CNN + LSTM for Biosignal + --------------------------------- + + Author : `Akara Supratak `__ + + Introduction + ^^^^^^^^^^^^ + + Implementation + ^^^^^^^^^^^^^^ + + Citation + ^^^^^^^^ + + + + + +.. _GitHub: https://github.com/tensorlayer/tensorlayer +.. _Deeplearning Tutorial: http://deeplearning.stanford.edu/tutorial/ +.. _Convolutional Neural Networks for Visual Recognition: http://cs231n.github.io/ +.. _Neural Networks and Deep Learning: http://neuralnetworksanddeeplearning.com/ +.. _TensorFlow tutorial: https://www.tensorflow.org/versions/r0.9/tutorials/index.html +.. _Understand Deep Reinforcement Learning: http://karpathy.github.io/2016/05/31/rl/ +.. _Understand Recurrent Neural Network: http://karpathy.github.io/2015/05/21/rnn-effectiveness/ +.. _Understand LSTM Network: http://colah.github.io/posts/2015-08-Understanding-LSTMs/ +.. _Word Representations: http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/ diff --git a/docs/user/faq.rst b/docs/user/faq.rst new file mode 100644 index 0000000..0c05033 --- /dev/null +++ b/docs/user/faq.rst @@ -0,0 +1,79 @@ +.. _faq: + +============ +FAQ +============ + + +How to effectively learn TensorLayer +===================================== + +No matter what stage you are in, we recommend you to spend just 10 minutes to +read the source code of TensorLayer and the `Understand layer / Your layer `__ +in this website, you will find the abstract methods are very simple for everyone. +Reading the source codes helps you to better understand TensorFlow and allows +you to implement your own methods easily. For discussion, we recommend +`Gitter `__, +`Help Wanted Issues `__, +`QQ group `__ +and `Wechat group `__. + +Beginner +----------- +For people who new to deep learning, the contributors provided a number of tutorials in this website, these tutorials will guide you to understand autoencoder, convolutional neural network, recurrent neural network, word embedding and deep reinforcement learning and etc. If your already understand the basic of deep learning, we recommend you to skip the tutorials and read the example codes on `Github `__ , then implement an example from scratch. + +Engineer +------------ +For people from industry, the contributors provided mass format-consistent examples covering computer vision, natural language processing and reinforcement learning. Besides, there are also many TensorFlow users already implemented product-level examples including image captioning, semantic/instance segmentation, machine translation, chatbot and etc., which can be found online. +It is worth noting that a wrapper especially for computer vision `Tf-Slim `__ can be connected with TensorLayer seamlessly. +Therefore, you may able to find the examples that can be used in your project. + +Researcher +------------- +For people from academia, TensorLayer was originally developed by PhD students who facing issues with other libraries on implement novel algorithm. Installing TensorLayer in editable mode is recommended, so you can extend your methods in TensorLayer. +For research related to image processing such as image captioning, visual QA and etc., you may find it is very helpful to use the existing `Tf-Slim pre-trained models `__ with TensorLayer (a specially layer for connecting Tf-Slim is provided). + + +Install Master Version +======================== + +To use all new features of TensorLayer, you need to install the master version from Github. +Before that, you need to make sure you already installed git. + +.. code-block:: bash + + [stable version] pip install tensorlayer + [master version] pip install git+https://github.com/tensorlayer/tensorlayer.git + +Editable Mode +=============== + +- 1. Download the TensorLayer folder from Github. +- 2. Before editing the TensorLayer ``.py`` file. + + - If your script and TensorLayer folder are in the same folder, when you edit the ``.py`` inside TensorLayer folder, your script can access the new features. + - If your script and TensorLayer folder are not in the same folder, you need to run the following command in the folder contains ``setup.py`` before you edit ``.py`` inside TensorLayer folder. + + .. code-block:: bash + + pip install -e . + + +Load Model +=========== + +Note that, the ``tl.files.load_npz()`` can only able to load the npz model saved by ``tl.files.save_npz()``. +If you have a model want to load into your TensorLayer network, you can first assign your parameters into a list in order, +then use ``tl.files.assign_params()`` to load the parameters into your TensorLayer model. + + + +.. _GitHub: https://github.com/tensorlayer/tensorlayer +.. _Deeplearning Tutorial: http://deeplearning.stanford.edu/tutorial/ +.. _Convolutional Neural Networks for Visual Recognition: http://cs231n.github.io/ +.. _Neural Networks and Deep Learning: http://neuralnetworksanddeeplearning.com/ +.. _TensorFlow tutorial: https://www.tensorflow.org/versions/r0.9/tutorials/index.html +.. _Understand Deep Reinforcement Learning: http://karpathy.github.io/2016/05/31/rl/ +.. _Understand Recurrent Neural Network: http://karpathy.github.io/2015/05/21/rnn-effectiveness/ +.. _Understand LSTM Network: http://colah.github.io/posts/2015-08-Understanding-LSTMs/ +.. _Word Representations: http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/ diff --git a/docs/user/get_involved.rst b/docs/user/get_involved.rst new file mode 100644 index 0000000..3fe4131 --- /dev/null +++ b/docs/user/get_involved.rst @@ -0,0 +1,76 @@ + + +========================= +Get Involved in Research +========================= + +Ph.D. Postition @ PKU +============================================================= + + +Hi, I am `Hao Dong `__, the founder of this project and a new faculty member in EECS, Peking University. I now have a few Ph.D. positions per year open for international students who would like to study AI. If you or your friends are interested in it, feel free to contact me. +PKU is a top 30 university in the global ranking. The application is competitive, apply early is recommended. For the application of next year, please note that the DDL of Chinese Government Scholarship is in the end of each year, please check this `link `__ for more details. + +My homepage: `https://zsdonghao.github.io `__ + +Contact: hao.dong [AT] pku.edu.cn + + + +Faculty Postition @ PKU +============================================================= + +The Center on Frontiers of Computing Studies (CFCS), Peking University (PKU), China, is a university new initiative co-founded by Professors John Hopcroft (Turing Awardee) and Wen Gao (CAE, ACM/IEEE Fellow). The center aims at developing the excellence on two fronts: research and education. On the research front, the center will provide a world-class research environment, where innovation and impactful research is the central aim, measured by professional reputation among world scholars, not by counting the number of publications and research funding. On the education front, the center deeply involves in the Turing Class, an elite undergraduate program that draws the cream of the crop from the PKU undergraduate talent pool. New curriculum and pedagogy are designed and practiced in this program, with the aim to cultivate a new generation of computer scientist/engineers that are solid in both theories and practices. + +**Positions and Qualification** + +The center invites applications for tenured/tenure-track faculty positions. We are seeking applicants from all areas of Computer Science, spanning theoretical foundations, systems, software, and applications, with special interests in artificial intelligence and machine learning. We are especially interested in applicants conducting research at the frontiers of Computer Science with other disciplines, such as data sciences, engineering, as well as mathematical, medical, physical, and social sciences. + +Applicants are expected to have completed (or be completing) a Ph.D., have demonstrated the ability to pursue a program of research, and have a strong commitment to undergraduate and graduate teaching. A successful candidate will be expected to teach one to two courses at the undergraduate and graduate levels in each semester, and to build and lead a team of undergraduate and graduate students in innovative research. + +We are also seeking qualified candidates for postdoctoral positions. Candidates should have a Ph.D. in a relevant discipline or expect a Ph. D within a year, with a substantive record of research accomplishments, and the ability to work collaboratively with faculty members in the center. + +**To Apply** + +Applicants should send a full curriculum vitae; copies of 3-5 key publications; 3-5 names and contact information of references; and a statement of research and teaching to: CFCS_recruiting[at]pku[dot]edu[dot]cn . To expedite the process, please arrange to have the reference letters sent directly to the above email address. + +Application for a postdoctoral position should include a curriculum vita, brief statement of research, and three to five names and contact information of recommendation, and can be directly addressed to an individual faculty member. + +We conduct review of applications monthly, immediately upon the recipient of all application materials at the beginning of each month. However, it is highly recommended that applicants submit complete applications sooner than later, as the positions are to be filled quickly. + + +Postdoc Postition @ ICL +================================================== + +Data science is therefore by nature at the core of all modern transdisciplinary scientific activities, as it involves the whole life cycle of data, from acquisition and exploration to analysis and communication of the results. Data science is not only concerned with the tools and methods to obtain, manage and analyse data: it is also about extracting value from data and translating it from asset to product. + +Launched on 1st April 2014, the Data Science Institute (DSI) at Imperial College London aims to enhance Imperial's excellence in data-driven research across its faculties by fulfilling the following objectives. + +The Data Science Institute is housed in purpose built facilities in the heart of the Imperial College campus in South Kensington. Such a central location provides excellent access to collabroators across the College and across London. + + - To act as a focal point for coordinating data science research at Imperial College by facilitating access to funding, engaging with global partners, and stimulating cross-disciplinary collaboration. + - To develop data management and analysis technologies and services for supporting data driven research in the College. + - To promote the training and education of the new generation of data scientist by developing and coordinating new degree courses, and conducting public outreach programmes on data science. + - To advise College on data strategy and policy by providing world-class data science expertise. + - To enable the translation of data science innovation by close collaboration with industry and supporting commercialization. + +If you are interested in working with us, please check our +`vacancies `__ +and other ways to +`get involved `__ +, or feel free to +`contact us `__. + +Software Engineer @ SurgicalAI.cn +============================================================= +SurgicalAI is a startup founded by the data scientists and surgical robot experts from Imperial College. Our objective is AI democratise Surgery. By combining 5G, AI and Cloud Computing, SurgicalAI is building a platform enable junor surgeons to perfom complex procedures. As one of the most impactful startup, SurgicalAI is supported by Nvidia, AWS and top surgeons around the world. + +Currently based in Hangzhou, China, we are building digital solution for cardiac surgery like TAVR, LAA and Orthopedidcs like TKA and UNA. A demo can be found at here + +We are activly looking for experts in robotic navigation, computer graphics and medical image analysis experts to join us, building digitalized surgical service platform for the aging world. + +Home Page: http://www.surgicalai.cn + +Demo Page: http://demo5g.surgicalai.cn + +Contact: liufangde@surgicalai.cn diff --git a/docs/user/get_start_advance.rst b/docs/user/get_start_advance.rst new file mode 100644 index 0000000..db3441c --- /dev/null +++ b/docs/user/get_start_advance.rst @@ -0,0 +1,217 @@ +.. _getstartadvance: + +================== +Advanced features +================== + + +Customizing layer +================== + +Layers with weights +---------------------- + +The fully-connected layer is `a = f(x*W+b)`, the most simple implementation is as follow, which can only support static model. + +.. code-block:: python + + class Dense(Layer): + """The :class:`Dense` class is a fully connected layer. + + Parameters + ---------- + n_units : int + The number of units of this layer. + act : activation function + The activation function of this layer. + name : None or str + A unique layer name. If None, a unique name will be automatically generated. + """ + + def __init__( + self, + n_units, # the number of units/channels of this layer + act=None, # None: no activation, tf.nn.relu or 'relu': ReLU ... + name=None, # the name of this layer (optional) + ): + super(Dense, self).__init__(name, act=act) # auto naming, dense_1, dense_2 ... + self.n_units = n_units + + def build(self, inputs_shape): # initialize the model weights here + shape = [inputs_shape[1], self.n_units] + self.W = self._get_weights("weights", shape=tuple(shape), init=self.W_init) + self.b = self._get_weights("biases", shape=(self.n_units, ), init=self.b_init) + + def forward(self, inputs): # call function + z = tf.matmul(inputs, self.W) + self.b + if self.act: # is not None + z = self.act(z) + return z + +The full implementation is as follow, which supports both static and dynamic models and allows users to control whether to use the bias, how to initialize the weight values. + +.. code-block:: python + + class Dense(Layer): + """The :class:`Dense` class is a fully connected layer. + + Parameters + ---------- + n_units : int + The number of units of this layer. + act : activation function + The activation function of this layer. + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip biases. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + name : None or str + A unique layer name. If None, a unique name will be automatically generated. + """ + + def __init__( + self, + n_units, + act=None, + W_init=tl.initializers.truncated_normal(stddev=0.1), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, # the number of units/channels of the previous layer + name=None, + ): + # we feed activation function to the base layer, `None` denotes identity function + # string (e.g., relu, sigmoid) will be converted into function. + super(Dense, self).__init__(name, act=act) + + self.n_units = n_units + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + # in dynamic model, the number of input channel is given, we initialize the weights here + if self.in_channels is not None: + self.build(self.in_channels) + self._built = True + + logging.info( + "Dense %s: %d %s" % + (self.name, self.n_units, self.act.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): # optional, for printing information + actstr = self.act.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(n_units={n_units}, ' + actstr) + if self.in_channels is not None: + s += ', in_channels=\'{in_channels}\'' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): # initialize the model weights here + if self.in_channels: # if the number of input channel is given, use it + shape = [self.in_channels, self.n_units] + else: # otherwise, get it from static model + self.in_channels = inputs_shape[1] + shape = [inputs_shape[1], self.n_units] + self.W = self._get_weights("weights", shape=tuple(shape), init=self.W_init) + if self.b_init: # if b_init is None, no bias is applied + self.b = self._get_weights("biases", shape=(self.n_units, ), init=self.b_init) + + def forward(self, inputs): + z = tf.matmul(inputs, self.W) + if self.b_init: + z = tf.add(z, self.b) + if self.act: + z = self.act(z) + return z + + +Layers with train/test modes +------------------------------ + +We use Dropout as an example here: + +.. code-block:: python + + class Dropout(Layer): + """ + The :class:`Dropout` class is a noise layer which randomly set some + activations to zero according to a keeping probability. + Parameters + ---------- + keep : float + The keeping probability. + The lower the probability it is, the more activations are set to zero. + name : None or str + A unique layer name. + """ + + def __init__(self, keep, name=None): + super(Dropout, self).__init__(name) + self.keep = keep + + self.build() + self._built = True + + logging.info("Dropout %s: keep: %f " % (self.name, self.keep)) + + def build(self, inputs_shape=None): + pass # no weights in dropout layer + + def forward(self, inputs): + if self.is_train: # this attribute is changed by Model.train() and Model.eval() described above + outputs = tf.nn.dropout(inputs, rate=1 - (self.keep), name=self.name) + else: + outputs = inputs + return outputs + +Pre-trained CNN +================ + +Get entire CNN +--------------- + +.. code-block:: python + + import tensorflow as tf + import tensorlayer as tl + import numpy as np + from tensorlayer.models.imagenet_classes import class_names + + vgg = tl.models.vgg16(pretrained=True) + img = tl.vis.read_image('data/tiger.jpeg') + img = tl.prepro.imresize(img, (224, 224)).astype(np.float32) / 255 + output = vgg(img, is_train=False) + +Get a part of CNN +------------------ + +.. code-block:: python + + # get VGG without the last layer + cnn = tl.models.vgg16(end_with='fc2_relu', mode='static').as_layer() + # add one more layer and build a new model + ni = tl.layers.Input([None, 224, 224, 3], name="inputs") + nn = cnn(ni) + nn = tl.layers.Dense(n_units=100, name='out')(nn) + model = tl.models.Model(inputs=ni, outputs=nn) + # train your own classifier (only update the last layer) + train_weights = model.get_layer('out').all_weights + +Reuse CNN +------------------ + +.. code-block:: python + + # in dynamic model, we can directly use the same model + # in static model + vgg_layer = tl.models.vgg16().as_layer() + ni_1 = tl.layers.Input([None, 224, 224, 3]) + ni_2 = tl.layers.Input([None, 224, 224, 3]) + a_1 = vgg_layer(ni_1) + a_2 = vgg_layer(ni_2) + M = Model(inputs=[ni_1, ni_2], outputs=[a_1, a_2]) + diff --git a/docs/user/get_start_model.rst b/docs/user/get_start_model.rst new file mode 100644 index 0000000..2337a7d --- /dev/null +++ b/docs/user/get_start_model.rst @@ -0,0 +1,249 @@ +.. _getstartmodel: + +=============== +Define a model +=============== + +TensorLayer provides two ways to define a model. +Static model allows you to build model in a fluent way while dynamic model allows you to fully control the forward process. + +Static model +=============== + +.. code-block:: python + + import tensorflow as tf + from tensorlayer.layers import Input, Dropout, Dense + from tensorlayer.models import Model + + def get_model(inputs_shape): + ni = Input(inputs_shape) + nn = Dropout(keep=0.8)(ni) + nn = Dense(n_units=800, act=tf.nn.relu, name="dense1")(nn) # “name" is optional + nn = Dropout(keep=0.8)(nn) + nn = Dense(n_units=800, act=tf.nn.relu)(nn) + nn = Dropout(keep=0.8)(nn) + nn = Dense(n_units=10, act=None)(nn) + M = Model(inputs=ni, outputs=nn, name="mlp") # “name" is optional + return M + + MLP = get_model([None, 784]) + MLP.eval() + outputs = MLP(data) + +Dynamic model +======================= + + +In this case, you need to manually input the output shape of the previous layer to the new layer. + +.. code-block:: python + + class CustomModel(Model): + + def __init__(self): + super(CustomModel, self).__init__() + + self.dropout1 = Dropout(keep=0.8) + self.dense1 = Dense(n_units=800, act=tf.nn.relu, in_channels=784) + self.dropout2 = Dropout(keep=0.8) + self.dense2 = Dense(n_units=800, act=tf.nn.relu, in_channels=800) + self.dropout3 = Dropout(keep=0.8) + self.dense3 = Dense(n_units=10, act=None, in_channels=800) + + def forward(self, x, foo=False): + z = self.dropout1(x) + z = self.dense1(z) + z = self.dropout2(z) + z = self.dense2(z) + z = self.dropout3(z) + out = self.dense3(z) + if foo: + out = tf.nn.softmax(out) + return out + + MLP = CustomModel() + MLP.eval() + outputs = MLP(data, foo=True) # controls the forward here + outputs = MLP(data, foo=False) + + +Switching train/test modes +============================= + +.. code-block:: python + + # method 1: switch before forward + Model.train() # enable dropout, batch norm moving avg ... + output = Model(train_data) + ... # training code here + Model.eval() # disable dropout, batch norm moving avg ... + output = Model(test_data) + ... # testing code here + + # method 2: switch while forward + output = Model(train_data, is_train=True) + output = Model(test_data, is_train=False) + +Reuse weights +======================= + +For static model, call the layer multiple time in model creation + +.. code-block:: python + + # create siamese network + + def create_base_network(input_shape): + '''Base network to be shared (eq. to feature extraction). + ''' + input = Input(shape=input_shape) + x = Flatten()(input) + x = Dense(128, act=tf.nn.relu)(x) + x = Dropout(0.9)(x) + x = Dense(128, act=tf.nn.relu)(x) + x = Dropout(0.9)(x) + x = Dense(128, act=tf.nn.relu)(x) + return Model(input, x) + + + def get_siamese_network(input_shape): + """Create siamese network with shared base network as layer + """ + base_layer = create_base_network(input_shape).as_layer() # convert model as layer + + ni_1 = Input(input_shape) + ni_2 = Input(input_shape) + nn_1 = base_layer(ni_1) # call base_layer twice + nn_2 = base_layer(ni_2) + return Model(inputs=[ni_1, ni_2], outputs=[nn_1, nn_2]) + + siamese_net = get_siamese_network([None, 784]) + +For dynamic model, call the layer multiple time in forward function + +.. code-block:: python + + class MyModel(Model): + def __init__(self): + super(MyModel, self).__init__() + self.dense_shared = Dense(n_units=800, act=tf.nn.relu, in_channels=784) + self.dense1 = Dense(n_units=10, act=tf.nn.relu, in_channels=800) + self.dense2 = Dense(n_units=10, act=tf.nn.relu, in_channels=800) + self.cat = Concat() + + def forward(self, x): + x1 = self.dense_shared(x) # call dense_shared twice + x2 = self.dense_shared(x) + x1 = self.dense1(x1) + x2 = self.dense2(x2) + out = self.cat([x1, x2]) + return out + + model = MyModel() + +Print model information +======================= + +.. code-block:: python + + print(MLP) # simply call print function + + # Model( + # (_inputlayer): Input(shape=[None, 784], name='_inputlayer') + # (dropout): Dropout(keep=0.8, name='dropout') + # (dense): Dense(n_units=800, relu, in_channels='784', name='dense') + # (dropout_1): Dropout(keep=0.8, name='dropout_1') + # (dense_1): Dense(n_units=800, relu, in_channels='800', name='dense_1') + # (dropout_2): Dropout(keep=0.8, name='dropout_2') + # (dense_2): Dense(n_units=10, None, in_channels='800', name='dense_2') + # ) + + import pprint + pprint.pprint(MLP.config) # print the model architecture + # {'inputs': '_inputlayer_1_node_0', + # 'model_architecture': [{'args': {'dtype': tf.float32, + # 'layer_type': 'normal', + # 'name': '_inputlayer_1', + # 'shape': [None, 784]}, + # 'class': '_InputLayer', + # 'prev_layer': None}, + # {'args': {'keep': 0.8, + # 'layer_type': 'normal', + # 'name': 'dropout_1'}, + # 'class': 'Dropout', + # 'prev_layer': ['_inputlayer_1_node_0']}, + # {'args': {'act': 'relu', + # 'layer_type': 'normal', + # 'n_units': 800, + # 'name': 'dense_1'}, + # 'class': 'Dense', + # 'prev_layer': ['dropout_1_node_0']}, + # {'args': {'keep': 0.8, + # 'layer_type': 'normal', + # 'name': 'dropout_2'}, + # 'class': 'Dropout', + # 'prev_layer': ['dense_1_node_0']}, + # {'args': {'act': 'relu', + # 'layer_type': 'normal', + # 'n_units': 800, + # 'name': 'dense_2'}, + # 'class': 'Dense', + # 'prev_layer': ['dropout_2_node_0']}, + # {'args': {'keep': 0.8, + # 'layer_type': 'normal', + # 'name': 'dropout_3'}, + # 'class': 'Dropout', + # 'prev_layer': ['dense_2_node_0']}, + # {'args': {'act': None, + # 'layer_type': 'normal', + # 'n_units': 10, + # 'name': 'dense_3'}, + # 'class': 'Dense', + # 'prev_layer': ['dropout_3_node_0']}], + # 'name': 'mlp', + # 'outputs': 'dense_3_node_0', + # 'version_info': {'backend': 'tensorflow', + # 'backend_version': '2.0.0-alpha0', + # 'save_date': None, + # 'tensorlayer_version': '2.1.0', + # 'training_device': 'gpu'}} + +Get specific weights +======================= + +We can get the specific weights by indexing or naming. + +.. code-block:: python + + # indexing + all_weights = MLP.all_weights + some_weights = MLP.all_weights[1:3] + + # naming + some_weights = MLP.get_layer('dense1').all_weights + + +Save and restore model +======================= + +We provide two ways to save and restore models + + +Save weights only +------------------ + +.. code-block:: python + + MLP.save_weights('model_weights.h5') # by default, file will be in hdf5 format + MLP.load_weights('model_weights.h5') + +Save model architecture and weights (optional) +----------------------------------------------- + +.. code-block:: python + + # When using Model.load(), there is no need to reimplement or declare the architecture of the model explicitly in code + MLP.save('model.h5', save_weights=True) + MLP = Model.load('model.h5', load_weights=True) + diff --git a/docs/user/installation.rst b/docs/user/installation.rst new file mode 100644 index 0000000..bb86054 --- /dev/null +++ b/docs/user/installation.rst @@ -0,0 +1,210 @@ +.. _installation: + +============ +Installation +============ + +TensorLayer has some prerequisites that need to be installed first, including +`TensorFlow`_ , numpy and matplotlib. For GPU +support CUDA and cuDNN are required. + +If you run into any trouble, please check the `TensorFlow installation +instructions `_ +which cover installing the TensorFlow for a range of operating systems including +Mac OX, Linux and Windows, or ask for help on `tensorlayer@gmail.com `_ +or `FAQ `_. + + +Install TensorFlow +========================= + +.. code-block:: bash + + pip3 install tensorflow-gpu==2.0.0-beta1 # specific version (YOU SHOULD INSTALL THIS ONE NOW) + pip3 install tensorflow-gpu # GPU version + pip3 install tensorflow # CPU version + +The installation instructions of TensorFlow are written to be very detailed on `TensorFlow`_ website. +However, there are something need to be considered. For example, `TensorFlow`_ officially supports GPU acceleration for Linux, Mac OX and Windows at present. For ARM processor architecture, you need to install TensorFlow from source. + +Install TensorLayer +========================= + +For stable version: + +.. code-block:: bash + + pip3 install tensorlayer + +For latest version, please install from Github. + +.. code-block:: bash + + pip3 install git+https://github.com/tensorlayer/tensorlayer.git + or + pip3 install https://github.com/tensorlayer/tensorlayer/archive/master.zip + +For developers, you should clone the folder to your local machine and put it along with your project scripts. + +.. code-block:: bash + + git clone https://github.com/tensorlayer/tensorlayer.git + + +Alternatively, you can build from the source. + +.. code-block:: bash + + # First clone the repository and change the current directory to the newly cloned repository + git clone https://github.com/tensorlayer/tensorlayer.git + cd tensorlayer + + # Install virtualenv if necessary + pip install virtualenv + # Then create a virtualenv called `venv` + virtualenv venv + + # Activate the virtualenv + + ## Linux: + source venv/bin/activate + + ## Windows: + venv\Scripts\activate.bat + + # basic installation + pip install . + + # ============= IF TENSORFLOW IS NOT ALREADY INSTALLED ============= # + + # for a machine **without** an NVIDIA GPU + pip install -e ".[all_cpu_dev]" + + # for a machine **with** an NVIDIA GPU + pip install -e ".[all_gpu_dev]" + +If you want install TensorLayer 1.X, the simplest way to install TensorLayer 1.X is as follow. It will also install the numpy and matplotlib automatically. + +.. code-block:: bash + + [stable version] pip install tensorlayer==1.x.x + +However, if you want to modify or extend TensorLayer 1.X, you can download the repository from +`Github`_ and install it as follow. + +.. code-block:: bash + + cd to the root of the git tree + pip install -e . + +This command will run the ``setup.py`` to install TensorLayer. The ``-e`` reflects +editable, then you can edit the source code in ``tensorlayer`` folder, and ``import`` the edited +TensorLayer. + + +GPU support +========================== + +Thanks to NVIDIA supports, training a fully connected network on a +GPU, which may be 10 to 20 times faster than training them on a CPU. +For convolutional network, may have 50 times faster. +This requires an NVIDIA GPU with CUDA and cuDNN support. + + +CUDA +---- + +The TensorFlow website also teach how to install the CUDA and cuDNN, please see +`TensorFlow GPU Support `_. + +Download and install the latest CUDA is available from NVIDIA website: + + - `CUDA download and install `_ + + +.. + After installation, make sure ``/usr/local/cuda/bin`` is in your ``PATH`` (use ``echo #PATH`` to check), and + ``nvcc --version`` works. Also ensure ``/usr/local/cuda/lib64`` is in your + ``LD_LIBRARY_PATH``, so the CUDA libraries can be found. + +If CUDA is set up correctly, the following command should print some GPU information on +the terminal: + +.. code-block:: bash + + python -c "import tensorflow" + + +cuDNN +-------- + +Apart from CUDA, NVIDIA also provides a library for common neural network operations that especially +speeds up Convolutional Neural Networks (CNNs). Again, it can be obtained from +NVIDIA after registering as a developer (it take a while): + +Download and install the latest cuDNN is available from NVIDIA website: + + - `cuDNN download and install `_ + + +To install it, copy the ``*.h`` files to ``/usr/local/cuda/include`` and the +``lib*`` files to ``/usr/local/cuda/lib64``. + +.. _TensorFlow: https://www.tensorflow.org/versions/master/get_started/os_setup.html +.. _GitHub: https://github.com/tensorlayer/tensorlayer +.. _TensorLayer: https://github.com/tensorlayer/tensorlayer/ + + + +Windows User +============== + +TensorLayer is built on the top of Python-version TensorFlow, so please install Python first. +Note:We highly recommend installing Anaconda. The lowest version requirements of Python is py35. + +`Anaconda download `_ + +GPU support +------------ +Thanks to NVIDIA supports, training a fully connected network on a GPU, which may be 10 to 20 times faster than training them on a CPU. For convolutional network, may have 50 times faster. This requires an NVIDIA GPU with CUDA and cuDNN support. + +1. Installing Microsoft Visual Studio +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You should preinstall Microsoft Visual Studio (VS) before installing CUDA. The lowest version requirements is VS2010. We recommend installing VS2015 or VS2013. CUDA7.5 supports VS2010, VS2012 and VS2013. CUDA8.0 also supports VS2015. + +2. Installing CUDA +^^^^^^^^^^^^^^^^^^^^^^^ +Download and install the latest CUDA is available from NVIDIA website: + +`CUDA download `_ + +We do not recommend modifying the default installation directory. + +3. Installing cuDNN +^^^^^^^^^^^^^^^^^^^^^^ +The NVIDIA CUDA® Deep Neural Network library (cuDNN) is a GPU-accelerated library of primitives for deep neural networks. Download and extract the latest cuDNN is available from NVIDIA website: + +`cuDNN download `_ + +After extracting cuDNN, you will get three folders (bin, lib, include). Then these folders should be copied to CUDA installation. (The default installation directory is `C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v8.0`) + +Installing TensorLayer +------------------------ +For TensorLayer, please refer to the steps mentioned above. + +.. code-block:: bash + + pip install tensorflow #CPU version + pip install tensorflow-gpu   #GPU version (GPU version and CPU version just choose one) + pip install tensorlayer       #Install tensorlayer + + + +Issue +======= + +If you get the following output when import tensorlayer, please read `FQA `_. + +.. code-block:: bash + + _tkinter.TclError: no display name and no $DISPLAY environment variable diff --git a/docs/user/my_figs/basic_seq2seq.png b/docs/user/my_figs/basic_seq2seq.png new file mode 100644 index 0000000000000000000000000000000000000000..4e59bcfc4d7d75a0371ff73ee3d1c97e1c50e0a6 GIT binary patch literal 34047 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 literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/img_tensorlayer.png b/docs/user/my_figs/img_tensorlayer.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b1f7c73bd042cac39d903f8db70cccb3803751 GIT binary patch literal 14657 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 L(#I8O;BWsIKe#*ZylP|gF-E+_Ro!|ML z8~CCS1o|2qS{RZ@Bx64u3nq~ughZk~GoS*`l}+n7!1xOSLVbK=17e#m$9#V!vEjU2 zp?LiboL~#qS8uSD<>pPs5YCpXlShPq|AF?Si7^1yEFm~Bgk)X%yuNVsLCgb=cduC1 zfe3areUOk*Ubu`zn(@F7|(tYBrcruMWgQh9vr+Kw^)_{>)185DQ3s$z{ylzjS z5JT$-IHx<#Y1!oAWH(J!R?XR{ynIiVI52vyi&=BKK`UaPzsbnQE5vuN?sBzIXbN=E z4Q*zLJtDI=0zF$ef7!FDLaL zDmr&eg>lh3`xWEOU5wu4MwB2@qPWVZrowVCy*7yTpvUBtoNa^ct3*^R!RNG zmIYn5tj5dLMCAm;lCMuy%4JWjZj4M1c1#9O&41(TKjeapk|%5QA8yTC63f3ozl*Pb z!=O4rf)8JBJPxkKRj_sd;>AzoAyQ+1Ju^By3Doz#?q~HpGp7nD|#%S2LHn(dPr>`pBRT+ zrm%{kD$BU&ZqZ6Tv!&X18yj*qzAKj{o(`lc-Q=<`M@GD3^tyRcw6JwIgK6k0gt6xxcZbn*i0)=C+EXXx;)9P6m zy)!+8zAxoUvb_O$@I&StskfbY1vb{1QiVTHG=FXqaZL85@L^pX@+rmWizdf#lS3n& z*?w}aUsU)ErTS7kndk5<=@TlAMB>siDVge<>7nKHIp10KocxW4pgXodJrj`+`5A~V z8RRfwCY(e146ZfhoOLnPUsG{!F2Y4nGRk{{vH44&KRRh@NDcXs{N7?@5>$fX z6kPfSGZjh%UCN(&`y(Y{M}9jcg0;b0C=qm_x2W_&!4lSAss3kXv!}-F+!UCB5bx!0 znBQx&T`&dBK!{p1wQ25t!x@rJ2MXJh++B;B5=NjH^SH;RUC5lST%k7A7(co9?gLllgTnM=d+^+rh$vjAOw;-$*Zw ztuLwKd{&=(Q;c)9NfyUg1~A@MeWTkK=St%}F*}sW3sLdG<|i8`8!~*Lk_ZqSEJF}= z@uJ5^We^&rAdatMFpR4ez|Guc4EAyfgx>#bx-AHx@dzyW1jyBi#JE|6>tV`-?*v9e z)ViGzK;P6y06NYO0$769iPd>xU9u1dL84L=Wi~R2TuTH5j;2R}BqF`o<2u2l*Vfsa zf&}CdAT1M6wM%+fAP4gUIY<0E_NgUM22pAAD?Hwse>;lP^kD#CM1Y&4pi!n2Bz!vw zE?)@pR;PC00E$QWC!}&2^ap!Y9SG)3V5*rwGLN%mpoIyCZZzm6-#QzD`jI)H#0HR$ zZVSh_+INsj8_?5u_mebl=}*Jt`AEW&?e!j@z8p* z7KaQkz=sDU(9??CF&LiD_gHQhslf$70BUXv1STrHhSO3o)Eo| zp)T&A5irAH4jxKO`Y?4FLE>Jk9vr}x2IPU~+33-tGwNaC0q3~6E@W5_2E>ez4Mh^@ zl9$ug7CAHz6H$=$xr!VRoB@FlOr5+N=%lW}CmRNjk@{$qd?7fqNDYl2lt5lfaN0~Y zkTHNuq2Jw3AQGKoz*)QqbPLhN*)Tr3w?oZ*DNKtB6qYlAU^-jp2@WqZl2(9=_H$yDW(7p_WM$^oB}CuPd#AYubr7=^2;mp6@F!kj~n{TJgBc<_!CG zOOYrrB^$M}E~>wC-lw5c>__^S15Swoe^s}Gk3Ftk3YLleq#?y5`_)0uXQJdNR4iGJ z=n>`^t|euoMr|)lK~5~}%0phBz6hEycU)qXc~BepXK3MPUaXOk|7Z@hysG~?;0xTf z4rC%*m;Y!1Eb;j30%FOURwYV0z=Rv(T>UBBN4BuUzN5ST_7@SB5+2h)dg3u{8}{3e zIg(1f!=HU(d9z*OumL7Mr1Xt2Y2B7CJ5t33gp>*#r_a=q|C@d(SCQLKUCWdWS!ENf M{d@wkN^g<$cX%^b4gdfE literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/img_tlayer_big.png b/docs/user/my_figs/img_tlayer_big.png new file mode 100644 index 0000000000000000000000000000000000000000..3679b70cf2a10faa74bd94c1d0a9886a760336b7 GIT binary patch literal 4263383 zcmeF)d6ZrET_E`1t18J`ye7emY)jT=$y!R1cOA!Zh(i*J=08|oKC^VsA57C{1{xSb5)wiJLoYM7_NvlSRd2q( zr^RKdq$<67@4mZy?#VZLb>F?e-|zeRy^>Ymy7&Hm=J9vE{pu@kxiY16^*i73=zCHc zxgn+Dlb0`#J^$f%e`hHExZ>G&eDL{{wyw$1dg-^`{MnQq*t++h5%`ZK>Yxk%2ys+wHdp^GRnK!LI@IU|S)vNYC@ut=9zxT0i zk3IX=J)hY7j?X{0=LbLkuJ`W#{HJz5_{8crKYZmwFYSy5p5F7qu2nBR{nRth?|kV^ zt2^!PjMsVh=;~FSLtgmQn^wOicev^Uk3GKXt^1zav+CZh_ifp|?Y{e0-T&a$?f2e) z|2_9_UbSP}_IpRS-938uwka_4&<{hrg^#aC}y z{fQS|cy{OL=!-ADxb?-mx9)rH=7s0uyzTRz_v|P3y|C~3PwcxumuKI; zV8<~hk3Dv_?|H}j^waZp{rn4W`)m-LCY|@p=imFeXZMW0XV3HdKJ(n}J#YJLq_Sqd z>|faXfo8Q#15X6{MGjMJi6cpZWMhqp$9qbL832)y}u>durcvF|0ig z-~G_&e7onI)%mRLeCIRIzp(3>-Fx2o=))yRj?7aWUd$#Z1z5U58+aKKVz?OTq zJ-BVl1NX#t{ph~kpUK}Zr<;D_5}TfL`gu+N zz;k=!@48)2%{eBI{!+V`rJNvg(KBx1&yK~p>{P)?zyYsiio+lm}ea+rihjsSM)2Hq2 zb^=eeKj-ud_wnK<_B?a3Z>UpEb&k4lBhT-9@`V?7J-6pAACJ$(;=bEYwfou=&+Xu$ z(fnV4r}n;fDo*Wv?F^my%$`4^59PnucE+b6Mz*Un3)>$WJ#XKuJ)b)M19?`T`b_8e zySH_=(e3$<)9228|J-vwxWKt{-#_=(d_ujkjeQ5OD-RGY1_}-WHJoSM`_r~||^ZApxecL_JSLdvA-i)HleKUrQo)n~sUdi>(moO;~w+~#yLS7X7~xE3Uu zdjPJv8VkP0wII>l18~jNSnxHj1&QV!fNQSCg0FEcNHq5VTyr%Re2r^CqPYj)nyazk zYg`Kw%{>6uT#W@^<64kt?g6;wYApB~*MdZI55P57W5L(B79^T`0IsC%H1_~pb2S!xjcY-oxd-5ytFho~TniG-Jpk8SjRjxh zT99b&0l4OBEchDNf<$ua5FkK+009C72oNAZ zfB=C-2;^rP*$5CIK!5-N0t5&UAV7cs0RoE>P)Jx5lY-5FkK+ z009C72oNAZfB=C-3n(Nkn#zF$2oNAZfB*pk1PBlyK!AWkg3kZ}0t5&UAV7cs0RjXF z5FoH<0fmG`Q#p_T0RjXF5FkK+009C72oO+6@EIULfB*pk1PBlyK!5-N0t6N!6cQFq#?0RjXF5FkK+009C7nj)Z((3F{$CjkNk2oNAZfB*pk1PBo5fq+6n4-hp$fB*pk z1PBlyK!5-N0tA{Oppej%nU*I30t5&UAV7cs0RjXF5a@w`LP8G^H9>#?0RjXF5V*L& zczf*P2Y8nN0RjXFR7*fLp<450v;+tcAV7cs0RjXF5FkKcpaKdB1LfB_0RjXF5FkK+ z009C72oR{2fI>pG=F4aa5FkK+009C72oNAZfWSZn6cPr?uX6$f2oNAZfB*pk1PBly zP%Qz4glf%~(Gnm)fB*pk1PBlyK!5;&feI)j43uBz1PBlyK!5-N0t5&UAV8p60tyM$ znlGazK!5-N0t5&UAV7cs0RjURP)Hakzs?B|AV8q}0^{wm@(uMS#d_C6yZ8a#B|v}x0RjXF5FkLH8v)gXZq%GZfB*pk1PBlyK!5-N z0t6Z=ppekeiI+A30t5&UAV7cs0RjXF5a>ogA)y;J=MW%3fB*pk1PBlyK!5;&h6*So zG<4#nO@IIa0t5&UAV7cs0RjZN5l~3zM$I_{2oNAZfB*pk1PBlyK%k)l3JDFJcxe+L zK!5-N0t5&UAV7csfo=p861q`y4gmrL2oNAZfB*pk1PBmlsDMI3LnprcX^*$Z%0EaW zBtU=w0RjXF5FkK+Kr;nY6Ph{ivL--)009C72oNAZfB*pkT?r^8bj9W*0t5&UAV7cs z0RjXF5FpS@0fmHS&bzD$5FkK+009C72oNAZfIwFQ3JG1YIf(!P0t5&UAV7cs0RjXF zG*dt!p_%h8YXSra5FkK+009C72oNC9m4HG*S8PrqK!5-N0t5&UAV7cs0RqhwP)KOz zyvv#Z0RjXF5FkK+009C72y`XTheE=5d#tOWIEerO0t5&UAV7cs0RjXF5U7MeAF2tJ z$lD+Z5FkK+009C72oNAZfB=Cm1QZgwKywNK0t5&UAV7cs0RjXF5NN7^LPAq#Ufu)< z5FkK+009C72oNAZpbG(ogf7sWLVy4P0t5&UAV7cs0RjY?Dxi?i)R~tz0RjXF5FkK+ z009C72oUH(Kp~+EG^Y?CK!5-N0t5&UAV7csfu;&5Bs6vA=z5FkK+009C72oNAZpuz$Q2^F3^LnlCh009C7 z2oNAZfB*pkMGGh-6fLel0t5&UAV7cs0RjXF5Fk)t0fmGLPoAL@AV7cs0RjXF5FkK+ z0D+1PBlyuw((%ge4PdfB*pk1PBlyK!5-N0t5&&M?fK=Idd&j0t5&UAV7cs0RjXF z5FoH*0fmGm6Ka3}0RjXF5FkK+009C72sB4PA)z^QEmHyn2oNAZfB*pk1PBlyuw(&+ zge4PdfB*pk1PBlyK!5-N0t5&&M?fK=Idd&j0t5&UAV7cs0RjXF5FoH*0fmGm6Ka3} z0RjXF5FkK+009C72sB4PA)z^QEmHynmM$>f9$R`NS|C7x009C72oNApc>&dg%1@yL z2oNAZfB*pk1PBlyK!8AT0tyMmS?h@a0RjXF5FkK+009C72vlA`A))e9C;wV6tZ5FkK+009C72oNAZfB=F13n(P?-&hX> z2oNAZfB*pk1PBlyK%h1P3JJBDN{J94K!5-N0t5&UAV7csf&L39B=p}{4+IDhAV7cs z0RjXF5FkLHHUbI>wV6tZ5FkK+009C72oNAZfB=F13sj+yFy0>PKZG6#5FkK+009C7 z2oNAZfB=C-3RIz*u*g&#Mt}eT0t5&UAV7cs0RjXF^jkn7q2I#VCqRGz0RjXF5FkK+ z009Cu5>QB}(PT=6009C72oNAZfB*pk1PJt7Kp~;u!rCW5fB*pk1PBlyK!5-N0yPp) zNT|_dN`(Lc0t5&UAV7cs0RjXF^jkn7q2I#VCqRGz0RjXF5FkK+009Cu5>QB}(PT=6 z009C72oNAZfB*pkRTmgm*0t5&U zAV7cs0RjXFG($ikp&9cmO9BK45FkK+009C72oNC969I*Uo-k^J009C72oNAZfB*pk z1PC-kKp~+S^DIjO1PBlyK!5-N0t5&UAkY&5g@m3kYJ>m*0t5&UAV7csf${bj1Ofz_ zBA}Ykl$n+%0RjXF5FkK+009C72oUIjfI>nK5H&%7009C72oNAZfB*pk1ezkCkkFKw zmL~xM1PBlyK!5-N0t5&U=z)MjLJtr%L4W`O0t5&UAV7cs0RjY?BA}4al$n+%0RjXF z5FkK+009C72oUIjfI>nK5H&%7009C72oNAZfB*pk1ezkCkkFKwmL~xM1PBlyK!5-N z0t5&U=z)MjLJtr%L4W`O0t5&UsJg&-d#vgy7(W351PBxtC{kNr1PBlyK!5-N0t5&UAV8qv z0tyKgpFqPWK!5-N0t5&UAV7cs0Rlw|C?piAtuF!u2oNAZfB*pk1PBlyP;mi;go;m~ z;S(T0fB*pk1PBlyK!5;&A_Wu@iqzH@0RjXF5FkK+009C72oR{afI>pWC(!T-5FkK+ zz<7HM0s#U92oNAZpjZLbgkrt*Mt}eT0t5&UAV7cs0RjXnEufH4>FG0g0t5&UAV7cs z0RjXF5Fk*jfI>pC-g+ZIfB*pk1PBlyK!5-N0+kj}NT~Gm89V_31PBlyK!5-N0t5&U zC{{orp;&Ld5gppa0k zx84X4AV7cs0RjXF5FkK+K&1r~5-L4?22X%M)dj}eV^vSV_z4goK!5-N0tA{UpqkLc zS(h^b0t5&UAV7cs0RjXF5a?1sA)!k+rx74PfB*pk1PBlyK!5;&CJHDdG;!ADOn?9Z z0t5&UAV7cs0RjZN6i`U$63%G^2oNAZfB*pk1PBlyK%j{N3JFb|bvY9tK!5-N0t5&U zAV7csfi49U61s$Q8UX?X2oNAZfB*pk1PBmlqJTm|6K7q{1PBlyK!5-N0t5&UAV8o? z0fmGv;haWbygdei009C72oNAZfB*pk%@j~gXy&}jng9U;1PBlyK!5-N0t5(jC7_Vd z6`PX?5FkK+009C72oNAZfIu?^6cU;_@3JO9fB*pk1PBlyK!5-N0$m9xBy`2*Bmx8o z5FkK+009C72oNC9OaX<2X3o2;2@oJafB*pk1PBlyK!8A30tyLTu{ntV0RjXF5FkK+ z009C72sBebA)%S`E^7h=2oNAZfB*pk1PBly(3LIjQctJ*

LAYRQ`?1zlu;usP|mU?i>My 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

Uc>hJYV&SCI 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

vmMKYyOZ=T^&y;Hm&9cYe9#@HM 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

#js<%Y;yQ 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�QsdIESHoX9IZYb*SZ=@@>s1+o-o1G;tX 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⁡N~_q?&eEN4~UR;G8I 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⪙T7sb8YeyjCvPF#f7 z-BmiF126H%!TdPPvD)3QW0@gjgTQ+UE>4F=>zXQCJb{4XV7=}PZeYoX(Ym6m>RSfh zS&zg8cV}Y4&tUIdS*lwpgyK=auXSj++N7dDk5M)}S(}>5)SL%lvg!Qu^Ex@Y9Cp=T zf9a0(?L~rXke&6Oso&tFdFU4?rsEgB+@qo_y(FF>!ya$3B{lGl;2ZH=m=6@)x)2t= zpec#_2a-3n>XFTBIk{(-*RHmNa8c4`KhiN|#sl(2JiCj5NCl3uQup}cudTb>y1TZ?}3OKjO9%R#4BGANh9nAKF7IB#S3y$oz00|C}4Q#+ONd@3&V@%7|`1W zev2Yk)$;nzOm8Tyqbt@~yU9!Q&w%xuzZdXF+_k;c{KMRb;1*W5YUSI(XXER@nEMi1 zW^sT>^Ch!td=eBRmtRT4ed$WgrVK@RA2!IOx>e_FHS5cK#N=O>c5h~i==I}m*r#B+ zk+aay3ew@*zO?3nx2U?&a=%?CMwOd`e-VsGfi{5;0J0SEN42M`zve}|frkthO+Utj zd$&Fiy_nJ767+D5MBHk=Kg=BSkNKNJdet?Z9v~A=Q}eNQ9o=EqWD`Rqo2}Jr@>&X< zu?7mYO|qkHCR$=5^nkfjVh380f)K=&PI z0u}EKe05hHumMG*bC8a8eWn+eHMykf*_Qi0{S6_@qF(o7LPI6l|wCaH?EQk4?@I06Id$fTo4Fl5NQIe7gz1Caenx+Dg zZ^hFxQFJbyhnDx72)Tqi=GH2(^Y1V%atJoP;JWeLLkr)bh;M9oLSk$x^lMX?#heq zjy4D`!OYl4Y$J!F!4*ZvuIQ!aGWwM@7OF=;~uj*TQ2guy)wXVoa3k zp}pwuz-JPd>(iA4@}u*bJWtrtBby=l+B}_}M7CK2wT-5v-*kV@2)`GJm<>5pw`FXow%S3k-G&2*yr# z4(uaTwN4F5eL$%|-z|g7hSSh6M^=^xTz>M>-78BHelPX-ZQ74}ZvpqTL~TcC14Tgq zwBry+Q#t*bnYvcUyzvry>C#_E&u^{)nL4;$x-VdUGR>{6!yCc8>Rq;B>Z@~(SrJ5Dn)v$^}`EyQ_9pXV+Zf(eNVe8 zPjh$*5$V~6u!;tAu`keF=MZl{{>>()vnkU+n_>+tg=kzDpP^hfnJqZ-!SPLA* ziJeeZUoTp`B-}=N-dh*o2~;hh$Ugdkr~|PR>)`2h*T!n4w^xp8Ys}IQ7sXYVeLY|! z`c5WAiYikFBa#_3M~Nf!!eGi}B2bkz98E`Yz2zPwpOx^n%f&$uvmcpiRt#DGIOc>I zG$j7E!4J_~V6CK-s_MB}CG-Dx2NR`9*I+<@Ra}iN5Qj0}T-Tm3vS&~rvx~?Ur9&l zNe%6R+|;7jQ)OW_Ep<8%))3fUW>SpjE}mAQwgX)!0mSS`y}vp9JXs>tWC~%%nLaRU zgE*mH%1U{Ba2IEqmad{PIf0*`lI&B-+l>e7;U`PT->U!*v@oQGNB8&ycCx(W@8MM+D33)x7@g ze*`bPxAI zAdS-i%=@HBZkEvO3Kch+Q`!)Ax4vToEf@ZqV^~sVdfTSPDc33NTe6b~s>$78AH8bR zHCE@e{vn_F%2-K%-xHBQB{YGKJfa_L(DDrbA>?Ki-Rw)06w)!+oWhXxnWsSYW0;{# zK$>}2#m3oK)if4{bGQ*REhFV8xc`EK5UN|I;j zJ}t+XZb2ps@(JwV5@kI{v!Qy-FL-ih7| z?=c&FtW+M#+q3PRl=Lv4aS$-A@h?;Yswvw#Qx9WywC!v6x}4i>Q@6eBO)Ne&kGh+1 zBQf^{K2S1`^$~ZK=}7OS+}N7iVq(MHMgmI$?}r|2J8PPLzN!-#ull36fv1HF$S2Bf zqRPgMQ(%9SVS{`~Aw*m63u-1#jBoJ2yuO#{q1;f2=5;F) z>d0iojlU|yRYf8y%ka`e`rN)7(De=8*4?hwSe>>0K!*W2#lVEC6PRYI^|25qE4*X5)aQ zrxv=2-pbEU$V(N;v-`r^fqJNFAxJ@ObOV?Cn#DeV`e)Cf%jMeOS78@o=9OL-Gev+o zd-U7#bD1sXWQ`PrQIo1U9*=2{%~?K`J*BkioHo1g0rO8I2e`Ncl#VoDu)qO+YY(JD zF8`wetR>9yHkFdm^&+0HTS$PNDYJLlZEH6$@e0ac;SU_KQ>Jp1indWH6iHq)5moOI zlNWn(s<$1_iD=*J1bXrDgLaYs?SzHO@8tO1#e%V-$KYOUmgGAK*wQxZI<%UwrzqU&d8*Qq90-aCVs>f3xL> z)EXHUIEjh;e{vmR|M@z8{GF3;tu%Fa6_AA}#e>hlRhai{f7ap^W^L3Z+$1c{a!`H= zEFUfQB4)~c20Fpe0Nw|0c5l(ca&K8*6|t&*so%-Y6?hZOILmgeE96$2Dz!SR)tHl zpi>G?Lv=x<5Np$rPsKc5Uiq>y2KK8yP_jr}<%&1BoX`e6!L%X!R!}D7t&7U$mJR~7 zs{yE8JeJ;Vh9tHO%z}(+;^m$InjDQ7u?OgmBTG^#T+F|KK-|I^V^12Vvzp`_C=z!` zz0#Z6cfE4)&C9>`GTqYCGjBf{Ks=6vm<+pG=s@zuuuO#m!j`w1zdB673W;kO=+JOv8PhjkgC0HoW(P_>BhU47t8#GMt+(VC|o?ys)k+0N6nyiq#ZcR_}G?=%1YM z=eIPKEsFIxf;$CVszVe+q>{BMcR+jWGfIpl2XFSh5Mw|1F;-~B2^33I{&jiv zVDs&4A@~nK>Jq>33rbyNO4? z;a|i)-sKXjTITRUSK{6J!Lz8^I|w3BFbpNpC>ZegA7WMlU}%}KQ-iLw)`iUVh-*(g z9Jgpds~%Y9FP0hNy1^?3lM8D@aTn`~6Cs(8t1M3FHtH_C(c3EI-F!V<(vqt!FL~HW zR4(Y+ejxlC{ZWT-yG2@cQVl{1Ka;7<;GY~rhK`BdvE;$Q_0CFoNEa*p=VXrB^8c!h zL6^a`m?yv@FgefJZ^PiSE)Mu^`?hz)9iUP%GV9j1A2MECYVyChx{z)MIR5^8XED!^s1E47y6Bm9W9rOMO<5q{zS589fL%|Go2Hu>2q zcqwfuwYY;Fys_XU>p3P(dt3xctJ(A0Lwy340EmMw1gjvSc==Q9?zvaGb(OdF;*Kl9 z(i27?{nO>pHWUvGLUych_bPQ&kEvWb(%YUAf>O3LPqw8%Z@TUuNuG0;4H2>qwY9e8 z5I-h)^=!Nzknh_AJ`F5A!3T(DM2SNbN$2-f9X9fZX}~p}^6>IM=!3{AIPGg=B)+4n&Uk=m0MTKHF#iIDqQTM!(cox z3az(L+UAv7q0vIALaB?ja?hK(!#dt_NN65_%?kF|dAE2U`!D*O9ndTiu)$|uBs1Y4 za$U(AX^^Vpe~fo-S1hE~x~K0XQr7?^v8$st{Y!p>jm7xR3LZ-5%mG3;Kj|+)Hbg1A zbA(3TSaJ@e1*UZE=~eBYCG|Jba3QhtJfrB}Xl{CW6HckmomwQjb}c55a1JRJ76t_8 zAPr}MG&(+VYHQpHpWc(rrU86jscKi9F~hI(iDwQDL74@QCrd^5>3 z^TRL%y0YqcI;Q+a-?N$5+c^{7VRXn!U3mDnPfp_DAD&)4FKj6u4k?Ll9Qrba5ocX- zrQ)Y2bODmTNe-lePDBtF;J4u|_%rf2v4BW(y6?Ouyel>S&GbtdrxfV~+*Bq1JiC4Fu&cl1XN;TOE_;( z398u?XfB>28XaXuz{JrIe?+evb+;hk-B2_wy5B%a#vP1a{ZxJO?ZPVFm*`Q52l@tX zcliIj>!E@+POtznFgN9gxE-^zEM@6V{h13s>$MPNvJ4GOMmBQMnK$zRy^n|M%jJ%$ zixjtsGd2s`XG|h*_?8?5@;?zmhyQYQ&*mBz1ILQD<(;OMP#e zN~-bPv4@hc*^%C$-JZ!Ac(p1xZ%+a=dlqjh_z7rF>M{%Zhm`{LghVlq(Y17s)Ah7v z)xaBe;mEYbKs&qX%}q~|Ls77=|I=@|QUpi3R3P2jL)pb{flV9T)1yGxrgz%bruT1Q z_IWAUYy)@^djYyHLP!Y!DBGrdOgAhYf1zek{tS?f#?bZtcnD0?K;C0byX185T5qjANUAq{Lr+7^m#!7`J)}a{bBz%*a^^F@=6GYMEC6hM zC)qMg|Gf!#F=q<10jhN7q`@hCV#u98Ax$_7EHH}O@;<-m> zC{Qoh4Z4m7lFe@mQ~5cB>y~c(q5-#Jx+Onjq($z&8m`%v*;vh2U=4X1T>v;|NJaa` zGE-M90)ilrwL58YfLs&ShyRnY+qXq%`J3Yiu(R691~gYd7S+4L9sCTsv6LJ+OHF-k zlFiDa>7CtX;^q85N#Z9bMq1Z>(PzoX^<39k(>Mi+m$-koZDJ+DN%G9wW<=l;$QJk} zE0*U=*D$Q9M}>P8iK>u?2L0ID1yl!#*^4gRN}|yKwZe7-irNqGX!IiRR>Vax5?p?n zK8jwc9wp$*BHs67Q)!56UE2qEY6!xkq~WTU>`gh|2ODR;vE;jR{^syC)3GjN^ihwX z0Q*#+T2i|a$uI=N8_~`)q+0?ck8m+zw*yYurs zp&n6=Z5Ci?Fdq-WK=bKikJfllFFwSLtGALsM~h92UN_7G>S^XVx}UBfz|A0Etz-Wd zL40CtWZIKd?jUNaO5;X|_7KW6&5j(|`jb5_6?Sh}Xmc_=PnZ2aYSF8KrTrzI`hv?b(>{y8E*SsqeMS|$G zEjD)TMZwS83~X}IB9Y}5+#C6v65iJEVwtiq{bG1ZMin<`%O-Ekfm1hu#1LPg`B`OT zssk1!0IGf?6K~)fr>Fo#a2t7-Ua+fbeZ?$XMvsoue4(M))?7shR{-R>qR-M#D(_T8 z;P!d||CH*BmiE(p4+<}}NE5q*Lt4$gvEnY;Zz@5nTtd{KA5d5Kk<#`#RI$xs5 zc{h6{?LQ2t6aMsURoKYpDGh^X77EhEDzDN5hxR|X&AWn1u$Ri6R->7%!{Emue!VRM zE;v5QwMXL}!y;8?$x2f0+%T9X)+&z2tQ#r>67GvS@`?%pH(O>*ali0Si9qA5|l>D{$v}ad{!fs)nd>3u!&lC>DZuq;$d|Q~S!d`|w zc)Xt(7U+0ptp8j?Ymhgzt2ocW`zt-#$f#vhUiEBXEf0EzK$4i#*-3!W>Z&(OkAq7a(Y$BqQ%@g{LE z-ctd*#zRHpKK^`VVQiwHPGl}DX`Xk)sBub>qDG1;RzqH#I;9IuT=p2^8Z=Z*53&GQ zf1b^*p8QNzU0$bdLL>!0y}{oxU$U-a95QPUKwNSsms0bx%m3z(?5ej&{F0BYL=HJ4 zh*f({GE9M{2BPTY;pzj3K`>C-&>hoJ5~pGsrc~<4U8<}sg-0Ao9uuVdlPV!0uKOOo zQ?aP2LvY`{hIuqyhD<@lptbL7JJU=tDjLZ&1%}^6Xx%ceso}O`??$#~L=U^#hN^S) zXYeH%ik;1X4Lbt0o(=d3;6!8e=s!LqQU33GQx{dJ(?WI&KHy2T3#(LZ#0UD?dK;{C zG3*7knX)3*X39dvcE(x|GKJ< zAj$yAjGUXT-4jSdHu9X=`>&wc``~lX1Sr`Q9ifCkPs8-^F)q#w-HtYTZOdm3Ko8df zuO;M0?_M&`-DYg;OR=3YZcY_yWyWmc*T(h^!_5$Y7E8KdY^_=-?#haAeUYl|UC?W! zw0Z2V_DeacM-@sa;HDm>C;ZiHFTV{}jp&zyS^vHl7JEHa8$?cem9BfS2Hm;klz-zZ zB(^e0wE^tJJI31tI$bO2E?}#G!?@IVxTpF5Y4J7xt;IKL4{_o@BjIygvu75X%2oov zg`nQkx$3zyC_YSuqMngs*ydvnxPO|A%!M*fpf|(Ej1^Ug0Oc~;ZX@j)0R0G$h9&gd zrW4#<3bL1@%R|6uV%K7x{%En$q(VHDHbZavLT5CKfZxT|xNylHCFV}tqGY6rjIDt3!qdVJL;;Zevc8x=Fc zM6hDuDvw}SDLi>(VyhSHlalyh+>A-Dypd$ckY*1MrBsai&-@`6g3?RVAR}9fjG6j5 zc8Djgst!FF50#V{rjzqj4=ak z;|t8DXu5+dEs9mZbOKD)X&E!9H`eH6dBw(s9~arr7xbajKFaHwEOaScAwa;A9!Cbq zI*nsVd#SsxTDwLLN=rY|I>33GidLr!FhF$u*~3iuxxr!tR_&+vqV0!(%0HhcFg8zi z1o%89QHLJy{2)G=ry?A>1FuywbW?!Cu1N4m4wS#~BRO%@e;bZp-eP`ay@P8y+w=Ua z0hCaCxL-zx%O`#Woq2|+&J))MEE9(E)pT?(p6Hx78_T`?auq59dj-U#$x%$L5CShW zP$OCuBip$afwf(SEoXie{5&4S<89B$yDmvNvef5egg;a3caWX&VRv#2Xy%Kg?Jb{H zCFfLZ`N@pjNk>W6+TcIqsVp}@cQ{O6&V}hyZbwFFt16{E$u5uh@a!0@Pr%2~Og$Nx zDh5cSEbZPfEm=g6W*hr<5Oa~01t4bNL(J23N7p|hT!9mA*zRD)uU+^a2W!+1T0O#Y z-3j~G@xS)e`4UWio?o6QZll$dT6(qJVD4gfq0E^_ftRHB3Yop#$goVw68de%edtOM z6Xl5c={vO`fZTcRICDfhMVv@Gfic!pU=I?Go^SQ{5SLp(A%T}fCW5Wv0wyP{5>O-6 zodEGRUD9aj@p*K|GfQF1HVMo&3<1nHm(~aLep1rDrB}7>t7I~2j59I4H@x=iv{dYO z1kruPe>@(maOahMm#viyYA{1!B9n>aW0m7nouLA-;JlTwLz!??)~_2zZ#4Eg`M`3r z32$=z(E}l-4O?{5j6lFs&XL^*2Y6K3#qNNYtd8q)oDusNai$Z+>pZOGS4z{dA1VEb zyIh+Iw^d=UcVqm}oo)7*U3{d^Lnip^_zMdDbLASuPdPn(r#+{HvR`yhH3*9j*(7wY zdO6xdt#hNIv9dvaL)Jity92&}e>xqT0_D-Zna|Xsq~o6(wdr~O6e#cH|26Gv;+-%^ zAm-7+Lt}ck=SO4z932qTn-vGhrCiMse5*o0eooiOb{=qay0a|d=I0A$Az}b9r->Xf zos$7%)}`QCm85kLbsblOU#<*d4EOSBmD=}N8%Qr~eod=8IS(WmkIomv0qd8EuN4JCb9cU zN_6q!-3CadieOHa!|94WfLmD1j_gF0Aeo86a5MnH=c2KN&G17^anNDd*-SwZ6s@?i zt$VAsxR|u-ud!P?TvuIFYHpV3TE^tpW-4e1V-&X#!EVei^g>`Wne9OJWSzI(ogPn` zW%Wk0Pv=FsS+u{(3boWnXg&O}E6%Z_HctPaCd2sPhl)j?`)6+@{2bHUlL2J_}@!|40-g6zBuxzye7YX<{4Fu3~EM=aNZck1gar9h@98s;z{N5#_A>< z4ANy%5}m-Ow0>?LkYK1!0felgTFo(dM;-@t_PNBHnnFUdCww?*nt%r?*RT298&~QE zNfMbEcyx0sS*8Ul%5-Aog%iTjpR~1w-yAr1EaoZron`zZV?Px6KJ=i=uDTX)yu3xb zXYLu}R^=_y<*&Q#?c(7f31piYa2W2mGyfwx{Om6FA;Y-U_Ke?Yxvlccwnrr6F>7P& z*SP^{hN#=aUxZGla&X?b+jCU%z22Ifn6a9O&+P5VCW~nZfn*I=U$K`c^mQ^T=(n~h zTipfgz5{8qyAcvFO(6Fyr4Q55@?#7LAru8)ctnG>SejS@6fc>0_Bp!E>~7?yw%(lR zAQt;NDAac0eReo^P{J7QFa^*)k`*zEr8B1d>YupMbIawor%#7bIIXD-cB2_`Wc-$x~)I?hb}=Roe!5b?1OLVn=+JPuYmPl>Rk9@%i^Br z@zIj)$6Hw(oblIDS8sc#0w`auAfSZehM%TGX7wZI0pcLQNaVY?mnLrn>zZ!v0vKHO z2@uPMJC`H+tnd)v?-oTxs(#4REv9WO2<`zF>o7l1wMc+ogkXeTJ`Dd#=tNbRt^>#i z*IEdV=f?E9=lb*H(tn0!KSbrn)?PTKV~$m%>0@ThmU%Am6{)uW4S#Uj=RYjImz>st zmr^>o1wm@~C(U3mSmElU)py@gr})%8T2<+gZWJf}`A1!WfB^`_5r?4-4sk!zTX5TA zRyZ=o$2BK2lPknaGYRWk?XamfanxW4a%?G#f%aarW=;S-P6XnYXygA5LCEpl_S`tZ z03#ZA%lkI~fd?=dlt1c$A+Nz{H(5Ka>cLb%;wYmgD6z`w+PSRea15*14~1Flf1yjV z4dT$OmjF-ah8i77=9=4O%7S8ULh9U{y^YRR+4}B@o4@}N@O%SW<5w*k5ZoxEAIEIL zz6*78&}?5#g1!fr5iapU|8l=8JYye`nPU~Hm9Z_cxyGiWEgyi%Ex@W%zVkk4?z-PWK=A|p~F>$edf-r z4+B^TdKKTfK+AeGV6_IUVOf4#`0n88^*6b2z-m?E->p{Xb*x@|Vc}03d^{h&oW~3! z?jUA0nnr+IC}2XqrvY`h19!1DyVGjh&#*UbgeQqmX`qXZ`$o^2cZLPdvYxFHQf**^ zCrLfccL^y8`nPos`#TioA@`eo;}+@E%Z&{zD<8*fSE?>8`eCkZ^DJe>+lGUcdicl#|~00KE-$uayj zwj8{n8vKqrs;xH@V!Hx=(s{k~O4Zc|yHgKVOy_Osfm)V}*X#_{x2NaJ98@ckyjz~QPg}a073CPO*ESDhTok>lO{74MEl z&o4=Meooljdt@1L<}T^;?hfk>(-qyzPfu!%f8R2|5;WyRPkszKzJnBD*Xte}VuBqU zW{vRcA$JIfv{z*YwR2rZ_w4Try*TuWpyop|!D!!M7F_`(85CI+6aHMR$}|O=PXk94 zpRFQ`H^0B?ds*ow%8)L=J~ptc?apSQ+2J}N3gnx#kYQaRx`P#Y6Emm!qv`t(m(cO3 z+KkwR9Y2MPCcF!VaSh&6NIvDN=ZoGzY(xO0$?sc!fsVbq)0)%!klTkvd<#4F4f%`+ zpEqFfkL)d+TQ+mpM34U)08;<|2OyQui8H~-D8vypCGJNQov!Vp`8q}Kn=66t`M6j zFV9A9#@5^sTAX1F`>uGasqYv&Pxmh3Cmjscs?6gs&ctyx$n(<<>R)+K8@??tZ2(FD zy_MINRfH30XXm@e0S>CduGcHVaEprrV2EIku`BrRO{hD{D$lD8R|fBUOl zdye`z=3Z9)RY|nH7G#-sy@+8(N7+y^^JakR6x4?D_F9ta)A0x-{O z0?~v%pKH0oJ*mSGH zuqBqn2`on7LbGXO^87yBba zn-wHp`drJslzqr&4`pO(V7L&@-y5kbM^_nBuX>0{yFKoG5D<6h_WrxL zBMb9i@T(xppcupq>a}maFY-V@Ld7rJMTL|DjH?_>l7^Jn^evq7@Z7gxkbAP1|3iN6vaiPJw<>IHNqxrltvgT&+_j<97JC(hg6Y|@{6h|X z&jETVFS%{jGaP;@01oD*1N2gUb|<5AQ8lm%x(jmj%UuRr}sKPwtf|rM}`T;z1L(qZ6Ux$K*0{E-&8IxsC?N zKLUsbuwoG=U(NF%J>$n0?+;j;kSQn!=+mFZvZS$nAohE^y~3n!HwmBvrMmkyw~bvL zjHyU0-?r1;00OV-a8k_s0D%?!4}n!9=9IFM@WcY})lMp}HDLfY(E&;Z2^fZ5Hso6T znZ`i_%XzmjKH?nfI&!PsGPJ`()R0GNU@>|r`WzJh7j_I3%VXxD9O~MstvrL|foZd_ z@=Uo|8)%vHaBywKRBs$jdOTH%Dn%_Sxo;$R#$aurY`vQGH%H!d<^|)~f;)1zikbUB zmDzALK>RFrd*ydkD0US?${?U}pApRnOOyz!s$v2SjNbWT4i+!-=%bUE}?ihVF1+Vt^TE(SeE4>d(X&aOZzdjC&2_Z5onZL~*4>*nt|Y zKS}V&>qWLlg}2mza4YDpXjAKsB-#nebd+N>@5z9^Vd3&Hnx(cxt$fpO$OQf{?jZfz z%(nz-ROB3QurIP=f;rP!QVLD}^kzm`%(sY4j&%vPj$c&}@}JyC)DwMsqmq1BA5NqF z#|Ho)A#BT(c}fX9f;-)7w+(FSUJ`(rfeTnb-T{Dv2~XBh!YB4`1jl3g#y4l0QURbv zY0oPcOzPM!uS-CR5*Qzuu47DP0Gevl%oeOft$z<>eK~dTw*bA6@nwoXpe3 zPj+ReSoZiWzqad**XEkVM`emvk@3+*w~7?Fn_A;HumSw+XlZm%bFSHgAE-K4@Rdpiz88mj z#e7DunMH@g`KpF7M!EbO&39E=-Z`4@-gFSHi3UW0;=}Os0l>G1Qe>h?)^=Av)_!?# zgbW)3`y9A@edFP0z}@eMt4PNh?kdH>?hbG7vC8_Se@e@1=+~*^WYb7EC?IIONkRy7 zI^}d$<%K2B+7_g|!J4VL&FoB8ubIh~OS_LzA(dTGSxbMX`F$X|%w%JCi(SiD-8)Ai zF+69W8`nV11IJSO7x6E>I38EF3;fLy5bL=qM~$qyPmhbe zu^`Wy-Ve4iZ2`Z<3DB`$DkJBDUtK)7>zQ&`rK4@LYpZqY4uzz zo#C?N;10SnwNwgxvgoF6XHfW_9~?yv8g-9)lVR#E^nAE*08L$WAo7lx&(jjfF%8%g zdG_Bahg)^qMdHSzt38)pFE&;N76;S7l)M&blmu@zMZYX1}j;dOJwA>ND&^PETU`W5b?Ccm$Y_+-fP9sa@b z_PRl=)BB>7SB#s2(SAJgh>HjbTa&*$rC4RW=rW#Z9vUBKXp z>D%XnI%*43`@Jl%R-Mv!VS-KU49F3;h?wAYXz|CFrZyGbY?waAzikOsBw0bG&$RyA zARG4Hd+aAP99-fb36m)-u9=Uspob4Go_{eV9?8wym6*PK7Rayv^6Ivj@{b3KgL;A$m-?pu&0%x( zPHI>EZRm$z1(yrsbzGPJZI^C7`Yr6$yoRx+H*&{OXBTLbT}1>^hgSO%cfS` zjH8ihkrH8FZC1XspI*=PcR157^Ubu#IU+jmh7a05cpA40Pkk;7WTXk2l|68o#8@%W zS$qEE;{oSbg}$%kUvpgv=mnOcw}V(lLpcUl(!Rxo@hVht>J)Ad%%!gD6$C`K?b@r6 zkx|B>wX(O)bFi&OhIqUBW0w!@pugkzU`j)}r@%RzCCqq2Sew4*3ewRlfPc(E3RoQe7Yta&gx{pRaM>-2Q*?eNBo~jD zEbtOUa!(fS7T%!fM$YM|h(ir(42tp&6*_s|3~PE!6{IgRWMRT&|5iD)s5AUx<+k+e zjoNqqSGPLP7`=@BlRI7K!)^fn&x~%)NNpF=A^IdcI{Wni2_Sy@_jp;%nixI%!OW~g zfLC{-$&7!Y1&%?@W&y%}>RBq2E}ZT?+G(9##|2iVkBG0bI0#sfq9IK;#6NXUMW zDO%QHNL50C-hSW7-X!PCKWBIT93E-NyVb!pldwH{XeH|p z?U%aW_Gmz9JsV$Hbtgja{b<`Z8U_CE@tv(h{}mSV> zQ}QXU-N&bC_Kw%g`^C)}b%GbU4ko@RB!iqbyACKIj^zbh5JguO zqn6;i&%39d0aS-S)OKodtZbaNjj3ONr2?l-W|#R8JBx5GNBx(d zO1XC4&HkGCrVdH-rC*u@zg6EyGo`dB!_Ws?eql#}(FD7kUFrQ3Zkfr;8oRQb9gWa| zFi$(j`lB}_3!IgVBv+$zzc+fwJH37RNEn{%_eSNitL%HTn3%PTHP=wF__8<_p$R`G zyWAl1dTcB#aj%W6Cl&S$Q3qHFOL-g$BFyh@1kNg$&uX;Vf#-VO8Y&iS{5p8_eDqaQ zv(cXU5y%?$HPbSWKF~=7=v1n_QDD|-(A5ca>=d(W_@ z+HPAIMMVX{f(il#1*syU^cIx|5D_CF1ObVPNRy&;42cz#svsaBM0zJ8giaz|L_m5c z^d6E>LLkL+^E}V{?sxC+?0wGnedqi-=f}D(;NpU;weEY~W6n9|7~Fs(iaCgcx=lcM zZPFX^CIdy2zn_8e@~?B@9xzS8gaDfHg;yKhD8G#`&cG4^B zV)IpAS3P7~o#epXeU4x1S5 zFRXNJs3T-=m5}?O*FwZWYulywStDh+8Eo&bp|bYzvjkh9OAYEz&&L>8exyEL<;xus zLr_8Yq;gd-Q;(k}qTgAiQ3J5?_8{V^-l~8JiJrSx3 zV6WlI=1J;3grf9r?!8=5XA^>5+P83z0>*o*wfBt?aJNZANE0mA`*+UM@`FcccOW9T zFflX0><(f;7;`$=sIpUgdR>3;LF)tVI- za^@A2aRd?Q7$%f>RLEr8smSGFrqP3PUUBmvIulRco^AwU?{N8av<9ajm)cKg11a4Asj>#Lj}#0w8n610e!+32)_q1AI_*O%iZEonCpU=8o!DP+uIS@fs}74ZDA6vWE+~|i*gbZ4CDMZ zHWxQNwIf)0D5wLNM>y)0Jil>oopfo(E~kBr2tkzhS61(`^9&Fg5aa66ygy#*svHD0 zR>%h>xBKn;kQyCirZW|0rM_NW@p7uzjkmM@^JZ%F+o|mNL2w4vsJlQII*ss~4PS?G z8KY16RLuth6mxnitIAy&XP%y6`K;;r&Ws2QSZe+l83NEWbKM*Do<7-xKSuZX4AO7` zn}DDjr9=2T5fUorjaNR~_5?X0cKMP)*Wr-oUQO6IcYCR0sYX?~x2E4<1K*Evn3-6* z`)>{r?L#1Mn4@U*y+jv-wlcn}Xk!$f5cXA!HPXTw_R2-?!XM*%Im+>cqS_5DZjJqW z)*G)EwY>bu)?2;XxCe$YRB}^tK_BYvii(;ADBzpc6JQg-*Ay{?W*hQ?1pST>I6~_X z1tpa9#wcOl3)q8P)T1l0O?(3;z!FcskO~LVOal*F<3bVkt3K1l`r7v=m$!Vd1uhdS zqT#}`_g}YnhF&n-lhuy$tMpUOa}2>Kiw)|#T43Y#$KkJ#brrH__twDdn%K(x0Yd}y_036mc(Mu?l zEWY5E`TgQ%<%=D_^WccUzO6n2Ql5^^WS*y(W5!yQVanVbbmY;t4SUVQO}YL()2r?& ztjzk@)7$)=YA^2$m%n!-%KWkU3Q!%}F>%Z0 zboztkH1bSU1Sqg*tI(aB2A8A8(L61*H^s4N^_zkoGn>~{?L?H{*I>I~K|wGotTsVa z&hBu7=8X$lI!VKzn{>Au>`+Kh?8&|Aa$$Y%CwQR~56$)1TEvCxLnv}f-)J?2_Joyy z!#>|o>AFMzu<*sk&-c~P8`=`D`esC*w^P>5%q6Gs8MfrpHGk;p*R@S>M7DNkT5^w@ z8{!7h>1?#v7~k`g>ga*Y$%pCV2*HQFwd;K(lS5_aPWwc>f=fzV2CiSUn3mgJO5A@` z7nkb;7_m(&MUntj^)3b7_#M@w5vBr%m3tqZYV>}&!let9nZWA?(T>vJrt3(=Wzd^j z(>}IuUGNA8QV_+a`O+p~>LH`yv1Atd+v>S|DF)mmq0x_uV&ai`#7?;-<~?^;oLR7rY_wV1yajgO`;Dtu zLApHSAl-R1PeYMu_LKD*bD4HYUuE#enSN1|UoIMn?(m|<_xInh&GURQ&Q7tJAL68>h*$lJw(p`;iX9crVWFyr@} zYjhNFBy|wiTkeZ@g(nF)NEdl)6@G#zfcixdD`;>gi!?23F`s}x1xrt*yP^Qwy+#{4 z^?=&M^2Gh-7+i<_2U<10h=qYZ#L|r|W6HD8ZsUm4`v#=w>x_$a z)FP`6&@Uk@#dMx9m!0w(wf}g~Yx}d@SRWEhe_Pv)fA`q!M{{rn_7H1vsNHQv`%@QC zpRN5Qcq@~CX6NODA4=;tG8P`zF@YJKq5Rx7cZfYT$ivijA7M$-|=Ed z9LAbZAe3Q$!3Kyl@1U`>C#szD(9X@digpRjE8d%S-zT5WlG)J!5b(1P(_s^%F9soR zN%f!kM(`H=EwYe`7EFakUur}it6Ec6#QGLIXW9T;jU>62p0B&C?j>zzc@2a>Pjnw@ zrt~@L6y0=!FNnm{8E*k+?I-toezjfMi=2+e8<_mluSPblz_fqZ84%y|2Y~f^kYhdkc}=%Z2wc<)Op0+UYoE~ z$H6@byiw^_L~+j!zS*bR+&s0~-J9-t-$~E3$}A>i*_=T%O?q`kfYE*jeG()0B3LT# zKtwZ)E(K?XjUL?QO+$X1VBMg!GoR%FpYV^^c(jB3Kmba8QC&L^>{;5?&iH?@c?8ty4SKO9MnhfNKADb!wfXnmCG*20YV=|-1|Wuko{?20>R zRoS)FI_S#IBJlt2DN#p5Q zAYIqqExpRtJOn+&>B<$CuE1K>CTC6}Yyr; zwD>sb+`*Eiy(AI!asSEA>eV{Tm!qvSU*bz6G;a>R5@XpFKKqQ?3%Ov_sH!Dv+k^on zVLlV;!CvH!d2h2rOw57n^`7Gn^-;~j}$az zvWG*l6ctlD(U(&z(8UQE5)^>!O_hI|^aRx-imGRW@q3#nv2g04$a!^Q!sB*wJ#nG# z`7am7==uU?FG?ihHHxDP$t#a8-UE^}hJ9@1&-ZEDdNJPWy~X^Fb%$YkSQ?e@+?`uuJpSyVFrd0{Sw29!t7XrLM@cd4Akur*R+9OX! zBc_%0(`4sC-I1O*(_sMt6vBjCAYPJwqpRN1sPlT1^stcZk3!SB-OHIc8+sI_uMWyz zr2-8^8oNrCeB@nH2t2?%12Yp@T&*VDg&yN9tnt|Cvy@mzhIU3#ol)cA zbfo}S3{batPz`L~3>w|N9dBd%wpO*8XhUUmpX0R&>AmJEJw&(uXqBCh&)V2aH;u42 z#?8?8RIy!SG)ADrNOV=Ym;h^OU;}&pzmn2$UbCvRIog3d_4)ERf$y8#BbT1&gNOTv z4KxcSv$Ynj6^}~Yav5pQbOEVDuHeLj1$AS?tIFh_5zA3b-yNs|0We=T)mv>@ARMkm zFUqp_@2m3dss+pVDDiAZ0 zs=UNDL{y9L)mf4ESo><+NT|J_%ldS4)BfEPf#tT}90_FmeBW7;9Cfu8!J{eS^I(J9 zBkxYuFs)($PB3G^e9+K_L*e}x+l?Wfu{Cf$$ zf3l#QhrbXu#Vv+Qu2EfhsI<=YAGJYdK_iW;yGm&yIgjq#_^@%e%a0eol=lqV$|5&tq_*Pa(-l#b1VHe z6qmCUNhC{hGD=ljoDC6Hb5BLcK@(Kq8k%CX;d%-ZpIBG6wvPQFKk#%yjfK&cc4F_L zP9(?%7)>7jj=BeliBxwF9vHUv)Pyf(#M!YDZ4bn-*w;uSq4pGPJX@XJV#7=C%wT7dQvasAN4x(url9e1F=4D&!5~HcuQibCq4j!z!Q7g(?z@2 z7$1+#2)%OXe;@)RBrVy)2;pMvL2<}_q%3rB`hCgh>s>B0(zcA2Hg|tWzACB~eK7BC zfJ959YcDJmQzUPjv}&LKw66x*UsQ|c@p=H76>jKp(VkN?f`TU@@~5K94u5$RD55Wr z?dy9ha@ISzXw{od$WMBoFXOn9+dMxFJgi(OvESeXUZ{Nn;((LB%1vEq6bEDVV)(1@ zutkK@c3z5_4I>Z%ocfiC?F7A=2zcjgm++E7tn1@XXqnAfnl~#EJ|@-sVi7S2L=_Hz zY|?mYX{7~2#(NOf3UbWIh(qR<9t~#}(!q?<;dCd(vBbeBx0zB#d&Yl%@C_Y~Df$C( zqDnu-xyTtake#NOcYj5bc=6|6ZQ6RHvj2(MI!0NZmVWWWgta2&C|1wab!S*L#K_`n zMj~h7H;Zn}kE+sIq6k~Sx2t}|SEnwXFt~p8#tC_eTTMR@k`FTuOv%+Y?(^} z-oDl5KT~~i0uJ<;m?o5lrq@g(j`%@$jW0DkLiB4%IU0SlZp`zNAxt&@PG8%`>$Z}i zmRTGDCu|p-+#@}EEM1UB8e6g!ef-h7*9;cx~j2T)H?wWu?=YIYO?%G;-R zcoT4+ceynVPepY}_Qsr)Ih22FBhtCmvhSpXYg*PdBF_nw(GQvu7CqVKwjs0$pAPyD zgw7td)YW9)qOh@0mh*J`3$Vh_dy()w-(*}nNw3H9g4l{CR=x#pQwg}7^MjeZ<&R}j zhhhw8Xz~X)zkJOooq4$_u^eEm%WrlNWr?oQLr>1uK*=M&IRJoD8AmhU3?dj|+YYl- z!r(=kOUUGShxH=5pPVLmRa-xi@Kc&SXe$J@+&WUHE=rks>zsNP?_ToHI|_xA>$%4) z!#ADT_d=|D9It6e6|-E!7MS3Gco94>gpVG7+H}2nUwNHJqvb*8wZz!PfU9Q)rV0-s(h!{Zqoc@^6s61;u1XQ4H+dUNQOyS@ zk>Rsptt_%l&y*!`DWjsj$&{K{r91sXf9v=_QRfc6t@iW&_R9=-_M2S6hllFr14%5> z#hm}dna5O;5O<{p zlLPk1oF832mZ(xemDu=mDuft}S5W)p}X|yE{2s6yulSueX61 z<$rYhzebSBj6YBguJOfD{tBo8n# z>nZBlw?cwVz`$Mrh6!2JYtx_|m>pX$|IGmoVK6f84i94Pp#wO)A6C;rhcQeURxRyh zBvw+*2Tbe|s>5;1N9QMUqzzPQh!^^CuQDc&rH>G*OMrSm%n7oBUSy+ZAc#Drl~*8D zKZv0{g9uw88llroO8|nAr_gysI+%%`smr~8&v+?HeTE#AySvgdV7903Gxj@n=xJR% z@i|*^9&x02M#C+xZH#NV-nc<<@zbn!^wyH9K!HjVYA2mL z&kr>_>sd#V5xtIzu0!lcN_!MI!LLei`2EQVK#ZF=s_>@Z1$#hMx}x!YPNHEAUe4hN zRQ$@&slQX8bD+Sv3#d-u?%eT$3HcTl*mBLj8oF!H$R(`;#_B-%D_3U(&$hv2{N}j0 zA6h}LUPNgVIyX;-0AqDidK1;s$j6-8mgeSJrim>=%?Qxl6jg@Jv~GD}qi4z}>ljk% zSvK^MMK0g@FOMD!jH70?9wV?e|2fY{L`t_;& z0r<@Jo}Tv>q%^cfW9P8x?QmB3GRYN;?12ojj{kYWanaD#*80TU)x`<9nPi4KySu58 zZ$~VQM-zV~Xynl$0$z`M3*L{}fqoE%9_tJF+y_*- E$bRBV~-F&_wmbF>c*vM_4 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%0D{H2($3jRVJ{b;KLLbhN7{#DtL|F@)m4 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 literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/mnist.jpeg b/docs/user/my_figs/mnist.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..08032339095572b6b5b3eeb9e9b770d9fe585418 GIT binary patch literal 232865 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 eZ`2HI`RA9EJ$jvAFXW|PALX}y7YPu3y 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

}=9^rm1!Di`7ccV`pAi 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

`8q3e5B@2Ht0elEz4*e;nOBu7rvgA$ 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 _pDpDFy_a3v zt4$t-i%ENMj12R+^|o|_Q&t~?vb~|Kt5q>4LXWIhck_W}$03iJ*qef;3bRBM4S#ew zhC$s@V4x|X0=ECRb40NLP5II1cT4^CfF9IsbDb=m=Pa{hbzQ6iT#FzZOLtPhR(s;E z$jR4*ySjcJ9}r>@Fg32)mL`nNz1$^zFGmE!1Nz}# zI)mI+Vi1wGw{@O*&CRj>toa6n{{-vIOSpEdbsbkJWF0233J%*j2FUk4hD-vuI7=RavLWM0Ua`=~` zJT{Jd!&HU4IN1iwbLMa7L(JbXH&^l$;lpM#kGpTienv>u>y=pz3qh)E!S ziGU=Y3A_dMf6805)B1+^9F&=-bq9{j`llOxMj2!_1bPVILz(Ir5@66pkF#nXN*!Jy z%02o7w15G%zIPNy)&l{{77T+H~{zvFN1yL0XAJD&yTQC#y;{c6Mt1z*ywMuO5Q8`x%c+|F&sR(2tuw*Z}GNJP&_+$v?HP=ECOgLlG*y68)Ag z4XbsVL9R$jvSaVz9~R$K{hfNa-}_KuLPoaXF**PWa1F0MM5GPmBlxkUKhM;i7(HAN z0io^F;*7F5bsx!x%iv`eKK!TsE2I)etG_8)z^9Jjig8df!vB#e)J}d)ST>5no!=_S z!yJMGHy=Jz`>$&#@-OjCiAhh*{2z9re%&+4qSJ}M%w36X zh;tfFhakDZrSY`pGZO$h`O85Vm4zUq5Buy%BO5u5n+|kwF{m*9$(IeEvyK;`uSL2uH{`p9c$)qY@-xEmK;r;I60t%GSA&&6 zcdeN!PaeV)0qLv<0otC8?aXid#9$;m_z_$?5Z?sT8VMOs&;QKWHi6{l8vhgz@6>y` z&mv%%+JciGK(2==D%YqeFfPC7?LP|9UeBMmo|AGk3(u# z@{_a^@T)1QcWqRM)POX7tVZ6}LP|kKWz91#DKrNbB2fobzk9uslqal-dDCD z(>b@rHDEBo3l74(rs3YQi7@`bnM~J*vT=zhYmIAO5w1lDOA;olhwlQEtxa!>TY&TuAS3yiK4 zU>QIjx17nFGqWyc*kL)VUPWi$l&gHq_O>lY3yyFHI|Q;9CYnC+*gO-RR7X^jh)8IrtSN z@O-7-3AhVj18^Qiu+GgHog)2&ZtNZ=CBv%Cbz`l@;K$%a`~peiZ^_&LD8%5OgFgOr zdpe&&XnQAWvJR^x=CwUr?EXS_55BLXadeG5+#cdEym-NYWt&i9XS-<6_P{;ozvdqX Sj$8gK6^YK8I|2CbpZ^y$6KwLSP{jV>=Rpf}J6j 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 P_W~NYMEU=kz%TzleAsQw literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/seq2seq.png b/docs/user/my_figs/seq2seq.png new file mode 100644 index 0000000000000000000000000000000000000000..41e902cd894ebfe4c73e85966b23ee09b662f77c GIT binary patch literal 30112 zcmb5V1yEd1@CLYOki`iO!GZ;McPF^JySux)ySpxK!GaT57Iy-K;2wem=l1unv%0Ih zx~r|N_ulOEo1UJTp09hpja5;SK|>)z0RRAKaB;ftOPf34uIc6Nzxe&;%0SG!*Sfr^>}iN*qFUI{(LP#K zGenO_1Gcdc^;B$31YeJEGzC^jCy8J={=Cn3uZ9ReH}-U96Xf0gxZ_ZI+ES=xJ~IWs zU+*~ao)tXT{~yBVW7g9m!`jyeJ%39cC2K6t?iE9ix0_ZnCMNXq`YxWwI#HDh3r|}q zGn9ZJt4Z~0h{*1md2-;(=7!GP>d$lSM2YvG8Rd4IYfEb>b8AbCp1gm`zRYJ;JrwKd zN$5R0V%CtLx3@>!1_d0!nA}TA5QyCDFGi}IJ%KV0-!!{kHh=8%eZxDcugsse7T3>m zyiO|M8sJ=(lA=qL^BmDc&8+Yd%WS|r{ah|g}D>Ur|vSB+BYUlqOX-4c>B^_ z&h+txB9KW0Ev8Mjw}|)&jlOQDi=Hfnq-lJro#4Nf{=)^eU)>{n$vep zB7ft3A5G}|6)p<{_yi_1Pt8bSrQ+0PDBbjGKIaLX%e)7?&`JRSgD6>YBQSv5K;k!# zGZr%a+1K46p2MWSfWhC@!R}WqO?4dG4?CU{trhvRoSdJlLboVyn`EJ*pF)$sdo*mj z8hq<0am+~DYk!SyIbL{FL|hYavMaTWhJR$e8qn6~^>Xr^^uiLVT*lCFVlN(x-aI1= zAR*WLp3S@s0NAgp+-aC8^d(upyNKHY^|AiGRZ#jvplCesASWbxQox~Hl#+fL<~^%@ zzqR=(Q2o!g~)O8&zpbGN1OLUL+*UdVJ z++BS?{3OzQoe%)6SY`6&Y3%5%Blb)Eag0agM)kYzbx&}?T6>FqM)^ju)^Qj^ad ztnYd)F_{_ul2ll9V4|Dlnwax8T!(j)IB@4&0@n@%?3{3s#x|Zr&4gzUV*8 z`*;k?>UDn{|0#n%Slng3JQBz1?Rk?( z9`0(#brNgOd1L-fhDzuA&0=(;x#44*vVqS(838WCEA{I?eJn)3<0c9@-A|*sgm-#u zFKE1`a&Mwg8(;R6iuB*!R`q#6dK%RQZoAjH0itM?B&HK&-t(zwzL44NpA`t+?|Z{(@2_VA9lh3#OPrvWz=;i>x0`WnU%=5HU_q_+_h!dy zb(y2&AS;P@t^1XR0PAdgy0cY+o8ZnCB~(o&p{BX_V*jG16;Y?3w_Q71dpWP!@`{V? zYb!@iYcHq8MfwKCX_#h^Oyj_ZQ-nn!>-PgNGVROGso%xAagi`Pt*{{I=ff{}=F24k z5dc85{>$bHyX{~2mYXBqo45Ufay;Iw?Mc0VYI&S@@)h_@}pU02m2C;5zlV zNLddnCXaCtuRhLp{ULbZg7!0Ii2KV4hqP0TP3%}ntsgk=!V=}*I3&9d6;Q&-^P!?H z&kqeHz0j(r=khh!@O|)5|NZ6E_z;rM&sY!Mxrr*i%MLcsf^KM!>B;;{O>KCFZqKi% z!7qCU3L=kSE)m1me@A2wlh@)bh@DW6p+ai`;q&{u;~aQMpTFnKgAND4Bymp?De^s; z40Z_ra+RNR`nPl%@8|83>crN#a)BWG1Wd^fzvzT1_j?B(3;+PHUa@`C0I%i3xI)A@ zi;O@!iB?#4-*LtVdtO6M6-bYbj&(!m`qbxZe&axYY=Rl|bH2LJ-($Tz`0=9ZOR(oU zJ*pKM*YLvb75eOG8}mT-p09Bd6C+xrsuZAHuy;T-H{#zA3q+TyIESv^pcCfiD@RwajEw zHVZw-TyiA$}Y&uz${F&`x2Cl_ic;ATA2xe zyZdhcU3av|V^O5&=_XmZaIB^OLL0hcOB7q)>Kb1)tPpJ5CKo?ojThWM z{yX5`J@?YDQ}E8YDe|6GsJ2fKT0S^tvFq?19&#kkX2JQ_sxRzw-jWHKfXI24s+F3I z-kK*9zW-95r3~&qixC9W1fFfL&OXgXS0^he`XZSo>G?ns(wTewp8rOF>b`nHRqDUK zJaXophXb^@+)YWv+d=Ws?pQ3x;la9NwUO7}`t{&jmmOo37Y5du0 z^4nERC(e$W$JM`hyxcDbu9s%sBQhfWuY}-=^!K-+jXm1zjj;hk{?Px10qMx4S3qdQ z1wFgBxHt+Cdl%&OHYY-3+2GFnc(ME?*zcdFb>txbYXW#i*eOBeKkNS{4ZQjEj@7@{ z^}YK63cG&v>?a2orWF2GYbgtSxJ7smupR1g-ky^$1Qc+9H+1e6KGJ@78W=26e_8t7 zkFOjSc4EEt{v-YUbn7qnO7P<-Q|6Lg$ z?D~F>CUPR2cG0JEzG+qKrySnbPJacf25=W&jh+%892gFMxI5#awps zuOC7dK(wY(=}>6BkyGfk{)?)y{g13d`#nN{1PY=!_8!FDUDRC6SY_AE-2eyxWQKt# zGXGh9YuS~(4-SP`(y}K($kB(8FkU01BPhfc*Y<&?sNI5~FvNt!@}6R(jgrs+-nP z>Z1L`ES_exOj+53oBJPFq_gx0XWl*tws%Zt$5q#mQ1Nw>+nNKbWeh)^&b5J0KYJpr z=q*6eR&;hr#p;I)jcnL4uE-@We{q3(Dev>Mi$YU&gv#djY2z&hruBnQW~-j^b=QWu z-&=L{`e}LFDdD85{nM89htK2DsSqQtzQD3HuJKS~AX=3j^ulQ}sj*fuZR{p9*!q6& zf2(uK%(_B{9Xy?yyR6cwi|0t;zC?3uNoNV0C)5#|S~zOj91Ylf(yM5U?pk4Kl} zIo93`WJ>j6lC8U*AGebFMEQZ;{`Kzy`*$Z504rTX9Z-`KEwb%<#_*}og@mtE^(Q9> zGIp7?I=y|%gCM{|BcsX||M6WUbX_o0whs7I?*#PKQ}BUG}gsB=3TF&C~2risq8U;6Xk$vqz}1hp{QwS zLMIOY`Ee9#VN}FO%Y#rN<35ouwd2vm`5zr)65844TU$l5Pnam=-u?XTC1)PmzAu9o zynA5{iwsn;8h*T>?~I@R$(pftq#Hca*U#s8Kfmhi`4M&6{HVio3@v$`A3{TEW8r6n zH{Yn6GMVtuU#4^hp;q@8MAtS~u-FRhZO&))$W|E_m!EiyU7GlO7mg?+gxZs%X9Qn8 zK}sO-Sp+&goNE&;TucCYVyl{w{6&c<2!l3~UI;wrWxBxLf>2e0wUcIBw zJr9CMc+j{0W&9H>6D;)vW$vz;+<^P8aaxug(z$;Ec5?I$wJ4c9mZznj@}`=W&8^?^ z2U5!ji=Av^=?S3~*=iWSV0hHFjrG2S`*p)YgPW(axB;7L=XZN%Z!Sr1E{m6;!GuKu zwUu*Z(&LJa#;CQKufos0X5J+SfN0a#d9hDQXhqEpO~(P_UFCYkeFOaJvu|oBJLiAK z?omPX6%92=cHv%6_|P~12BLt$a9fR*1nP;(ofh}9UvQXqNE`V6L@eZ#1-Ff4ms$tg z2mWpSTlDvAD$XQ|OmD}4cw1{#z3I6A0t8A;5Pa_KrSI(QjWtJ%{M`G3HZ-JH5Ut?( z3ki)mSi?{iOK|S7Gj4osrRUGBnsr^gF9E#=D*o&Y&!_MGo%F8#Q@ZMHhFa)=bJ+Y+ zQp)fJ_o}0u=t7>WM2E&iWk!N*X92qi8~{>CYA&iVpXB}Tb>G81maY!&$ltN|53WVn zO-KOB3E(~T?oi3;?Q`6(P;_lci`V>%0dO)ixy7&VME~`Xdnp1;jN#*>``^S1D0c%f zqh6xQu{*a5TtAE?LfkfU|Lslq#tE81cP?4^HpWU_yc^fAT-fX0lAQ+$RITcUJre94 zqih|crou*Tv>87JIHCot(Pw|n*qh7h>Rn!y?ld>@b9%S?e=YJH{7$4#!a2GQf8R&= z4XSKsCw%1t1q5fp-;D$opo1Vi5k8AVnx!{#nmY2kKRWJEM{zUE9tXuCJ^lh7Ng{+W zB9!I72yuJ9+#q)1i`NJ2^?%(hMb`+O8rkR+8S*%&7ke8Up z{{D&hU-(=)f;)kYF8kZ{w{PGdWwX5kYiPWUbWWM?!&nol^7Vg_e62P9CQexey5G~-{{;Flq3B>o;9H{h|HnZ8 z|I}jWV2815#j!{8)t~tPNe{rL+AGJjS^@7@|8Mz$|C8ANYia>gC-Odmu6EpHXBRrx zp~(e!!Oek{%sO>~{jtXXi;B$9%mp16*;`$d`H#|IB|BZ8!v(%ajwn8L!xR{o)d@|9 zRt5|Cmc1yPxHPsk8&Tj>g?MG9ISAG^mkX9&hq5_TLF z|8vO<)F-vf!+_?$31t}f=PA_4hj|G0vmxd?dLa=4(kox6b(R zXh#KrZbi+RSJ?7x?Cj5opCOdMp>nNAr_vu(=-WryoC>ul5c<~eo|biZE=_eL_rjNw zD4JS1eq(fi*1(<}aky}?8Pes*f2kZ}&+{Q_(?g>Ff9W3Ra8j7?8@OgfRJOAHPlm|k ztT{&UD;uK!w=e%~lj0bE2uj5wiS?zAeXfSZX8ZefZPUEy;1!2AvI{*8eA0o(j--pU zjW8HY9rI{*Hil+=8FO@%QS(Pq=ZMbX(<*S?m3QURX`L;1wCzgHa!qsSd_786iuH5o zpBtH*coKxWFauF8Le^IqqfH5-Oy{`a9*FORbKs*)r$0nL`8aZYU|3HUr`-R?3pCcR1(`ov~V?5p9~U)>?yHb@5-|g0X>c00S&i8 zov(XDH8j65iSLt~RW&<4mF7akd$_Rljw%a3N}1XeV_^InSm~J@hy`#es&iEet88I| zl5JCSh`7mpQH}B?SL}8jbXQ&kWm*D6g2a zF{SNyBVm5A?sBZ!O$6vm~P+EYW6WJ^&%Z=f7NyshHAwRfd|{~17O z-PYXcpl@2#wr1+u!U%3X-^~gaSc$2Mpimq7u`HR)>et-#K{q%DM{^@j&^tX7{%KpIv+g~yGR2yFd<=C z7o(YZL{0v@oX?0L<@JZdnx|$}>Xu|9jb6+$+}uP|V5ksxJ^5SKLQ15@KSz4*u4Sy(uQ1dI!k#Qvq@o8 zWyYFJOMo((|LS>uOexn-os~XU{hQO2pLIlaVxCmr5`6@5hcQifqwsaWva|d2zB2fJ zQL$l_O#(V*;Pj8*D4M#r#g5CcD@Rs6a`NSmHocjf5nCV3;jpmte?#GCz&S`|AuAb3Sd$ z$9pbL!&Oa9N0gQ94u`evKK`;OP6@V}`DC;-d%0gCm|b$%bK@GqC8+GDs%s zi_CeCVuH?PV(|=8sieEZoF7LS9L;Z$R5Dfin;ww?G}t*gi@Q6ZSENJ^iN#0pb0BgrHmk_7J6~flrV&xV6o<(pxG{apVsXl?j?3qrmG& zm`CtKzYlrQpK?NQI;t32$r>$Qcl1VfaD=|rz%Ct6Ao@yAFx>pR+X9es%Z7uq3TbPK zeEZ5{_IlRI1uTs@fO1)OdQ;h&!5aAV%9F0(r0KpI;P1p)k;9std3GdmY!A7!btL%z?b@oi5(Y4SSo;-&tzpBt#% zImK&a3lmpVL}{-Ee`~Y6=u2xGKY}!GlEl6}V@lI6b1J5lML8#ePIQex%8v<@9KM)B zh<=0HPjy63%z5sSheA_k9sdTTr)k7BHTm!;5}h|;i(7j{I$S-Gn5K?{j5g>aS7rG` z*adN(H#Rx`QR&9jhJsec@g;q&iI(yZabvKsI;@N~nAejN4~^|y_wQ<*O;_@&Y+G?F zA@L5NCU-q`q6oYlazdfO$xL}0U&bRfhycXwWTUywd)wEV65DX~vmC=_*U6bs6VKQ^ zjqmglaUAn<^cPF1$re1+zB#ZTyFDEVS`)~qz3ei*`Bd4HFC`d1K)l>h7aRV=i}0jYk#(qF^{Wjoau$IsnQfbG=rb~RA{P6;~GPRY?V zl=`LW^bPLrC-;ZT3QP}?9!#8Lol}+}2MYfNJ}o|Zz0u^F>Dk;3%o>WXRFsuFbPkYq z{UDEhm9;fIvJFfvAJWJ^4&m)zUw`UL{zAzoqX$~qUW%!*Rbxaym2-_7&9d?d&VFj2!X~a* z=^Nb(POqFS>Rt3N*#2eXOEYMddQPuZ&!uXAv97(?Zo=DK8WgMSR3cYwxJ+9|;b`;H zIm*_VLpsCybyo4)dc7kuC&=+ZZ(*@3>MIuHd*>x_S5ErGN2D;9IYpJ#I~&ec&z-s+ zS>3!qm(p<#TDH#;^Q2$rrii0!nwDnVj)HgG)l?yPcZ z%-B0j{y5wdJZu!zy{Ea$0J)xS7FYFm5;{(I5jD8YzJ-5t|LA4q##JV*;){pN5s zW1|Z1f~jn{2wTK9_LoZsUDF`>$NHo8N~@l_S^u8AClY{bZ-9_6Rs2Sz2z^p7nc0i( zD%&C1W@e4j`2k~v92As9t!M89NFhUMmZC{w9nbc*7qpWO?PJ{?@D-7%VoX*DR;oRDBwd;HN_+5^T(?&`L zc-ek|bCZr37fV5NPN~R+_D?|)JAUl6?0^s}YO;y@ffC|tw;MVWobxEBxhz`IA=L;e znL9QA*rGG-)b-CLj?;C++_{^Pswb#w!)0B^wr*tim_jO7TUn|+HLxWPSl40ojfMc( zXKOvm6j-_I{2cJBW~cEIo`ypW7qHguh&JCmvU|FV1o8z;#%NvpQKclTCo}%7(mA(? z9x+w=etORp8?{yI0GmeGF}{F_vq=wDpQgwC5C?|3C!O$;i^+^Rz+j!DU7|D&n!n(4 z-i43O4XvpwIFxeHMgzq@Z)HT2?(iNzlQNBrjlG&QnFvNMjlVH-k?AHzO4bolqK8^5 ztefR;BuKYyC)*N3HeI3@KkxE2?!HgVs;2XdpAxp+N<~|l8j^;4_Dy=)>!(Tpqa-^W z=a9`U*lku(@^@XRLmnF`DxyVM2VI<5qxQ1Gc8Zm)jNqQee+6aJXlj!w z;RQ7A;ToEr|1H^A2k7@T;uFORkzd ze8?%ArY6RQn6{>-HkDwkg}e=5FimFyElr^zy4E%i#*fHoZxha4sJp1G$&?_kkuX*Ecgr=p`_ zi>xGt80$Gc?sT!lA_0kuQp=e~2SCZ~uYW4G7-$JVBJu?z4Z_jvy_FD1PB#Ex^U^41 zg><2AM_(yQad5_R&sPxsk#```O3R=^yV5aUsJ!gVP?e)~C5j(~GdxNqR{Yb;XU+je z)jIG7?YLO}0Q&r$b>S&))XJH*l@ZAEMdrw}DB8(BTi5mOZLV_NdaB|0>5o7~55Pu* zkZb7}F3+~~j{eMIVXZ6sIZ&S}SIkvRd7THY7yA_`aB)X}WuXPSqi+Ysow=mw>g$zF zOR%>KXL7fV5A-`zvNx{q-+gpB&rf>d%!4%OotfLvZCPlUulf_NCjGNKDv_=-a9ui@ zV{cgTBY0LrvGs~B2tRh*o^0=a;=hNK96v2-{wV3*kS{oe1$qVKdX`|6ta|T)o9CW7 z?Fk4!8a7Fk=Nj5SCkIBG+=xB%?#q80NDkzn=^60)qGo8cq&kj<8SP>dD0G!CHcy&m zzB6q%@l3t=`&8eSgP~`@lTpo3Z%IlTjVsE{Ci=OdzEj&u#lU4wS37rko3yXJu+eZb zlh9%V<*oHt$AY4amrF^s8s$D6I76f+`^t z{#Tis5+G)lYb3RAHIh@+Inc#4&0;#xcwvmVZEbaPgcDsGjVaJqM$O1#LF}4=qEY8E z{SK5sK14MgYqThW2w*DIU9bXU5Nc_NN6CRH3AG($69W<_I>x`X2oRV&W#pSzK*WL) z1mZS5U5EX(2!^Z6I@I-cx>@rZ4y%M&tU$S&ZgeuAO$Kf0k`|lUF1&iIkD;c>q0>lA z<=$jB+0Z4o`G?T;fDI?<00A8IFPD&iou|bjt?q}oqlTCNT7y;*T-IbvRo{_i%ASHd zacNeV&<=yIs3YPmOgf?NDLJa4s+~<9BGa-jSAC^;6h2oH!jHi@_SZh==e$V6m3xH- zSEBf_H607FFDi*aSMvm+a_=hzWW3BaXPR_z*zwX4a|0YBYMcs9UVty`!1T*k{SEHz z4q4G`%EcL@|ckEuCJRM3qdQ!%@i= zn)5UTCMO={T?qn^mA5kwUH(L`<3fcN0%Goj71h?pKieUi@L32nTRfdg>s{)-iZB~_ zF*ela=oeh#R8*gPL6RuPUul|lQyw&y&6?UvkOODjy;d4#d32`fMYq*thvA5~d z?J=DS>s8q*1*bTWgZUDs{tE zPY%wTLAPw4+Bya~HC|k|`oB7wB2B3S8TIsDcs@}noJxbZ)0zg5-My0S9qmOA!&RUm z93b3u`qRyv$O?4i)5J?LKgH`*kiWlvX{}nAq}6x0M`x1QNDPEP&PC7m?Ie|7gnRJb z=Kru!4MgOE|H+9!?sXQh?4|pk{rJFs+X{g*D#0Wmk%d6oswB}M=*5D#alpfwS zP~6iKic=+_2etA6Dc}(Q5ptfz<>ihO;B&^zLtI^*+Y7L@oLr7yg1U05ObDWg;@zH! zMs?sy<0PWnUNu-vq|htNeBJ*obsXZ-sYq1wu~F%lwY%E@=Rv2^61ABmUhXy92mL*b zUs?!k8}=+dNo0zDWVS7330K{#YWTqptZ<7Bw!2q8`4eNR+8cFf71%eRm09;$%z~f_ ze5FiplUFBA>F}x~jn)>$FCC>obmG4rwKGu<4&S?$78TElxYU^cGK|w^&wDKt4 z>>H8Fz6XnQ6WgVqyVNk+Z{iD4{^lrVvF#l1v^eQ$lo}2&1eH7>Y4YY;+C@#o*zF@a zX5l7>Ky*0K+CwC=yO{$~6V=3Ys^z%S#)erFn9s~#AbhH5fO7_L#zmGx0(QKcr)2^* zWz>`mlL{XtdjobWwW_QuEVsSlqNx2ff#0fEAps0`k2LaSRoEcrFnlHzrQ%_6Ye=$V z?UJV=#>2NN!vtowl6a7j?jqHQ{a`Kfi7@PC`!nW^OZv{$PMh`YW}^2ODA@knQH~3Q zs93&s3e{Ei_7_pXf}0~)x88mphUy#g5J;GAGP@_S{z;8?_;DB;X-Oci#)VjAqEa_G zE|++U3{$Rfl?-qh9cG;ll~y_QCAB+FC}nkYZan%`=ukBdZWA17u07W|?kSxd_w--J zuC=#Lf{8MR=V-s&+48!~u4G`FoyMZW|CI@=)ap($k-|y%(;HcrLu36RkZX@EXNcrq zo(L9QUg^YHAri?hBBcT~O+JpHX~M%>)n;FdZg%?hghK0vPTM8jVVc-G+q0U9yqGEl z5pDzsrY=5b)A`Rnj5>Qs2Q>^2rh6$dgdRaL zx(422m5%249Getjg?z=wIRj8hZhQUAj7d%@gT#ifyr4rh@Cl~0j;kSQ!(8DGX^mBM znVd4TIfy}J;WH;3yu4)FH5_28q!q7;D+=1y@5G2kSLv4&jL%W$j-goo7w8hd$Q_Te zYnS>%-(5yyu*j05_qsWaY!?c6ONi8T+8E+Gp3~@s0zw|2z2%y`;DY90wG@rBXw_0J z`CunM!Q|6gdDM+^VyidUb;;bIlj-3{qP%p&6v3G{>9fiV(jzCT)!Az#*@QK$wL8@- zo~qjb2fGOj^r{EaX`c)P!5j&>4ht3^;%8k--6Sn7b4gz$+TaHlu6N)#NiOb>EJn~e zugFlx#OFsinMMN&`{D~Lz|1LJ>Gk7Fi-ywJS2(a5n+4-_pvLP<;49aSWbLN zfrzVf!E(1bv%+@fIIXkr!%9#1GvNUACqzD(r2iVB%*d3M(OPtvOe@1`=3B_r{1Z)K z%ogIs1cRzJK@)c77SY+;%ZdX~Xj5208KF8mcVbG!5c~Ad=j;dKlnW(Vn)A?98&dK2 zp6xek0Wkit#~NQtF{g;IT-$dJIc(9DQ1>uYm1A)_*i>MK3tFrBE|u7CgcZ@rm>Kq; zWNj6;ITWimz#nnhG_i6|4&fBZl^fOvN-WouqM7`#4b#+^c*>SYW6&?`S^l*q@%{tG zoS?)8Gto&?hV;Q9?ecgk)x(@c(9TZ(L@}# zv1Zwb#Vf)9cBD!b_CNnxTFZYd&wn8b7ZuO>5fsd?<(45hMNZ9Bbs?%Bw}6)N5e|{_ z85V$V?r;!^y~HkM8V~sT7l$=OOiXoXu01qS2?=>RX?QI{k46FOLBqlrum#XXm|KPs zjF18_Dx$Cdh);AhG2ox50?)Ug`}Kjvi6Fj7v$y3@-!kq+@e@9n#n$DOaTuUf(T%k= z!DJAb*hIgDlIjA7r8KuDIT+>ck9h{n;`!F62-cDi0BaxR%krG|kkh$I#~zjxIV=JJ z0wlJPrEEk_nYdH#wjNwbeE5^B$01je08zTp;Rsdw*-Ddhd+v}Z7|}bJtoc;IIGsy&+zo%Q=TADs_8Kt0TDtC_b*o^ zAeI>i5G8_Iq#Z8W;ca&AgO7wF4hj}`Z}PVNC*7KUTLMu+*++z%c8Rz$TtqKgSU~LQ z!3y3yHZ~{gG?#L^@O|V1>pa2QE1hg6inatd?fTtAQ}*=S28(z_2{9sv%X&7fBY6w| z^MKhL8Wlq6-Exq*rprHTqtCKf6$u!ac($H(A;!SMmUXx*YUX)qVV?N)Lau~ z_Q$yu?b$CvcYYqlClHFwOR$HDME%O-JEvE1x~mI(%zBe-@-7Q$L&{==SPtagHdD7v zl47_SK)vlz_0q-TtbqF+=qnoR1!p4U7#lmJDrmVWu5>7tn1s(Z65^ymQ3tZjYbYCa zA7s4_6=f$Dxp6Ch7=s35K!bY_huJ10#22s797YXmW61pKWtO?#v7*OgD>I9gTD-Q= zn}aH!f|25@GOD&}i6|fR7<%Ljd*narzsR#UMnk{%b&5=pMAKG_z9s}B(}|88X2KSh zn`si+AWx0s{ z3Mo}}A5=n^%k`N+vh(m!u?!#^I@v||0tWsbYk!UBA1Ia2h(~+tlad#^np3vQ4Hft< z8VdWT#5MLc5-FdwjVP)xCp}Z9-R}lylUL&SjAdFQ?pfYz&kg*A^PFm`(tm*f1c0$) zSPtL>=W!?|Y6iCdM7D`n@-1BeQkCZmtN|#4m~*1p*sIwc@0lvU5oYf=}06t z^tj4Lf+XQIo{Ma8+xGhyT{g%cWtK`M5X}fxYLw7gjctGceB;&-KxIjXX8;ml0=q5N zBm|`-y>sq4{8cQWgxIwZ)!CDuP zE}nmujqBfn!SN%v>d8*K?cFfUEUGW0?vCUt;Y6|1tVkM#SzMBVQ1GJ@l`z?Mxb`UV zw)BuHs<@b>(wWRkG)QvSW5tOsP+MZrz2%f0Cgu(@ku5IbhslDGUg}ySf-_Cof0$z! znkcYq6Od9RkFW*S9wc7h0b9>sMq%^6b?Px<=UJYUP(;8C0(8vV;kQzEzj4l@qH{=n z7P7dhCxC^;xJweXXCz4%J!@u-L@YuQS#;{UAyGz3_3Y{3CQ(NNVCqaOyVY(6a zF{_qV5*dJa>wvBET0p&`Np&_q9T%?D_2@ms+}phbP83Aph^^Ppr)P@pLu!Jx7dYy% zE-w(d?etw&`(&YF3@ho6mX~#wCN{4kx6M(xNP=Ton@ic)$-WO6{|+WoP*;`?pEHptv2>M$lV*gfMjOR^{L zy>ZU4fvsA0g^IdiLr}6990;+m!iBh?j7z`W*LQwASAA0LBatbxvuS-_7Tt(l>$dQ3 zz@O%Cm*?x9eS*@sy=aMcc|?iw9r~8Rk%>f}{JuJSfkyEh)gbL5ELlSvp-2bIk*wN2 zrtCdlFIMfJDj)k7{%CfL0z^%6U$C~r0yZgvtO5)@q*5udYW<3_>a}B5LB^Y%K&pqt5=A*gl0xqdoIn4#5KuI37vVf$9k|J>LdizmmhtpV`F2?+3{P>kYPz1G}zs|Zz&diC9%X8WlWo9H-E|?f(1oW z^AsbP+rzL(eUV)4O6kaMd{;GLs!&0#`i{->`Z_yu%s=#K)S?WUPYuiuegCa$&zrDJ zbDVnq%JrzJR>|h(_0DtCN2+r#|1Q*IjEtBDXCT*8Bpo1zgv0FXfxn0W^tw zbfZheqzCV{KjTOiB!3+<9~l{`RIQ#?K@L9uPUFjt3rT<3599QRQC*|I>YEOt9)!HM-@bm`D8^)Pb}U7 zTw?+lHS3CLie0%VQNfmhh3jf+e*9d6Wn=1{bd1mdxaf7Wnctume5J#+Q`09D!I|4n zG!UKEin}47MOD&|Udk_<^Fc4*rke_7q^;4b9{K2WI`1xhbaaFoHprULuj#hR4-v5x zh>XRF_f&MWvr8-gD4nyic+9Op{zaQ*Ceq<1hr?b8RW2WNJGc-q!@&yt0}FN=o$Gy+ za{s9d?Y6G2ZW-OB$kH4q69I6lwL#ahc@|FSUT&66I=5{Fq1ue@5RUV3bS@ znXR3i8rMll`dXZ27q{HLyDDbkC>T{h7F_;v-)&7ltLd*=j_**_ox0i>?UU`2 z7-L-60lWMD_ zTj+a9bMu^8OEY7=jv2S}%dk}Srka{sSuM(h>wuoKc{pfFFa2O1)t!6-4&DCc>%FM) zD5nX!*FN7?QU)9*BEc~07O0s@PqKIG(uH^0NG)5%!;l9!a^U6&A-(z775`BuJ{{+r zgf{0U)OPAwCPFk|TgRHjv_Y$W%gI?pWP=ZyU!tpIcD}q^K==qM-heMY{xzMeRpH1W zXNLs~l({#SNjT!;;LL}tTr?Z0;u@}kzKwKd7G0nYSarE+X}^SU$c^D%3P(%>W^b%K zo@1O5n_cdU~pNsvD0S=;GkEqe;NjIJYI(R=!}wzdkAB`@1K_7ZE# z6Q9G814vLm^w{QVHg7m^w@Ei}7vfwT-h?e5LiYAQ$(xr~zLu%WVzs&LZ{kO0f&K0w zQ#cCOZ(jN~li#<#Jti{30Z*(>Qxn~KAkbzQ@lZ!tJCV|BxV9-bF1!qJsO3=b6SfG2 zY9lreJ;k$7&+%-Gji{D8RwRCrRz9z-zVKmi#+m5cAblEXJ%3xz#-v0F+j5HjiA6#c zCpZ$%_=S}^&}y2Dm!E@5zl7?m=+p1xys>>E$w&Et~3r z3|PUo9c1aiVF}Q>!Qv?QpYWe5j^@WOtGb5YY62w)qdo)S02LQqf}^t)8SFqRq_D-4 zh!&2*DAN|5bFbcYSQ;ny+$3%FyEVyX(tlK06poo@!iw}CrRFbPq*3GkhU!T*$CAfg z9Qmp5P^Vq8fUIo%afVtMN7RN{V->?Jb(8iO@#2Mg=hO)3RbmX`dq2XXBjJ1^Lcb*~ zdnQ{A%@dxQLkIDLTS@H_P5H7YOgi+K5Xucw3nSsrwVLAwT>%#F`rH-S)5OnY8eQL( z`i2-LT+8S-NV(&uv7mI9*kr#&!6|f@i%+B!5vBx1M~>Y2;Dc5~gxFR`!?<<~5XcVw zR-1z}dSut_+bA8ld9+}*Xr_Fdc^>V}+v73@IEtS)cIZn6n9grh!ewbO7YkX zG$)AKvlb<=AF@Z#|{GTl{qR~X96^t^FwORimbb!}c`#tgz{pSt(=V}PP*!T=ON zs<^VnlY|};GC&esqa&5#`yBr%|GnbP!YAsy*PMKEmOl-H)I{UA$=4+a)Dg{$;F~_W zIFecH!pV$SM4|VGSmAVXq%ykJL;huI4sozYtWjZZAS4)DoS*qFw1)eJ`zAnZ`TmH^n(>?ImT2{j zX?j}d1YE12wA^4L)iNty-CB*iZQ3vdAqq%Pp4r7D2dZvN&XFRNEA$=!5QTey3)Krm zxtzl1`VNGK_J*szGYu`ySKvHb*E?Id=?W^mKsuW$$HeGx3VjOB5%IIl&mclB{__zK z_`frq_w=*tCL}c8pX2OnDxkh;;+21{Avvb=Xj8K(eiC-)n`b#3wjM}<=XF+E9{nuz zkaj9O=&KAUazE-7j}O>(1-uW5pIN%(dZ#KK4K5rynZ7R7?+B;Q_}+eIX0`rgv2wo} zJ*Q@x2K!ivCz1uF27 zE@|L8{?W!PQ#az_jk2j_c63%< z*gP9TqNp>qlx19&y6iAIQb%cULSjr+H~hVg-<|$od3Pw~Oz9aplzobQk0&FA=hp+G zw;f@FRdysouITyEKc=qFvPy43FfMP9o9-_L@NeS(8qo~2FP&kvmGeyXkFQ=C)hw5g zGZUc%vYhC8H8L-MK4qHxgE@R_<-a&osg^GqR?F;mB>_J5h43EFHBa0cgxV`YCC5q% z#0yu#$1LB9vFjbW8ywW@6t?u)MmAeakFdE$T?@i3x(NK$42QQ{LnKU?tXMx7WF=rm znZmD_!B{6i=@0wcZYd7#Z2M%tPgU&s2s!UP(;VCh6X7~YNhR9Ev~swsq550G@yw!F zfzVn!8GfG`v1Qd5nV56XJWIEmMIHEUCr^_qLa9i*`y8~-(zj`&K^`S@P=<&Oi)V`f zv;m{}8mTJZ`_96eqqy<}3HDZ|uj3XwF+f99Pq!|>L~y%qPl7_WS_!BqTK{yX&uu{jONEn=ZnQ`qj!ut%Sm9JIVw&phy! z?#3(NI=ppmB}tz#%b;b6a0WxvvCjKGe6L1jFxh?M=krd8^SjoFRR{jxy}IQ@6iGG1 zKjCdeMX;{zV`gmGn-?%6ta$Nb_7Jcg={Ed9E%U>W@9l3AnHDJfVJCf}fvbKwk0s$J zlP?uDT-0~ijwAi?jfQ)%{x;{j94@n#4Sf?UjrZws?us7C5BMv8#Vx8P%r3sgvSxSU zfr0q#(T)s))GR zvQO`p(LPB!4w2!6gVN2nf52v`>HPrhT8Nc^&BX9Ihp&O|2$9u8W*`cVlIOKQB|&HE z3u719ahtRE2$8KQ(6CZ!h~ClzSrM$i=_%@Ve2jgxHd+`Mtp=;~^J&IYLY-Jj|=sSn*S7z$mJX3=~s%fYHb)h$Qu12M)fVx{|-Jw(R zL;vfKwlTA7zy9(EWQ)J>io9%$uN`y5+_oC1?BXp7x_&5K@`kT1fj1rSugPy6C zjmpFpo%RQP-yw}rgphuqO`^{;(9qbwhB9V8dp3wjz#-|4$k$ItEV{r?t8gojaj6PI z$!jf-k5B@<{d;dc86E!!>sk&IcAPX}acYpZqDxc`i(+n?XMpW>b6;QIHt{VQsn z8;lFkNL*^)SL+y~=d9ReRjoEqbQvc*hzm=jH@q*e!?QKie8IFV)h`g(*!tXKqVaPx z@5p3Ik{k8}Kd)ia>rojU1^**n^7QPia)JqQ0UA(DlU~fU-jEV|8CG`; z7|5aYKKRi-;(&m}xE%#y*dg#mAN#VRrF_AX~^m zq8{;)!U&ogN5s_NyytD}a2hhyC`#2FEn=-u8&^M4wlxj00wr`Q@+zf7%S;P17p?!7 z=FU5+sjutvQAAX_B8W5C!t$jY^Xmiqrt1 z2S^}5AR(kpe$ULa*34Qn^S%ITvu9bUo&OPVk-o3wP@6Y-B%bnN9^T1;LNI^UG z>C>nF{^3f0AM1HIo$0*%ifcH{;p5Z1)0vv-^z--q*7{P#ERsYl)ruJY2j-9w2!K>j zOS30s#K*`y)A&|*>qGtYxwFpY{=@Rlld42)N~g|69-ixJjVw?fq|Dg6UzT}y{7s%+ zDXnu0Gr*G~;N2mc+1uQwoiB?P zBB|)NM|DqQlV!xkeOu@A#BY9m=UrDtS_mcoto?fR@99U!oot2?yqXWj^52iJc_%|> zlNOUL5KnFtcH;4PAr771Xq~1Rz83EfNg6Vu4hl2BNzAggl{&?r>buT`92T<__OKyZyJq84-pJSw zWoMZE#fzU?*m7O0(h*6MN=xHO5N90H(t)k>?S}0x70;gPK7AURgC?G1rzs?+^mBo# z-a+!|RN_PSL;$x_vi?w?Ywv1vyl#B#8X7IeuyLO{(|uWSDRlJ)F=t9NTHbM$14+rm2Iyb#NF!XSM+U}0 zc?~&G>qUMZdeb8RK|n$ERW*r|#@HN%PR^0)5IaoVil?%`RV}Vlt@Al+L;Iu{me=>6 zd^9mtV#}|>>>Ou!o(^nU!hzV{k0y6J)U;yls#K(;q{PH}SN1Z-t;56YotOV6HD8_G zCd^GzCMQ!;9&5!t{#tZM?&+zxo+;W=hC6Xnw!6+kdf2mg3NzH#*Ec*I+-#$qSwTz; z?Nv@$QT>0|NLYjU8MC1^7k@8>%9!yu+8jra+3D)bMdmFt>9J-VM9B+oGDCD zvkgmj;mlgVAp0#9l_`gsY0t*F$+^kNrCg)OaZeak%hjLp(|WHlwSg#~@1lstcRPe2 z>ln^&ZLNPmfUT@~Z)eoQ&&?t;+rbasS&C|c?&}Wxuub{%2wILJr*L>?OwZQ?r)Goa zk_BaTQl>Jqv$IoE9d~rv%Tu}z^ziZxSI!707nhV=;ZpT~D1S|*j}a;-cl%=KSuL>x zS2d?RAFmpVx#pdSWHC881f!So7ygOjk7+NwQQQ#Zsr`~Rd29hEik|D@l$AROJDaan z=IyOpDV;uZ5Y}!N+c`R5$6PNItn4~iBQ5oh$K>fIu}iw?6R+hUQv;d$dP0vYE2ks& zv{2)X`0nKcHC?saSTd1WJyB?=dWi3R-iCkk?s=Ti!3w}U?#q}>kF?zxnCfh&WS z#KGUA_r26;j%U?z^(PPU=8!6rj7jv>U=HyN#k4ADmG+LG@NROC&7#RP-uk!Bed z#?gU*>p74wXpbfgYzA6Mr!C;jZ67FRKC9Co92!b|l>eT+w#s>2q8xvRsxVMau~DCb zd5ztD=j#2zWlTwIf#}9a6B2T5&B&~r!s!2f3@7HtRa=NOBL3`IlC4Eu>^+q;$2aSd z+rh2vhNQD<1#15QH5!oH!pUOi-)mjt)_yh^+$Q3TT&tS(5MIM@_B8Ku?95E26d0vLgt^yemZUE6MldV~AU*2fWp`R%X08@~E6W=Yw^ z>=cHX;4{sbf~tZ^kMe7!iQw1eZ1F+%y$6D@Y>Xjhs>WU=AZ^G+_cpf>XmFeE5kB z|G8-cNE)IwAjqr!?x4$3#%yTDF1>7W}r0 zC|ak)r(J_0KSP#)90<5iERzj=Yn0PD1x$_4R${3b2|iqs@2U(?$Bv zh}KZQy#JL@25q+jnIK2UoQxRB)ILr{iNiY~o%TD9Ba`)q>bC*%9 z|KzV(h=NN+C!*h#b~f^=`qlP2Zz8O~Os1kjWZw1N?u0U+j+{jKESmH2v!N*VM5moM zSen;0TY~6Dcce4NvDB9e*o6CbNQF{t1B0vd>A_o0hlD!$RzxaIjrKQoS}Vgx@Ow;q zgy9cao@eaSBlirmzuxerN|?%dRFGpn2WFVK+>GgXRGTaNBmb%<(bLhZe5}||yjrL~ zxs|>Gfm-D?4!RzjKe3j|Thre=%ZemCS(BON?j}HDm9GpDbEhr?Oq6xY%JNP#175PZ zdAJwU6%m>p6{<~7GnsgpR*aQu?450y&~%=++nn1>qFr`J5^idTgE{%gLc}`{`!xn?|{B(pB$Xo@R~`A{W@|&;I?W*~Iyp=W=~wDVgu< z{iV!X(8tPvZ%U<+*1|a!*sTy7CV|oQw z@s#hGHmI$P`bnv9cf0cEcbm+&hWTq(IGpPy*^du7;LRQ*H;#PKAo+ zR+OA;db5H@D!ule70~o+n{w1m4=NxFeJvU{{k-(;FC@v`Eo}GG6H5c#mN#j+9L|o& z=X`S*4_F$!Kw3Ve9w}SY{Tv^gAv`&uHK_X=aBnQ(^XFfC%*tgScyoW{PRuUwy5ScH zH^5Wou>udRqOBhX>DhK}>byj5J)Ef6=988|3S}wGZ8mb4T~OGadG*|)UCd-*dNcTA zru%Pe%&ixRYj(_MszcM^lT(_;u;&(L!sXsi(lLX_ULnTV_=*Z4a6;>4hccqmU?M2I zdP+=A29J3J_8qc6EZgo#LVR=D*J+SzBJosESO3_->g(^ma2jTBf6u3TKp#`-G4#2(bb_n5?``9EwZZYv6t72J`gZ{BgMLolsfH#=byM-JMY> z-I5Anx!y3&-&)ujyx7Yq(cXO6laFFxV)nf^jx1Dz06O`b=(JtvzvjcP7MGKU6oQ zb56-L*Oq*%gQ#=jpPO^XxUY5e0BXWjILBZsHnw#otynHuYQ0 z%1j`|N*}>zMoTy6wJv?C$4R}~{}%M=G%{o@no5)c7zMVJ-kRQq-Fj6t?(7x68+88! zFYX{#5$XiHJUiJE z6R4;-x6N8GDp?)b&>(9yGdHyO;besQI%m)6!b5>SSY3(og$w1LYKwpn4_hZ)uj{YX z9|HzL$R1X$pv=VQM;+HPa&=x1>K~&-LU}AExop#GL_c1J)z@AN{f2L?;67wz=_l+o zx@O(eBl}xpqTLII<>aI|oi?6irM){o3ma^G5Yo&uhC2F>{15^G{ib@~d zBWjzqClqUEUwtIZq@^)6oB)38vH4oumJAw2Q4ZCMO`=Q^%*eO)5S`}`85b<9F1b0@ znPq9In3l%gKbIbzrR&A_MZiE@xwZbPC4Hs!;yRu!8ftf2nHDL%bX+5?9nNLp|7+03 zG#_AuNk^eZJk6d|rotEh*x+X`vLZG<`SS^nY?z3E90c(~#)thPygY<3KNCD*8{EB)_WnHxY?qA>Ek$iVon)S#vwxjs z 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�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 literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/tl_black_logo.png b/docs/user/my_figs/tl_black_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf892db9e0b6035c0ec9ebe9f08f4e28f9ba847 GIT binary patch literal 127091 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 literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/tl_transparent_logo.png b/docs/user/my_figs/tl_transparent_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..359a232dd719a910628736ed4cd724eafa85c187 GIT binary patch literal 150323 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%0AJnFXtQ}UI##Py-sk~Y>^ZQU|@U@7(tI_ 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 Ba_Rs8 literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/tl_white_logo.png b/docs/user/my_figs/tl_white_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a42806d2026db643b4804914bc3a09f902dbb0cd GIT binary patch literal 83507 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%0A%rVo&u2i6PE>n8 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 ZR0yUkB(!S7gWd>)f}E;s?rlTw{{f9$#Cre$ literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/tsne.png b/docs/user/my_figs/tsne.png new file mode 100644 index 0000000000000000000000000000000000000000..848d7affe01927e078baaf040f0adcdbd300944b GIT binary patch literal 200160 zcmeFZWmHvd6fU|E1r-Dlr9%-#y1NwV5CsIJJCyEj1*8P&6e*DsknV1fZjkQozH|GX zTW6df_x`&-?jFPOjgQ!St#`e1&Zl1dU%wK&bDQWk0)e()XN3OC{9a#PO_{{NPR_&fL^jC;s`D1DP|=Lp0@goN-51&8?cN&Dv!gXAqc zM>j@QpNm+hJlqV8jCGETSsa>p%+7j5_AZ#@4!iY(?t#X}H>=^#72bk-|MSRWbX~Xf3Mbl`DomKUuAxA z+nVCv>#4Z*D`DiT@j7*<|GyuLe)y65zu(0TUu423BYQPn?P@&o>ydf&$x{>*l!4aZTWmURH1?Ys zArr^35T)rR;hgs0hlEk6s!Wj(5QxLO5(>C*WxPuG?yxf(NWkp1Hk>!NxQONv7e_pt zrzsny^WP^>zKa!IgiGPFoV{*3_PcI+nw*%J7%nAhmB72sqfSd)KJ8|KEGulKX$TjsE{P^ZWnT?0?;1{=d65!s$~m?&9Et zb{aN)PBR(#Mdl$I6#F_yf z&kt6MZrAn@qrDjtsG=rd%07pFn< zp7G36RZ&Uh<6vc_qNc`5VZMcqj*dsCeE7W`7bn!+C^il1JXNmThR|;PIA~;q;Co8S zX#Sj%WE6w*w54bYj;boJ)lzp?Ud?6L?$~Idd)0E7h_HqvQ4CC%P=(KU2a8>t#JyF{ zVu&fX3TiB@;G>|CNml`bPKR`vvp|sm7YT9kZ?6)ZsQZ~kgy&C~34%m*Me$LPow4^x ztM%;W=C{kP`hl8vQKuXqGOJpIfq| zNa5f(uKc^fR@QeVW`gu8!mL($7%D{tIy3bfgz8~_tx_WYCS79NY!l~A3};fNyJQ-% zX;Qi@<&^M@KL2ZOe7GsS+pS9!6uU0}reQ0q@#Gi^e$-3E$Y?^k2nKx^J;g4?N=7a$ z5Z_lkdK&p}wYLs8_EPlP)D-eGXj7!_;W%dgkLz$gcuTI~I!Kk$aTmvt+W6n9!teb* z=mdHmt*zqc7fSjzgcKAy_5V6B%X492uFFd|LiJC6e$h;(G7l*z!cZ1FW7;BUJ#988 zA}K^Fe<=cplrZAYyl& z%X5*=go-Z*YZoVLdHsaSRepYYX#a)^VXYBcIv>N^pO`2pVxUFZA@TpB-)_+pHA$ z`1%&wuHl)On&#){*J&}O@=O`AO&!HTHMsn%hA zW5VsGDP$HP!Wq;*k@C7d=HU3WyliB*c}~CZ0iN$}-+wo5VP%!B*VbpV{O9wqMwWD@ zoIaO@7C9`1PQ`5 z+y}WQ#h*SPC-2FAw=+@s4)iYWn50wM+heQammIgMH1}yobg>i2xk7a#6zUYcA z`=MST_ka7`NP1O{(}NFRdi9Z4k!l?IA4K|}5o0T=Od?-m06wE0a<}f@EjL60N;0G6 zKW_-ty`WCKkhjq)^^k`rmRa``4iS;0oE!zY+Xyrr&g#okDd;Yi78bB~?hz5S4`$T` z66`R;M*nSgK{oBe>YbWOiFSvmx&Gs{)#<*(?h<3|e4FO%>Z)jx0RJ(qS$Q#tS2D_-Piyj@oknYYbIqW>5{tQ|DdLL?+qse=>@ek+6 ziayY(7Jqg**_HqH90d~%6&-6m<%Kt=@%SNsb0FcXGOLA5%`2I)-^M+aj?)M&CIWFu zNn{D^Z}5J(fw8E+J@^?KGqOVG)9?ui{cEmh5Ll!c)FC=7)! zx-G#44*879$;s49c^Xwu5gHm(K0enCTiM}*P5$*l4JVi*$7g4~zm4|-8E%MUMX45> zd^hf2B;m37@_@G5usxiy-=@3Lac^erjNkca6K=rVVJ?UUuxd27wTpZ(3U5F$kBtp)el$8l0BO?d0 zhQDx_j#=+7zcHIEZ%T3}Lw!g|>GSOyE%H0B63TIiiKWEFnc(`-YMX=Beiam?YgBQ@ z@Ht+)b?cT|sm0|e!)syTzK_V^I-fS2rKHKA#?=E2jLYR1`x7>KYhRjMX?b~XmXZ>* zGoeg5Mza?o&JFs-CZoTKi?s)SB*U9vG3Mz667EqWy5eeNHpUK+#lJCTTU%F$qdD!^ z*whpX%K*#*5BS2X1fI4=|G84D1(wCd#rd|cQEgwTEYIvPVNX3~VF_z(y?GB8*V4}J zsVWBs5r>IS(zKO^YtcPl?5jFW_lu_em1!o|)1~u+VM3MP4sp5a(-~TILfEC(8ZgeX zVYeC}t9iGNl_)5a44+n!gp<=A0Ye>l%ehd)#9aMCzAj2Q-8&*+EMLE}R#!`vL1#=6 zy`z1)Zw{+tu+sN2kc>a@?_XLZL(}h2oSC2R9Lk9st+}%QjL-PW$mlv;#&(mWz^T#0 zFMO+D0o=bbUu@?^ZcymLz>92bK3ad65){?)AeMAa2W?Zm|T$7$5VQVT*7 z66v^vDmB1%Fn&&UCxB+isgkxMNepGXi_>Hew;Pv3$@uKr|ia@CUJ8<^S3`GH$C?)bE{S@?U&&<#)NJi?-* z#lJq4SspE z=7oW(e|Bg}r}Ep&xZl8HbwC31-M->8Dk?+CNIDr`tej|mXVFiZONBmC^bBl^(1$+6oIxiNlW0ZG48#1YUbYG^aUP z1g%m!w200)&Jf4FMP{Qv-}a3pg@rw8YdZpoIsF0HvKVw)z#@uPIo;_m3VP{_wbM+@ z{_EGT+WLAgnzvJb6Gz?Ob&urFksmu5D>P5rH@NrfDhpvA6fgTbE%2w1y6CFZhL zi=85e>$&so>}0gGnqgrkrEV85X%wZgTy}Ou<*r!k|M6YK5m-B)$TyY9>C6n$&G#3p&6 zq50g|)|`Yi+tQ>xE&*TZi%)~Qlrw!j=ITH5V5vM$_V6?K%zM8xzj^Z}I);#dby0qI zu}drfF9b%dW<$%f|wSQ8;rna$h=kq+;&@2693S_oAuE`+J+2r0a4!r-3hH?WY!yF>_qG;J-sO!HtWX^q8NSe5)%g$ z6|v(psMQV)1w+GolclJxn5Q8DY@@<%NKIo}BhB(1nDSo3LQe7wd_3LmIOs&{;2?k;^1}`1ZALy={r6ax z4W$*lscHAy=79yoogOuP4k~)A%CQ&TGdVSNo3*gfW((c^C=4ntia~vBc5(4jh%B?! zf>lSsh3kyav(V58xx|)cyob-0jnb>8K4Q3%pV+4KitAALe0=+eV+ftK5XWX?EXc>_ zW-O<9bG~lN_C8(XLPylQavPMoy1My}sF0c~0ojAqyh4`~iuibvla-7EY}1CxNzZ&; z)%2q@37*#Mt7*y8*H`W8Al3L{lN*c|o0?2lCzO_QQ9OQ3$mhV6o15$N=@YP-?xGLF zt%>|+x;+p6XYmJrt2v05^6Aqwm(9@7{Km${G-pA$^*^PSQYuBO;?mNXuBZFoY}dTr z71wk`F$Vg!m|sU9zFs?ME2!T--+h1htmev8Yw#zzxVT?SOU89nG|aTOSx=8o8Jc=~ zS3I+Vi;a3?eSFSGMmL(fHZVH78rl-8m~Y)$dsj7*zV%QCR zeb;z-owIWi-j!P1sB*H^UXXNuKa}m=YcxMmR!H6N{A91MXW<_i4fQ}Id|4&{$&niix0e`A;%y%~f^4MA@EPmg4T#axD7?R)fx)8jfkiy3N^!^Q}&Sgsh3i z{Q|nZ6q?Ybe#mDe!b}u@x~p~=v(}q}{y)iZJt>61B1MITuji<^iWx1F5lRilO^%1QR8(-E&ouZdSG!P?yB!MvFAOB*z2<)P76F(#7z4i>=9>kM+0d83Q`@=9!_C*Zkmj ze*OT!#$skum2KZ%Ts%`7`Rd{ESmDQO9KfTPWPD!l3e&Hw6WWeOBj{B%WU^ z@3c&|C0(&gM%owv?3Xirm_Vkc7QeHX)fDz5%fhPQyGTH@vZ`vv2jUq2r0LtM!|u4W zS)GnS_ME;)`*cF$;&+jFyX>C$ROQL`o~jg#woHvGJUcr(g`WyB+|~wA9YQuXY*JAS zjS~~`gscKo0s@Jk8l9gHUHiMd-1_rvmRydX(zoYkL%FU|P~Z$|tuhy<{=#XPLn1S) zKWnZ&`{{8YNAXjNXUl9&0ZZEF$H{ocFw)GY69F;;z+Mkz*bz7~$09$g)rD463;hQv+XKFt8`dn@-D$yX zjpHOo02jd|Tkq*kSo&2Mkml}gUv8Ik@P&hZXO~7gN#IJi&g->~4#|&qd)Ft++1&;3 zp+b73K|yL1W-}S_`*epG1z1pXr6UGw@k87~^J%h)2`j*$Hi*p$e?8DyI^((V#l$i& za~VvVgGqbfDx%px@N88L`}5jw{(3+7IXray7A{_)o`hH}jt8@@8>oP)wGB$tq-;L~ z0RO?n6+2viB3~?Y7c|J1)=z=3mu1RxzDaAx`}y{aeA?|yRWwSs0I*vmc!W1ZJeK19EJU%^Kz%8Sfd6!bEJF3$G^oDTOXIf@YoEG#kQBAUbk{i-DAapRS7 zq!iTjd5f6<^FG6R+j4IbpEarNT6J9{J#W&<#nI>g7-hEVlI+QDUV(OlQ}vmde_Kc= zfA{L3^U83~*XZc^96A>lH?V!0g+#>7#- zzRU4>Fj)7Y=VbL#1=1jg{k$o7TeOkCzKlhx#Ji14{mxJW8^4)fq{(;k2yES?RBOq z&B2Po3k^-Xc`K%Isw(PTSpiuPQB{{G>Y34SF6xcjl=(I*asp?at)8ew%Og7%nAPCt zNnij&3YE^5dqOU7wr+oZt_ava^@9@jZ9M6#i-o?gby^RquhrJ$~EpERxZvK zkc#5?X3*7V%%cRTkd%jSdRs1cBJ2EgjnT(<8cqDf+yM0S7afs;uQTOtM$m38o^9D1 z+DP=QXXT~8sXou*;^MN}nRRq=tx0{Ie8|O<+f+|M;61}LT0r=Za#G2XWvG?i=Hlko zH8blTH?QdmeeBD6Oap=!JyL<8RDVFH?1x2K{wG5go5%Kj2SCe+-Y03%Ec(3TCH7BP z3RpZnWuiIgK?z(AWLV2I9r=~`VK}!hO$s|u^f53=owl$DOcE|k=d<9Eaiwn`hVO83 zjcDoWqD~0v#1e|hf?B6;)B$o)zCXx+L9O>{0_+EcH5>Jd*G!W-GU6zni}HcTV05q?Jw}c)yKyh=Pbj zaPjaYq0<`m)^jenPE9qPtY#TcRJ&q8v2vJ<;uD}8`%wziOm=*_oU zLKVg=?&YWy`P!~g0B^Xd5}smdx>0`6U1flG($mX7chL>e)q)l*^gmA0r@@_O|a%cw))xQ zlih{6k$hdGG;KM{21?%cpCdlw>C40MH|4g4kNGMw5g%{oXwNlUfmw|B1#q5%qJCwJ zo!iCbY=a~|A;Ea6(sqn-o$&bVs=L^<#L^~Eclpn1j6qQszRYyR|KS#lfdV=I#O}!4 z8k?w1rO@C(e@4$!m`Nz8r(akz&{0r)$q5$|2R0{P`1qEHJGx!E*t%W0lHVa#bkyP( zP1*5ePZYS|EHosCK}OsayO64w^PB!~mq{kBTC_jCXJH^_XtB#ThL_Xl*uk2Jv-q28 zNi5Q0@JmId_dp8vUf$kD{fp|&A>>lP=3)A*y0%Cs@PvZ6g-LS!Nbsr>4+8_^>8tqR zp!BEzdlsNQT}H4_zayP(_zPnayMaM6bx%Tq?CWghsqm#VsVME1;AtpK4HLbk?&)W5 zf13QXM&henb=d-wceLl{u{$%qXjo)?35#Rbuc3Mq@^J+x@T%^fZFNO6)x}+1Y=s0e zNP%AFiPX!a)pmuRCjFh;``gusj!jl~c~Qe^y{NW1QP$9%FrHsrY|tK_w>(|LSzK(V zkh$B;T5>hzJjm^6btjIKS4ThMc?cQD{b#Rf7S==poc0#uf|jSM9wW?aCc`O2KBx1v z1e3OKS*O2f-~022#$<9;?Bi`&JIw^j@uCmt_>755RYyEKllIp6MMVwms}I7$ignGC z#P#%C*EjGBtuxTKs+1n5bbz+VhBTU)ExE0o_}E$}*A6#Sqhn$Uwdz<9>l+&}g6@{F z~L{ z3_P}`vD2L`XCmx!PP2_Mb+rmRU;C-d=iTvU*skXO_e7S5%`q_W&ShLG?;NbEC+oJ@ z_ZL;StPEyh6dIlh?63Wg0ja4al6eCio!R2AZ}_t}pLJWnRX9x6ZV;tYW(tYpG-tM3 z&j4{U5io0C&DC8*py;#Le;>3*NX?#~OcDfza&dJw^zY#!K+0_FOT%C$3aY$xdh2v> z%Cw-O`rD`>k-q{2!P&wdftIEx&Y#pP09i+Gf;-nXD>2M0z2gPRk6VxS*Oa1A(SKU~eNJ6{`jgwhfbmdiAjM0q zV1Jxq=AAmA!nL6-0Nf#J<@=nfC1wVPCYq=FCw@%<_IMqCqq*j5Pxb5lRKR zOaw?v#Cp-CE0EAy`Iia&p-!&o$7oP4DvYxU??(& z%l*GIp}s;NZ^IQoQ~q@qCd2h_T6OiHyYufj!l-}^o?r+V9y6&Rd64o(z}hcRZze>y&TFmVBzz7I$f!{dN?0qb- zdvfTeVuHCzZNT0eZG4;ilGSY@BYen>9}IAts2I# z)#$-2`(G}Ox?y2zD9QzmUy0bS9q;#xV)GdSAbII~Xb2`yU(PGY=BjLt$cNbauUi08`Q)`BR09RUE)l|dKU#^7=qkLBRKjCuYI;0f5_*8%B|=u zr4%_YlIJ=)SYFpq1h_md;9A&UU)`SZMmkuaz3r^!sT%iw zzk?VW;z0UESfnbJ$J>v1>^Bd8vGTvIsH=McwMRprmJ#Q;=ayo%fUA%jFCKuG<>%+H z<9;2;4V592z%s)D=3Sznngs76Dk{8BIWgp~s+C1kLLK*tt#)+orAdzVrOOPWliANU z-oRtvyFsurlyhAqV9|M*8#G&^$#QB)OWc?3p#aq;9tdYIY`=pIjBUR3G6DZ9x2;dU z(~AegSCnkO>jd*Cd$WeI1Bs9Ru9Ss2t}I#oUs6}G2GkTfLf`{#)o3o|x11c`*J}^= zl6BF*4&iffdOGdAgiKg$e`U13VmUqA(h?1xkbV7yROIu-;$F|1uDN;A;+{s?z1HR4 zmznYzD9|S!J$?EKwDaF)lffe+Ty7`&0PrFK43GkWuqh352cPmTncJ3Ykb$tM3g5m1 z*tQPHtDv}gw|jZQFdO;+ldvG9D{gwOM=)-7YufWoikrk9HzOcF_z*&FE0XT+Zsf4= z$IW1NztmamIzt012S9X&uz#4z*uFK7n#gF zg3TDhXRxC)jjs?SK9quteeHs0UT#klNEpSKVXCkRm5oU*;FqsU^}6&I6#|T<+U907 zLqkI_kABEKaZGCy`pB2`-g}!$9~g1{$Drl@mXKglcfFzPXRCw#iZ{YIAo83QZiMy#SHrKP8VmtgtT-c^u`z7 zpY~eF(T`7-Y+X)Q3=#hqH`I9Q+|h=Y$W zwbX4&t?+{>Ma(_6PKjPe1<5cptgh5|t7YPjG?d4&Pg@dV-Yq7v?Ka`Rh37zBS9f@y z`d)WN5{GpE2^}3>G?yg}D%yTsbMsL{l@@{?Y{y5 zggXG;vf8a*2QE=+vvLoC6xlmtFo0uL9;!TO4kDHj61tY0JPbaP*5gMeNZ~}{kMMNz37Vls|*?j$qi)_dTVt^<3GL?61iP)Wdf#(czhSB8m)F6$GD^vW?@7M08xLk z-#Op9xr`w23$WH|3tQXYbo~fIcI6))B&a^DsjXL~SSOse0PDm77Q{PJX%GlqH2 zG&?(+rJT;uA6Px)YduOzuq7n?&rg<^0Ti}Pcfol?h(AlrwzaR3QbG&)e3y@sf%&ZyA6XpC_=jsc)TZe~-NX50Z zbR_&}y2@~10#GX}jm~FeSfR18GiHxHOX)0)?`pH6OqPG+nZQ)MbH-*<%Qy}x=~s;> z0-?JLw7W1>${hEeeyKFJ6&G*C$az#KDK4%x@Zff^_$Q~NhDV*F`usQ?hYpA%-uWNa@N>i_#91% z^r>;>E9}%kkv$?mthp?Y;IUohALNF#vd~ne{g!M%y4fWEeY)fMxWEkGYd3E9RXH=F zVIF$~la8mJwoG)G7l3aDgo5QxqI#=P|Dm#`>yVX>a4vH7<6IGjnpv#^|gpmEcK9Nx|F#r%8Wx zU}e55E(DZouMpW=2qHFzuMxDvyCB;bjTaNnH3y|DWcFcaN*)D%p6Jl(r0mf7_(@dH z=GJaJI8Q&^3z-hgn;o{Q@W2K)0fo8_UsDsM8hUWt4f!qd$5>NVxtGBCPlBLi~e#vSL`Wgd_3j2$CLyBL({C zV3s0B3ZP<0OaOPphtwJs7nk1)?^C&-3hyq@SrPU}B+{|_+=_~d@qCW)JpyOTyE-dZ9)lR7+_Tb8wKDB~6Y=uXeu_-oA;=v_$7XII6Za^`r__Fn0pdlp**T`q z-WA+`@#2Ma%^OGo z(2LkykEvIV%>Id($KIDOkB}JfTP*w9HV9T0;2LF+MO1Wj&jPC)URX_$ zp2UPql_H)mmGv{FmR|{YY$$b`F%2PIfK1W&FeO0@Rg%loB&!^Ccj2!R^H60mDeX+=jdQ zl81YOhnt(#YF=4QeX`W*$rn(*>T^^%L2qb=8vFC-!}S|CK;I_5Pd(doeo}brPF3?S z?UW=3snBURUdgQ~wEB7#ge3{jZ;vNZV|?2xv$M0H?Xh}#M&4&M1Hp@jC<6Bc`(Jq~ zfIt0ImaGS0FzD`XqEUOot3$5d^s07XrMSO}FZJp*s#_f-y@{zNRcMfRmz1>W$D5aB z7BeIo8chVOPaXIEM%jjBx}5Muvo1B|GM(~)#I@LY5(_>J`265FEWk)aI5^DL^%vem zhO(}sqvH?~N`Mp66hI|gm!(>Q;(WO7V#0f+erpGkGGJ(g@!FGFE$kv7`+5q>ICd@Q zE``oVSdomH*Pgq$@G0eedJQQ?JjTN(Z2L5WS;OsYDOLcWF$wcSqNPHKR*3_V@9KRs#ZAOSLL z7;Q;4h{s}BGv3(cbCBzrYq?4_9Y0zg%E505xoWF)EJX5hT&iF|>OUczkN}}c2=$yP z4ClMKGHGjfT{#-GbtmYTIk8iw6+7P{_!S&MJB}DSKGTHZ9E3@HXh0+=5t@w*+csWD z>ak!l!=8{hTu(2EuknQEVY#Do6Q9wnapD~9WS8A=IJcYa1DgAVErf9|z#UFe%FBh! z%X3H?$!{<(Y}I^*dtk9y{t;MB;3x#@$UM*yq`wVj6COPgE-^9sd4>-_fOTjJh|+@s!X(<6qU`|kSB|N`!$QhbOJ>^>RB(Fx}v`?YvpZEbCc6R`q1pK{C)fT*O_ zaBczt=3Vk61m#f+BpYYuV7W>OM@$r%fw0pSf{=sgLzrY~CM1vg@ z92dun=8YoT^Bp#6M*Q3qe>zB%EVC^0gp*~~==f3V;G$c@Mgkx}?pRq>#Sfv4c&;5P z1V}osPE_DP47c+k8}P9#rI%ceyIcrp;L31$CHHiyT~2P@E)VNl9LiCZOMj=BeN2?4 zm?O@86vLX~F|QR3TOJ}7UBu=JOVDdp_FklV$8+;z4m_w~JW^CxhS>P1%;`7pL51j{PD18B$v2 z?lEBXUenUv+0vZ+dK4xp?wHG;F5NTf90y&o_D?eE@<={A^pMu1n!m0s=SL^d!H@|s z0|T`7aO#kR1bzglxpj~^0x!_(`~+im;VmWtnCpG|Rgv-HuGY}UO6`(<(B+X_#1mBz zjuU*+X>ySpTOP#e=_DAKLZsZX(Z(~pP3{la(fBz2VldOq}3Ci*1nTXBCsQ_dwMLQz5EasYR z5n*9rH?gr>z(SiSv$j51eGB$32#oQ(_8j_>CTWs+^7*qLFbVrY7^{zoR8_~Rs?qH2 zm4>n%^(^0el3+Sj zNh(f;L&R&xhl=iY6U3Bj)=O?O4WEL36&0n~uGtgv9?HkE88=61zDfpF4=N9iBFO$! z%;`pUc*{8+RP@6IsBw@9LahWBs>tlN6v1MK#dwQwxjfMWisCWNxG zw}(`N9Ji`ot(?3`t$?#11$Gg>Ns&uc3i~5_NA8FdWdf zr?Aom3HZ&w6HxO`PR>N0szCC{gj+Jjjge{s<{8*ZlyRN?e$C@iN zxB!uiSEd%0mM|1fXJ*3^phIozUA^ijlkaKoF~9L)_|gwt#1ye<@=u8+5b`Aybi3W) z8z6{bVj=K&jMeoHtueCk)SQ|bogp)CiEmUxVrHOZ|(s|ms*c3zS&$sdGXpzvc z8>ACfg>zJ}$Cv2lCNA7-oDO111l_`4C4?z?u1}t&pu3ST0FDn4AQHYjzXACZQU-?6 z7-n6p3OiH7{pDn^7Uim4ZouA;hA&oE@5zad^6^>C&4k857!QKWx#8AR#Ie(0iGuPq zAFvONlG(<{9gp$S6U2*O#{Fog2gLiex?7XE^PA1{6jp-&Ur>bI)xj(OYq<{2iruyPW5Ux@>+G3fx0=i0C>3O&cNXK! zGXl93b5!{Co&B6`SNa|g?llFti#x`HI=hr)zL-~25Xz`Y*YIhurM`Z)Cc{BzYD$1Q zC6!`#9Vwegdw6?4rdQQy7(TjZX_@!>#~+?@+dZ_ft5c2d!qf<4Qp*IO zTKy$k&mW#l)ldh@0IWZjnrmVF(;D7ywx;EJCfJ1y}-u{GB z1zuSnu%_IvPz5e*Fd;G(AcaZ5guk$A-;;J^sPLbr4l0WL?xU zHf{r8Y(3vfu2$nln$inwofV>>MiZsf+Smwj@;ggV(=7TCx?-R1KLw(t^I5>*L zt~sjq8Nd16FHM3;&p2C8PI4YHFa$H!#J7KbFb$rH2@-AEPZ>8uHiM8!>*n5~>q}@8 zJBJJq)~%Ua;|+lz%@a9;@WVa#^BsJ&m-n2H@Rm*w2!hFzUIpNpjzDS#rUyK` zrP5NpC1`Y@u84pd^!BGh15~qW@w&KewX@h17Wt(&q;=54t}G4?hTFz-_)IG9;haSM z^S_Sgzcwpm6(>nW9fH5N&>GQ^@b~XGg}P-4@4iCV+EVR{)3P+qc1p0p@9d_6w9NNXA5g;-&>E`|-&|?Z$XM zM0>Xvq6$G%fL$vE=G15N8g^0o z94iAl^$7~1$EAAJ1ValB9n8Yn;qM|HC!qTspLVC%ZIowTYUV&5;_`G&x_u8!wE`g6 zz`#2IkZ{@2dEn8juo`wtBV+NfMyL-#u?4gZAp*gN+?ar%fM+$$HeDHR382RER3L({ zSj9&=ZhZIp?&bA2*BP&*m?pTq=zUXp)5ZIQQgju25lhhw|D?VoCtoh zudff2)h(}tw#@0^HW``wxw-Gd^I<=&S9h<^kk5B8S}R!x1P9N;fuPcgDCex_E3TCv z9-^O;4>x`0F0fuwgyt3aRsL4><=7c^3AZgxd}E{Cr(taJArLZIe;d77O9)}C410@` zub9Kbh@tqSt+iF}@;qju!X7_Up&cFy=9*zq079cUz^`^-AP~UZ-0Dy4?!v_Ua*G-J z&FPw!T=nr@BbMIxMSQNOQ1jJ)Hz!};zW?m{vSA2NkI=_ozKT;Kvk7;Ihd^%;Q=oYu znHB~B>tTc>Fw94ALc?mIK#p9~lr};#Qz=h7cdycNj!0V@dwEz^Gl=E!u5KE-4}a2SuyJk zO$0)%+=eV+le+11(T(R6Z*)!6!UHiMzaRK>#kn#o_bC9s2L%uoJ1i8sN0gE-u)M2= zxhUGDw)&5IMgu>7#OW9P?^%Fbwrd>7S^9i)OH)B1_2%OB8Fq?j-0LrneVvD4=^Y#g z7yl%G-TEDrkWiHz`*+;RhV2DS5c7SP{DN|c7#5K!WAgeqea0^kC_vj?=;%4#k^f`F z#%A=oVOwL<4kuQSPJz{AM4U{}P1wYQ4!oFMbMIpZGF?t&mh-|_T} zg9R5)yLSzhlUQyWQCS&#m&mFA&(HcH4sx*22@caJ?ev2-x~C_;VpTHul1_FF7cX#i~+~rr(NRYBbd! zpGr1zrp~+mK0Q%eXN*}Ofo0uxwF1pahv`fBLjy0s!vYp^UqE0Qq_FQ%bL|%wxYr+1 z^|GlUx9F>;=iqyTuCb0EZ_r08j%ImD)8sRF_BX4N zbeinm{8YF**W5I-zP=xso-FTh@;+U8`Cyb|5Sw>SXR0|zRi^H1acS&=|Q!+ED;pOh| z>Yo2~&JruN3Opf)V|j#}yu9P?JacAdCM8wPH-JA#b^zxz&S%`F27epla=V@1^q5hp zHm(s6aGz*^bV5AqjC=8=CcBmgaheo5%8s(K+BbXi%w#Q`=V_8}Z`~?uJw323bLb5+ z9beTpG`wuSC@YJY8)3d+hXYi9iHAGxkzI!0dlC;Px_EPQ^&QWTLw~5y-ZYo!?7Zdm z@Eny?&@E!FZ!4gl{RFKWAr9PON1Xnv_2oKhI7R{@|UUw4ChhJDK65Z3|XUWfQwW{CSf#2&bwdFuk4jaQ0J{4kCj|~KHR9O8?VsK zwN@@MlL<~=aDUQuVp>|xlW(7Q$FMuTWpp%AE{$m3VY)37NbK?UMo9u3CxO!eKBI*f z)@khqgltA!FewZ{PlZs+9c$}7zTu8j)@Mezb#?gu{*IzMv)v$pef=;jG*zJP|M0v- z!sgwr{iJu&odG@k*JmD6zpfQ>slL*g-MiR#yF4MOu09c$&PGu7CO2^4(Z4^+7_Z8z z6i{W%<0<>uxA26UJElD%4;Oz)UwNo_!!DA+bic0UMD|Nn4PI@!%$kJE+Xb2%SJZkp z=tM_E%gM-4~(}TOv?_2j*tgXAAIXjX* zrA#fFv2FUyJ5n>fcF=#KMaEa!Q)>AbqT%e3k%}O=?aYPjNk~cQ?#{3HeB{^LU)Bbd zlC|Yvq-0CU?c7oTMlbUGSjlwon}Sq~Z%>{+MT?LWd0y)T!LxVOF3gY#MHXPbPVhvP zbJWJTJ4AYh?lW#mzyEnVNVH*lMwiQakur`mFGKj2p=7v)!TB-uCpNPm-D zAJMN8Ndf``Ki>{pnARMBr-1`BE^|c}Sv>ZKZdr$T?`>lrMI3FuIIF;9+-D;iMAQP71&9mJf{56=EJ^H-D20RuJno4%G|Yv_ z(@r;kejqklrRuGgn=G4j&StJLx~*ZceS?T?yS}gQHUbO`#QWi)BVB7N8Z&V**9)hi zOnGeVklO>LBDB@gZczx=XAY{`mnTlaBC42w!;(qw2T|C1oRWeB|fff|l@IrHIJA zdItSa>00FQM<2E39$CQ-IXFNMMl(D`2p@{xr!I*6^(z_vyhP0E;Fi@)JvSt7q*PRh zAaH<$OkOuIw9U7Wx+(&={u34!ieXEGZWGV61+4n|`&_&ktOnA1M?6QU=nS(9$mkXVRy5`Lo7I_ zdk=SSHfZ=TuQjU*4kidDzkUY(ISHht>l;$|KyExf#nQVteF!A98+=xXP;paJx7n-? zL=NSQ?<~KGo=NvgOMAemQOOiPe6m-<*-o}@au;H4IZNgaF&cRYpVN2Ja>wCg3gY% z;HYMI$+Vpa>=*51*(;c8frN7buQD3yl3P2rKHqab({9ykyH9(_E}PVhgRkTXVV-ZV zpWVDu)%GX(v42PioYlJpRxA`ACme$hR-k#A(#HQG3zmm1vk9H|h*l{vMQ)I@((N#t zXsL&s?K<*gkM_EJVv; z;)k0*rtW`HYpNe7lH;6!CHP z?U&>94`%{aB_$q!YWE)(6ym49ifN)A?4_omm47p)Tiqd3weAL#awsR{|1%`F>=g;G4YbV;$lOX3ps zCdKR?j<(p&ESz#zYHF8+6Km5D^iZER*5u$QhQB1?_Gjlp-qG2a^W^?n!WVz-q*E7Xn5^nKiA-imqqF^{6&^%RDgE;+G4Q@;z(ShJonNxB` z4azrJk)L1svY?Q@c@wZa_<>d_@3J0N-*_nd34)oq2V&G5^eQgE&RHRp_Azhkc`WDE z>eu)RUonBepslZwi`U)0?Q!}#4oR2tU zV%fwPqLxmiRU{=r$Znd~#zZ>D7M={~S~Y=&>s)>(1@ruZ4v6FYFwYI@j01=ly<-=ku|iarfOLMz-{RR;)ZObC6NXqJH2)*O{iA z&?feZkvLHLwrs$Wv}cNok=#FjE>(R;f%7F{BLU@q%2x}x(WtOXUu9&3KYt!1ox+M# z0CaI0FCX*UmmM~)7dR>4c;NGA_3@T6pxPdm-|q|K)@MI=m&U3H%3SIF2M&zPkDSA0 zOvi6Vixt+=5_FYM`CFkSjePLMkGwUHZ<)MGakkTokAGTOta>0;$YbFSQpDKFy;e}6 zZEx+(vm4C4(_a{ZC=2_we{55|J4Zkx*SYe=#Cv-mB-v|d(tOlowsNX_Iy^SkY~Szl z`+snC*F9?{bSQL*%;;4F#a!JV1qO1DG+aHepMeaZb5>pF%AIGQ1S-=pG6gb(tgIJp zQuh`sMOu-N+N5i+Z?z^?IL~fMz0PC})oEv~d+SwTme^<_3Xi!@P|y{#FFc9n&p7t^ zB%-a8qI}F~WUOLe84}3vQWyIn4m|^;(a~l1v-x4MAFTcGi_y?y>67{KZ*RQW-mn-T z8U?7g`2(+>w`*{l(wI-E^XNqtP~7#NFNZ{2Jju*ISKy*1qZ_lZGUa+-0Z}Nl}Mh9qV z?a*yT@ERgS;cHn>^YdOFiyIYWF;|*eV%E9RgXvXLK<+d0FL5>$d`}wW&@M>gobij5&rieid#a6iof0;I(Qt z^PAuC@biZQ-P5Riupjp!dK;e%bC>1WK^b4NbvmO2)doZ%WoqZ~ojj>^PPpWK*J3yM zbzF>-lgo}X51w~*`7O?@ao;SDc&W)5-R9Jv^dp8p`dew<*_fF1n8H&EuJCKwy1U0# zu2gGiXy{aLUYMMObA#$YV2M}tk_{>87WuO`X?}R(NCapr+Mb>^EgJW(d^9v$!+gao zy?*ZE#+A$y`&_7M<4^4Kc~*yvjL%74d)pFYMn)r=-ra5$UwO6-)!PB}%yyNRsRg@e zXqLT3)(`%_p_R%iQS~A#r_HU2XYuhts4V>{5;zPhNk-~bOuocVV&x1EseL?`$`Yoi z#zDO})lG*I^~HHA@@BRp`<0^@NBWB*sd;|;r;V8`|527oy$7KPUD86AL{@1jH6Qu3Fj30^`KZAVhtFUqh88iVHWgf-5p<+jn%}hy6+_5mR7Cx0pz?k92d5uMMAn2Qsc$=`Ez~OTe{{C zzBbQ3n66=kV&wy6umG%`Kcq#CBwl}5$JV_ zhnr|er*f74^Y=f>*r5TdRghSg2qRS0(fD)s`J8a4OiI18U87QQzk6=EC#BnJ=Z2KN zf%x)70uE)fl^f?Wq*7L=SEdTMEIgk|QVe}fop_a@ z)mr>9_Qi|EtM+%KRx|#)G>9Z`4RK-JKEl-r$M8!@;y4_$UY7!7|CJmX#R8e&h@ICu zqg!~XZ7eVEp5yPkL6A}rYu$5F zlJ^4I9E}1q8>kIh3e3OaLYZIwtLRVRe8H>w%>Mm0oZ53lw{M5&*BC^YHXlX7`)R1Q z8m-G-ETeo=3Hz}owvJAIi_UZ=LyvC1p`pOd#ZEq8u|Nh6GYH!@G`|tTiX^$UwJr#W z26KR{61;e8e=BAQ=p(jiI1az3)SMqy=fkgY1;+^4u$Y;R!`c+y*QdR{!Ym6x_}~N8 zU2W<~YhOzit^zh8m8AwsuANkMTk+k@I25BxIV+G^dE%*q=3cQ!TZKn@j z8j|m4^{e`sJlH<|yX30*q`$~+{F}G9pkU;FDtRg@sz*28fDIhDaDjTbfq4R_{Znk$ zk@_u35ZH9*l6ljVD=3fHlk(=)Lwp{r64$eU0%PAHuO>($2;Ta>z8BY0>#x0iL527Z zv)0&1#WX(14A$lwXp%MQ-Q#986!+4$zIjg`3-!=^OlV*ulYkzZ-v{h9{1 zAVZ>z!1?pHCp+Zg#XW#1$ipv{saGP725J<>VL}mRT(93XB>>p=;Uk%AuQ~+EoqPFg z`ma@1(gWS%K>O?Mui!!e)3EDB9L5Duu$;H*xFK(%e7ipA^Ch?Cp#4USYrPp6`2Z@N_x%IwsS|&x!$Zi%pnxEi3 z-`;k3SK^$koyS7XAT$-8P?KRUCuC<3iWdQBE-WVIvYFZGlP9Cm_Fleqi|D{no?5)f zrRm;x07jAO)bKgH;allFQ6iKn5Hf1ukHV*EMNlan)Ev+bJX3sy_@AiRnpqXuk78(M zVDd0AF?r{{M(=o$=^%X^k#loO$qU_X2I@73IEFcQ5Gt7uHhVc#dM z`tr&%+!>O~+t*xKo>7Sh+0|sLR=fYb_p&bR$}FLtp}Px67Mce8gcPQ}A{2Z0aBLSZl0gMSO~!_zc^p5PBeLFa>t>mK4E9vsty-f(-7^;xqBu3` zQ@>ikD&K8*Fn}aWQ|a!U+$(iX`d~k-Pa>397w~-&+oe9)dS2;DG#)!L#v@u{Y*kfy z^tQhhS&#fHFBzE-4nUDWMOzwUP__OnF-NE}y6S65>3PG4W^Kg!LyyB_awe~$p_!$wXuzK6o5v)IM~ zk#f-ZRHj@A)Z}6_tlk8}z(Ay-!OzHO-!_T@5@ZEWuY-3qui-DCEPw{s&!30s`j&3- zCcU!qn^1RBNpwS4v1m5ba^l&)d|}&9Q7s8fmmr_lUnAH6qpU0bf3P{}iBqR=^*s#> zJAC?dI=V~w;B{sQw@kOzvx$B?4uMg?8?SWFmdWV6hO*%POrM{03htbE)ZW+L-Ad7K z_+mhvp%lrhU0}urKt?J{;4~-aexNMs8rS>!$4{YVf)Zl9j9H3O{On-@sJk!X>>s5% zKZC{J^9RveM4XvkF7sb3A)v3osO~wh4D}aL>fdbcD6~8P9k7(U`!0#ibH040AD!H8 z;sv5IYl4&+TnMDIOp}vVCiz+tQfU29?YAXKfE(TwAloE7=x93Ll7+tJy!+}4#@6PM zk&%BhQt6!!!@_o1TXPfezpZt{mz|TP0N*`5!)b-?utE%HG+1qj<8}=P$V@ni15sk) z7&-wl+-;HpN51grUkHUh>(}^=5SIlrVAs@p{aIe6r~lh@A%~Lt#F;aZSXt_L156ix zb9=?c#y*$uA}-WrvgsFK7Zjv1Hm2(6>;#ZGjAex*{#pDcAY_>fz}4H58i-HJQMPhLHr=iM_DJd)lNP1;@&7)3B52G4ZGXDb83Y>0m-+fjpg_}s zq2=K~RmD9(DN$z+4nf=c_GU%wWaotY-;>*aGBr81wY4j+u)8+~GxQFY{zZVCc4c2u zVWB1(gn*-Gs>gwv!lwfx5t*eW7drc(RO9(eCDDqD1&Ua-CM$mvNcQYWz5$nUDQ8v| z*ZrA&M!2A$T~W(?#>A!^)#M<-{3yem6#A}Ul-&_Z#yABN6KN2lX7-~r0IW~c;vzW_ zuB=dS7YLDI7ZYP@hqv(@5kVpYZUP7_K1obzX+(_fhgK`rq_Lq|D(0DsWIoTr|I=J;*X0;`y7zXlYIVtS{-Bnh`Q zF4$oDZquh123IFYQk&Grk<63GuBvWx95$y#yv^c17cagShnF877m6x}N z`a?1Fcoo50Tj%G5z>UsImp6L7V=mmEc{{w6t|ChArG?fDYVGlUv$3Z4`pr#| z3!q6qK>^yUcG7-x^)q_RUsw-8^nw)ado{5;$iM68eOE(WS2z7u8plf-;r*lZxRxq! zb4je3p(jgEYp}4w(NYUpKkFG2FhzbTchU-LE`qre>d9$|pYoKCSN?OYKi+xwH8uC% zcIEcoxhgmMx7oty&A<3tk8awfs#S7LJzHu~?-`^I9(Oo6ZP(h^_(a6v=(uj8M{&AV zZnaA_dzd1$kh6r6&!N&VMVbu);>G$c=tUj@)gqePbYT=17Y%rt|Dn6+Somo{xfHd^ zUXd*(lS6(^7nzO(i2p&zIcqPxwUA;T*3YEt@90{rl4@zB% z+4xvk>~|=sw>|5F<^=_UY zpHnja2=myWfXrcs_s>Ug*nhe`+DQuvt!=^zjuI7|TcCEK5OC-c4AbH?0Ev=;F`#o2#T%oAa10Z$%8+Qux!ztrTCIvWkS zi%{;V?a7tzEmwBEB3?gArf$h7B$PgTFUsdc<-z})ew+ShbTy;*QwdR089$BF;{sE@ z@k3_)dwvOTeCiL6WtKy^H7j|fSpB1yJ#>fBz|0KR_yeSXxRw|S&4UDbG}&%-lYmAR z11l;l6nOtDJb1;S?C!}Jt%r<~I&ZT>-E)TB&)vVjj5CxphR6ICJ#~b`4V#%hW?JFD zT9OLV(#MV*DZgduvddT6Qd<~rs@HTd`i(UmoJPz3##7%4h}l(1?0>7B8vQ3wS=H8& zEcN#n2O3H3|FZLkxHUN>nxg~FM+c%*GmKkfM=p8BBinTihigZY-Qq($<54)ac?_%j z)usl&e#K4mAwQUZ<4Q^h4fiewfqUC;C>Z;iyS4fA{*M*_V#vmpmgGA+&M1K8!cQ+* zVBvm=7x7ikGN}(L1NuoIY6-QcZh|}^42P`0B}JxYtj`cwkw(V0q?HvH5fmRELA#-8 z1HTQwmY@Hj*%6cwD8z~8HfGJW3oVX=3_E^&%pv%^sGHlFXJo%S{Z+2mo^!GaT&bpD z?ug5oOp#$H#z}P!{#Y|SvKQ#!$b5Z(bq!%*)d$D%xh*?(SqV~5$Pv~g3S~sB(I_aG zLq7aiHzA~AgDS^xhr)PdL-TFv<2+;j|8{V^MONLd^CBPXtA{=XMm3Io%G8?OfB5jk zzfDF1a}$$~{Y6Zr?rVGM>&brnsFYLQCACUoFKl@j&>6|etH$*+MvK37c?@P$YCL_l zYqm=y207x8#0k^EoPlwp!PL&zRA8#5s#aF?S~(;Ozdjw{LwTxs{4EGpDXCnugA1-X zQ#N1+N3n2t^p3ut>ShR2GG)9}8j2P4 z8yJY=&~-d!+H5=C!2Bn#q+~~VV#nOw-F0j7A~e^s*{b}No}Gf-8Di5_$0^0Uj@N;^ zBk0KRLf@|p9y)#QE)^`b~c?`iApC=FJJuPuKMM!^wm~b^@q_o{IiK>&dkG#iZ}a4 zNrtHo^Al(*pSh@z<3*Ag1*9j~(#SWKf4)+VF8Pl1@P$V~Cv(+zfK(FXNid+aMYmB>&m=# zfaq8>A6g{}ZzurI8`ocg*o3~|L7rERhna~9pV#&kuoEc4$Kd+$TLI;M%4>TU5du+T z@w$V8gE{s4h*9zp@~yilFO7e~^#qql)!XIOdyfLsly`4CCL|}f3fTT2PgCE~{}z{H zd0#jC%Up>pON!?fZ7FJteehrnhIdn{$+ivG>+(1PbN~Cz1^I>qXM@ZXAE-t?BL7DsdNQNE$ zi|?GMWTOfv|2L-hMBZ3VTG~0Hi5zH5P_~VDqF5ljIQ-~r%AGc%{0>&_qo{7YDscvh ze9uwP)6w%kswQ4roliv)i&trRl*{z_%B-#$V9>b3RM6zY)>UR{)H|LxM~mLKy-2gXmt*RhpYDzV>+kreigC@1ctW^%*bN z{{4I1img8Qf`y*CFa|6gtw1I-+}+UfK({g${E7SF!d`0OwM9HsD`sW{I zfdsx5tO$O-VwyUkG2SZdnG?$|E>3}(ju4WH1qmZ+NKw(jL5~$NVqyjWwlPS42nq^9 z8g8;$iZsaYFo@x9-MJHlmJ)tDXhDxak;RIW1c9|k9@!hoMVi(@Tc)p2V0QhPVzR~8 z%Lv2^ii{-qOirJ;B?fNBZN!{&--n5lW(4YjWcZBJjP@hfrI)l~y7fb~LYdup5nN** zpe305XXPWy0_$@W%$)YqJt{3NEgTy42SqEi+AKf83u6|<>*?um*U@qPmhr~+My+2B zFgiq?p3};`zt@rR!n;_T@3HWeZjUoVwKzFa_wM#!YWLJRK0c%0?O}Fz+Rj<1_<*qUO4VbjUeb(TT`3tA!=QQtV87A(0w1q7> zMSA)1WBu*qTK)TR!bxzN+x|8WWF^__%+B%K+;#cRqQQnuUwa@98+#tn2Xl{yXMy^t z=NiZm0cU*wl*XC}N-*z~>(a|Y6mn0gu>!+yyFpYzggoUK*ot3;15pn&-9cneDNQ}rQR58K=0;MZIpa}raW z9T@ytY_k`q0NsT-(K_*`G!91pOgvowRD0AQ8t{pF)<2|tl~ZbYMyB{7BF=v?x#0g&-MWjZ)Q@Wpgqd-ID%dxhY5Q{>E*QV| zc0DMo;O`)VXlGyc4P_YjfG~3E^_pqTl zeo^=J^Xo`eU@v#xK`2i#|E>4WoCg$^twOP%Lqwff=9Us7N6NP&twJIGgMOgy5;z#V41Rg%5D4|?%n!;peq z&`RRocG%vWjThh2%drXtXSOw|?T{Y#Vdk4BP)#ai!Mc{mLO&!A%WHzDn+CeP8*lf$ zg29{6FfBR?0-Zw72PeJn$B&nc-+Nahp<3d{&t_nqd?t-6za4cEvS@TcHAD3$!WH)J z+O2gB!khfW@893u-VI*-9JM4Khu{1`IzH%%*z;g9g1d@VblG2j;+=J`PDkh1kIHXH zvkHj=0+=R$d}DyF^TNfWZ42?FQmdC_&k-K=C}g#P;0@sTVFh~@l9fd_=)MrOw1T9f ztGqydPH=HOhnjEhUsHn5^050VbG&YL6roabn&PR;2i4tKvopjveH|`cG8zNHqiu;s z7D&l!inQLDyO0~5@8vvNjuD{(?`NDHNl+DmGK2H-GK+W0)(2M!ht zUoW>@rvADx;RT|@>8)-NBLjmTR;@DNo1%? zw8)-q+wkJo5i5hHK*aI)dj*Q|MF2U7C21+}kTggeCHCCeA`d*;Dw8E3wAkaiI!Am; zo?IS(7I3kS4)rj_SF{WashyJ?H(J6_^n^u4`N1v;ULi&8r0DwcR^q#NzZBDsyDvo| zmG*SC1E(8rZom7|bv>NVSHW!MEYT6x2*z`;n ze-FdGO&N3Lk!Gy7W~`5Vcv4rF1+M*?t^4Hs1wVXmf_Q=@g`lG%fS@&Ap(o$UMD z1vC*m*{b{XBk2^c`m+~SUk+CQ)FCKYceceuT)$>@TR}~}axC}v_j?WnvRUpyy4i=U z7RE%|K8Fuqa(OP@mUwXB0Tp1Et5^T4EwM+j0jw&b$hw5+9X1A@VVV0H;!et`7~R8g zRzY(MW9mP6=wb-A zF)~n=XV!dy<+{#JFFHTJF696kE#ho~qvi^QPrls}JEj0E0pcgf()PcHXc}>6Cm>CN!WN`C3X~7Q z(;J~Tvu^Ak07K{3^J$F#@tYNk6+CLhd$_FQ%rhCR}AGx)}ItAp`*am{ib+%)M za=5)yjybJX19PhiQpKRZxc?xY7*Oba?25vM6(7|xLFh5sLNO?+?&eXZUi^yt`| z2MfXplFRyfzgMqhk?%Y+Gqb(eUln@0j-LMxEjfK*QhWP--e_I>xm)||4nFQZNZTI$ zaJT>PuU}114nK;yaF6~X6EM)Ep6n`OkB7)NA4eu~i}UeL&;VIF1@}XC_K*zM{7-jw z8?SXQfmh7TR0IZrA!aUclVKi22F@)&69_YC-P&+g< zwrN45W!<}nl8Q&?h-m=zTI3K-$Y-by0G#s13p`^dT)EWO>8Oi{M5H zoHBG^9CK&2VOVuoTnTR;!?`e(y4OJ`C`drWfSWq2aZKJNCvK}k#I0B&xsAN9jK7hx zWvtC`h?mq}XXBWh77RK6g>#!fo8&VVNKQ`XlF6HFafBzZ#Lz|=12a$LCLt@^T# zWmIl+l7z(C!UX%db3|S{Y+ippRQdz0yZh_oHL%6uVPR58!nu2ov+k{qCsYG|2t&1p zrD*(1f+a_JSocMOl?3b}JR(4SS`p(xE9QEkIf|5UkGQVa&-yij`T+j(lc>&CdKrK($z66cIb2jCPeWP$QCXQSh zZ}YmMt*t=xchK3a)~8j(r;O*@?v)vpf`aM=oQNVl2cV2=_sSJ@{2g!p8Yvha7tsB{ zEsfudB6ec@fnoLyLaB_a%r_w5a?YQfr*BylWc*gE@4*Qgh#iJ;U_KpbC8;-RBvUzM z{V7yRou>CFN3DX_zw2}cx9bc2oud!jN=#4_V#wALybeqY3V_`8E0`|WHW7KH_tipx zfFB_&100|w)RqK#51k43teTDAKp#z|YR>pcmZ&X&wXkU!8Obq~b~81?$j zf?bCXuP5HBa$PcAU;IqS0P&TU($(b>b9Izv`O0iQJ7CyXdXMSzXI{dLJwo&fY$(H- z-PRoXr5C~Mf2)77(x(R=3Jg1^TJnkQZRLgdNZ=>ZMn=E%BHMP_b8a3WvKHrnTKtj!mW{cmrUK3OaLCj%flz1Bk z3k)qpa||$Re11d$7mDw2-QMT1ucdMJ$_3_vPSs7!dVczJJvwx3Psy(@KOxaaI%L{y z?cYs5^0K<06{dIXFMbZ9qv*;SSsqBzTV_%4LOOy^nS%lqRq8Ob_17}hs69QEF|mXW zCFs;*H+1Y;n(>^bOCUyo2YSHQN^q|;Q3Tg$`Yhd2-%Xv$|u6F+yxDm zyYU8v)N1a3pxO^L@%m>okTXZ<5s~19s6dj@$b8lm@Tgoj-nQW9PJS=pMIC$F#)gox z(-_T*ktdEUP*nh5xVy2e0_m2-ca3UyId>0*njf=o#9*#@0>uSObn|C?^Uv}nK1POQ zlh5kVa3i-&w!rKR!mt_i_4N_zmEp2*gL!nbAo{9T+%mCFBsp>Q>dT7^LU)>ru5OVx z#WOaeaBEAHGqy9NO;eAt#(c8xjBR%K$Rzer`CePAHs9|j+kDsB8qQA&lurc|{T#a% zf=s95=G&a3s{GxPj-WhgJu7SeF7*)W@LyEVqW1mOJp+e<+?#Hc)nAZrv^tsLglHHv zDVz;6_B}$m9ma${2O}5D94B`X;)5pI*CLA=dnE%Qm(@JN8~)`Rl@G{>5yn>)xsVuiOu4 zIGtH@Q}l|-dm=-Cp@bs}wJ)2XAe0%WHn*aW5ZtW%^Kfet1S9|hppwHdhGgyY3U#yq zj7>_{G)mu{x9-`LMFZ;>F^MYq9ZX>Qwff7mb#bu#Cg#>G3%%N_r>naQUWJGF+f#02 zz_o-kA*1-%Eb>}-q55$!dpG>VQpj<=Vmq^L9DXA8GU^|4edOSvb zt^BP{CXU3#WQdlaohDNnwRZ_g)S{!K1JZ|b8%yqV{j4nek>7P?J9wf^_*D4id-rYUzJ@F*T)K2AMzA?F=ce29n3&I)je^7W zpzncW<1o5*vbwZ*fJom=gy zl2S|Fj7Md4m2S4#K&1`(;Woi^^i%hzVdv;H#aynZ zvXUe;a+KURW~z=o>0qh%sXuBxLz>EZpY$5#rz3*(2Jd>c^JGc6Nho|;$#2rzFOvs`yu-DvnXm-2!C-h?XC(X&6Kwfi#o$B*)qVh~)S_c5ZtV|Hm; zylbKXGSt*Q%z{>Zd)w-Iicdpm+E8aqz_=Kix>d)3Tgye&ztHTHgAe-F>|+|%Ko`|`(l zPbu*n?R=MVFem2^abIa(CYKqpeHmk3=_r3sJ4bA@5OO`IdU@9&u=w>fKix>ZLwR!( z&`3JsD8^RTr#q@tRpQ3)jWzL`I_Xw8^D4Dh(FdP{N%2%!kSXoV3SX!RPgam_X_lKdOpROMj z{y$oPz28e_iK$(*Jv|Hd9sJpZ)(u#Pg1kJvQQiyW(;$#cKj&tJG~ORgj@dhWQoAm8wZ@a} zK;_jJ?T1gLQvE0k_fJcEF^|3o6FS0MI4MYVBOe57{Y^s424Eeb@eVXi|~{ zfL=cP(Gt0wxHzv*b~QG}wLS>zx4OKuZ3s!O4fM`WuAD|gr3>|CM$7!t;$qg#@5h~2 zwgs$4ujCqdL=Hl*<%SH_K!1O3$W$Pr>%c%z=xQHUxOtHu49?W)%xQe!6PxBOd5y$a zRT5vxnlDo|BK#O7?-!FEIxgG(@>4^NmeEUcwbACrF_!%ND^EgHH;rC3G6<{Uq0zL< zvA9TgrrT+~-lWtm)|}|eQ!p{t+f^oDF*h3Qr*HB5BEgXI@L@{6`+H=IK$*zz;-Zcd z6fy}RxN#315-z^8Mgt{}y!^$)L_;JqaZe#_DMgFq`bUee*G|bJf$DXa&o?wolkps-)iN0W+@f; zUY9;VZsUyrpQDz?=*zE*EH{Q3qb9!+HZ3k*hiJJ;k+a);gm-*yoN)G%G$lKji$`7+c>w=6Q-nxmiIeN9Gle0Zom zn%{hx+rbL_kWQY_c^w^{-;%4pL+-q^qRN^yO(;j?$>Pr*1oQs?hO^iUuw&3P5a3L>PM4na=t6K2AUT8SM+Z z_qsw+cx}8z2V~#(&n;JE^ft)&Vori_WMwzJ-4sDL(_i%H_4PC7&Yc4hE>d5AdUJb2 z2YtY&Cx-_Q)45=3EBBr6#lBGYJ&TTRez@DMv8@dwdhD;n@P*@b;`|M-a6T0V9D%;; zkcWrI;?hAymFth$mD1D^hpWq})QRQ>OCoa6_~uO%=zPnf+n>BPi5FtE?OHTF6Z^b?T0cODjbtL}VMIKK7^Wp;zMg+)dC z$@(R2ZO_*EA41r_Jnn~ei?&RnJnfdous`DKrFKT|iOlyzWLu_=j<;GPlzFOX&iCS% zFRfwC!vj@rJi3dJW>4Zu1t_5PIFN6^=2Qyz(6Gwp(B$bFQAU>%uQmjcM->Gp{1qGzc<2LTDD|{p_)%V8Px}G zM253#tp0(zhGqG@v3&FqYc8!EMvaWAcXx;HtE(?UkQ{Monf_xsn^neI9A=qUWX8StbuC{S6?blw{4>+g>>nXH-KY7h43 z&$n4QGMN%YwHiKtl>DZ3HX8SwjN_sV;JJ|KXa)u$5`sXvqmyR%PLUPoz>gA}?^0zh zunO(+r})#*+#GCIv&1SW=)1aFT2tl68{Hws4Fe+d(3c3POtRKv;_omh}XJa7f~GyuK95F0K<*-^`|VqAV`O^qwu5q z_UgzUpe9mRuO7nGC|FGzzkJyvO9;zsisYs`e2;YZZW+`Th`-hQR+z<&*cV0R0(Oo} z1f&^U3(+b~H_A0Q2vZo7R!-MRo;#9RA6R!-?aSidz0<&?=qGjlxt={`KdLso4;<4~ zdnc!&WIsMs+t+rHo%o>_zmNHUZr7pkQ%55II&n5rY3Q0n`})!l6W7XpNlQzsx>wnu zNxCzbsn`1uVCnh0$?SYF5t#Sej*M(RKE87T_|%d1Al@JuOP=Y363MJB(Jy1-mgKyC z5_*NyR6?LS@_FvU*WTW-KKJr3X+&BOaP2FbTU+?3>Gq}tEG`;n&;HS_a;3wKfVmxS zo*?=PrR@{V*he8DkK^O-m~MPf3MM_SpQr7+=}u>qrxalQbXMb9kxJM;oHuDk=F%UG zsCMF85t&ygQ$c~Q3E=(k84Qgv#Q&yf%6{|UPyXUP3$(~}V)7+s^H>eBD66$|e zt(nIJ=H-cBycqB*jV7~J>1)q+p-ASgU50%BD>Uam-*bH1hM)wxb3@a;x1%`wzI6}d z!}OQT%05_?GBt<*?(k0K^pSvb!nsQJ|G3j+%i%mZdln<3lm!F@%N!<-3R?Hyo6#=K zH+-}w7`N$O3JO*5c1FfKuiV$j*q+{~2|zmuue)qpqUoEZEvmPA$1>mA?V+SCJt8A> z>fb+mLc9C#!RC|YX_v{1hx-M_+J{s2D$1k*X($5VF827KXo+lTeXMq z;lo-4_YTG{Ai!+H34&XTYJY2oj6q&wR`X1p}*TMqI*;;~q9!y^*gJ zxo_WQ_`Z5L!f}YO!=-Y>+1bwB!~ew5H)?2-QWdVgZ?ij!D4>t;-%C#3+_^g6;DSqQswX=`fDfm#6o`vKcYew;{g8(bPcBUG zx=x5Fr>TQ%S^HD+C+X*l=^teb8tLw+opVMfCLEyU^n((v8;=gRgQur>_~~GX`>Y8A zA6))9IyyOhhLN_R;SmkD&t2ygjE!6;KYl6VMs`0gMG@CU+Bjiu@}v(hPYc@_WL$qE z)MU;XrU*;eA9llu2K9O#0th`RLJP^-6{O*HYh5Q+x_0@@jEBbNpFd(G5;fl*JSbJi z=xEQ?+h!@%Y_r#^%0;YuOrUBI($pMXUG0)oQTebkILpQ+_XsmtB;rb@Z7eLPX>MK9 z2#@;uFX{H;@8Z&mniFt=@E2@1?V8!OYZu$$&x7pWSEKe(!Z?cwuYy zUz&R{N~#F%437RwHvPCQa*T}Bs~;PsS635jq+cOqU1Ah@f#Ozqu}vIIFm(8iclT|G z%FD|)*UZVg-+Z@+DWIjb27$fu1h%3e+o9#fVf+iJ=LQJ+x4ojmeGk%b+_r`i{&)5q z{P)UX!WKKCF@~Qkv^|`CKPC{9S@jgA$_4r%YMwYu@$o|`5g7afKz43dvybp;kC2GUf4SHmVOe2hp?&}pn6hH)vW6clm+FgxWrObEe2)C%r6!r11gYY3;toyIT4yGAcP zplrcCxW!_%<3T1ZbM@Zx9g6aDvbvtW(mQoRB5O2Wo3~YJowMBX=(TEsqlUu?K4zzloDU7FD-wTBk>f#MTW%IhF9yaPi+WtIdO=& zJnZ?u=i%%$ag*>d%r`Li4qh}sPEw}!wQD?ENfZY2OH9(5nkE4YAX&%Om);QQ5U`4b zIgEs`!y2zcSY<>A1PRj0HGnPjVMqwY)YKGV31Pwm*OCD)U>J12mge!}<|J^3SuJj#H!3;itbSvNm5HEcE>+6Rl8(5yk&~V4vuh_DlJ!^v<<9PV<`UiY8U^i<$ZgvBe#6W-6 z7wO(Z!Z8nOgs=dySfO<}6wDw>b+q_6HXA(9;3rs<8@s0ms)V(2^o?fv_RG~np?&D~ z?dh*QJt>&gn)zC()MMk&_?MfRcMvQKquLoAkspIzI#~WXFq^eq62Zogkl*td`cvc6I%`>88rZPy;gshG&@!bPD|q8mKNkLSoy^H(@c<5C%!TXamlT~{B$y`uGX{6olj zbQe~=#SK5JB!cNhqB*@`iH3sY_TnVJHZN34^oxoT5*I&?+$o@~yeK_4k|$WBo4-|WQOCsC z>lPQLSamCz7I$}bnRKQT6SOudDf8bnNdph`xKo@~v1(0KIH_M@7LsVd7k)Y>IX!(3 zkPy8HAAXb%r_P?G$kV>k9F=`IKo-^lUO$NU41f;VuPo=!ANIyIMoC{D zGF(?<3`7F?PD=|sHzXy80;T@Xv*IUs!T~x^i;BLJ72UnNj-{xX?2;))0b^(ojisn@ z{g0A?UMP>zd49%NUKJIH(CNX3*)NPc#V5pJ_{HPIMDgUz;rmD`0QZ&kWA2#z*=UrY zXBZi$I5#lZEV8r|xw5N&vmIQhP||!&^)j9A`P(?=r>#B1cHsh^9nWCjRSk`W;9dzf zy8{wi8SPzNtUPy!aLQO%Sa3{eln-4|J)B2JL=#z4tj`j*FF=+??QvU^$)ZNUN)ZEDEWixfWix#2pM1ckahqBInX#%ds^FM%1a!4>N z?EC{4G1Jyq&$s#_M8YM;vl0AzZ`m0}pV9k(2H-H-lly6kMPW3qPI537Og7CZ#Zb8b*3YlRM7);?Au@vyh=;NI5478yt11hi{{0jbsZP`Pn;fuMkU5NBMvf62 zZoo1(*pqhREc)INT>BW#bcD84o%4dm4@F)V{dGZz8Bsl86MxT$D@2LtwdZ7uIzH); zVIvfqib}3Hh`uDbaqVc$3^2**>kr~+Wnn2tkRDBck@aRzH4@J5{GjzoxM|bXEvTlY z)i5wXeCm|3AH|YsS7r)mF8EC_S@!9Nucp2f^mKG1f5aZ+VwJ|8#iJ4DXgMb#!JMZZ zgpIb;y3Z!dxX5lW0Ek07_#;T!ku>fgzP35|`1Nb6EFXT~Pi9Y<-P{gw-up9L zClL@7RM%gAX>Dyyz@q(k=M`;yXbIo{p6r_k%20AR&&pRvpJ$I$LfK?E&Fm9GAxV*} zc1Kgg?P);3fap@TR<1a^>SoTRfqc`9e}f<)GBBx!ZJl~>j@R&bBfw1Pp@Ip3a#t4j z!-w4G1q4`ld5LH z`jW}du0Ifef-?a@nWrKe_U{j+6YYsEvKD@so!tstud#LO4TWBry_~Wv_2bv~r@Dfn zVZ-_47pNT9cDm```ET!r$sH!9PKC2!y1|vo%5C4sPuP;%k^6S0;oRC6@d4iczH%oj zT*X%1Z|N>Q;2vK45!b4(kyqDF(oG<{hu@;T0TobMsd>nb%8w z^F}XSJsr@HaYOx!7r$Xb=$FV(hcN&Vj~CXL9O~Y`_wMSVCa`vX@*=?Qa6pk_HbX;g z%79)2pO8>J)H-0Ca04zKYT52Yd5-8b5n20x_CY~8&m$Jkn73K693fRN$vL$&)oqTE z7ml+72b`RO+r)0-?DL}gZ=9P9PWjne+2`U2iS5UaOB!ytKN0z}?-CATIv5FqZlHHFAtdUTc-qwq^^DHEX?6 zMYep%wbcoX=%IM^>eVew zS?CjOo^)5I={EaW^u!|@nXtWDZ*EMkxq|KDwAUXRK05?{9%j;!5!Jcf+9hWx zRaDOC-wceZMJhKvbf+13Jm_oogViT+70;dtR=P&EV8-y15YNZHpNNf&K$i93za{=>i zYHM#3B69eQ>#4``2sgm)+82NxDLMS$N;}P#n_TFSOesm^dl-kx>q~~Eo|^Ob$b`OO zWKHAPQx&IS_mqwo!ghzjf*liap7@e|q)cv?;Za{1LVV{nExX6%>)1)uYmTp98+JmW z2B4}HI)Vq=n{+tKCNUrFKXJBV1TGYIbs4OxmDxelh4J8~d9Up?1*HGTHH6%Zh}**8 zL(I2QSe}(w{d8y9l#k9~;`r$3XTi*@%d{8THy+h;z$Qu|Ohp5^F(YS=& zl4m^p)_|!6@s)k=PCiCjO-J%WQZZNk;kn`O+B$T=difV7nB`cHe9dSh!W2{f=IFg# zhUZ{;*o8#}5iDNA#Mjil+PXJ1UVCGZc=$wHXQ}+-_Io{5hEsn9DEJ&TRS<;VoQd@qIyp1_Wo6*TkotX4PJZVZ#@%1ZrhXQfNvhlrY7 zb%}I!b>&#+83ZgohA`B%bmRUl5xu*W4^V{5_^{#>!LI`;8b z`Kt_OxIE<{d%TBe9)$1Uo-t~U3dYKPr4*TqbFkq@B^Q2iQ>-KD9{JlcsqaR2+EZlE zLyT{G$R(7me4EJyW)O9Tx$U=G^!#|6L}OFrPc#-J(1!E7E>5mg69&rVhVA2JjycK_CnZgDKN!_Z3oW&eEu}a}XNjS%Jk@e##)m zo(gMnJYqKwfC_s0)Sise?0SL8*Eji@i{EUIiJb^6TDe?WMve;u&0A(;@2UpcK+oJC zs??odSRkZ?Ll|T~V@lZ3W~Ba|seOT5`IM9hmY0iT&oD%2H8zrgG-My?Z|%Iy#dg8DdjPIPg1^EgdnJtZ=jz&8!Cft)ubC`YCH&Zo56dI-m=9s8RE(Q{5d;CmxRDz`fPy=-A&b>B)mL#n2cFq3753*+s&vPR~I_qc!%H?CG)#n8xb5?9M-bUPR+`SJ>^KQHhMkPJ;+dWyVbgW2150(W=8@024; zat4^5ZrR1tVX_z)Q+d_S^Ue!YdpV5Y?+FSb#|H}m6O=KTloq{ZPNq={>*ruKuIw+{ zzEmUzwKEJs}MQ(`>N(0LJ9cU4oUBmHR;2AlR2j zze-JBo|VY=Sl5Pgt)1Apb1MPy+0th?^K&X%*{;(H{Gjlz317}i!fXb$!;6{nqh9Z9 zZBzFAMzHNb=8m3J1#%2IN>8=1)%XrY5pMKVa%Q&CDFuAHJm?m{Z+qRfoRT`|BN8SM z-(b_(c`qbB_hVnNZfB-##NuMw-S7MS)uO#~a!#O%y0)@17@s=f_vkNq{&<&_6~oQ9 z_d%hFz*mfegFvT%hzGU0gW}+ZKTwGJK+gjEIRo5R{?cc_d*wgMu2Qw1(WULm(Wz~3 zmnl|`kUrBG+*VpDjNTAf8Y%1-e-i_;lu%FzfDj-#J6l2NGa2L}hv7D-I&!|Mb8$-O zY65q-yGM27;v?rfSVH_jzrnCV1lb6bbm+w{y-_%M4h$eMb15f*$5vJK!{utsx)*=; z9CAh_uSMTlR<+!F)etG7M~7i<_P!)jh%!cYq~PwL^|~@gPvYqK7t2^s{NS0+&JQo5 z|B9HKA8-Gr+vtDz2>i;W);j3o8(JI>vFe)~EOiLLNRgP6vp0QYvM;8u?-)9DKEe|c zHZ?#0iU^$a*y`MA;5XKbW*5qwRtVW-2!GSMv%Z6uw?hVG)X!Iset(WK|3Yh_sjRF& zAk2W6iD!NVCPS6w>^grzgCG9>y%W^NXCS!HrrFtXK_~AOrp`~uBm+<)aZSunSbfRO`RHV!^P!)mYFKtfO&Urk*5v$6AS(gRLXW4eUJ07r=VU`i9?;pMHv zt<~O6{ajiNiR;*7D1@C?FOQcsH8h+Q6`hU^C|1ln9QMhmIZh$&U4&SIeME^xaHX5o75hv#8oGB<881EIxoPYosvF&?0_ zu<$$p>NYy>3^4N-KF+hWY>|CeKPw6C$w7x^aXS;L_4^ z)4mHwGc_y~a4+}-Ic=Lq_gbU* zv!DYU8z@69eU>5$882Q;DRKjR&Qssea0t;QSH(Se1h@AnJ&i+Na;R?}shd&0Gduh1 z-(771U}W|m`4BcV#1F%11U&6L@Jry~%*)GoBF|Lax4{Ni6~HINm@Xk8o*I>~;;2#; zu;{uof;0NrwU)-lXzUzVGyEgEZbLnUDt6{@zO>ce>XDu|ln{OBA3fyWEsiK*UD8yoBZ6!NCE-{liN3J|=BjP28W`+lR4<6O?CWW;F=DlevEVXI5^e zfxf=v<;!pKvweK_w#BCr?;(!Z0k{?Mj1W{y-Jj}F|1n~SERR!|D4smYA_8ufqc$Qh z>)86-aP{Xz3a^jz2gIa^p2SO0=7=M5Bym0|wzFf>UZB5G-B7Xk1k5Ve>#;Ya%R?Q45yXAP9QauJ+Wpc%1@b8t-2OfiT$C(zz~ z-gHGy?&$I3I$#C@%UpB_ijZb5%X;$N@m4H7BY6RWGAB?v?^ zR83jqJ@6kZyvuU?MQV& z43e=I_ad}}RnDt%4QsOZBYq7qPJlSPL41uL38=ustxK7Xs`2jo0o_TY;Ib z0zw5{8zE8*GS>9;^v}uH7%(#NsE<#YJr+m=h72Q#y>Mt&9T0&;}4`|!n1 zxx?Xy5!?x<9(J2B#5UN#KLVc#)_OMkjn#Ac1+m-$y3!Bk$rU#}zL&dDn6@%sZHX6g zlG4^b2DvpVXh`n=Z`^%!^fpY=%#GatgS#V6f(A$KldJ#tUI*9q@Zm%FcTeBE*@F-2 zDADm)&B^YOPk6R3SXb?TOvvmBP$2SDx<b&-LEl)Ac1_~?Om-8YA!DYj^D^P+HY?D4*1x`o}L~vvvflf6R&?X zE2QkYrO&XOJdcR*&dfX_;h zt6|RlUD{X72Cx$v^?wM!G>f;63P5#AA^Dqv0>h?oZtUnEL8m}=%mqVKJI(mz5uAK;XTe*hGr^=c5X;x6i5d<_MEgNCWWAvDFlAE_d@zugSaeN4W*l8oeY%K4*S)*I;(4qk>8pLm%lst$9LwIt zYjd7MR+Qj9?Q84@p95aR*16;Mots+bl)c}-zle;y?C5xLZLQnLl&ut*E&V*)-!*@( z#z#XzOHgEBr|JCq^{~+VElh+;s;XS`F_#`qRw1#SxuYn7vbyKpQ7mC5TN_%Et|!1u z?BtgtfM{+U1eI*VKE=|~z8e*;94Af;67BJ5uC5L{e#upTv?1@Y0UtqDQ@&=h4~Ije z!VB+uK|)c$^ZWB#jSYJp2@b zR-xt)t zrU54bAXTYkDFvXhNAz6O=>VZ2hXf5rgLj$Bd~ngCAnlBhkPztT``AN?^7H>kLimKy z1%bCUligorId-qkQTQ$64J07(&MpLmVO36|!Ds66iBpCPq{HZtBYt>7beqn3qz%HLMXJKYW zU~(Im!Clu54pLK5QEBAvC1_4w>oG{+50y2$h;C2yP=V`#qf+k1ja@Lpz&pcZP{TZS zBgH4U)F=PyF>(m?gHOf%o|sV03XkQzwx9MyOG3g|Ou^+f_AoxZFWJVJuRJ=cma360 zvietG<5JM9m8!LvSuav&?>D_CWHrpp#r&K@dvl8yYrYON0a{EYo?n zq@+`V(R*vZgV{uIxCfq7oPU4+%7H`V%(~poaW2mUEOiZT-(FSz_BtawJGV42d#r^jk?fd#qsyGtHzHda1yK}!%D zd`u*gWqtUh@b>s4Oe{E_3-w|Mt&|`zhvE8=LH@Ya#0^eIjPakLXPcfjB5eD?+I_CC z)BV4m`N&k)rW|=^v0c^|0wnAW(&h2M()h4qSC`^!gDFmObaXT!G4bP%S~jRJu+u&5 zFR=&-F}#u@JItoRVrbn;P4OY_Uc*^9-m zh(1-4f8*Mcq1!Id*?Mq{OiBg7SeFLg@i5s5>?9Ph?O;aqI5@`Yr+PBUcZ(Q2khV0LJi~Idev- z_<=Fd9`~G_>H6pb5JTIiQod?ma$H2w_ZE>hbQ6QF>tV$+s)c?`L(T*(fWRnRI~rfdrDhl6m%tyd?!3!aTv4c1_VE;y)!#T=_8 zJAdlb6Cde2@08gl3Yb)Ozb;AJI%%U~R}sbnjjd<)I%%RVZ@w!=A9+8KSvcEBDIfA8TJMSkuLC_{`&fn$k zK_Vlg+^N(9J*CcvhrclGoH;9^dG9ZPfcB0Kl(-hL7>}i>upm(CM?J$fYjBxK%Rl=L z&^>ka07w!DHDm;$TDpM=li>JZ1v#X{`}bR?)M%IQgmA0G&f-*9^p4p@b3QEEIl$0Q3kTUuKZzur>mPl$iaKJ|b zZl42gZWT0*5u{xd(3l(-+qw{h0Yo{xj(KQ(W@>IpN6vGPjG5Un)DdKca&hT5NA}F5 zT>Q%k!JkUWqn4nHCi;QLiZO__nSX7hxmN!teo{0(`qe9Xe};Hj=h7svv6h$ZY8eln zO!qf&-sL(uyWL2>I|1pAN~rr51EkD>HY${EuplZm4MKJz1WknCbT2nQL>QBb42+Fi z!r15$mn%e=(B$M^LPly08Uf{y;P4J2=jUVRTN;q9S{R(^xwZmRQ^Ozly9+KM$VK8B z+a4n)hvGbl5zu0wS;)3)qTuaYLT4oqY&CWD47ChiNZi>O?$4kNfhNgmZ7eAca+M0`Z4rK7~qi4WHt{0a$ zYDCVdw{-yWM%TRhnE35ENuAc%FA|)Z4aH4HV?s7kQ^^6A7Pm%{4?VzZ2K0Vz_E2S_ z_?#W*@Ud!Iw)SI*EzlH|fCt}W8lov(FW zDDib}tQzY5U2JE%usV9K;#V4~5prtkyRJ!&v81LZLsty0KeSDR1HpafqH} zYdT`HAilbKqr7Z{objL^Fz|tyK2edf^!+cwm#xcA$L~R0$l~I?;1?hT@KvD_ zaWtZ#U5qR(ZA5TP^c4?Qx5f2|-=nlb-@a|#-@O8KhR}ILK*b?SLrMnXPoBWA^Ay+# z#^I}w|I0p)Ml}u13D5ulcs0ie>1icTO?IoI@a{?8|8Ew3CXu9~u5LH86;|$|gX4k(c@JnHg5enN z49h#B2=WaKv1P{NRlJRKB;KGVfa@gPI@- z@K$7$`bM8BD>}#+TVquZi3VS(_R1Aq2_5huqq@Um*<&tXRqn0LS@l)jqb`7MPconB zquTblV{Tgxd+F(q-ue1>Rci6Q^+92W{E**fM>Ey^j5h4EitHTG?aYJEF$^#m1V>d% z6Z;!2@RI=AkcPPhZu#-<0xk#+2%FDU@ggXBy+OC%wcOTa9xruR-%Y`HhD$LPO&D82 zWea=LGqy)oCm!|6iAz6XJ}+S+CH8bu*@$j#Hj=vgmWIg*r)vWHPdF_c3VPna%KPQA zR8P_L)YjH}#Ryv8eQge#)k43V%6~bv7Oy-K{k5=GJ_ru#1)Il|;;As%@peN&)7HhS z>Pte#O@B{^u;?Bel{(IM?)B@tTP>4fX~<#?WmcXKA^Sc^qyF`Ew^-hd<(8l*dSsr? z#znTLVGL}JPN~B{C@tT2^`(Hv=WpS>_xj)>+Krw4yxCBC3SX?^J-zg(o&HiBkhg9 zD%23vry*{3v9G43mc5R}_tsChTKwtU8_MqRf=$z%MP0V_d*1Z3+8;Bbfn55lv*DBs zaSMe5Wi|r0+k6l{ln83LmlL(QVHyt`wjbJ3yMTV#zH z(ii0@w-K?KA{P-lNUEcw5EF9*ox-~gsl30hFTuE*n!&5R)Pc{JUUQ?x?!g`Zz(A=u zF>!j%r*9sl9M8zuV^#i`=+Y6v^2-&j#TBkX)?3cprmg46X>F!EI{eX4O}z9+D={~> zW#QNEXSJ-2bE&U>C*b$Qug$?hwTEuslc}ozY5_XX5KA4!zMGB?WkHS)r~b%7vmoU1 z_q<^pWp!`wQT%XF9XyVR=+X=j%-xvtW~uhlfq#+gK!|#JmYi1U>Oq)o0PEXqto@1y z15HUqrB&f7Vr^{=5+M)=Fq9IJ7j0P)>W}d(63P-(M_>{CSY7RLLWK6oIFQj@l$1M> z=0-|QO^yE(77l78b?zi5M-{B(`tlTR*4@zc>q8p^eh@N?hN<2nB*rmfwuTDnlY|s& zqe_~5lzVJ{iNjmQ{r2`3I^J75{9O^Nj1h{(Uq0HNybf%Q+}73>xyr3G6)RVO>Sy2D zL^$nfBuF6E!`Eef$06WP%YKU#b9|dE`&SE{)wu}(rvprO?{gF-Me+}q)i3y7M65UH{81O!+>JuxTem3BBO&rCr~Z=>fO6Le0*rs)H=Zwf^#kS-lKtB&Evq; z&k6_-8;&q)mmZQpIP3R!7F>r9KQJ&n@XXh@rup?w{QjsBKev;7@D*|xUf&Xo(a6?@ zS@VqO7RRSgENC#cEErOF*^_VdN$cBdt+seK&W|;(c7c5``I0(C2nsN6`lj?c62a!a z7R9$eIyZ)AgB`u=?%{!HeJ7TiQ!Fx9?N>e6qcqQ@eS7LX2&eS9ERF1Qr^T-imY+~d zSHe3c0%7&+a$M~jeZ%oD^|6(eWq2H;3Fy69yNa{(Pc(1I%E}(WcLwN&)M6qNv#B2j zd?>yO`t*vm=epZAwCnLH;@|t4x%}!?gN)2`^uCybk4EP94xBJZwM8)jXKhc<&xj3$ zRtfu@zqV^HPHtwo7iVea&Vw=mMw#gB^m}Yfa^txb9`O!eKxtSPclt`Q@yyTy`a{^m;H=7kCy%oFd*w5M{ayb#m%#h>kf zz2DVpp<+CG*FoA77-Dts=7Ki7X=kel1a-3 z|E30xK6L5YJ5XJflcO*kv5QZpE*qkK_9idSxHTpU3K5D7wMI{hUziKUI8#yK$!FrRHjfsFfIY4~U4A9iw_vVarWE``7loj7%<)^e?DnP$HWEX(eDd zr1A`W2eafAKfV+ckK{4rgqEv&0dN*jc_>MdDNU`euD*wkxAODnXI;5^*6>0fIlszq z|8oGf5ao(QXRy>YWEz0Bv4Rj zxqJ1Pkk)>zQ*ic1@%>UHbR2qLV;HliwHY3q+FrIihVNUhsS!{g5fVhe8uJKp#ao_m zxrbNp_NJpnI7e@weCpL-ttoHv|9)6=i)xPTebO3hwVyshy3Dbpy;E%`(~RF+=igzw zkOp^nW3z}gf=^-0Y4NuVpyPsf+mXb}E0x{FbO)IHl}+w}$8YjEaLwlKOPkw)9b3e- zAH(IDno`}sScXmHlWF-F&zFR z_%A%I7qz-tw395FF^qK}N6fX)cWJ_IXky*cz1aQsi-8Zea=0}%6>yTH=~FTnV<|wwGt2$SY5Q%A8 zNd*Nzww82U4q9b5_un@0)wFk9Zt2j~(IFur@%$=*9btBHQVyVEMSM2bfy*p}HkhAb zt4S_m-eqN91;^=W-R~mC2a=|NL1qrG9=iQ!^LQc-4f0&;%*xja$tvO?+-! z?6@a*_&KiQ4;GgwfE^P0-_UUr%un85AWCj?u*TB>gltmS2(+f&Tu1cnpA>l-T=HjL))ju<_WW zu9$k{C5m6e;6+IgN`d=2E#;pq8)kRqQL1O{I@iIN*jxB9WxGvUV@MmfHM2}|oyUO& z>4~FX4*xuOQto={;v;|k&A*3Ubr^(lmc_@3RJfjKtA~3Z+Hwjle3*#21sRsvai+h! zm>=3L!V!hvmsO!-0;eeKcwsK1Mlbeu^Ia8+dPRap8-jR{F7kHkrwjx8;$%=i0 zjBL1i9fo?o;}_o(ycj4|Ax(HYYF{DTQD6TuL$!=Wr-xC_=O;F_u9_3OJhS#YsBrT0rxa&At(dRxL0nikI9;Nw1pf^Cl`A5| zJPD2CU;2@e1y|>G(~60^B3m?Du)AcA7C=J(d80U=Z2WkdK( z6guekF>HtD8G56xEg&`ZAR)L22O5-6%`xM#$=8M>W@q)!G(~s^KR=Z!7m@$H*VM&f zwqVm_*DmMXdZs;$i2s^pfCjJd^-a2}x8|3+-!=Vs*&5Mwo=H%Us|}twP-|2uT^@!Q z9SV*!FJ(T&>ewz%cGp5j80z9|_M#k#3HW^6E4BrkUFg|*T^i4beEE@hd)CGwJe*ZM z8o{og%SzZVFk`yFetH)aqkLPO4m8Sacpz4PZ-D~4q1DZeVji3=sB98<{1A%dtN~Lv zrbh4$zBOx)M3(~Qn+A+j(BMeoU}K2SfS^E@<;HUv6Q5M%&?hjrH={||57je|b;~|< zbmI_Ct~$uW~Qz#AZKxEJ^Ia?`gjor z+~riK_y`GZ!E#`pvTq7GM;Ox4hAg^EKX|~4YMzs)PMtvSJlu3?x@BJIKO)8rp{?DA z!ZT4kC{XE-fq(TRA>UHT{N=(0S@D5$CL$*Ab75amFDyi^P;>s|pB~SOZPDyL)9-JT z37JT3-t3Rx>XwU#ev?@7_S}zt;`+R_h$K zE7kpFqU$TU+eOVPUdbZ|dkR}zbJl9TZFn&liO>Bo!HQ3#6nd77Y&txN-D~6dp=RcL|&fq-n}XK`cCoW2^5%?00ebJyG6}Q z!CV&YRh^Vd7~S4G35EhdAij@mWT>pLHnd_=g%4&&%galc4lQ4VB(rEepl@$)dggyu z_Hv~xfl`OTaU{>XRLh|;PNryic5PJ7h34Ef~C)( zWx%h*PJF*#E#;B({&&7k3PCddt93H~@v0DHl2IK)hg<`_&UPu`%)NYB4z5Ix=;&R7 zMS+mTS>t+;4QE$~;x%4avS(=hgaNwgMVYgn<-Fm#Z><3@FYOgAjASb2j)jFVoYj4Q z&wb$Bb;35AuH3I3Ftd4^3vBk!7B|D%J?Q-9Jjr;b#v_`)>r|LYOLLjnPautiC=QL+ zv*PRrM}FUU3DXd8Hs62%{*p%lm-XBPJ@-rvElqGf^*mnHUq*qe@gz6*NzD=3eXHI3 z-T(2k?U2Tw7Bssxjn)NBAY$QqF=#f=V;n~ih#&!mBDAUa)2{Ar_4?MF4-Xs=oI=_W zsR6dipq2)mN`T9Mj5XaDfFRk^^Q_$rL5@k#sfCA!?V_N7CUv5*Xv0CIHAcwIRe&w@ z%Olk6EUH}BZ!LGGJhm?UZJe{9?{I{J`O`l`8w z1vC%$F%uD?r_70^K1!(5dV~olrkYVcCC-CvVQ*X($a7Gb8R!S&dg#az9-E)qsDL}g zJJ0gu$vWW+1@4N?Y99&t-rCljiwK{QxMq6fs6dQy|A()_E=Lm2$3C*LfaQo05y`uld%3RB*%!vd6hBY;>Xwc%+JWqp8s${tQLI|Q~KF3<$D11v4}u=SQ)s=sbi|il$BBUtXm)!dNPR7`Zi9|BWAbp-Wwk zddCkk;X264u?&{(;6ATbi=`8uQiv1$iX9x>J?NscI#QZOGiM?r%}Ptj5VgRM=V=}~ z_Pxh01Y#_N-?SQg0fC5>ex7vWhMLOX5C|P&pd<#)SsBR_0_fY9-$EleJRF^6UE}T5 zAyNU+qvOIhtY0PvT+ZNpyHUKcQG9NC`mg`7DE`Mc%6i0Zxy{_#L#P?Co6$9X6BkuR z<0G*+AsFnsNoLY5C?w?58e5W-oBQVEArZ$NxDQdeevD`jT?hH7^qCiTQ@{NE>j_~~ zl7Xb>1<6zeai9?JG-G&TlXTdzqmbs{Bfv^=3s^h}EdjTBAIuK9?qv{7SZpY9;M++b z(fYWGBi3(>J@Bz>Gh)rUc`b_bVf`fjcl}zGS=C?~$8AF$ zL=?!dLe#l?*Y}3N?2leUF(2~a3&7~8GkKRsk{l=Wh;qjB4|gd$~Ryjw(0%NPf5mgf2bZY`~% zdvtDF#r}h?6K(w^iIm4L&il3UrTOc5?x}76T6WDKsY>s<~JuEJ`RXKW}!i1F-PyS>YQoR)mJLKwdD%jm=_oZF1XEW>JqjO zA7*Ig67Su+RAAJ&;1T1#3F2YsSJB}E2g>ehE#2$y8y|GLA8rf9j+T4}Ur~kCZlxrN zPwZafQI;T73tG@xF*z|Y!6w2(tgX{~@}S>g-dAk(LGg)N1x@gKz;k+_E>PVlFeD@- z%r`2Ez&`k#34la&aUq!(e6Gn+3ysXC{FdgxPT{D zPq3=rMRa`J*Fj@=ct!NXc2h*2goH4YkdT)7m*CJ)LSs>aed6rzb`p5Yl@KSy#1xIQ zpV)WkCPdBf1wf}%i5CwMqM0!h^!w+YVzX5K@G$CF?n*?T2esUz?ANcu&X&O8C+xZr zytOGp*hp|RZ@l*X9pSoHRB}K<-*v<2d$qU6ZpzY@-Xin!mN$oqaG;wh{$b&#~s&a_B?d9OZA5iXa8u9df553BItqXy-(+9 zIMo`4lIwbxm-&%_pmQ=>D2SEI%zP|#oW^DLa@^9eu+3%-LsLeVp#eDaG zsIwQRZl6D4O2L>8+yk3fE5V4`yC^#wOaePwq}PmMV*b&tE!iMl%t>|R69a}zmz)GFZz`f&rb3$N z>^TB<0Iw-bhf-Q3?;X1MmZ#`m_Q(%OxrerTd}hIS!Y@x7j-KTk`(+0Jrb9_R ztUWDgH^z2KDCBU@3{HLpN4W?EJCgL=A;=cH)4$mcj;x+21nT2!Q1SU5vITHNw>b3u`r zgxuF*sgX1oq2bRfw(fWp7Cs7`!oz#^|9%l)jP>`d&DoVM#H(m_VHCl;WqtpR6st=H zrAm3NaJ<#0fwBn5!TF*-s@cD%D6u2wzMo)|v%dPqd1`b1EpGLp@$Lv%!pW%qz#z$Z z+kS8$kKLc>SKY9X0iKRh1_rGgR9~elFV@Bdf1# z)$G%~cXyVB26|)EB(k$DaoyHy28@{^kv7_CrO=Y9#oR5u`Nd>pR}bhP@{I8L)k@9eWwJiaUq)(0{vf#&L5XdM72- z*M;nDd*G!RH)7*S) zG1RB&_c5>Tiuz|0)q5Hg=6U!i{m+#_avr0G8Nwy@EgL0|zT}%LO@lyH&?T-1cF7a& zU;zOQXK{`o=QMRT@{4u@pK^4T8^#Q7zWea_<*hX52{*)W#P>~)*mzZJFYi>7mVVq_ zKw{o2KxMnMLBT90sUhP^H_)B?N)3sg< zsMRemPazUx+ei-!6+$5Vak9A0*_ZEx!tSnRmUCgOHfMdC;#ElUN|!%{;3Ue6MP;|{ z#oh|H1CX#=|MVw4a>QqG>ZNQH@AWl-N5oIu{rCM71h~QIoXP%LCd33N6??DfOjZ>! zFwJP-93-R*`rE4Dzz%Xg)Ncs(HZqdVP)b~|3u6ij>KfW~k9hyS3Mg<=&b?5pdSorO z7NpCXXh=hi|D)EA;M&<*sbIo~KRrmD2I>0g2VY7ZsH6gg>juhBA^Z zSI$kOGkL7qAEl(s>BxS$Wp~K3mGE0vd(Y$-q6Kzk=2!p3w95c}`Pw1C$3WXh3qJO> zp~J5=KPHZIOInT;clT@EepvT)lQS~THisQpRXnxxUniPA@8Bvun}+9?w0LCl2YS~d z($*~%plyL=ugO2M_%ZX&hTU%4@1#@4e^1cE%sGyy7)Po)G z!m)S3+pb}Ox+oH`l~ z@%eJ|rc1+(eFBIY2k!1!QNa-WB-t=z2VFBULSAZyKE_+Eh)z#ay?I-TG{sBlS_MeL z=-L$UXd=a;u2Q~XUR6bVCEd4Cj-6ffxW9AYil-F-3s3F65u7?WWZ@fmSr-s{BhO&> z{{2COSrI-yv>|(&e_>(?cwbg3rEk2nR=Ii&$r)IfJk_(}z@k=Hoh_Fgg&kjBZ5@Z0#8hh@YA&zdW#SdZtYQ+bEFO>t?^%b;~k6r5ABqE)Pviycj8K z*$7cqaxcSZ3XEJD0SVsNu%Qx%kO?wi;x|@dnRJy?fXCFcR-tZh_6mrDA4`cZ2#sX#GXb7*-VE- zreE*>kRc!W`A=3kUzC9$%9nlt;hpS1`Yd;bhCsfg1zjQt6c~T(hDXT&3=!l@`wt)X zlYZrnAw@A>3TECX{1yTmZ+M$ZL7{dRF9-*nIIB|O%7SrsBiUOmVPAPk1t$}e!}iNl zM*lEMTh(}}BENsX@$jMZKA%5~A%|^-s|5P`?K+YqZTk8g!GH!}PRmrwg9!xqeG0II zXVN>dh?0AwH-(N6jfG?Rb+%>Hr4_~V=g&v+814akj&Ttp+Abg|&w*m>$DZF9mL00A zAHk&uaXK9qy~wDr+kNi|as!t~8y`Pvn&Dw}ajAXjgy4RH-SCx+q5bAxy7BRGTCSYg z=z_vRW9+YlWeKnwHxEk{T!@GVq`^r|dh)E~sj2Ohk1<&m$F+6D2B)21sGM68sY||Q zz^WF^_b{D1{`W1FWG_-;;)C&4k#YlWGp?ZeV`8G&Jk0>zN}2sW4z?kGG9-@E7;PYZ z6%2tm{_vTO_S%>8LuRYl3c$8J zJWs;dx_FG9(L+gvL--ivq>vQQ)1(y4; zhl1)Eo~Z~xi6MGXiGB~1oinVHM~~m<3O6f8#uIE^xwncuF;%>=ymgY}R^g|#tXuaF zU3$c@@bjHPS56>WS8GC9*4-9^ca{goh%N{jZz6BSKhIhpBz_)BW;?!osp#5ANRB-H zpOKycF_wmRUtjUubE*BCs87zcjJyIpObd!I{!18*suKAgGh&}Cy)@u zgg55hov(SZ$q&X@@sNf9M(jH$BqSr`J&D=N$jCW%m*3;Zmp@7{7tj)tJc5!F6I-8M1{7iVziPG)+BapM5n)8hzH0N>Dr%f+PfvFNK5nE{LK z>x|ptYtA5Je0>i&t>1)@Xr#bUr{vMuo}P;j$2*SWvuPThp8f;?URim+YF-j)T$~F) zobym&BRZq4z?6pwyBgv`cRiQ(d@$CG${N_L)lZ1IHbc9%gO<7l;Cc1u*@e_Pu>)je zEDY>vu0@91ls0e6pB9)ZqI}UDI>z;upr!Izg{dA}G&Koh>%4M?hUa!A18$DQw6q{Z zu9>#w5ORC}2M|-q(l`!YfkpUWs8B8;$tLJOSFrad=Mk&hw=r^D17C4P*7p+DcZ4Fx z6j_~(pV=ub7Xk~bJTe4)e2U{ExnSW_sXYQMCiokKUb{mcpj+;brQ=1Tz)aEhKGRwa^^UoBIr zDV!^cKWp`p;!^7oM`P}YqttI06yDvTyYQ$v217J0tJ;zuFW*F0?l6#N z=to#*uwPOAY+bs7(ocNu&~oFez6MB2R8$ogUgvAAiK8*?U4-t^fBCuVV~rY!JSW3< z^%T3z^H)E9f4^a_ng=)&iXJ~aBql9A=kKnH5%fKfn4<-}3AvvbY3DrJm`w$&MC(7; z`ZO3BfZG(?+E-(>6RXxviycp_0#7EcTbza_GQ!HmijI0?pgF$ckh(fQ8TE7%!tQ_f zmyok*tST4hhvm0qs&6$IsR)adK#+5-ukXV`J;UZI7iq0)gUhgeDPWZ-kb(0Cp&s0wsCQe?XhWmi75Oek) z-BtsVIQOVUjiH{0009xQ1K1Dpp`;w{lZ;zMqEO-BHSmJf=yT#}7VY=kh=(<43fCbb zjIYVbP0djQ7cO)X#Mxr2ck@FWti;6`J{MZDT3f#({@m$Y(-=l={U~S6;~MiU|1LK> zHywNh(52x4uS=0jWY=DO7D}rgeO_6AsFKN{XZ!Ec?H?n4LqoH>6k2xv>108=49-TEC8v0E17_aTUfzppa*uyqc(&UIGmuK9zE#^N>ekpTmuc;TT{(S$m zwY7+nrrTu|6;_1o!VjtX?hZeqLa&CgYBVlNO__j?L+5aLn0Oh0BT5&V=zaX1 zkr{k6binr1sV+1yGXr~=TV6&5z#R0K;jo@`yv?wQ%jpe*t7G4vE<1vu8bl5Vq!7@m z1_tgOb%_oO;qZoeLBfpLChwj4p;SS18o}+c(J*W}0{KN>*-@!@Q4u0^i&rCu0j52u zFrBcEVi|k^P7&fsEd=Z0E0#s6W|+I^WdZe1?sZ?YsPVd{wMIwZ48LUOexGxd0ejmM zZN`7+^&JjOr%uI*Z9V%rT-{2vlT;-2Mjpk($s2-QF52(!2fg8D8z?oWtOR6~?6~wE zpX;pt$PU8{G>ihu<JkVfZu;ud9BRNX+R%31%ly_#p2h%AmFtdctj@&s`Og0Y^;4 z?A37Suld|o0L%?xgy~grhWS~2+p&BJ6|dmn(y-0+jIb-3E0m1Ntc=RMfBqCfOW4wp zdPn`z*4FxYxH3jZ&)}dSe~j=PJn_KEM;Kn>+oI*a_B0{{pm0>phH9B8mPj8^kn>HayM@tftD4Y>_J2@5VDwe z7w=^rotc`yF)#4r~vKUoE4^v!}tzSj5GUpiOpDm z=d9%OC$ClOpM3Nvd+)Y=B4HmjG{1j;^X%DS+!%TrVGzfTlcZ}}(GLvlKW}z>Guitr zK82uvw|3$u!eEPJeCaDBAHKb6ts;3gJm2`MSb?Sn;)g!@9I#?mZ=@r#obtsL-cs%| zvm@P?jsqdQK5-%?$h(mkYg7;Ih4rDe)S+N@Wknn*7_VehjlZ!8UWp7)aJXoDr|Job z8ycDa7r(R7?Sgy%xoisbYbJ9T_lHl;+Mko^)7DvYqV7ojW7MwA*)Drwa6Z6Mr@_RQ|@0uROPoB63AqpQQ7|bDlsPd$6Q;)}k zH?wc2(#~?Bs{cdSdxvxV|No=NXv?mMD6*m`DjAV2vXdmKB$ZXjPWH@BHkpM&NoF## zrLtEtO0xGnx97Xh?>g5x*SW6q*Y|qAKi_xpdOe?y$Nher=X(vAe{5`gaGdCaIXGO_ zFD^7B322azW@>)Ztjy|l4i9~EHLlrc@>1v7iyw#J=v#9& zO6Qji&o33N{+Zz<9Wxn)eFC!x{I`2L6 zpi+Ku2X$EuxE;J`Q{RmdXh4p28#U3>uF}gExW=#wC?`r&5>yrfUWIJNU+{nY5p*zT zu^r%b5S!#-7(y_Nfpr(wk9Jt(*n8%LHx+dQxAxdR>k+N$rfg}6z?B-D5z2CbYtcv4 z=6E!@;!vZik)J+o%O-#8-8k|(5ZM@k7awc}bUIblsdr#*8SkJ0wHA|qVq12$!R@c9 zCArkP?E-j-cSDGCtMPeIVj>N3R5_@j&4+@@ixLBGz4bBMUoFl=-nGKv3Ou{FZgIA> zwpK%&xKFtF`0?ZCWMrN|%Q}TK97i@4I!&26OB|SRn>H?*Exer0TNl|e#Coogh*(E3 zUoB=}y}Z=@rl#*M>HRhOS$+9g6azl*R+BuSrnZF+q9+X9PFv4zM``X;+)0`R_nnYG zOvHI2!W21VKKUnT_V4d{Fu_7Wf5q}?%u-AKnIoxcWvUmSQjwVVmCyaw?|A#Ced|cI z|LOYRLldsvuaBM1%w(RPHQQ_q6tx;+!|cE1z=2-scig$LHGu~ZEpP^+kP!5}gYSDM zf#5B7#Awhe@|LZS0BXz6B~!cmESsj(Kw02H zS3w$OX|4Uh>E%MYU38Q=KDy{qJ%x*`ANQ0_*39xApXz&`v;IQw1xiG56H$I zt%?Zf{yeIei@xn>2+;{`BoV)Hv;KK<;+OF5g62J}&Yt=OyN?@5@3}bjea~#&pZ3do z5r!qLD+=}TLFwG$eHkx(Hw-px8e)r%=^unMCtQ#O&2U7%`qZp`6;^AwCz{&irOI`X z7pYX{97jBW= zf!D^6uN$vyXhK5$CTlVU)G3GA*$FH_y~t+byG0)BV(%i7AIm(S{+ImtSssu6_38Fz zZJLV~NNERtThUXvgA^jP%H9%Tgh3==^HGVHh{87!5~0I}l$Pt)H_mgssrX`P{qFQ_ zfB~TKLLv1Defm@imX(g~_Q8Vw6>I2UWV`~&4{{71$7Y=bsU8FZsgBFO^t?BozMMv@ z94!Fd=OPc~aCu?sgU|x7n%=KgIDqJ==X=Lxc9})hAfvowt1(_DF??HEfO^kcz;erhGFV@&rN!38*6xF%bhF*Ebj}N#88>{*3qaMecmW&9h=Q zchxB$#$T@qJc_Ul(p|ee7`zq2dMgIu07=g%p(DA|-Xt3pW%eZreOc5*q!y$s2}vA7 zd&$XXeE+RyLyxg~Sj_!mhdP`G!y>*(q~-E6@M=NJ_0)xdfiL%Nr!>9=sIm4Pzs`@B ztIkW|*+Ds8BeLSy1g_PPHBlJWlJwz^TNNXr^0#_uM?rh|?|`=IAxsN`&%2SzRCUmxNFh z6BrM^9hOtCBO$ySwJ)Y->odV$oSyCtMU-)+_Z#HV9J}#(uTuCKAB8YjSSGa6pGxD= zh!Sn4f}Mkn!*%B9vlAH<_V)7c9dtcfQ@-vKKeO1LognN|N_XcD3Nu?$9{eVEbS%Bd zAw-oMDI-!B@)nUxxWh8EvhR9?YHlGx^qwc09*DADs0Qtpdig(Iv9hAIx3>q$HZ@dh z3;<@n(~=P93|6W`v;#k=^<6qTx<+pr8CZROwj??c?=l~sJ_kqK9-8TAaIDx(9YnaB z6Y)w@v%1d?RtclHLjk24NHR=BBLhljMnD&ymy>&q5@BRxC}8B6DQE>lOLzgeLeV+I zuN2Pv2_iEDDMjK+fM@_Vq$tGNxeR}2+Ot&nKZV{EbgD;V^hfn{01jg8gT_XQ&w^68 z+q+SlmWVrDPe>lsuP^XX$Ma`6;Go6v8^s*|di9^3_`NlV)l?lV4PR4F%IfMyLj5+}(F`O9Wk(%q zX)8xS)E`e;4q~kqMT=q(f;1ah3SC{ZV#HrwRCPiP7>qrQxh1#NHFbFd7;#K|v)i-RS)pcXBWj(89vH(wsRxJ#ZSkiOByk9N0Yr=mR ztUx~t5Nwv6pP%06a5&U5glL<}%M-N7L|;igWKNcrzt2aD{Ed=y5!qa`CN&wA!{0&m z-!iqI(2Ya0Sc?S{+Q7#pP8V)9%~gNRV@p##Ag`&(S8twz8U-BM9VHG&2&{VU*S0Vo z&4?6bUDWLnpzTYYqc>OPPA|L2VD;zt$Fd%b>?z(S4K)Cyb?d9H8is{gmc~{3E8gBm zPTvYV^KfkDi?b{T4GdZ54Gazd2+7pWJ91)<5p1|~hfvLW_uD_|YnzBB0Gqc)y^Y9H zIc+n3>~D7wTq2c7U4>TQqwf5&Q72?7B+YSEdq7b~>1{*ir#A%lbrDCAP!`sfrEFxX zM~o&nf9rA~m*W*M8>91kW0PiE;G}f z_dLj;zTWZrTwQ-%1JeNpzROl44T>bRw6t)P3aP8B0sCQVWWAMZ^H&L~yI(|YO*hmD z4gVyKQrWcBwpcX3=K}~Fyv6IZ?mb7*p>d0&mZX7rXSwnJc}Pz z|HD{FQ4Xjla(cRfiV?AcuoOm}dFYn=U=rFze!W}*K7bwX+S*d>US^kQDM2jFy+vDY z_xEx3udKbk`=#ED9*Z3|`2C0z09|~$y@>+rPO9p>(MPvJeCUvc>Ak-8yX;(WQcj%s zDx8{*SZsjjCg8BX)qK@8HdZ`ZBr8ofCmR#2ANVB;i`(URl=E)~yWDgGId`j`QCBK5 zOP_6O;jd{-ET53$(lx9|){|HFV&gL&tbDaE0$rjYHK=?JGsxFe&rS4FU%cVVbo9BJ zk`gcO5&p~hWOzV9Si;n=i|p|<87f@>OHa*54?f*2Hr&0uG@X1UTxR6R$OyyKe5~?l z(^Yz&>rF2d@4F`DTUU^q!&$!s#Ji`bi;ig#U_~Vmf$ML!1KPt&;`Z*H2sZm+=xw2+ z+M}uIVLs#~$VH&xH*TE${d*tubxN?fJi;lw7@hI*CC_Se%-4cjjoY!YAoeN9r1?5F ziT)$a7wp(MrVOS2=Pn{D2!T_*kPo^FPDkL%DdlJpU#j7TgE?9mgy-9&mPH$=yX*BT zm2EqUWB?MQ;LAN1M%Si7YZL4ihw-u>KD)+>)C||b##yLL32_rJlUjAvv%=SwFRtkG zhR=+~TStkn#@2LZYS)8-XcaA#;M3vff?^yea#CidFI+Y72g0371sUsq4$F$wqiH0< zXV)NRA9VfL2kqE_k(c_}z^+-aT!NO7{!19_APy z;s}l@)GO%Gn&6X8lm2q@d&AnsGs9%{OG8~wS2yhfC+E)!2aL`-O2jXkG_kPRjCZ8A znwPt>17_z4R|1N;H8`01^*e#8Zy9vhTKt|oIfS#E2r00gypMT*dcIdmM~6|ya}GDv z^Jmfe^j#0P(hE%P_Hs1#c2rD040E&AxAU#7R>y?8pa>H_CKQ6O0MF1+VPsCARN2Tx zH!wY2o;Z~q7AMmE+0i|qsR=9Eou#FQM9s9ej*c*+mIR|KA07n5rG*hH{IB4Z_topG zW^eLY0CvT>dx($p6t0W#E=c_!Er1d!Jst%h8+bb0&WB)SAGAD)5)nKVC`1Sa_s4DM z8!PVc+^oF)Ix2DFq0PdG*fIZKJN5?q?%l%#y2;9Fz;pQBap$LhsUJQhznhd^XqAiWmf`pY$_8UFD(BueIA~;~JGH#S~+> z4K_Wl!#9`!h>kXgdi&aMb@lPd5K0qh*F=faBaTCC7K84CH_rjs`tn7M!gxYV4lzmP z7N60kh8E)Lo*pun&7%}^{4DRxsbL0X8nQYr6h$heMH!J_2a0+BF)km97AzVz@~XP#?u|1m6>*y}~@K+;w0csi~o$oQ1aILC$O z-?-_|g{UX1;1Xkl?LFfnyZ>=xEsCSAj@8KE-KqcX?tiH2pFhGVokZ}OUAz;t!KZNY z3081S{e%*09t|Rg)evB@84@^e|xw-|zt5JLkGyj3YE1^R}+21m(!+VPgzQBgr zmfh=(JX@5&915>{{f6g4k;MO*Xb3-$gwuzw1?JRv z1N>uS*G&Qn92RBQ)+h7sb~~D1)MRn&@U(3`~65rhE6#SZRjA zt$PN(Lqm}$2s?0*`@RH3)Ol^I#}V7bQ!qPH5+-o39wA03(?z{DBO;Be#WZNbhZ+@M zUHanj{{1No82(zkSa^gya{Ka6oSx!3q0GfsS0B0ED6Dz9Y1sEfzPVv+=#f}_VkcJ@ zMXNu4q(nxY-LT06P+Kvv1|(IZ&k++092(mX0R%wHOm^+wy-%~FiU=#&adF5%F+~G& zR8`=C?l5Z!to;ZiRlB;nSU&JEZc@A-j;*UDyfM$s8=rq)wMZ7kt1o(~u+?L(eZKF}gh#gMN*oPAgI@EL|Z_kA>^zIH$O{@IXS6q{YJwMJp2XV{>o*Mc^Kr^{4;} zQ8aH$1(`#o=YvV}qf;i^lhX?y`rQmq3 zsY;%?8B0tJ#*;Aqz4hd<@WZ{4bTCOk?FLq_Tx(I)W~NqBBgWQc}c z{4od7+mN2lJw7h*G;GNG@yDwV9)@PQ%rG5+Q6?%j}giN)l)N} ztyZ$0nq!gb{jiJpQ;4P{VPQHH7v|o4NecM8N!PWf>jOPB8aF4du-&~|hYlT38fuUj zz0Tv4FSJ^~)aY})N{M?{i5s~gqu|wZAoBoPf$?R9EDTzQx^eWzej8mXd1E!aDqimq zt+w!&LO3ZYE;ve$r1N*!roO|%dApD5`t7=@?T%FkX25m7I!xJ^4skYC1v=Jj$euD zEwUXLY4gMs&B0MYOl0TI=_1YOFkgLeWn~>8jVA&I8VJ})yRA-#b_$||r^=Us$}a6% zxNCXYwtqciOLF+GIoT77tqcW3*@eG8|5?+_6Ey5(QO9?r@3j#fUT!kiv{91bY0#rD zzX{~!@zu->o9_$}^nsL^f$u}h%l2kG9ngQ&w#&)L{KV~9>GKr{t-Dbug?w>TseH3- z`u<8!+0jWC_@tlXXi{=KVbm!u<`TN;D~hkhA?KUR{WzjHueapDuKnKJ1}i2fPGl2V zSg3J9QkOhOEux{N@OwTJuJPK%?AG!6Bk z_bc&q`_h)aM{IqJj_|@EAR8sUQk1*b=1Z(M6o%S#Rg{#jk7=2wFjz;o9oLK|%-yoIFhMf~%u-z`maWetu(D5~jAV zEK`8O(YoE<4I3s4%YxNtpcu)>NX_le*6fyQLC7>-@TY|=c1W^|i^qO^Vs5$mF6l*i zhUVgNky0tI-6v<>BFxG+oX?yiG~;Vl^vPY!I)WBW_{1$|M^4%=>U@h~7P>)>JwR5u zKKR?W!AttK(gN)O2uHv3QK7-P(v`I2xQIxqG{uo&<&c93QXUPg>iP&#^##G zhkgFM>N=SC+Emly$1j}!7%Me2HIb=tHZd^`p8Z1!d(;&byyc<$8@s&z#PiBTM|?dB z?0@xdnr9mpR8VZp*P9Y?dr| z8k&5}9udqtoZ=Rzk0r$)w_LmBOaR;T@rD+l=r4oB**ymakWlWF_9V0k;V$x3lVS{}C zYA2_H6;fKI)z!YWi(Xrv(ZKr|)u3|pxoGfVL3E;Gc@jxI{UvroKL zF)=I{g1lp6?+BP;E?i%A;Fh(;tD1|{-=t&)iq!V3*_)lY9w*F3?(f55FuDrmnhSH z?AYg9;~gS|rFhkb{_52q=jEBNnM76$R?Qz1-L$GJAtURj``_oyNa$Xm-$H&6VMOcb z79&zB#>eX{|6V4)5G|5+x6=xWNb(FV-zPGUssraSWovSdkD=TPo-t`DhC0q}3nbJSt6HG3OV( z*WWDpH7>ukw9IITcUi$NyALLT>SoDJXHF!SB|pmNw_}w^F4~C>^#x=R?c3 zxsCyUdt>xV*60&FZnL8fWP1)AHK_}`u(a}SbIA`@F4ASoO7mN~Ze~%!?&m&x05iu%tO|jj8uDTt>*{Rv&a_#5s5uW?|>nIa! zn5#jb3MCkwoWAclA@gZYdYa2w`Q6>xp?NdeKqD(F&Ubeop~G{zyJUSIa8ZN@eH^Oo zb9Wzqp_BDtXupK{Xlw1Tx&Qm(QHT|xY_qf9NTQb_#bV2*9J%q>OI{b;0@`7*^(fqI zfQ;fIz-GZa4d1h~suE??KG)?^zR=2~U(FF3f`IYoabe+P6pP}T!Ht#edpt5OE)d@Y zx*uwSlD&h1G)F!TJ1_qIdq6?eIb$5J(q|xMr0*RTFR+ip_)o_$zXw?xs7Zm48^Yr~ zG&I%d?;-*FpRL3`zA1D-tS!N~W-aC9j7DCn@DnOFjO-yXEXT7hizn(AsCo#wNK0QO zWuR$}`^{MQ9zs{Lf3M6_uRraF(sgs#;Tyvwu94QnoH5gL*#whEbwz~+&t78QI3V_} zHAT6=Hjoc0KK%kxd>j~WU{d}sZ{*sqjb7!!n2Z z#-4(LPmE}uPwZJ(?0?nMl%+O|KN4F)OIEiUg4k$Kl7PzE5qQ)w#cGy0%a9;Rwjqq? zXK?KhMlO^sSXyv53zj`-8ug)&T_)@U$g_r~*RPcfq^_dMMo&UJyzk>;*N>D{(pbi3DO_u1Ek)z>0O;E4bU07#j~P( zcrucX$>*EI-ZKjs2u`gFh6;;%&D^+tz}=vGt?36Gq_&OH9WW8h*!sm<3OiIy$HMu($7F$UW zC4*59P$!nn-Jd*ny*R(kdT{W%UTKeR=T&)muWfXxkXhVBrMcdR2b}uv$O->Bl0Zq) zHPa+)Y%oq|Z|yC@kjAO>?B}3{2auV;A73J^N2MRFuY6}JS#UXI9?8zVlTq-#Pw(&a1!PdbmJ3UIxpjEcbo^JjqX~OiY+CriX@y%YtP?D6>vnz0>Wt?*!10&W|t2 zHEH7#;9?TljSKhLM{#y!&WT%(97Y2oW0!hX5_i^zY~cG#`r?wBfgfK2P!`V}&LMvGLr6q~?-hYG?U!7@SEyb038#WY z_GrEwk5mEprjuPi(AEE2Xp%g80txxe`93*xn1>e{Q3`~wUQ4d)cu+24Qn7R9&H@ge0* zr2!4)s+YT>S*qB?D;WkVJo0$^YV-58kXr5e#*$`jjjRLelxR_^f#H)rV0?|uCqE;R z19dw$ae-6-a?pD9tKzNM5BS*0(A$=6upOw|hrc!$dkt@WNLe_UPQkzTbDe*;dd`rDk4qGF+3v^$3^eW4zjV{ukE zegCsW3us|_G+y~qq1C>(X6>4p*(07o5qzWNcyLH$Cw{-uE8DU?nTM0p10}iGj_6of z?!7k2KMur zu=zN|Z&3ZWIkt%Y%B|*ZqVo&smS}&w*Y^+&tyK{#Fo|e60 zIzMFV{`lN$tqe|<&$*cSZFfUMg@wgyQu>P1D386~{q7(t8dhb=FP2i`dw*$1B#BZM zXM9b|&b}Ne=yE&58)SB#ag7e5?~sYJ6-4PM(9*hN!{!J_3CNz{yUOb!FnrsrtoD(? z>w$yH5n7n}JraLBbaYhxTC!U9$6N>Mq?+^pz|y|!1Ue&;O6=eZfSvgbuX?@Wuaa5! z-^Y}$a}<&GE?3VkI*j65gIMZgZ7pKU9DykD5yqsZ7>~Wo%mDt3pcA6#>(lJWuZ_Rg zy@1LNpv%1Q6Xcus6D|!<_R~LVB|-}rj`j8y4Nhe5&onVLl?4GiJMYv@_h&e~=(|5C zcU+Lz`SIwI+y zuVmE{ub6*;U&4QqOabtE3Mr?tEe(!e@xetbWS`$IRA^=078-Wh!NOA-T`K6lr^Hdm|%tl}DOOg^{2CEoclr zCxA`Vii$pU#)dL9+EN4k{t6qhYZRPZr5kO^dzPf1MeW-fKUuc-$LzYDYJBPAw6xtk zJib(y_+H8&o|sa(p0?laW~Sqq2{RKDEE8KGb*Cmlb>{Weg)9OC)qc4)^ER^fhP#&` z=ZU!!_@t`(U3P42m_gO3ok6#l;h0&VM6*$Nz`=nEReRGxtMh-ED-cV_y=d09^YGyp z_eyPWmJ^veR9-W@Khkk75T)P1=5TWe+q@FR$&OGFSLjD^@=Bq588}OIXP(I(zp94V zRVvUOhf1`o6({ZB%q* z*qod5y3OE-jk}>suj-w#AoiVKljRMhrSmbQ;jj%`$=+2cNQ_RsAJ!|Erj0K_ONepd z7Je{PE{4KnBYdqqhj6OLdq)PCLALkj-ZxU4atokgOjgr8ZghjyABaE)3yZ7p$i?}0lcPiQO(GmZEfJZBH+rV7b))wNX zQC3umaecRN^TC4!;p>&Vp>L8(Qa_h4dd&!4@4I3dv(F&}a9Ls=_-3$_6~d~>(+4pxdc z1-6y_F2b_58Vltn7?KwkZ?C&Ck(i#U8SXuPi;~cx)~|Jvb7^ zZ4?--&)m@9izSU90+~Jwq6VWaIsYs!zQv{Na0J1GDK*6!5Vkk+|Na2M5 z06gEZ_H2f#ZzpygN~XgxbbWRt0M%s4si_d^?Sp>tFwWuC1rM0FYawJ+yx?@`*}NEupmr>An)w{xU0T)}TE<@11kw z-|j*OE2Rkf*q{LB|Dy$%adt-cWIpjq!oPHmSKGV1*gjkuN6{6ueq*~M(zS3(6G8+$ zq;z{;$DyZ+?>jFwuG`eqk%Ho#co-S}O@;@jI*b1r(fZIoW^_pa53NCK~7M7yu?aNSK5bHk8Jfg|{~ z*~^g(r|g2U`29~{SVk=J0o%p<4bh_byxejomGF5;AJ#Db&MS#dZ_l(*K|slfF|1km zdk(7HV8BjpZZ_$G*PcgaoNGwi5`ZG5V6UjBo5vFq#Gw>D$^w@MJdN zcHg~3bvd?uQ+dq7Ra zpZ#Xti(?KpUxUU3r~bYH>5EuX*sO)1{*c$#kB)cQ@W9}li(YKVSG@D`b^wtd?`CpS zNjZnyqtUd7Aa$9UG#Mu)-M!XjM? z#|IMZ;UFQj4EVN{kWUH=a^2UoeXf*u?$naJNE4%>r%xYeL!~K1K7d1iK%0%3T@J1W zwCti_rXouC2#v9EJv5^Z->gI5pSL2o-K zNmP_Y;*i6ey8{QL1)x=5hEgb;n38{^6}Ao^7bL;L0amdY=C5m$;qDpSrg<6ts+`97_kfG zTALh0DfJI{tRNi>7_3shnB-pQ`vZ<5YZ#)n6AH%Gxr@o;;c@C|>Hs%5Z5Wo2W6NJ!ZSh7pw)O#|JH zLp#6!p+DqwDOT9zTRFCOoGcS5*@mAHC%t&TZ;j%|=csZTZ_A>4sk4mI z5q}k~WQRpnG;63v$*-8pafKp^!03LjMok4rXz(Gk)~s$G4vw=VG*r}-bo4I*!?mZ) zOSDKIv+e!|Z{UcL5N(zPxi|cMEV;VBV3NbgNYLWJ31kVMsr!jekA|2>NFsl0`HLiV1z^$$przOz^Zvcot!jUs{5#(n zjg5^pG&BH@6UW`uyurEYK~BQI_WkXCq+Sp96kg2DW%<%_Oh%xc>f7;S>CzbW2sJUh zYgh}o+y51}>?~Vr^}E%0nGA_{?vEdnHbxi0LDh`!0q|hPs~lX?hC_Yp3NU@_HJ{|c zq%CX`NDcIekhnqNY;;o_{7zaf#Asawn?8u&B*qv1qgl^{WPfln_?*wb{i7OIERYh+ zc+9nUKWs3e|4gzz;w_oK>s^$wJ@NKdAL5PfE1PUu`1{d+@0S^U0l09y{D~_b;g4_5- z-F`Mn=Ze};r`m=GvNDJEE7xzlx>C4JvP>IU3C#eEv9kpHKk+(5=HbaC<;FpdpA`tf z3!@(F%*WEOttQq`poW&#{XZ8q>GMegSg|8 zE27`Ow2PK^yx(eEV;}l_ailH5mCmp3EyI^pTGx|(=o0iEW;CYwwja=GI$%x0L zr3ZgPkHqtj>~<}uuIVe$5E8B@dm4VT>hTu%2zFpAVHV~8{CzP*N!en!uAMI_HZJa* zP6X*wl5wh58lU|%dyZY|Ouh5{&eHO|x^`XuwvmoEd3Eam{CEotuJFDwH{43crIMnu zPk&|MuMb`qPwGke=C~Tuj$?t<0Vhw}O_2sLk2b5MVn zVMe%UDhFc<7V=18kE{50BC4{oM_5QjMX0pv14_u1KY2c85lf|hPwH^WrF2)3jR64L z{qbkB{giKt+`r-#swrD}{T^;&Q`0kdd+fr2-dO!=(IMNS?QwI4`I4^_)_?343R#!s zGjy`J#>U3ny}W4X^L^mw5QeiInh|LL^L>5BiVAje8XA51n3k6n{W2U=5Ho(2c|L_{$9F&;$}pf)Z!P`0PU9qftx ziT{6XkL2=(lYn{qma`5ECorR5DRT};NVou~6s4-f#Kaz1{`IH{;|rFng|>dkArrf(U6T3L5$${*X-*4Znj zC>f}0(wzlF5$|^Gzv17J;@$mSFPv86_xQctakJR%j;GU3;wGNx?M8#$#HWBV8A|GR zaFlMTto-)k(wk$HyM!p{DI30Jv@I=>hlJg557j&y%H>pYmIdRzqhqG^+IysOaz0wK zqb4zF>PeFEQe(q9(!I9wXDhy?2!1`O>q#-m@}mjKbe<{0yI~sVl-S^b&H`b)FYu8z zMCFknTv2H{!t!Tv)Y;Bxljgx~+q-;ZU@ zKG+6va;0*$wHcu49%<_mAi|-WbmBJb+vZBT#S@YjZ!O-N_#B}j0xeFDW1_sqL}2&s zK!nS}{(&ggV+4`_T`tL`k`=Wp1}}w;DzvVaIU`Jg_5BClo&CgT15w(REl--4v?Qnz zaif-{t*IFbDk=B&m$Ts(TJVDs^AD;SX#5Cn8?|sJ3Oygho|%slcQ})EnMaym4HO3c zd1JmhCS2Rn=I@w0a`yNc`GUkwpLYDD4I_it9{>NeZaGpA;9kzZt$n+?M{=7P!mqg` zH`jKEh@^n%W1All6A)ljYksq|OyT@~S`=;MOuJcC4)c%0|8ev6YwqCD7~z2Z+K0u& zn2#RK$|)7GwzgIZ^9J}*&=!aGq-IU$2bRdrI!gLrq9^?I>zBoj89Qz#BwKq_R>nWA z7rvBtE28z8J$y;pFLjIoRRN}Oqu8NJw|~FerB~;kP-=$@k^;>q1qn-Suxf`C z&6)StK1zT47V;){Wyh`nlfztREGK$we3?Xb_gj(te`$$%@C~>o^|6)b-t@cOk`SCb zS>-nhz@rL1C8SUgBc6a2%?dBg=FRVXCdK~SlzO3CD-eOvh)8{T+^lVqpkv_6z#asp z)?qAd3dop;QSb%G5C|zS4m%Nua!t@?z?I$L9j=tIp8J1ru#!o4tAiA;%3$(Ju=wAH zFU@u6&=Vfb>QLlLsc@yJC#T{nfaBtze*i;OEEE4T!U8tyk@9e&hw=Z7$~_GUX~;LF z!;er|TdT(@U(@Zt-yFyJG@KKfF=oIiy5?+83n~bb2ImcWIQr9q{SxMe1 zzvwTyDSD5=-+vK3K12dV;`Bn>wduiYSIgSca6HKcj4kOIcXf+d;AjF{3PAG4&G7U3 ztJRwUg+7P5vMaw@d*Q2th8D(<6qLWHJbUeJP*nW--Bsi@nI8_Jvva7|s&4=0IBW2E z{r&+7N0JK{_HElXiyJuM!SCwZcO*WxY6Nu`^cROA2g;~E;sPKw8YEyrq=7zWMv4-1 zJKgCSy*%f%8;WM(#s&9#rR3#Dt?zg1-mD3{2H)A%tsQlryn<0$c)*oUcOp1A_+z%g z5AX9CK>UKh$pC#$x!=12Ku%4sY|`OKfy!skUFZ7kc>qpq%Ky6>wnw2wbp|VXIIj)O!pMx0tbkPK4~A@-BoPo)(|5EXit(%+3kKd=CV$~(Ikt_3$k?G5Xa}4PFV}-+mAD=jAr4JDO zWROTmbJV_2ja?z9GDrJ~CT~07ZE!QEfBewJ(lL@2-(%Xpk(OgC<0AFJCQCL_K#1tF zZp&Wn{5i~f8HBAD#^8|f@Jf#zR4uK(aLNh_8eYBG`=R`7br`v;PFB|&OJg)=sXl!^ zCTDMd^f0XFI%dXZ5VWsQCCp2no(b04A#6_Z<;8WF0GblZuv5nD6B3pLHD7v zu=*ui6PwDa^k)$Uh+ou%AN(Rgt)W4>aaUKDEhK6j0{kxV{R*>2) zF#LhMF952Qt}YKcogLd{>l>rDq-$ktM>4Z_Yl`j9U$-kNJia5*L>{Cvt{Cf$HD*~A zNUZR5a9@5v!NVgN9InlHAoe)|UE+Y?fe~~$sCJ+}>dOZ%sH#>&uA1<<5vtKo>FQ;J6McbyyPs^` z+2aieX(vmEmu}8gQesuW(EFvx))wX5X~k?PdI086fz(9BNP)kw)&D9eyp159z5fvn zQ}H9pXJO7a4M0giQ>@sNoXPDe=fagg8ky1#FZWEzKYVyH+^f{BZ@{p`J_;7wv~+2gfqg1u7HHDN5Ipl0%S!fM~OTn-Bq1Td{T@U7Bs?TpoG<;P+Wr zkHV-m5Yb0~Wj#HE*7rlpm?9!@(O7aA%9ZzCAm3b2wwH}4Xr z9oQMZW@?K~^cH=BOqirfl-=6vSk-cs*Y0!`c5hNGeikQW_{P0|(##@}9 zU&-=!>rq078m%8KXmO-$Cum3j&;10u0;M;R$$$w!+HkY6p5x&>c|${`t8}Iz47lKB zc&hGg@UTU1(SJr@p#Y424xbF>(JY2Hpu@pMo=x2TGl+lq3Gu*-%Xs>iLtTKpIwF4r zaco!^nfX3_a&po|F~a>b4_EdjNLjK1J{SFO=O}k^d;k6tRO_C2h45=V3AnHi+*o$& zEqD}{hrZ`vf`51KoRVz0a%5AU^{CCQ<_+T9_&K`B1oHczLRt#~T3|p7ND~_+(6tXb zqtJ-pF%E`D0ZAD6f>7F-Zl^)uv3>JJ@3nAdKEZiEj7|4ynNIN+RW-Fw01sfH0%GaK zF0+CkRu%utuK2GlE%52_=3GrdP9$y~_3fH#ba;y8L4&V!GD^YKJ;Amt8Y&qQD2pC1t}TGKN%tJos?d*478z`5+&$Jx{-negwXoDq7kD9-jdYIn(;x2q+Tq9y-MgO)JB6XEp zBSCbG3x+rUv|YUX?ymgpUkuMhZTZ5E&wAR!1a_-E`!8^Spk!l;icdKqAtCV64C4>d z%+Lt84g8wZe-QK0^3R}0M7$VMKtCtS9I)GPJk`||RA`k#tsEK06ZVivq_9uf+Ik0) z^GGhHD4pcze}w_X7u5gh)1AN|H8SbJ*~NYGGO-vaXLWnBh%cucl-=Ir*LRMLFoIc% z*M8YnvSQ}e7W6<)hU;|U-B%;vcqfLGh>e!NU0BW1x4%Y6Jcdx zJi@1J1;WzPy>{*&+9qXVvzvjBx0=!KtzPMxpf8ilp-6M{$%LKEZnh2@u%Co=W0pq# z%XShB3Gg9Zy%tZgBLb~G$d39?GXnWk)3f70!OYM}A3-+l_spYNm){QK7K%aILhvD% zLzo;SBtknu5(5x8Zz$>FZ213WBPm;z+u?{ya(1irsE#bh=|F`!H`A{R!e%jR@(f#`$|B02S6d&EgNQ204X+RdR-ME-+WJ49^>>OjL_+QEC;Ypd4D+0QmE{3f7 zFLnMR-p&JCJm?thk<9lW+OBow>rph#zvcW64YK0=Sfn>NSo=VM4o>E5bs@u&?SnpD=sN?TGKCo& zuj0td@cAqx=cHW8 zqg2kPsdC8qFG+}RA5cc8jhE{+*FmQNtb2aJ0dH2&}V}f74ia~z4EBi_?2%nb?Y3sCQ zeCF+*J9hQ}oW@G%37TySX8*f)m4uyE#;F6tMPJb;;Df8X=d#&Y_m{94LQgCwTgjEf z9=~|SYj-SMPS&N%eSz2PR;!>lbo~!fS@R;y(O@{D#M%k{7p{k>mX@!OX@{SE=SEK& zebNkD;dU@@B#6{>_n}Ke4I(*~1yb3j-o;xD24$?EL3V|&>gh%Flx@m==z|aKPdgQ3 z$6|#?bVIDZuWk;#(N&i<8pY+ANYl24dB5ys`2mBf(DrPD06=0uEtoncaY;auO9<}` zA2=n;b!u3E9&o^r8aMwZpkg6J64u?^2?F-!QpITde zv4vpKdkm-snXXlpm0`d`Y4^U58Xso?Ar)NPNAJ@-fB#c=YJJeowZo z)!gk98Z8XMUy``u^BSa&u(Jp2WKGP>Wk{2JDj(o7Yb$=Co^0!rU2OEH zjc(_GF3;jb^-!*R#!FLci4QhUO3bgGFl#%3DC$M^nXy7LIyNGu4>=RudacrWuOtNf zSIl*}Le&drEC&bAa0i_c33or32YP< z)=;I>?t2u39TqbjjVqL$)qw|^5T=AI;Sty=uN2#{;@Q7_N2#_+$I*nq3X$;JQL=iF z1h73|#U_Z&pe0R2Uj~|wr;4`zAh(<2e!lScr%#YMx$7HCC_-rQPEQ5sF04;wZQ4+j zvfy!M>y`hH++Qat0n!$jd|ob}}Q zn9-QgWeL~|q@~@8ojY@xOuzk_?RvBpMt@kX)bfzOFT?!w+!gPFg0zZD`fu;-Gih>9 zK;bbSKU3^~_$R1e8Gx6-woC>e&(uuFkv5TI$FM{0g8T-09HqwRj8M(U{jAm9#<>WFds~EzDjBbQo zK%q5~qqJU;uB3d;H@&AClP(KK5Hnq!a*BrM?%wLhTXv~y)FoJtau5D&&O;)r^U_CB z7y>4G{jQC7Y?97QLZIPG0z(M1V2;O)8!tlR;&c=a$eB4%$Fe>Akm*?c~w6}k_Tl-%#}5pNvBj*vuir@J`%!%sqO!swo%@>FcH-Wh^|p4s%lnac z;|qC;o7GqDZj6m*?yn7o4uf;~m>3zc>8}Ig$q5IjvR5QT+|_p(1V+jiIU_ ztUBPp?Y38(Bu!1?;GKouy_+Z6U_tsJXZ|cmaYCD5e(<1Z7_M(57h6L+p)xyiwBNK~ z!unHpci=u@k=dm;TyO8B;24c_UU!sySfIoZtS~1hv-{w&DRPH}Inw;63IolOd_Vq} zdFEPi{b|dpY-(bqqx&lD)4K!tMcZLJCMwTM95$~*#{fGok}9#@UuqkQI6&M${%x&>ZR-*m(e_&pc3^GHTT95-@hMvlgqn!)roG;(sP=BKs{IYx3m+9pvlOW3BD;OMTiNPK!^k`;oal*y) zAQIrGEQV1_;vZl(FgDhNG%$Fvso?BNxp|aJ#p0Z-tOsIWUt@TMt>yAt`>R)_R8>VV zc_+#GMdaU^Ka`yv`e<$G4ae1S>+s*37hk+ka2@4+Ar$rO#S0ZYMSc+xBGA)-e%E6k zJB%8tse}9JLigXeB@wwIi894ow?=mE8&s+CUD?YV&E2P|^-UaxN1|(_$Yxzp;dB4c z$Oue(o__T^{rxlZTsB#yrBy>>V;eCL|3ba@>C=U910bbHySUh~<@@)egVOvcTm=0^ zLt{&Sbr(XdhBnp-(W-9GQ_|OOvug8AT_B`6kfEhA+O(X1kMF(Bj;+Pp|EDjfKJy^G zd1b!H$NOo``rdtilMTe8MXzvP+z%?{$B0Nui+dT)xTPh20?9^HwWFgB4eJIQ!aHt# zBrCM21nlhXU+ksDi(HUIJgfeQ8@5=P;{h@4?ej?CYii?i|E3&pm-@{O(Pyt-@#D){ z`kf{M&3hBr)3c94(8{_$QegcP{)wB9kI)Z54&C|2m{~KGD2v_)1Ha0(1WDxklMT!a z`z3CiR%Cbx)jw+sBi031AtZdqk7rEtu+8)N1eON*`7z_Fx3jn31HuUk z+uR4g@9f<5^0>nS(FCNLrdoE)HrpY11{GzbPXTO2NAG}XFX2M8P0ZOx{@WSmre|hI zm&VD(l%A-@j^Pi9{`@(f1m-Pg5S*LUyu? zjFcV9$Vx>aRFY(cgtCQf*)lUiRvAUI_kLdIbzQ&X_dL%(_i-KfeP6|Se!rj3`~8~P z*?bsM<)P2@-V$#4p3C_PJ=54gm-R|L&O9QgN5NefK|PP30kqjM91vjHjpUt&vCf?_ z6gf;YR{Qv{83f7U1iRbR)M`!EL7LVlJ9b_iP9fdv;rXAR*BvYtVir`93v*hc)n~qK{qO;K#GL9|$$YF=@A{YDi(oJ<_-8On}_n$x(z{0{u zne^8_J`;FVub1EZ%((oybobg?SZ3Z!9*d8b?ZISp9w`Q$M6#7u_pStc)dt(*^r1E! zC~=3HlonO>SOm6&gzL4e@Pp)-`i3wYHGa#RN}~OtfXt+OWOR<`ETX%3adl(b+cV|L z>N4} zHjBUY4Gn~(J0LEEK!^u>zIG&=pvg2^Hy8n;=ZIp^G2eF8Vr!3n zV0@qMOt2$mempH52jTbsNRQk>9@osOw6}d6m9^pf5E1Boq5DCIVv1MYV%jCu6Cy-}BfdO9=!Uszi%CfY8Zl z^b6ZLfn3r8t31p0n0rK$QBe}c;W^YU7Wk}DLx7v$CoCRqAq0ii1bG3W zCV*w8rVMCteUhE+agmn6D->MB&!4=}|M&$B)wk9r)TahRWVE$QU$y00D;%dcB$Qaz zH#K=CtrWJ%nx=Z>E}PeG7`#8*{{E%aa3gmp^AF>c5L3;p2c!qO%cQB z;idwXk?Fb4@LpGtWQ3xdxXP3bKm@MhEWOl29q2wrNTWvj6*oe(SXS0Pd=;qrY@8jA z1AOKeda?zDX8hh8S+xB8PHItm(c7h^$m;egvdg^hQ$1n9EO0785yS;0C6&R_W$^15aT__kI-&O@OzcqT?7z36C#$~f-QgQ?DYVulWMo|JU6RE#5d(y zx41OnX2K3KQ$cB(ogI@ge#6{cBkukcGN-}Pe);c=5+3KUyj@OBMrvW1!|&!ZSOu%< zQ_dhvig2!j@U1_>gVn>~PPF{`5+Ra?CWJwp8BZ><*~G-ID5-cf0*%+p{SuBI3y!Iu zlj0#bEZQ@SUC>*ba0)1+vEM;PLSzB0$ZaAh*nO#pVCUnv>3$=#e-8}Yr2nG?)t;Gq zxQ)_hw>efU%%5IMm`eJk5?bg@tA$@T^ z3RX*VV`=fK_S+^v)A9@zh<~NLICACqZU?u~FSK*hWm$3;1}b}2yPiuv4I#t{*CmVK z=}NF4v;%hyfjlENF`o|;=26k^@tBt3`O?(ZK9lFMwb28lmYzS}gmHP7HtJ(LDv^dUu2sRjpAz}teH5q6J+?PDw>j+${CS`1nJqUOY zn(quD5s}lo#1yf)>(@`^m{% zb8{cv);bU<&YkHx`#WMH1AQ=Xs+TCjo;rwdssg!Do)5RF9y{ObQ{+D5Jo!C1q=lop z`KX7Rod-I&<&`<3o*Ymn`uMRTE6*$aBc@|HDJg}Q++^%5vi?hxAKH_jQGWjHy#o&Z zM{nNH2dv5Z9oRE6`ve1u2G_M+d$y~w?Q3dkYDXCsyY8SDxm{6F@f>Z}R7&AzE!(DP zXfCty@F*PC8XxKK!$d~)-eqIO#CduEvOYov9;PRv>O$oPb3XV}6&mTy*NF&jgkLyd?rTCV#bJjKywe=o$KZnRKl*!VO58uPm*UII%>}o7SOw5~ zN|0Scf#8Q>pCILl9W;Q+6tZb5s9?~K7>~c7Xkns@o+l#_DR}Q%D=N_CakD2|n~4_% zA2Rwm7EpGm75TaJ!zP@q&*CH7W5)(%=54V=H|9csiElybF*9H%UF zFLB`2&}$u*nyT_n-R0!j*4Vl_cfx~yAXZ%|ls!)+#v|&@8*hB0@ygVP$;r>`@B9iu zR(0Ygr-7?D?sQCOrFp@?cJR~^&U>s8D=U9T$G&!g#HSN4ag=%ypRS_QeJvP@fr)QT zD{FRgkbxIC^~YAXQ+lH+k|0}zhFMNwaQnpg1vECv{i}BULHF~z&!PWao{{8>;PAu? zWc=7BW#y{qQ6XDBTx;3l=$&$F^Dd2>TLFr&d~vJYnfQ*>8E;&`kT)7;eK4`m3B^pA z?YYhf<ts&)6*j)Iz7^n!j6RL&)q9J zaq|~1y2WZ|&%Ao|s4=F5h?-guxezTV2G=k79@3t)&3?9((P{p*@1KT~)7hrfRHV&; za?IfBzue#LM1WxfsTEkLZtz>E91s?cyFIB|3VerIqwRvyzt{`$z>oZL>vf{}@7?V6( z^BP`!O;DpZTw9*@!533;eMSC7SXhLBwFLIYA7$I7b#W@9=5+Pw-iK*hpvB$DEv60DYYwHjy=jYRW_yT^83T{h?It}3EN*w)*mrGg8yM<#u!D2@C28^)Cp!u(sG~= zoYAAc68A?q00}3A?4#IZ&C1Irjd+02EWL5Vq%rI~BE-1!HmVnplO!3fn>dj2?_8E$fxKL^VN%Pw`N}6NVk~l z--`fs80zQ8j(Fr?3^iGp62JlyGQK-M z&>=_Q0b~V)*>&emSwsvkq%eNogJA2!M_F0;wWbCrDTW`$4(2WM{o>=RDtD?BI+;Yu zz|iS7XD-4A;@;hkn3pGW$|TSnHN^0v1^xv`~Ms%aY8&4BR+7=kZ0iz2h&Hy+rwTzMOLB zjEwYLHA#&z1tPMGiaV+{qs*)2OW3;NMUKFrrZep7b~=ANxixHG)SCl`aU8A@s4~qO zD#DG#Y2LW+X!ZB+h-7fdbj#s8q9k0p?L`gV<_W{q=+smlxO}Eba?F*wT&%W#d{*9= zRbak&kpk@aH$)F=AelY~X87vvdkBH0&QFV; zIN2M%GnMaDeZ;(?{PLH@9Gym$|6F7>N+C%|fjYF9kXg^o>tX!=mD01vC2P z?&9kR!kKAeYx_9ejusAq1Vxpr2E(qJ)gOP9VKJnk)xH5aCsa8jU&54a`qxI^a;;o; zb=#C#p6Wu*K*$5x8(y1>_SxBuvC*A)BC_kuv-5SxN<3E257(qTdv!{1SH>0La%1mm zvzvOWJ41d9Uz!mVIy)1h-cRYnbKqZ+>=$yBum5ho277tGj(^z&pe&SSVK1r_6Q9fc zcEQ|LSV*$xU<}a-))Di#J{#|C`sPGsf8;qmQH##Lb!T#K9pwb!MbxHog56>=GgrK} zzvwp(rlWL`E-qPI_|~W#>mVMX=}BpZly9W<2>HwJVn;$ zmkj$3tz;i6MKza?eayf6@Kfv+38|@1@Ec>t=YGzAMr^|(OSq?$4>2&LgB#o0T$Y^bM<(V62@Z}Oe+Qy#J3mZ-gWiwC`;#If0r*oaIP-m}v2i`}OOxYuDMdxDEl1;J@>S72;YYPGY|jr2KyNWKTpxP* zd8l=0c-OI$NeBA+MZFwW$0R6+YxJGgoeynqF4Ko`^dpKc-s%@!=d!B1N4XA9(*6}YLProYKmYqoPyX6rwq-$V}!sH2aXv8_Yzfw4T?um)l zJY!*!pArBn2qut-M$qmEVMau?8n6f8S;5Hhp!%}^)Xe1nyunBlX6KtD#0P#tXgxRg z@cvPiBIijCB$(%z`%};Vrf#ZV63{r(GfTX-yp2W@`)2?qf`hMo&XDmXeHGC;Qsr+p zHumDAcnRg}*Eb%A7%MtEix;{KK7mFKe>n50o9(*eH5?kR#>UoB;E6ZvK~mBlY3WEp zaz3gvYVhHM($EHtz!PWEb6mc9y{KX!K9sLJrc z73A3}!630AsNotuTRkW&EDY4LxcKEE3JQgZZ~Iu;>W7!&;~7j$90DXfFG>baTbBdx z+PR0rVcO`Z_6LI!r}Qed=wlRAdEsSSZBqLBXhkvoJ89_oV}J^AfnNa@4F?V0UY;re zItE}5xesAjq=Di*-MycR+H8aR>VZ?b>Bj@9Go-Y&!}c7EcW{Xf25CVASD0!2bI;`W zUYmbXh}mTS5ucX28QngJGg#j79nL#g@Kw#1c_$|q4$Y6(JHO|1KJwuDt|>1`+5&cl$ZZ_@cZ!5701J61^*PG=gWU}M%k0s z0+C;{%t$zOo0&vJ-pfte_U8FUMYV;$p+0rhD9RjbAENt7qj{P$GxV}D9p1j(^)GT~ zAQJ6Cwx6o%FzxDoeSNZ(-?2NQgq}U|ub)5u&7qXrp@h)3H0_*#m4S5`5IH0&e+()BlNZ{6~5pp>qrFzc%`K`XJ=j!mbdtX zX?T}aEi7uRdk+9aabC)|ZcKwE_syFYtuwr=BdjQUWqTj_^iakM!ILfxs})9MHueiK zF+;6!o50u@SrYyP%ti30o#oYkn4QfYL}xFht{(LH!6U+2IhxE_8&97hx-;YsTMHuKX_DGLj~iq1`F24xszeY%)G>67l=>oNa=)ksBOKSDp} z*YNPLDh9?&DGwp1H#5C795hM2>r)xmmWll!k-EAI>ydq{t9-v2_21m;THQE&`Z?S0 z(G)6Y9vtg3!@4_X9B4a6W3opG&n73lxlV43uRoHRlCLX|B`ELD2@2#lt&C2bwmffS zL<+&w>Rz2VIYDVaTk^c2s6>v6AT_JQJs+xB22im!@G_UDmxL-s(dwg z%Zd5KHE{y#gE?gk(?&%FDR`Kfxj7^y@4@D9cvJ_Ua$SoDK7aPmzdau0z=n1)_wSQpo7H7f#9ND*r4$PBkj?pqT{1Z7HJwNL-UrH z=#fz+_$aG7J0IZ6!nh&?h#5s#rb~Z!)6l#q4fyfs+UA-7bQNDe=nft+4h;=`5E#f) zU;qA`y`A*-mTKUs!(MyQXjBD)gJ`TZj=#TX`O-!cIx>-9dJoI-n+)T9pb%kz91mKi zo^8`){vR#C7Pq(S!1;q$^6ex&pO%?HLyZLI7cX95QzL%3ye@!9_vT2>lK-$p4dQeo zvXiIAPB}P)3>2V=yxFQNy%JOaB1EJ-Jo-*5lhaeoKSj?6Hn3O#9>2S@Dj_tkeXA6@ z_rOAJi~SiYDjlS3&Gy=}yb?D||1myYMh=<=}ZyG%{lN`BRW`IaHAqP(@q5z41$~Swho$s&Uz~rAbjj6$>G)y&lqJo9;~C zKb@-GMaw*YItGesv=GYPT1v8e-NXt15To+UZ&h|Yw%)znkjraDu z>AvQPy$8$cG4JW;b0bvteCCZ7HCPG~g}ncC>|+pnY%%|961?qaaOMxA3)Jg+#n+d; z)mK+n56~^`QGH!^vyC;WLw#I?9J7IP$Sn0fwW0-`oQ9U(qVxSpkLCXL zA_HOJO+|Qd_L7mAR6OLxEAI6napgH^}b-Q`tpNtTw#h!A+q4%mv7wTkyf zFf|b_>9=p+g07X;>!w8C!v*m5tMj$3>HT&FACoJg0{?V}GwSbOE)w#;O%L{Dy?s08 zw7tdK*kt=u@gsJHN}%@~931CtzenAf(7A-ze`F9!uB}K4;CqO(Y^Q2@;wErR(C#9% z$m8Rdpwf2!sAcRO{v)!R$lBTvDQ}3K;{fe8vazZm^)4CFmZywMiO-+EgDn-Le?%~S z>~9OF+csq7FhUrmv>pS+iN6WTEJUhO4SEkMI(S;Dv&V|Lp^T;WlVjqZix<_$dgj%s z&itACc0t9VC>k6iaGV`L`d~x9F*jlf#j_JQbu7ks?OQv~R6e22sc&w!Se~MPTzwJi zon(zT;>8K? zjk1Hpj<|RL221}eF4ZPye z2{!S5s(WK&OR4(vwW74xR}6fsB(Y$idiGxWRrlwppOdTVS2t};dH?>DS75d2<;x?r zbFYL>n`R*}d?tg#9(z%5{Dcmp5cLwRN8NbtQN z_I=*HV~4uYI686^&nWaWewUMH9OGB>`7izXmZpH`0bH2Ft(!IPROv86VeSJdR zE>*k{OxiI6cnS{BRHI4V5e7`mXiR3t0WO4SFx&=r2YN3J&>ED8yx`O&A!2@eNj1-Q zJ%&lv4x6vMf3K@Uz7|K=*_#^1kS-&zoSWigp_uZ6TMxj=4iD#$;^;v8$BujO%w)Ma zonTQ2PDHO5PRh2Nq&{&c)X)-0miO9TC^3g(?Gx~w0QZ+XRQ_^__G0@zO2s^1?-6S` zc`{7r$L#QedKZ&V%aPCjbWi>efYR^nr9_$QJd9=j_xD9cLEpP!)8edDo8iuAm2q+JtUAV0DR0%w1MdN2H*M^R0;z4G7;x|;`O zO^1e=MDk_eR;%RPDrRO^dTKxB>L+@T^LVYvo>7rDGD!Qj1{>flU2zfXtZ+TcOY3Wj|i!FxpsU=CgdE~@rYPm2gG$J3&8i>XlM5Zrx=IvAi<2^ZXoq@dlEm=9%%jiI?tX< zMUFW;VF$g#d4F^L;B)NQ;oRcL52#h3+g_i^cJ+NAnWi7l<$*&V&3%nB`65qYf?N&Y*N60c-SAp>j+nOcj%3R0N-mRH4}}976Pp$-FF)g zdCT)WNf%84@Gr=+b#R_ig1YUqI8JCBCtu3TfZf%M_e!Q}~uBLwcY+j!DV0Ku%sL^h>&!j^_#^&%mE&S;W zf$EL0V0(F48}~SVZoVTOIW3DH`J;8050h-vjCAv&~x26;Zow4 zjuf+bqh*Sf>|~uZz8yP+cad!Q=y92iX}H7CzMfLVHWR^=tWWwvA&FJ}*!+P&zVYRP8W3bS9WFq^evhdY~lIGw(hL<3vBVvDXXvz$c38g4Gp6 zXG=?SGc%Ko{w#YMS5(>$jgO<_h_0?BocDGzKPbyr0u8Drjk|Z--lY;1dZ?M;m2jh_ z6t0ZossPt&`19m3DWz)2ds2d)#T@$-3a`3nvJql#$A0~4DeG^U9GnWY@>!m)g>8$p zYUqkwyg7bb6bc>z@&aZgHPxytFReEpIqeEtb|ZE#H^(~02@$PoSi&ulUWg&;@#7-M z~rc^KbL^7zw>HfP^Z zKgPkK|IqJ!XbiUtQ}LY-qMSN5*T>sh24A^{y2|h1Nssu_@0oa=y6$q`tbc;3N1i!@h?6oPr(fH-Du`LLeZIQ zY#j0FlNnCc=aG@hnAS;Y9og8BIaVJUa)>rXHrHz0_3rs3kJYw8+GL{=Qq@QU_(1DX z*jQIzUxRo&Lb21rf@=cr#`}IX!TcUq_ZF5D_u@n^;+6ME z!ET1sdi?ECm-fCXE_S+VAg5596L>X!2WM6}KK@Of78-g%E!IG$++1DwZZUiFm`g z>z^tT&(5!}1RhK?sPA0Im4XRI8b6AGL58lxK<96B7AN^kvaW4;bET7pujh5VNf z+We>l-uskpDA(FBA$4P8o$FTIR;!rDE2-%L#M1ZEKXsfNA-VrR6bZ_jL+8nlcQ;@+ zMyDX*Idz>m`>Xj5N;r3mmt?C%|3Q;q80s0>t*rhas4);@0W>O{5Nt4sZAe;mX6t-f z77-SnX;+tY`dJ~2=-_)r>sMgR3TRSFe)q09N|+xU>aTBU+oY$x!8SZVe#?&^t;dO= zJ;S+2xxRr3b>PXrEygp4HFaK6iRft7%PNge?$R#3Eh96eq?$JWSMkBdhR})K_vS`h zW*c}YCG`gfNDO-mv5JBIR)!rL5WHpg%%10=u}@#WmI2}hE}3!>gj79P8H#$*t*E6^M!N-|Sygz^!aT%{%!VB&pbS-R zFtF+S6a-1!%yM`wB~^H6<~`!k78sy1?=CtLq2+?G6~^`pMuY#NzGMo^va2ZYD)oO- zSRekZw1&S~jhXrTo5VYjJ9f?uHoT%kvK3N>4kJx$al%AMcymQ<^7iES!-y;z`}2}X z$d%K3a}h?}JFm{wPe!jVaU3}C;u)R&T*uD4cLiwA+fWM&8+^2}tXdxI^_+1pRYW8e zma>Zff4gsJPpXHmU_TLKtndFLy~Tdp)K@SiC)Zb9R|gpI%UO(1SOzn*Qfi;G4d5;Q zny9>|vC+!Z#wPxgJ@_OffDw31N5_%LFXnt8mjkKlDO_|@lS5($zu%~lnI%z{W+*5w zz5>)dNi%^R5G-=5n7Py6ygVRYlDh1rs5^NfrNp9R?OoR_2}wE#_`5RXI?kQqGc-=Soc;|QsZTO z;{&Px{2?m1=TU3Kw`D+e0lr~P3>^abXW znxN5|7ykaIN56#eyl~-@kf4HA4P+Rz0^|j@5$9E>oY&q*Jmf+igh>@A8nE z!e`d@FYhm;?CRNGvsShn==7KRw$6Hg3I)rawtcFqsvJ5UCxJ7PlQ%&| zD9_%Yo6J}E=@TD12|79jkjf#^{!Y8HU;ME`$U;_jVavk!nZb48rr5zFDd(OhpSt>9 zTiI-Dqpeq3Q%8rOSNcyB4jF8!P}2MN$aeEQN_?t%HvZn1N0?WUtig9TPA&+6oA!eJ z4c6Qc**#&D3_vXXAu4Cz?ruFWs1fHZk3Ap}xUoDHS5;$`5Pw8AjDv5g-|5G~xF<{+ z&*3M7``igA&K4StLHzQ2Z!tr>fXNUdS2{?TfB$OQMuZRvP}dePHi7u_Q6%kOpdRIAWE?Txk5ot*wVVSdKH{mWfk8MGArzY_D6ImU%xbjY9s}d8RkX( z3X$Z~xb*yMnYaG2^XL8(`0Mqm6}#Hkax+~qh>M<_{dJ4)r2aN}%uwT-n@8gLpVW&P~1f?mn@gKTVUKrsoMtbDfP zGsVj{pIcg4>Aj!pvUlV`oz``Hx>zQMYl6<=Rjh4yV)FM7`TuYen#-8FjrWpo1)^8# zd%lZ#Pj)UKo$FPPnefFVXsCS*cVQ%TK1Axw46T8g{WeTN19(&T?k;5NF6CUS{XDSc zZqe+)EridDY;C!Vm93iUo?(7-wx>H4B7u0?YMwGx((=8%`TRE2=)R5=7Ut#ozEE}!yPV6fVFb*`sMMa9%vXB#0)%OiedqL0GE`N-%DN|#=5Y+-yE|>CVW|{suHulz)5s5w*jJ-wk z^1PChX}+cz3Krh6o|UdS6)a}Y8e2J(J;!IPPVWoBmPgrHzJypV6Od#bQkqMD$i<1%(p%{&`@-%KUx zUU0)KOwv6kZ4TjNy`zC)lD;1(I2SlzwHJ`pAi`*Up<4b-K6DE}vTl3>bkBr}BX z3HGO>q8IFkMqk7sI+*EfYe;Pf1;HPMy%6dkecg>OZDW0!3`&p?2sB~1A-pN*Yq$}*&;VXz2u4Etu)ad6 zu}v#r_}a{f(h(FZ!<3d_ zx&uc@<3WjUx``W}Ju4bIUZrDi-Y$5ME_*EN!3cswoA!!1lSN1JAUJP6Dk|St6CceR zCMNRcBjUt6x6z2Qr0NV&22FyX(7+NZNdqZbtA|VuLFD_sy+ghXh{Mj(Dqv+PpDCYB><>gOPv~D1G z@G}}y2@VUK6vxiptb-@!VxQy=A9dgV64v~VvYz(Rg)03m@)fXRo;9hUK|%zn6kddt z$^65N@qvsG2pu@fA6mp`0EH%ONWL8Faf&2drWB+WqDNnHC^(ZLx;;+GL7~kAFj> zkyuJ(YNize)7aT-<=6ff2{f|&Q9{nbVuo!61w7gZ4yb_p5_3Hi7{ zhm?*hpEM#ah83R`$d#6r&8adI^_D=0-#?E7x;*WZuns4b(m zcH?RG)OcpyK(6jY&L7o6^=*bkhXJP&YD@5B35hPt$jUw#Z@nA-Ow}I_f%qih z!sa{0_L(`gpMgb>9lJ&;qQry`X)y84orJJ#FIkDqa1EPQ27c=s5bQ(cRC7>L2qmBz~wGnxRl_hA19I#VBgu+c0pU4OkMpTEV|NhGpA3?6tMg&g*(U1 zO#w%>Pha10L^D;ZOKxs_UDv=D>%n{yx%8{KAF6j#h+yl$)kR>iK^GCOCD}(yI6Vlm z@-d(gNOL(r%NOM^d;!y=Eco-;;gi&6jh-IT&!5L5-MsTX2|AEpAmxJzw<0tb(2ycz z{Cti@0rZGuFruKW7kd+ZK-fkbv$!~v-=TQtTC=YUi#TtnIoNfdRq!hj>6=O$8z>Qh zTH_>lI@?qE4?4QZR|;w$S#HqdSd<@nHn32v%;C!Kd3Vp3Fwrk*hO4h$2ha%oNy?v! zg&`EV#1DP1BITZ&!0JK^$yTTX4I&~SE*TQ-Bln64Njq`9JP`V@h1^;mb}sMPD3mlq z)q)gb0#Jq!wd(qDg};CQ&Mw8^=p~0l37i?(J&Xs~SayTL7{b&94KX~4C>Go%*wJt< z#h$+Y{?@kFQCLGYwX}w}HcvtAb-}+jGK`HlhOYOLrGAV=iT=<8aGU?juho&UeKl?# z3kEzq!MrN;*i$_wx8fO*~rs(%E@6X7voiUiD!uYss2@f$ud8Kw%59`$vQqhUIs8w%2mU35=(2t5HkeaSy|~^X=g-QMa>)O^_WSa zQ(5lIcg(Z*Z!EMIeNdtrSCn^S^%y7(6kW8M1=ydJ&vdm;{l^7SZg_*hefx5xP z$A|613lly~Uq{u>zc_i?;}DLi!XbvltSqH{)KU^W_=#VM^@Jgj`>aj(-ghbymB`C6 z`BBb9)cAU|CW4;{(zAPttTN2ckVCi|SQH`s<$G>gR?a&4!H{t{6ycB21GUMF*&UAj z@!otoh%alu7X}Z-R8Jl)bxk)Eq;vk;tt3~~A|*j~%m#&D&*{eSv_N=;NL)kk_B|kg z!TS)D=DPU@z?vn0utqaLH7tPtIQ07P5>qY$L*qU&`1;k#D{ZtOJ=A(VL5irRmI|X z)$6_gqXn>#mDg{H>D4d%I8s5*LvSm~^Nj;F8lET$U{luddOSrH&pItAAh5`m6`1>R zThjeE?V--EzCUk-U;Wc2mw7EtPeb$JwG2((V*+1K?Xc-KJmQ|3rI7iCBq-pBB}aEq zzn(blpw}p<=C{ zSlr#3z81R^k<*LR1<`rW_PY$v%&d@lZy$Q{WI&B~ajKt2MwaF4HyvJ6IZlLt8W&Ar zd(wVBe5K@=kFUJ^0kZ2Dwq7?!7r~|R%VQMw zAGj_X1ZLCVudZlLC)awX;`;Oa`-;kh*bC#!X0on=+wQ!A-kW9qR~{0m0H19x`D$;( zbA_$m8DuTUy28yf-)U+;y$NPj@xldu8{6f%2A*#nAC{M7=otfm*=AX`>n|*_A&c_7 zam7%!411`FjYrV!pmGy(KfjD^I;8GBxNs&14n)KasfYf~Fsp6;+cVDzbsddRrl923 zr?H^R!paXeOsPW<-o|8_rN{r3hdk_Jb)vF&TY7Y0O&zC@LwLg|entJaubOJnro_u- zFj8CjDEzEI7}g?}qoljPf4_uJ`NrxT8>)K+OG`f>1s@IEy-jF=yyal&3-}1A{snAY zz$~v>8BFD7e9$-rWT={Jn7Kyr*ta z9=*7G>1_dSt1iknH`MbzMgxNFwTqw#+i3sCkbut{G6WQWlxlA%SYC?y5T(e9YwFCP z)vVy)lQW&x@MLB>Bp~zC0C5-n(U5ImCYNk@<-W19&(1ChSDSm~t1n z$Qv8S?xT1M^AOwV6y{hDN8kET(K4O>`{AfUvqT4e1Ps(Jw6yAm#Kq6b4LAz zORIBxUhYmwNrChIDMV?A*xL<6yDnb7A>eRP9h^qLbNfW)nZI&U(rUjyet;~HDrdD- zPQJggeg3GhaK78jHR@Q;yk{WDk;HJ|y#0V;hS3!Mcd0myHyWoNKmMdr>1V|h0!E5p zKey>V#jbXoAbK7B5@BL(2&+t*N0AXXcbbrgUUb7`xbX&*K|?^4aS76UZ+AiyqA8ZyJ->9H8bY3#L1i9V+jcs;@X_m#Lu63%60;hUP8BJmn2mb5o56XzGk z5$MJZMWF(8cUYj}t`>!J!*QdPu58K;A2xyw4lu^<24*lHwru+~e&@zU4ht=96Jkgu zt-B1%@J*u)J`J!V{Il+`@APt0VU z*lPX9YP_O>Klym#C8fdA^p(}kD4wl^)OzjAsB@NF78ax64_J|-j0hV<%LSl(E;Y>- zQH?mP1eTT-(X=%Rlrr)A!Ng1cmrkFax!Q9~>bkT>YXP-i)ZSM3czGb=8*(pj-rh=s zbDW|%n%{igxvR@rI`B!c%*3}?40VARAt8nx1`fUYr8q?KF)El5j$kmhUK~h|@aQwn zSqVQz7(4u;LbX_e86{;L=bWS_vm*j8ChA;EyHdc156f*f+Mw~5*@<%tBrP$tPhWpO z9QNf!<)dEB3?o^zq|_isM^Rl}*3gj7eSHnz`3b(cfEraz1lSe3DMMe>gbUZQBYB^+ zblekKtrxSiZKq1%k2kCJ0@6)>nIr6%(7D^9?n@hhDk=vhci|CT`n#%4VYt3LxQ*l# ze~6yKy1QwR+2#`zM0P3VJYSE~$Q+57_f)Xlr4Ve7zWXRj6YTmo(ns8a=AoE6a;z{$ z`oY=}I=Y?cRF6i2udj2>9H_zSnjjH#^Nw8~Ke=SkZEYp4ml9{=dc(ZUWjKtSIkT_*wlQt2h zRuQQ;Pj3yK`lJ6cD@N%V@Vpav9w2pqJ_760@FPZcv?>q6hHPEMZDV6Iv$)8_&;MX{ zxXf&ALH|`m7$L9`=}>YArYJ5jc%#7Ga)Qf7oYeRERKKX1g${#4t@=5;TLr^W!t=E< zrsoSxr5KN7>8%chet-2+k?*Nu)#GYr4()97?Je<+jOlx6wq)E_*AU8l^Sy39vC+i^ zrFa)5~HXM0yN4zErkBmuJs($J#~%bxXZ3 zb7;r;#zDorE?rwC$8T0+P9T*))&`E5)&u-{P)$%BwpgRXgvS=oYEW1cA9r; zn~NoXy^fA(*Jt+k-9^1LNsKr}j%N|wjpnz*BOSX?$qY7XbDjESf^ohb8SIJPA4<6l zI(8Zl=BU6+)!OQK&fX|PBf`Fn{=(%K1{XHEvse};C%(MmWf}Z)_c|Kon@}mRSA$6D z_Js32i>Bks$%`i7d+X{$%R(a}d=P;(Qa|kLI5c`4UmcfWUUJ7euj9x~t}`DF(a?NJ z)-*HvyI0kGxW@K!s-8bof{;TI10=`22$#MX%E!zm4RTL4!0}7a%RV|7YYGDv)`3Vg z!y(1h4B`dUdzUdiQ>2kJqNfwQ*?P9GfBpH3g(speLxg4}yvzhGBC_9KeE*bZvyY9R ze>m+=@UhM(9NI(A>d9Hc21X__co5M=yJyeI=;B<-W!eLz8xGi`8qT3uPf~$@jHTF=H;0pG=1&k2;(sJ5<7E-S6KLB zQu2~n!$$AizP&OOm~_)pocN7t_278_ z`sC0s>D-Uc;>d1kTo`vk6R};X6O2&Tda}b-*7p!drb{U!H9=)U4ns7bKS$2Y>Z@Ju zAZsGNpTB&(CL~rxPuvwYA5EHDiX z4FvLsaU4Q%nsK@2)QOqAe77birE7X_5* zw6rLk|Bh9`EAh1cBbp4!vQ~zTGE%i0f?Fh~zqH215Z#{mmY{KexcK?%^)SB^)24nG z6FEM%L-X(mX~Bd>0(wzW4LW8Ei$6%85{M8-oW5axqV|Wpdj@W2#Wq+?OeP3%@xNw= zT~)vP%*;$YpX}!}6jWMDd zgZ7HhwZrx;QgT~4Dq4Mh#^e~iNCyWcQzERhym$V{;hRb}>JLy3=f2tOFUJgRE&lU! zclR!>c1J=m@CRL%o1GWW+-D8DC~*2Jp&$ZRa6bNDYAAOO4+nWI z3=I^j`~1SLD4~+*%@brpwbD2ek;=;t4K)+X|Bhx{LX&V19Y8`#uSY0RrBdXWQHUL09m~6%mIe z8zIvyDhO|&jNXm4A2$Z_hGH;#@L7MmjL%tvBMf~@lzSfe5vp4fZr?C7tA4nz{cF3{ z^r7U-9MGi}+!Y|UpDy@l)AL$0q2{RI+vQ+f*6lfF5g*TlH=t;ibl<*xBO|9~7mnXg zyiV!0xR896} zlL{%9&pQ8IenPiQhA0r+ZajPi4w^?tb=Z-Ag)X|D9@6)hQ!1X&I$<=rj`R)K%yGU1 zRaNc6os7RB5NMZ`b1)GUa5;AU#{gCt7#snN^$0@{az;;xZ5+ivowMqAh|mLwxC5R( zB|;Chf3VjZ-o4`DkAD2lC#Im#B8rbs$Ni%+HMmX2pF=q^B6jWb{f1q80>|2uB>M~R z{6_y@s$o9K&Ye5s6Bvg^Mj8>63_&Vkb|#~{uaR;YiHFahv6SsR#k<`f8LuXGRgeB_ zPXRAF65@oLgB-L{F0USWXK2`a)?+3Ap>Nua@_Pdv@3kZGuM9Uvv~O(8s}lxNadA)8 z)%$Kea||vM-=Y!xLdCPhe0rQ#`6U+^Nr$Y}S)$UF_&pTt9!bxJy(!dUy|yZz?nK!8 zPdPLL0#fk4E{>2?UE|!l*CPbsLe`9vVPj_Iw!Wf2&-`rUDh)-#We%VFL!un2+jH@k zQt&IJ8vd?%ar*aI=LAJm^#0$E8_QPMza1|tj=5LpZ|(ZcZETHevIyM+G2&$wn`>w4%>97yaSb*{ zAZ=B~Hvrc{TV@=Kkx>rvyG)v1pFm(C@hy0!(13X1+O<>C(k30L`hif2%E%BS@>yQ0 zoCHxhwP?JUUv&6U9@pK|Y4R;~l`)J-_Z!Nw{N_f_>?I{-V>RbT)njFs3opV%kjJxl zEWh$kXPU;TY=NPpsF{ujQ*!Dksn=S{EjOvqkE`LvGN`P@6*?XzD)`*2mg)$lcJQ5v zj+VdLQ{~kKVY!y`r?7X2(?p=BQA(!azybc2Dhr7f~;Rg zlt*9G)w>CAwtg%1efe$gx72+n5I_N-iQ25N`IAFvccuv^iX8DNKEb=PvEgO0>L^LP zQx@{1<`k{6omQ0f5ccdNB}Et)(+eK^X7u4+JY(Mv>BQLJV9?fPe|I+96Tm)VVx>d1 zj5ofPmC?=rvVCXUOAevBKL8F)VkVnwQs#WJsi~=1d3n_xACKb!#Do1Awq|-r-0;Hq z#d>e~<4<7_`?M$dDpjncHzC-DM%eKX;Sye%v4;qUgpAG$J&aZd4wwsxc%e3cCrqt2 zD3TDmvm^Jo_sy}T{9|Pi5yY+$h2?!4J4U~h6e(2n5>o%>3>vYRq4DZksgwM+>f@WO z<+!J`;N`#v+>CB6pT2G#S!R|DB4j7+P(6du7(|~S5q_GM1ch1XGPLhAPbfTlum3|* zE#hyZJV0*b-oL-BsV-4?d%OZnVODPLnZSm9gv9Xk-@d)vwaXm%=I$)L>ejf$tjx2V zI)381jYKHP3;V)h15gv^+*{$LnXwP6#peD7PYJ@s$B*eC<+zk(`iOXOe{C=2+w01? zy>Ek5$wnLtYUC9G7rlIW5zpStQcR#s+#6iLglCz6;!h9IBRzaqa^mnr$7vCtHE-J^ zX4ZzGu;l8O+}(|)go;*;nrKn^BKkb*-}q@CjrF<^Dq&0pigyEe$~R4lZX)T z1?yZ0`hQ`adr(>`F*}=u$f3uCZ~j477E-FAzW@32WP#V_u@Hu8m}fk$ToorgGz$yo zE^|=AK1{eJ(a+7yoIbPIWsJ>K_Tojy(yf=AdqhN*HB;p3MpXe8?#GRRibw>Y9OH{% zg8ZBy_$9hMHbaX=0bmWDiTem9fs;ELAOIgE&7Nr+F80crmaNC=qm3RrHeR0|c(k(e z>6$Hl&95eL|3JeapU?VeV0{MtEuJ<&H#;?M{v@R5-n&OeaJ*$^k`YEJ9i4BfSH?pS zQVoVD7<2L5a0pwivQf$1K&RhZzj9iRCmZC>8HTu2JS6Wcq=cG7`|LRtlRhCc^K3zN ziz~-4p54B4NB`s4Nhoc6lYT$-NUxQjRQcZ1nTVzw*Sm$*Z89UIM{&eV_!5!g61qIk zb$8(w?5}jN`~lL1R{Z=Cf7ZeIyAGWmo}8S^H+J}RC8|6rz}cgj(xxo`4j}F!T3UUo z@FNH@b2a-rX{%o>v^~@|@g=kDAhzR{Op~rp4hg$0EbUk z_Sws&(|7OwKCL^|Sy0k(G`hVB8X8Du&>TRrhy3s8+-UgtF-LD|IAk$9SvtD8xiv|r zTxO=S{#tmam$_doCnu-i)=#lAkQ=tPwg|xrpZ37vjvwbWj0C_dW zGVXr`hd3r7K2y1$uhQagqOAB$aGV&%|2M&tmL)R_URV$89-ND7(IG5q!G>b2Pt4$$bs|K5ktNTMQ-<9x#^L_DU+o^SOiFjux5;X-*Yx!kt28x9 zHU@;0uS>g@Zrg2 zK{oC9@`#f5#zr2mbLs)CqZaRW9Pxko?jT!D-uW9hoL@zsWTf!}H-5*^@WsvKr*Uz)$*%tj78j|}2J<{tPvqglDx4gV1C`#u z=8qL@9>(0?rBJTc4NypvRUFAm_MxS|kg+xW& zyxC-l1~|Ci`B!H8-{a*X0q?q$R70}-SJyQYfu?2(ZvG4@*@gwiM!6*ISFb+A>#fc6 z`1`+n5v0LR74>@0ZL5r@1qElGKQCO1Gtt-1vx49&2Ue9!aOr{P2#k(C3Dp&5Cwg&l zJ-}BINd4y)5RlN&u&jF>eUfHf9{J|n{6A`c{w(-5GXP`)IZdY{@6A=y#;z{5(;$TN zx{3z9M?u_FSHK5Vva46G;syb;pLs*KPtWX!Mf2Li`(W8G2)N?S&fc!YC4h^RaFEy4 zHNt?T3V2IgwZoo=Hy)F?$*p+dz@j1{^rjgjhhO^ae!#Yuk&3sqzEs)QcQAx?r>O3m z;&aG_isKJZ*ekK|Ub38+GG_{%FuZ@?6E8F(V*fmw#)*^cZCxH~9~T$j)fpE?xx}wn ze^EZCa`WZ^Zr;!{G-(?}#`Uf}xt5Zc!N3Z&`L|U`FwoP>gc$87mm8`-V$V2>%F#RR z$*~~EivqXeHw1+5R9K*X8is1-YtD;r9@&jKnpywMeo7}4;T599yfDgFTa)}S>`H&c z&i4(CKb>Jd+!_gDdj<#fYr-M5gXXI(RjzsnLYc=SU>jHZP~MKy4hePrSMcl@x=ZkG3>mj(H_7Uq~)#taV1$%oI6x7p#$ zb6USdk;Eg_?%mOGb9nwH4^Ottt%%UzV6j_)zAOsL^({Xb`PAGv^IUIH!eJ%rw0gdx z;s*g7>k|0m%`o~#RTdsfW)zB?fsVmPqUp_bCgeXb3F*}5+?zOi_TBKtrolj~2ooZJ zL7kur&SbDEg^-L;Li;i*%2zq1yg3~S{gXTPSan|-)&vy%yxCiefjQe zL2}<`QzNZUw~w7Bw3V#cUAyw|!PmOFV^|dzCr27`?#aORLPccIe-5L@%djws+Q9fb zca)G;ea+$T>QN&j71VCvQ#v2--V?X@aLKN*uI|R!!-&IF9v2AT&|zD3Av%VE(7}NX zT;i-)u3mLse_(q@tcVBK_IAXp=*&N(^4zps%t)Pk1^j%pB{t1xL7BCqOHQFR(b@jw z)vN0$EtNn$G?CuRm)~*2HDW5$-}mNH;vI4Oipd0VskZkDs2n|tAtBLy>jqZ_SHnv5 z-|r)Gq?B}v>LjQ4AYHj~bIopblAQ|V0NvHqlZa%JOi+Z$uOjSxbH0bj3va6Sti1l3 zZwbwpoi2uDmQDtUCHxt0Gjd%U(TH*}=;$|7R=)D{=j1XXuf#MowygBZg#Baajv`GB z`M9C4Q&{J%x!Bpu$er%qZSk12{(M>`xv9l*lXJyzYd!R4tadyMFGLcOdvdJ%Bcte^ z%tU)M?C3of7_;<$7?OH`gaI5+>=k=PR@QywZSV+UVD1-BhE6=Mwyjb`m9OhPgHdA z-h8d>)zRTB%5&;e@7&U~+TAYpK#zu;tvslO{EA$tFeqc9y;B#w-SI&w6v8CJ>1I3|KR^3Tt2Rx=`Mc6w6Q!*+F^PY>1>t2`sS<43Jcx8 z0!l%?Ju~PINEP1c3i1MGHSPHcC@?DW zYuB!!=c*pblE@^Y1!sa-$AC2n1zR#Q!TP>}PMKS|wcln*+mpAN|9rLV@0woIz?Z=K znOBMH-l<9bKYz83hqHUU`XxB}*GhA=lNkD`UX>UrSlsP%RTOkbGrLDl+suc&%bMpsP6X^C4__gF{9#^70st z(TIB0bxz=A^`Eb1Sro6Eq(e_OH8e!!=i}?s7oF|0vL}MW<)&FG-rK82^)F9(IWV)S zO7FF;JKC6`dj3n*H^0PNWwN$AYJdAZ9@~u_PSMwke!NSBqx0Amfjr^-f~EQuJ$-S? z+fzS&MYUE}TZ{xWHt75Y6WbWML44cVK%`&j?)bM5B1~9A!>XT)ZiCH9Q5s^S<+6Hf zsiOlY=LXGNR~Nibg6K!Y;mrv5V!XR{Q;-O!Yo;43JDZv^(Q(f!ce4$v_d>N?c>Wk% zFA+RC+E(q!6qY^3SIE*)piw?G%e>Z)6sM-Kc*nPJuVQ(Rj(4B`+S}`me`~H@X$NK2 z*M5;#BHQ~|E9zOmt=1r_i1p@BJSw zfB_2^yx%wDu5!k|Ar70qEJ71^&84Brr}c&3lyB0AFxt<=!r2Dasw`~1EKvGHb#Ls3 zlgq|Ict#xiDeeK^#x&#&q3-=2YQHZqeLb2IKF1<*@5jeWhK7AaIJl0UjDG5WYD=rs z)^7CkSbgYitGAO?vaY^|#mm$(tF{>^E{qF0a{`$T`lvd48ju{4(1qc7eg z4q^9YDVjD&DoZ=$*B)Ho^6gUsWn0@)Lr3t_io>gvlw6KqZ8r=$tSVvMZ2YLOm-2pS zY`O!BtbBUozh7PWOqw`XWE*T_7|6Ra`$q=ES003c!s*OsMrs3 zoBs%!QS}(C3Z=W!!En%K&6ZMm;)bi6NQ{j(Y@h5HUhn=X|E-#$901t<@Zs#&5D)?o zoG~^wK1jcH&~Zf=v6wbUcX_953GfR(ofqJyP&h21{GAuu7TlCqI#ac5{&pXF@?;aG zu*jkSde*Zd%#WpEb5qwKA(id)?7)AS_MoV|`W^MYcVGU9+(}X0kaSCTU8)U=NBsqA zot(p}B*-|lj~SYnz%r5)YFOPmbML|hw%JaN3{U4g8H0YJa5iroT5sT|f$9>uA(GQQ z4#@G1f=1MCVUz+9t1X50?tN&z$G{!QX)wRkb!yF!giH5wYpPl)Yq;#+zmq)BZUC1o zakhVpk^h-@ycj@Fa5JfDIc!;F$|>39bG-rp=Kl-Tjj~yu?4+QLycKip zWT589>UT2ja|=4xf%Rd(j@&r51$ax!-xL{|8Cl(OiYXqE8NUTi&nc? z??JjUb8>;_{p(jnjugVijOnoB`>W3P zsGOkF0|o<+>90^uBg@4UpK^HFc45uSbL4YNdh!ouxsc%da(<){Xu~?O)M~$6J>zWa zpUSh8hX~uP{O?OU(IsxXP<64p9G4b&qurvAHehHxoQW-$7Xqp0*w$6vyQ6gL%i5-0 zts{f4|?JV&%7x(7%C7s~<1JLMbCOm6IH``fsT0N(rC+ymhkyPeC zb{{%8yR9)J=Vv?8gy4+e8vzyEyeB~gm~Ieq0sf-|h(U-n%h4*|YhJRJ#Fbh2%QDv7#47 z8W~JFSVO6PB{?Q)e;IoeX!}8btMUZTxe&)g>3^O?y?x6I6F11y)1k+|CwleB_tqqn z0@$e=vCYsAFs|{hM{(sz1_rLUtB*)T!PsJo@FTp!ym98!r{CP@eoZjKen4i5AU@aF zQa3%qDgfca<4yK=k3@p#g~+UD1fM<6sD-zHiT_)vn-paD=q8GWNA>z44dpz7bO)5~ z@vE8~ZdPX6lw6tB)*N+;)O_YY-0y^)oB#V$1>z?{S0n+G@uS@VIzf!5u*lIGAODJk zloW!9uMtH=sJ#dX7n{(2KBX_+W7+TvDX{ImaqxoughMsiM9$tK_dnR2Al@m^ zI)vz4Il1ccKb_n+7}z;EDQs*W2_?Ly7pf?D#JlI-J#t;$-@iTCU&O{9E!#9yGn)?Q z4-DiJeE5MRBxDELyUBCO66@V_bEefDDN{ZHd{s50g1>*$^Ns0`*luwrrgL<<()d+J z4fS;^gtP4x7Z=CuN!}TYgxju6gP|aiisM)F<8N%C7gjXjKN5J?4m1_Gx<=5hZ+}ZT z64i>#h^}{Z9}prCBA7JU<#-#G�lJ>_6@cN8{vlxCDl((%YkQcA$SaZHNEKfy}{n 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 literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/word2vec_basic.pdf b/docs/user/my_figs/word2vec_basic.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6dc5b9221ea14a0fd6fec68f664482dd1e481ae9 GIT binary patch literal 113953 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 Zqv=7ma3@nt46qoIAm$SiQqopN{0|`9oT~r; literal 0 HcmV?d00001 diff --git a/examples/basic_tutorials/tutorial_LayerList.py b/examples/basic_tutorials/tutorial_LayerList.py new file mode 100644 index 0000000..2b60fec --- /dev/null +++ b/examples/basic_tutorials/tutorial_LayerList.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from tensorlayer.layers import LayerList +from tensorlayer.layers import Dense +import tensorlayer as tl +import numpy as np + +layer_list = [] +layer_list.append(Dense(n_units=800, act=tl.ReLU, in_channels=784, name='Dense1')) +layer_list.append(Dense(n_units=800, act=tl.ReLU, in_channels=800, name='Dense2')) +layer_list.append(Dense(n_units=10, act=tl.ReLU, in_channels=800, name='Dense3')) +MLP = LayerList(layer_list) + +X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 784)) + +def generator_train(): + inputs = X_train + targets = y_train + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + yield (_input, np.array(_target)) + +n_epoch = 50 +batch_size = 128 +print_freq = 2 +shuffle_buffer_size = 128 + +# train_weights = MLP.trainable_weights +# print(train_weights) +optimizer = tl.optimizers.Momentum(0.05, 0.9) +train_ds = tl.dataflow.FromGenerator( + generator_train, output_types=(tl.float32, tl.int32) , column_names=['data', 'label'] +) +train_ds = tl.dataflow.Shuffle(train_ds,shuffle_buffer_size) +train_ds = tl.dataflow.Batch(train_ds,batch_size) + + +model = tl.models.Model(network=MLP, loss_fn=tl.cost.cross_entropy, optimizer=optimizer) +model.train(n_epoch=n_epoch, train_dataset=train_ds, print_freq=print_freq, print_train_batch=False) +model.save_weights('./model.npz', format='npz_dict') +model.load_weights('./model.npz', format='npz_dict') \ No newline at end of file diff --git a/examples/basic_tutorials/tutorial_cifar10_cnn_dynamic_MS_backend.py b/examples/basic_tutorials/tutorial_cifar10_cnn_dynamic_MS_backend.py new file mode 100644 index 0000000..02ab3e8 --- /dev/null +++ b/examples/basic_tutorials/tutorial_cifar10_cnn_dynamic_MS_backend.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import time +import numpy as np +import multiprocessing +import tensorflow as tf +from tensorlayer.layers import Module +import tensorlayer as tl +from tensorlayer.layers import (Conv2d, Dense, Flatten, MaxPool2d, BatchNorm2d) + +from mindspore.nn import Momentum, WithLossCell +from mindspore import ParameterTuple +import mindspore.nn as nn +import mindspore as ms +from mindspore.ops import composite as C +import mindspore.ops.operations as P + +# enable debug logging +tl.logging.set_verbosity(tl.logging.DEBUG) +tl.logging.set_verbosity(tl.logging.DEBUG) + +class CNN(Module): + def __init__(self): + super(CNN, self).__init__() + self.conv1 = Conv2d(64, (5, 5), (2, 2), padding='SAME', b_init=None, name='conv1', in_channels=3, act=tl.ReLU, data_format='channels_first') + self.bn = BatchNorm2d(num_features=64, act=tl.ReLU, data_format='channels_first') + self.maxpool1 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool1', data_format='channels_first') + self.conv2 = Conv2d(128, (5, 5), (2, 2), padding='SAME', act=tl.ReLU, b_init=None, name='conv2', in_channels=64, data_format='channels_first') + self.maxpool2 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool2', data_format='channels_first') + + self.flatten = Flatten(name='flatten') + self.dense1 = Dense(120, act=tl.ReLU, name='dense1relu', in_channels=4608) + self.dense2 = Dense(84, act=tl.ReLU, name='dense2relu', in_channels=120) + self.dense3 = Dense(10, act=None, name='output', in_channels=84) + + + def forward(self, x): + z = self.conv1(x) + z = self.bn(z) + z = self.maxpool1(z) + z = self.conv2(z) + z = self.maxpool2(z) + z = self.flatten(z) + z = self.dense1(z) + z = self.dense2(z) + z = self.dense3(z) + return z + +# training settings +batch_size = 128 +n_epoch = 500 +shuffle_buffer_size = 128 + + +# prepare cifar10 data +X_train, y_train, X_test, y_test = tl.files.load_cifar10_dataset(shape=(-1, 32, 32, 3), plotable=False) +def generator_train(): + inputs = X_train + targets = y_train + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + yield _input, _target + + +def generator_test(): + inputs = X_test + targets = y_test + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + # yield _input.encode('utf-8'), _target.encode('utf-8') + yield _input, _target + +def _map_fn_train(img, target): + # 1. Randomly crop a [height, width] section of the image. + img = tf.image.random_crop(img, [24, 24, 3]) + # 2. Randomly flip the image horizontally. + img = tf.image.random_flip_left_right(img) + # 3. Randomly change brightness. + img = tf.image.random_brightness(img, max_delta=63) + # 4. Randomly change contrast. + img = tf.image.random_contrast(img, lower=0.2, upper=1.8) + # 5. Subtract off the mean and divide by the variance of the pixels. + img = tf.image.per_image_standardization(img) + target = tf.reshape(target, ()) + return img, target + + +class GradWrap(Module): + """ GradWrap definition """ + + def __init__(self, network): + super(GradWrap, self).__init__(auto_prefix=False) + self.network = network + self.weights = ParameterTuple(filter(lambda x: x.requires_grad, network.get_parameters())) + + def forward(self, x, label): + return C.GradOperation(get_by_list=True)(self.network, self.weights)(x, label) + + +# dataset API and augmentation +train_ds = tf.data.Dataset.from_generator( + generator_train, output_types=(tf.float32, tf.int32) +) # , output_shapes=((24, 24, 3), (1))) +train_ds = train_ds.map(_map_fn_train, num_parallel_calls=multiprocessing.cpu_count()) +# train_ds = train_ds.repeat(n_epoch) +train_ds = train_ds.shuffle(shuffle_buffer_size) +train_ds = train_ds.prefetch(buffer_size=4096) +train_ds = train_ds.batch(batch_size) + +# get the network +net = CNN() +train_weights = net.trainable_weights +# optimizer = Adam(train_weights, learning_rate=0.01) +optimizer = Momentum(train_weights, 0.01, 0.5) +criterion = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') +net_with_criterion = WithLossCell(net, criterion) +train_network = GradWrap(net_with_criterion) +train_network.set_train() +# print(train_weights) +for epoch in range(n_epoch): + start_time = time.time() + train_network.set_train() + train_loss, train_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in train_ds: + X_batch = ms.Tensor(X_batch.numpy(), dtype=ms.float32) + y_batch = ms.Tensor(y_batch.numpy(), dtype=ms.int32) + X_batch = tl.nhwc_to_nchw(X_batch) + y_batch = tl.nhwc_to_nchw(y_batch) + output = net(X_batch) + loss_output = criterion(output, y_batch) + grads = train_network(X_batch, y_batch) + success = optimizer(grads) + loss = loss_output.asnumpy() + train_loss += loss + n_iter += 1 + train_acc += np.mean((P.Equal()(P.Argmax(axis=1)(output), y_batch).asnumpy())) + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + print(" train loss: {}".format(train_loss / n_iter)) + print(" train acc: {}".format(train_acc / n_iter)) + print(" loss ", loss) + +# start_time = time.time() + +# train_loss, train_acc, n_iter = 0, 0, 0 +# for X_batch, y_batch in train_ds: +# net.set_train() + +# with tf.GradientTape() as tape: +# # compute outputs +# _logits = net(X_batch) +# # compute loss and update model +# _loss_ce = tl.cost.cross_entropy(_logits, y_batch, name='train_loss') + +# grad = tape.gradient(_loss_ce, train_weights) +# optimizer.apply_gradients(zip(grad, train_weights)) + +# train_loss += _loss_ce +# train_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) +# n_iter += 1 + +# print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) +# print(" train loss: {}".format(train_loss / n_iter)) +# print(" train acc: {}".format(train_acc / n_iter)) diff --git a/examples/basic_tutorials/tutorial_cifar10_cnn_dynamic_TF_backend.py b/examples/basic_tutorials/tutorial_cifar10_cnn_dynamic_TF_backend.py new file mode 100644 index 0000000..f399bef --- /dev/null +++ b/examples/basic_tutorials/tutorial_cifar10_cnn_dynamic_TF_backend.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import time +import numpy as np +import multiprocessing +import tensorflow as tf + +from tensorlayer.layers import Module +import tensorlayer as tl +from tensorlayer.layers import (Conv2d, Dense, Flatten, MaxPool2d, BatchNorm2d) + +# enable debug logging +tl.logging.set_verbosity(tl.logging.DEBUG) +tl.logging.set_verbosity(tl.logging.DEBUG) + +# prepare cifar10 data +X_train, y_train, X_test, y_test = tl.files.load_cifar10_dataset(shape=(-1, 32, 32, 3), plotable=False) + + +class CNN(Module): + + def __init__(self): + super(CNN, self).__init__() + # weights init + W_init = tl.initializers.truncated_normal(stddev=5e-2) + W_init2 = tl.initializers.truncated_normal(stddev=0.04) + b_init2 = tl.initializers.constant(value=0.1) + + self.conv1 = Conv2d(64, (5, 5), (1, 1), padding='SAME', W_init=W_init, b_init=None, name='conv1', in_channels=3) + self.bn = BatchNorm2d(num_features=64, act=tl.ReLU) + self.maxpool1 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool1') + + self.conv2 = Conv2d( + 64, (5, 5), (1, 1), padding='SAME', act=tl.ReLU, W_init=W_init, b_init=None, name='conv2', in_channels=64 + ) + self.maxpool2 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool2') + + self.flatten = Flatten(name='flatten') + self.dense1 = Dense(384, act=tl.ReLU, W_init=W_init2, b_init=b_init2, name='dense1relu', in_channels=2304) + self.dense2 = Dense(192, act=tl.ReLU, W_init=W_init2, b_init=b_init2, name='dense2relu', in_channels=384) + self.dense3 = Dense(10, act=None, W_init=W_init2, name='output', in_channels=192) + + def forward(self, x): + z = self.conv1(x) + z = self.bn(z) + z = self.maxpool1(z) + z = self.conv2(z) + z = self.maxpool2(z) + z = self.flatten(z) + z = self.dense1(z) + z = self.dense2(z) + z = self.dense3(z) + return z + + +# get the network +net = CNN() + +# training settings +batch_size = 128 +n_epoch = 500 +learning_rate = 0.0001 +print_freq = 5 +n_step_epoch = int(len(y_train) / batch_size) +n_step = n_epoch * n_step_epoch +shuffle_buffer_size = 128 + +train_weights = net.trainable_weights +optimizer = tl.optimizers.Adam(learning_rate) +# looking for decay learning rate? see https://github.com/tensorlayer/srgan/blob/master/train.py + + +def generator_train(): + inputs = X_train + targets = y_train + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + # yield _input.encode('utf-8'), _target.encode('utf-8') + yield _input, _target + + +def generator_test(): + inputs = X_test + targets = y_test + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + # yield _input.encode('utf-8'), _target.encode('utf-8') + yield _input, _target + + +def _map_fn_train(img, target): + # 1. Randomly crop a [height, width] section of the image. + img = tf.image.random_crop(img, [24, 24, 3]) + # 2. Randomly flip the image horizontally. + img = tf.image.random_flip_left_right(img) + # 3. Randomly change brightness. + img = tf.image.random_brightness(img, max_delta=63) + # 4. Randomly change contrast. + img = tf.image.random_contrast(img, lower=0.2, upper=1.8) + # 5. Subtract off the mean and divide by the variance of the pixels. + img = tf.image.per_image_standardization(img) + target = tf.reshape(target, ()) + return img, target + + +def _map_fn_test(img, target): + # 1. Crop the central [height, width] of the image. + img = tf.image.resize_with_pad(img, 24, 24) + # 2. Subtract off the mean and divide by the variance of the pixels. + img = tf.image.per_image_standardization(img) + img = tf.reshape(img, (24, 24, 3)) + target = tf.reshape(target, ()) + return img, target + + +# dataset API and augmentation +train_ds = tf.data.Dataset.from_generator( + generator_train, output_types=(tf.float32, tf.int32) +) # , output_shapes=((24, 24, 3), (1))) +train_ds = train_ds.map(_map_fn_train, num_parallel_calls=multiprocessing.cpu_count()) +# train_ds = train_ds.repeat(n_epoch) +train_ds = train_ds.shuffle(shuffle_buffer_size) +train_ds = train_ds.prefetch(buffer_size=4096) +train_ds = train_ds.batch(batch_size) +# value = train_ds.make_one_shot_iterator().get_next() + +test_ds = tf.data.Dataset.from_generator( + generator_test, output_types=(tf.float32, tf.int32) +) # , output_shapes=((24, 24, 3), (1))) +# test_ds = test_ds.shuffle(shuffle_buffer_size) +test_ds = test_ds.map(_map_fn_test, num_parallel_calls=multiprocessing.cpu_count()) +# test_ds = test_ds.repeat(n_epoch) +test_ds = test_ds.prefetch(buffer_size=4096) +test_ds = test_ds.batch(batch_size) +# value_test = test_ds.make_one_shot_iterator().get_next() + +for epoch in range(n_epoch): + start_time = time.time() + + train_loss, train_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in train_ds: + net.set_train() + + with tf.GradientTape() as tape: + # compute outputs + _logits = net(X_batch) + # compute loss and update model + _loss_ce = tl.cost.cross_entropy(_logits, y_batch, name='train_loss') + + grad = tape.gradient(_loss_ce, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + + train_loss += _loss_ce + train_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 + + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + print(" train loss: {}".format(train_loss / n_iter)) + print(" train acc: {}".format(train_acc / n_iter)) + + # use training and evaluation sets to evaluate the model every print_freq epoch + if epoch + 1 == 1 or (epoch + 1) % print_freq == 0: + + net.eval() + val_loss, val_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in test_ds: + _logits = net(X_batch) # is_train=False, disable dropout + val_loss += tl.cost.cross_entropy(_logits, y_batch, name='eval_loss') + val_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 + print(" val loss: {}".format(val_loss / n_iter)) + print(" val acc: {}".format(val_acc / n_iter)) + +# use testing data to evaluate the model +net.eval() +test_loss, test_acc, n_iter = 0, 0, 0 +for X_batch, y_batch in test_ds: + _logits = net(X_batch) + test_loss += tl.cost.cross_entropy(_logits, y_batch, name='test_loss') + test_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 +print(" test loss: {}".format(test_loss / n_iter)) +print(" test acc: {}".format(test_acc / n_iter)) diff --git a/examples/basic_tutorials/tutorial_mnist_mlp_dynamci_dragon.py b/examples/basic_tutorials/tutorial_mnist_mlp_dynamci_dragon.py new file mode 100644 index 0000000..9c06ec5 --- /dev/null +++ b/examples/basic_tutorials/tutorial_mnist_mlp_dynamci_dragon.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +os.environ['TL_BACKEND'] = 'dragon' + +from tensorlayer.layers import Module +from tensorlayer.layers import Dense +import tensorlayer as tl +import dragon as dg +import time +import argparse +import numpy as np + +X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 784)) + + +class CustomModel(Module): + + def __init__(self): + super(CustomModel, self).__init__() + self.dense1 = Dense(n_units=800, act=tl.ReLU, in_channels=784) + self.dense2 = Dense(n_units=800, act=tl.ReLU, in_channels=800) + self.dense3 = Dense(n_units=10, act=tl.ReLU, in_channels=800) + + def forward(self, x, foo=None): + z = self.dense1(x) + z = self.dense2(z) + out = self.dense3(z) + return out + + +def parse_args(): + """Parse the arguments.""" + parser = argparse.ArgumentParser(description='Train a cifar10 resnet') + parser.add_argument('--execution', default='EAGER_MODE', type=str, help='The execution mode') + parser.add_argument('--seed', default=1337, type=int, help='The random seed') + parser.add_argument('--cuda', default=-1, type=int, help='The cuda device to use') + return parser.parse_args() + + +class Classifier(object): + """The base classifier class.""" + + # TensorSpec for graph execution + image_spec = dg.Tensor([None, 3, 32, 32], 'float32') + label_spec = dg.Tensor([None], 'int64') + + def __init__(self, optimizer): + super(Classifier, self).__init__() + self.net = CustomModel() + self.optimizer = optimizer + self.params = self.net.trainable_weights + + def step(self, image, label): + with dg.GradientTape() as tape: + logit = self.net(image) + # logit = dg.cast(logit, 'float64') + logit = dg.cast(dg.math.argmax(logit, -1), 'int64') + label = dg.cast(label, 'int64') + # print("logit :\n", logit, label) + # loss = dg.losses.smooth_l1_loss([logit, label]) + loss = dg.math.sum(logit - label) # dg.losses.sparse_softmax_cross_entropy([logit, label]) + accuracy = dg.math.mean(dg.math.equal([logit, label]).astype('float32')) + grads = tape.gradient(loss, self.params) + self.optimizer.apply_gradients(zip(self.params, grads)) + return loss, accuracy, self.optimizer + + +if __name__ == '__main__': + args = parse_args() + dg.logging.info('Called with args:\n' + str(args)) + + np.random.seed(args.seed) + dg.autograph.set_execution(args.execution) + dg.cuda.set_default_device(args.cuda) + + # Define the model + model = Classifier(dg.optimizers.SGD(base_lr=0.01, momentum=0.9, weight_decay=1e-4)) + + # Compile for graph execution if necessary + if args.execution == 'GRAPH_MODE': + model.step = dg.function( + func=model.step, + input_signature=[model.image_spec, model.label_spec], + ) + + # Main loop + import tensorflow as tf + batch_size = 200 + for i in range(50): + for X_batch, y_batch in tl.iterate.minibatches(X_train, y_train, batch_size, shuffle=True): + image = dg.EagerTensor(X_batch, copy=False) + label = dg.EagerTensor(y_batch, copy=False, dtype='float32') + loss, accuracy, _ = model.step(image, label) + if i % 20 == 0: + dg.logging.info( + 'Iteration %d, lr = %s, loss = %.5f, accuracy = %.3f' % + (i, str(model.optimizer.base_lr), loss, accuracy) + ) diff --git a/examples/basic_tutorials/tutorial_mnist_mlp_dynamic_MS_backend.py b/examples/basic_tutorials/tutorial_mnist_mlp_dynamic_MS_backend.py new file mode 100644 index 0000000..e480221 --- /dev/null +++ b/examples/basic_tutorials/tutorial_mnist_mlp_dynamic_MS_backend.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import mindspore.nn as nn +import mindspore.ops.operations as P +from mindspore.ops import composite as C +from mindspore.common import dtype as mstype +from mindspore import context, Tensor, ParameterTuple +from mindspore.common.initializer import TruncatedNormal +from mindspore.nn import SoftmaxCrossEntropyWithLogits, Momentum, WithLossCell + +import numpy as np +import tensorlayer as tl +import mindspore as ms +import tensorflow as tf +import time +from tensorlayer.layers import Module +from tensorlayer.layers import Dense +import mindspore.nn as nn + + +class MLP(Module): + + def __init__(self): + super(MLP, self).__init__() + self.dense1 = Dense(n_units=800, act=tl.ReLU, in_channels=784) + self.dense2 = Dense(n_units=800, act=tl.ReLU, in_channels=800) + self.dense3 = Dense(n_units=10, act=tl.ReLU, in_channels=800) + + def forward(self, x): + z = self.dense1(x) + z = self.dense2(z) + out = self.dense3(z) + return out + + +class GradWrap(Module): + """ GradWrap definition """ + + def __init__(self, network): + super(GradWrap, self).__init__(auto_prefix=False) + self.network = network + self.weights = ParameterTuple(filter(lambda x: x.requires_grad, network.get_parameters())) + + def forward(self, x, label): + return C.GradOperation(get_by_list=True)(self.network, self.weights)(x, label) + + +def generator_train(): + inputs = X_train + targets = y_train + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + yield _input, _target + + +net = MLP() +train_weights = list(filter(lambda x: x.requires_grad, net.get_parameters())) +optimizer = Momentum(filter(lambda x: x.requires_grad, net.get_parameters()), 0.15, 0.8) + +criterion = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') +net_with_criterion = WithLossCell(net, criterion) +train_network = GradWrap(net_with_criterion) +train_network.set_train() + +X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 784)) +train_ds = tf.data.Dataset.from_generator(generator_train, output_types=(tf.float32, tf.int32)) +shuffle_buffer_size = 128 +batch_size = 128 +train_ds = train_ds.shuffle(shuffle_buffer_size) +train_ds = train_ds.batch(batch_size) +n_epoch = 50 + +for epoch in range(n_epoch): + start_time = time.time() + train_network.set_train() + train_loss, train_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in train_ds: + X_batch = ms.Tensor(X_batch.numpy(), dtype=ms.float32) + y_batch = ms.Tensor(y_batch.numpy(), dtype=ms.int32) + output = net(X_batch) + loss_output = criterion(output, y_batch) + grads = train_network(X_batch, y_batch) + success = optimizer(grads) + loss = loss_output.asnumpy() + train_loss += loss + n_iter += 1 + train_acc += np.mean((P.Equal()(P.Argmax(axis=1)(output), y_batch).asnumpy())) + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + print(" train loss: {}".format(train_loss / n_iter)) + print(" train acc: {}".format(train_acc / n_iter)) + print(" loss ", loss) diff --git a/examples/basic_tutorials/tutorial_mnist_mlp_dynamic_TF_backend.py b/examples/basic_tutorials/tutorial_mnist_mlp_dynamic_TF_backend.py new file mode 100644 index 0000000..1287391 --- /dev/null +++ b/examples/basic_tutorials/tutorial_mnist_mlp_dynamic_TF_backend.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import numpy as np +import time + +import tensorflow as tf +import tensorlayer as tl +from tensorlayer.layers import Module +from tensorlayer.layers import Dense, Dropout, BatchNorm1d + +X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 784)) + + +class CustomModel(Module): + + def __init__(self): + super(CustomModel, self).__init__() + self.dropout1 = Dropout(keep=0.8) + self.dense1 = Dense(n_units=800, in_channels=784) + self.batchnorm = BatchNorm1d(act=tl.ReLU, num_features=800) + self.dropout2 = Dropout(keep=0.8) + self.dense2 = Dense(n_units=800, act=tl.ReLU, in_channels=800) + self.dropout3 = Dropout(keep=0.8) + self.dense3 = Dense(n_units=10, act=tl.ReLU, in_channels=800) + + def forward(self, x, foo=None): + z = self.dropout1(x) + z = self.dense1(z) + z = self.batchnorm(z) + z = self.dropout2(z) + z = self.dense2(z) + z = self.dropout3(z) + out = self.dense3(z) + if foo is not None: + out = tl.ops.relu(out) + return out + + +MLP = CustomModel() +n_epoch = 50 +batch_size = 500 +print_freq = 5 +train_weights = MLP.trainable_weights +optimizer = tl.optimizers.Adam(lr=0.0001) + +for epoch in range(n_epoch): ## iterate the dataset n_epoch times + start_time = time.time() + ## iterate over the entire training set once (shuffle the data via training) + for X_batch, y_batch in tl.iterate.minibatches(X_train, y_train, batch_size, shuffle=True): + MLP.set_train() # enable dropout + with tf.GradientTape() as tape: + ## compute outputs + _logits = MLP(X_batch) + ## compute loss and update model + _loss = tl.cost.cross_entropy(_logits, y_batch, name='train_loss') + grad = tape.gradient(_loss, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + + ## use training and evaluation sets to evaluate the model every print_freq epoch + if epoch + 1 == 1 or (epoch + 1) % print_freq == 0: + MLP.set_train() + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + train_loss, train_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in tl.iterate.minibatches(X_train, y_train, batch_size, shuffle=False): + _logits = MLP(X_batch) + train_loss += tl.cost.cross_entropy(_logits, y_batch, name='eval_loss') + train_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 + print(" train loss: {}".format(train_loss / n_iter)) + print(" train acc: {}".format(train_acc / n_iter)) + + val_loss, val_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in tl.iterate.minibatches(X_val, y_val, batch_size, shuffle=False): + _logits = MLP(X_batch) # is_train=False, disable dropout + val_loss += tl.cost.cross_entropy(_logits, y_batch, name='eval_loss') + val_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 + print(" val loss: {}".format(val_loss / n_iter)) + print(" val acc: {}".format(val_acc / n_iter)) + +## use testing data to evaluate the model +MLP.eval() +test_loss, test_acc, n_iter = 0, 0, 0 +for X_batch, y_batch in tl.iterate.minibatches(X_test, y_test, batch_size, shuffle=False): + _logits = MLP(X_batch, foo=1) + test_loss += tl.cost.cross_entropy(_logits, y_batch, name='test_loss') + test_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 +print(" test foo=1 loss: {}".format(val_loss / n_iter)) +print(" test foo=1 acc: {}".format(val_acc / n_iter)) diff --git a/examples/basic_tutorials/tutorial_mnist_mlp_mindspore.py b/examples/basic_tutorials/tutorial_mnist_mlp_mindspore.py new file mode 100644 index 0000000..3e552d3 --- /dev/null +++ b/examples/basic_tutorials/tutorial_mnist_mlp_mindspore.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import numpy as np +import mindspore.nn as nn +import mindspore.ops.operations as P +from mindspore.ops import composite as C +from mindspore.common import dtype as mstype +from mindspore import context, Tensor, ParameterTuple +from mindspore.common.initializer import TruncatedNormal +from mindspore.nn import Dense, WithLossCell, SoftmaxCrossEntropyWithLogits, Momentum +import tensorlayer as tl +import mindspore as ms +import tensorflow as tf +import time + +context.set_context(mode=context.PYNATIVE_MODE, device_target="GPU") + + +def fc_with_initialize(input_channels, out_channels): + """weight initial for fc layer""" + weight = weight_variable() + bias = weight_variable() + return nn.Dense(input_channels, out_channels, weight, bias) + + +def weight_variable(): + """weight initial""" + return TruncatedNormal(0.02) + + +class MLP(nn.Cell): + """ + Lenet network + Args: + num_class (int): Num classes. Default: 10. + + Returns: + Tensor, output tensor + + Examples: + >>> MLP(num_class=10) + """ + + def __init__(self, num_class=10): + super(MLP, self).__init__() + self.num_class = num_class + self.fc1 = fc_with_initialize(784, 800) + self.fc2 = fc_with_initialize(800, 800) + self.fc3 = fc_with_initialize(800, self.num_class) + self.relu = nn.ReLU() + + def construct(self, x): + x = self.fc1(x) + x = self.relu(x) + x = self.fc2(x) + x = self.relu(x) + x = self.fc3(x) + return x + + +class GradWrap(nn.Cell): + """ GradWrap definition """ + + def __init__(self, network): + super(GradWrap, self).__init__(auto_prefix=False) + self.network = network + self.weights = ParameterTuple(filter(lambda x: x.requires_grad, network.get_parameters())) + + def construct(self, x, label): + weights = self.weights + return C.GradOperation('get_by_list', get_by_list=True)(self.network, weights)(x, label) + + +def generator_train(): + inputs = X_train + targets = y_train + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + yield _input, _target + + +net = MLP() +optimizer = Momentum(filter(lambda x: x.requires_grad, net.get_parameters()), 0.1, 0.9) +criterion = nn.SoftmaxCrossEntropyWithLogits(is_grad=False, sparse=True) +net_with_criterion = WithLossCell(net, criterion) +train_network = GradWrap(net_with_criterion) +train_network.set_train() + +X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 784)) +train_ds = tf.data.Dataset.from_generator(generator_train, output_types=(tf.float32, tf.int32)) +shuffle_buffer_size = 128 +batch_size = 128 +train_ds = train_ds.shuffle(shuffle_buffer_size) +train_ds = train_ds.batch(batch_size) +n_epoch = 50 + +for epoch in range(n_epoch): + start_time = time.time() + train_network.set_train() + train_loss, train_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in train_ds: + X_batch = ms.Tensor(X_batch.numpy(), dtype=ms.float32) + y_batch = ms.Tensor(y_batch.numpy(), dtype=ms.int32) + output = net(X_batch) + loss_output = criterion(output, y_batch) + grads = train_network(X_batch, y_batch) + success = optimizer(grads) + loss = loss_output.asnumpy() + train_loss += loss + n_iter += 1 + # train_acc += np.mean((P.Equal()(P.Argmax(axis=1)(output), y_batch).asnumpy())) + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + print(" train loss: {}".format(train_loss / n_iter)) + # print(" train acc: {}".format(train_acc / n_iter)) + print(" triain weights ", train_network.trainable_params()[0].data) diff --git a/examples/basic_tutorials/tutorial_mnist_simple.py b/examples/basic_tutorials/tutorial_mnist_simple.py new file mode 100644 index 0000000..4d2bc7c --- /dev/null +++ b/examples/basic_tutorials/tutorial_mnist_simple.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import numpy as np +import os +os.environ['TL_BACKEND'] = 'tensorflow' +# os.environ['TL_BACKEND'] = 'mindspore' + +import tensorlayer as tl +from tensorlayer.layers import Module +from tensorlayer.layers import Dense, Dropout + +X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 784)) + + +class CustomModel(Module): + + def __init__(self): + super(CustomModel, self).__init__() + self.dropout1 = Dropout(keep=0.8) + self.dense1 = Dense(n_units=800, act=tl.ReLU, in_channels=784) + self.dropout2 = Dropout(keep=0.8) + self.dense2 = Dense(n_units=800, act=tl.ReLU, in_channels=800) + self.dropout3 = Dropout(keep=0.8) + self.dense3 = Dense(n_units=10, act=tl.ReLU, in_channels=800) + + def forward(self, x, foo=None): + z = self.dropout1(x) + z = self.dense1(z) + # z = self.bn(z) + z = self.dropout2(z) + z = self.dense2(z) + z = self.dropout3(z) + out = self.dense3(z) + if foo is not None: + out = tl.ops.relu(out) + return out + + +def generator_train(): + inputs = X_train + targets = y_train + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + yield (_input, np.array(_target)) + + +MLP = CustomModel() + +n_epoch = 50 +batch_size = 128 +print_freq = 2 +shuffle_buffer_size = 128 + +train_weights = MLP.trainable_weights +optimizer = tl.optimizers.Momentum(0.05, 0.9) +train_ds = tl.dataflow.FromGenerator( + generator_train, output_types=(tl.float32, tl.int32) , column_names=['data', 'label'] +) +train_ds = tl.dataflow.Shuffle(train_ds,shuffle_buffer_size) +train_ds = tl.dataflow.Batch(train_ds,batch_size) + + +model = tl.models.Model(network=MLP, loss_fn=tl.cost.cross_entropy, optimizer=optimizer) +model.train(n_epoch=n_epoch, train_dataset=train_ds, print_freq=print_freq, print_train_batch=False) +model.save_weights('./model.npz', format='npz_dict') +model.load_weights('./model.npz', format='npz_dict') diff --git a/examples/basic_tutorials/tutorial_nested_usage_of_Layer.py b/examples/basic_tutorials/tutorial_nested_usage_of_Layer.py new file mode 100644 index 0000000..27ae9be --- /dev/null +++ b/examples/basic_tutorials/tutorial_nested_usage_of_Layer.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import time +import numpy as np +import multiprocessing +import tensorflow as tf + +from tensorlayer.layers import Module, SequentialLayer +import tensorlayer as tl +from tensorlayer.layers import (Conv2d, Dense, Flatten, MaxPool2d, BatchNorm2d, Elementwise) + +X_train, y_train, X_test, y_test = tl.files.load_cifar10_dataset(shape=(-1, 32, 32, 3), plotable=False) + +class Block(Module): + def __init__(self, in_channels): + super(Block, self).__init__() + self.dense1 = Dense(in_channels=in_channels, n_units=256) + self.dense2 = Dense(in_channels=256, n_units=384) + self.dense3 = Dense(in_channels=in_channels, n_units=384) + self.concat = Elementwise(combine_fn=tl.ops.add) + + def forward(self, inputs): + z = self.dense1(inputs) + z1 = self.dense2(z) + + z2 = self.dense3(inputs) + out = self.concat([z1, z2]) + return out + + +class CNN(Module): + + def __init__(self): + super(CNN, self).__init__() + # weights init + W_init = tl.initializers.truncated_normal(stddev=5e-2) + W_init2 = tl.initializers.truncated_normal(stddev=0.04) + b_init2 = tl.initializers.constant(value=0.1) + + self.conv1 = Conv2d(64, (5, 5), (1, 1), padding='SAME', W_init=W_init, b_init=None, name='conv1', in_channels=3) + self.bn = BatchNorm2d(num_features=64, act=tl.ReLU) + self.maxpool1 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool1') + + self.conv2 = Conv2d( + 64, (5, 5), (1, 1), padding='SAME', act=tl.ReLU, W_init=W_init, b_init=None, name='conv2', in_channels=64 + ) + self.maxpool2 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool2') + + self.flatten = Flatten(name='flatten') + self.dense1 = Dense(384, act=tl.ReLU, W_init=W_init2, b_init=b_init2, name='dense1relu', in_channels=2304) + self.dense_add = self.make_layer(in_channel=384) + + self.dense2 = Dense(192, act=tl.ReLU, W_init=W_init2, b_init=b_init2, name='dense2relu', in_channels=384) + self.dense3 = Dense(10, act=None, W_init=W_init2, name='output', in_channels=192) + + def forward(self, x): + z = self.conv1(x) + z = self.bn(z) + z = self.maxpool1(z) + z = self.conv2(z) + z = self.maxpool2(z) + z = self.flatten(z) + z = self.dense1(z) + z = self.dense_add(z) + + z = self.dense2(z) + z = self.dense3(z) + return z + + def make_layer(self, in_channel): + layers = [] + + _block = Block(in_channel) + layers.append(_block) + + for _ in range(1, 3): + range_block = Block(in_channel) + layers.append(range_block) + + return SequentialLayer(layers) + + +# get the network +net = CNN() +# training settings +batch_size = 128 +n_epoch = 500 +learning_rate = 0.0001 +print_freq = 5 +n_step_epoch = int(len(y_train) / batch_size) +n_step = n_epoch * n_step_epoch +shuffle_buffer_size = 128 + +train_weights = net.trainable_weights +optimizer = tl.optimizers.Adam(learning_rate) + + +def generator_train(): + inputs = X_train + targets = y_train + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + # yield _input.encode('utf-8'), _target.encode('utf-8') + yield _input, _target + + +def generator_test(): + inputs = X_test + targets = y_test + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + # yield _input.encode('utf-8'), _target.encode('utf-8') + yield _input, _target + + +def _map_fn_train(img, target): + # 1. Randomly crop a [height, width] section of the image. + img = tf.image.random_crop(img, [24, 24, 3]) + # 2. Randomly flip the image horizontally. + img = tf.image.random_flip_left_right(img) + # 3. Randomly change brightness. + img = tf.image.random_brightness(img, max_delta=63) + # 4. Randomly change contrast. + img = tf.image.random_contrast(img, lower=0.2, upper=1.8) + # 5. Subtract off the mean and divide by the variance of the pixels. + img = tf.image.per_image_standardization(img) + target = tf.reshape(target, ()) + return img, target + + +def _map_fn_test(img, target): + # 1. Crop the central [height, width] of the image. + img = tf.image.resize_with_pad(img, 24, 24) + # 2. Subtract off the mean and divide by the variance of the pixels. + img = tf.image.per_image_standardization(img) + img = tf.reshape(img, (24, 24, 3)) + target = tf.reshape(target, ()) + return img, target + + +# dataset API and augmentation +train_ds = tf.data.Dataset.from_generator( + generator_train, output_types=(tf.float32, tf.int32) +) # , output_shapes=((24, 24, 3), (1))) +train_ds = train_ds.map(_map_fn_train, num_parallel_calls=multiprocessing.cpu_count()) +# train_ds = train_ds.repeat(n_epoch) +train_ds = train_ds.shuffle(shuffle_buffer_size) +train_ds = train_ds.prefetch(buffer_size=4096) +train_ds = train_ds.batch(batch_size) +# value = train_ds.make_one_shot_iterator().get_next() + +test_ds = tf.data.Dataset.from_generator( + generator_test, output_types=(tf.float32, tf.int32) +) # , output_shapes=((24, 24, 3), (1))) +# test_ds = test_ds.shuffle(shuffle_buffer_size) +test_ds = test_ds.map(_map_fn_test, num_parallel_calls=multiprocessing.cpu_count()) +# test_ds = test_ds.repeat(n_epoch) +test_ds = test_ds.prefetch(buffer_size=4096) +test_ds = test_ds.batch(batch_size) +# value_test = test_ds.make_one_shot_iterator().get_next() + +for epoch in range(n_epoch): + start_time = time.time() + + train_loss, train_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in train_ds: + net.set_train() + + with tf.GradientTape() as tape: + # compute outputs + _logits = net(X_batch) + # compute loss and update model + _loss_ce = tl.cost.cross_entropy(_logits, y_batch, name='train_loss') + + grad = tape.gradient(_loss_ce, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + + train_loss += _loss_ce + train_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 + + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + print(" train loss: {}".format(train_loss / n_iter)) + print(" train acc: {}".format(train_acc / n_iter)) + + # use training and evaluation sets to evaluate the model every print_freq epoch + if epoch + 1 == 1 or (epoch + 1) % print_freq == 0: + + net.eval() + val_loss, val_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in test_ds: + _logits = net(X_batch) # is_train=False, disable dropout + val_loss += tl.cost.cross_entropy(_logits, y_batch, name='eval_loss') + val_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 + print(" val loss: {}".format(val_loss / n_iter)) + print(" val acc: {}".format(val_acc / n_iter)) + +# use testing data to evaluate the model +net.eval() +test_loss, test_acc, n_iter = 0, 0, 0 +for X_batch, y_batch in test_ds: + _logits = net(X_batch) + test_loss += tl.cost.cross_entropy(_logits, y_batch, name='test_loss') + test_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 +print(" test loss: {}".format(test_loss / n_iter)) +print(" test acc: {}".format(test_acc / n_iter)) \ No newline at end of file diff --git a/examples/basic_tutorials/tutorial_paddle_tensorlayer_mlp.py b/examples/basic_tutorials/tutorial_paddle_tensorlayer_mlp.py new file mode 100644 index 0000000..96d57b5 --- /dev/null +++ b/examples/basic_tutorials/tutorial_paddle_tensorlayer_mlp.py @@ -0,0 +1,57 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +import os +os.environ['TL_BACKEND'] = 'paddle' + +import paddle.nn.functional as F +from paddle.vision.transforms import Compose, Normalize +import paddle + +import tensorlayer as tl +from tensorlayer.layers import Module +from tensorlayer.layers import Dense, Flatten + +transform = Compose([Normalize(mean=[127.5], + std=[127.5], + data_format='CHW')]) +print('download training data and load training data') +train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform) +test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform) +print('load finished') + +class MLP(Module): + def __init__(self): + super(MLP, self).__init__() + self.linear1 = Dense(n_units=120, in_channels=784, act=tl.ReLU) + self.linear2 = Dense(n_units=84, in_channels=120, act=tl.ReLU) + self.linear3 = Dense(n_units=10, in_channels=84) + self.flatten = Flatten() + + def forward(self, x): + x = self.flatten(x) + x = self.linear1(x) + x = self.linear2(x) + x = self.linear3(x) + return x + +train_loader = paddle.io.DataLoader(train_dataset, batch_size=64, shuffle=True) + +def train(model): + model.train() + epochs = 2 + optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.trainable_weights) + for epoch in range(epochs): + for batch_id, data in enumerate(train_loader()): + x_data = data[0] + y_data = data[1] + predicts = model(x_data) + loss = tl.cost.mean_squared_error(predicts, y_data) + acc = paddle.metric.accuracy(predicts, y_data) + loss.backward() + if batch_id % 5 == 0: + print("epoch: {}, batch_id: {}, loss is: {}, acc is: {}".format(epoch, batch_id, loss.numpy(), acc.numpy())) + optim.step() + optim.clear_grad() +model = MLP() +train(model) + diff --git a/examples/model_zoo/__init__.py b/examples/model_zoo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/model_zoo/common.py b/examples/model_zoo/common.py new file mode 100644 index 0000000..7bc1bfd --- /dev/null +++ b/examples/model_zoo/common.py @@ -0,0 +1,287 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorflow as tf +import colorsys, random, cv2 +import numpy as np +from tensorlayer.visualize import save_image + +def decode_tf(conv_output, output_size, NUM_CLASS, STRIDES, ANCHORS, i=0, XYSCALE=[1, 1, 1]): + batch_size = tf.shape(conv_output)[0] + conv_output = tf.reshape(conv_output, (batch_size, output_size, output_size, 3, 5 + NUM_CLASS)) + + conv_raw_dxdy, conv_raw_dwdh, conv_raw_conf, conv_raw_prob = tf.split(conv_output, (2, 2, 1, NUM_CLASS), axis=-1) + + xy_grid = tf.meshgrid(tf.range(output_size), tf.range(output_size)) + xy_grid = tf.expand_dims(tf.stack(xy_grid, axis=-1), axis=2) # [gx, gy, 1, 2] + xy_grid = tf.tile(tf.expand_dims(xy_grid, axis=0), [batch_size, 1, 1, 3, 1]) + + xy_grid = tf.cast(xy_grid, tf.float32) + + pred_xy = ((tf.sigmoid(conv_raw_dxdy) * XYSCALE[i]) - 0.5 * (XYSCALE[i] - 1) + xy_grid) * \ + STRIDES[i] + pred_wh = (tf.exp(conv_raw_dwdh) * ANCHORS[i]) + pred_xywh = tf.concat([pred_xy, pred_wh], axis=-1) + + pred_conf = tf.sigmoid(conv_raw_conf) + pred_prob = tf.sigmoid(conv_raw_prob) + + pred_prob = pred_conf * pred_prob + pred_prob = tf.reshape(pred_prob, (batch_size, -1, NUM_CLASS)) + pred_xywh = tf.reshape(pred_xywh, (batch_size, -1, 4)) + + return pred_xywh, pred_prob + + +def decode(conv_output, output_size, NUM_CLASS, STRIDES, ANCHORS, i, XYSCALE=[1, 1, 1]): + return decode_tf(conv_output, output_size, NUM_CLASS, STRIDES, ANCHORS, i=i, XYSCALE=XYSCALE) + + +def filter_boxes(box_xywh, scores, score_threshold=0.4, input_shape=tf.constant([416, 416])): + scores_max = tf.math.reduce_max(scores, axis=-1) + + mask = scores_max >= score_threshold + class_boxes = tf.boolean_mask(box_xywh, mask) + pred_conf = tf.boolean_mask(scores, mask) + class_boxes = tf.reshape(class_boxes, [tf.shape(scores)[0], -1, tf.shape(class_boxes)[-1]]) + pred_conf = tf.reshape(pred_conf, [tf.shape(scores)[0], -1, tf.shape(pred_conf)[-1]]) + + box_xy, box_wh = tf.split(class_boxes, (2, 2), axis=-1) + + input_shape = tf.cast(input_shape, dtype=tf.float32) + box_yx = box_xy[..., ::-1] + box_hw = box_wh[..., ::-1] + + box_mins = (box_yx - (box_hw / 2.)) / input_shape + box_maxes = (box_yx + (box_hw / 2.)) / input_shape + boxes = tf.concat( + [ + box_mins[..., 0:1], # y_min + box_mins[..., 1:2], # x_min + box_maxes[..., 0:1], # y_max + box_maxes[..., 1:2] # x_max + ], + axis=-1 + ) + # return tf.concat([boxes, pred_conf], axis=-1) + return (boxes, pred_conf) + + +def read_class_names(class_file_name): + names = {} + with open(class_file_name, 'r') as data: + for ID, name in enumerate(data): + names[ID] = name.strip('\n') + return names + + +def draw_bbox(image, bboxes, show_label=True): + classes = read_class_names('model/coco.names') + num_classes = len(classes) + image_h, image_w, _ = image.shape + hsv_tuples = [(1.0 * x / num_classes, 1., 1.) for x in range(num_classes)] + colors = list(map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples)) + colors = list(map(lambda x: (int(x[0] * 255), int(x[1] * 255), int(x[2] * 255)), colors)) + + random.seed(0) + random.shuffle(colors) + random.seed(None) + + out_boxes, out_scores, out_classes, num_boxes = bboxes + for i in range(num_boxes[0]): + if int(out_classes[0][i]) < 0 or int(out_classes[0][i]) > num_classes: continue + coor = out_boxes[0][i] + coor[0] = int(coor[0] * image_h) + coor[2] = int(coor[2] * image_h) + coor[1] = int(coor[1] * image_w) + coor[3] = int(coor[3] * image_w) + + fontScale = 0.5 + score = out_scores[0][i] + class_ind = int(out_classes[0][i]) + bbox_color = colors[class_ind] + bbox_thick = int(0.6 * (image_h + image_w) / 600) + c1, c2 = (coor[1], coor[0]), (coor[3], coor[2]) + cv2.rectangle(image, c1, c2, bbox_color, bbox_thick) + + if show_label: + bbox_mess = '%s: %.2f' % (classes[class_ind], score) + t_size = cv2.getTextSize(bbox_mess, 0, fontScale, thickness=bbox_thick // 2)[0] + c3 = (c1[0] + t_size[0], c1[1] - t_size[1] - 3) + cv2.rectangle(image, c1, (np.float32(c3[0]), np.float32(c3[1])), bbox_color, -1) #filled + + cv2.putText( + image, bbox_mess, (c1[0], np.float32(c1[1] - 2)), cv2.FONT_HERSHEY_SIMPLEX, fontScale, (0, 0, 0), + bbox_thick // 2, lineType=cv2.LINE_AA + ) + return image + + +def get_anchors(anchors_path, tiny=False): + anchors = np.array(anchors_path) + if tiny: + return anchors.reshape(2, 3, 2) + else: + return anchors.reshape(3, 3, 2) + + +def decode_train(conv_output, output_size, NUM_CLASS, STRIDES, ANCHORS, i=0, XYSCALE=[1, 1, 1]): + conv_output = tf.reshape(conv_output, (tf.shape(conv_output)[0], output_size, output_size, 3, 5 + NUM_CLASS)) + + conv_raw_dxdy, conv_raw_dwdh, conv_raw_conf, conv_raw_prob = tf.split(conv_output, (2, 2, 1, NUM_CLASS), axis=-1) + + xy_grid = tf.meshgrid(tf.range(output_size), tf.range(output_size)) + xy_grid = tf.expand_dims(tf.stack(xy_grid, axis=-1), axis=2) # [gx, gy, 1, 2] + xy_grid = tf.tile(tf.expand_dims(xy_grid, axis=0), [tf.shape(conv_output)[0], 1, 1, 3, 1]) + + xy_grid = tf.cast(xy_grid, tf.float32) + + pred_xy = ((tf.sigmoid(conv_raw_dxdy) * XYSCALE[i]) - 0.5 * (XYSCALE[i] - 1) + xy_grid) * \ + STRIDES[i] + pred_wh = (tf.exp(conv_raw_dwdh) * ANCHORS[i]) + pred_xywh = tf.concat([pred_xy, pred_wh], axis=-1) + + pred_conf = tf.sigmoid(conv_raw_conf) + pred_prob = tf.sigmoid(conv_raw_prob) + + return tf.concat([pred_xywh, pred_conf, pred_prob], axis=-1) + + +def yolo4_input_processing(original_image): + image_data = cv2.resize(original_image, (416, 416)) + image_data = image_data / 255. + images_data = [] + for i in range(1): + images_data.append(image_data) + images_data = np.asarray(images_data).astype(np.float32) + batch_data = tf.constant(images_data) + return batch_data + + +def yolo4_output_processing(feature_maps): + STRIDES = [8, 16, 32] + ANCHORS = get_anchors([12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401]) + NUM_CLASS = 80 + XYSCALE = [1.2, 1.1, 1.05] + iou_threshold = 0.45 + score_threshold = 0.25 + + bbox_tensors = [] + prob_tensors = [] + score_thres = 0.2 + for i, fm in enumerate(feature_maps): + if i == 0: + output_tensors = decode(fm, 416 // 8, NUM_CLASS, STRIDES, ANCHORS, i, XYSCALE) + elif i == 1: + output_tensors = decode(fm, 416 // 16, NUM_CLASS, STRIDES, ANCHORS, i, XYSCALE) + else: + output_tensors = decode(fm, 416 // 32, NUM_CLASS, STRIDES, ANCHORS, i, XYSCALE) + bbox_tensors.append(output_tensors[0]) + prob_tensors.append(output_tensors[1]) + pred_bbox = tf.concat(bbox_tensors, axis=1) + pred_prob = tf.concat(prob_tensors, axis=1) + boxes, pred_conf = filter_boxes( + pred_bbox, pred_prob, score_threshold=score_thres, input_shape=tf.constant([416, 416]) + ) + pred = {'concat': tf.concat([boxes, pred_conf], axis=-1)} + + for key, value in pred.items(): + boxes = value[:, :, 0:4] + pred_conf = value[:, :, 4:] + + boxes, scores, classes, valid_detections = tf.image.combined_non_max_suppression( + boxes=tf.reshape(boxes, (tf.shape(boxes)[0], -1, 1, 4)), + scores=tf.reshape(pred_conf, (tf.shape(pred_conf)[0], -1, tf.shape(pred_conf)[-1])), + max_output_size_per_class=50, max_total_size=50, iou_threshold=iou_threshold, score_threshold=score_threshold + ) + output = [boxes.numpy(), scores.numpy(), classes.numpy(), valid_detections.numpy()] + return output + + +def result_to_json(image, pred_bbox): + image_h, image_w, _ = image.shape + out_boxes, out_scores, out_classes, num_boxes = pred_bbox + class_names = {} + json_result = [] + with open('model/coco.names', 'r') as data: + for ID, name in enumerate(data): + class_names[ID] = name.strip('\n') + nums_class = len(class_names) + + for i in range(num_boxes[0]): + if int(out_classes[0][i]) < 0 or int(out_classes[0][i]) > nums_class: continue + coor = out_boxes[0][i] + coor[0] = int(coor[0] * image_h) + coor[2] = int(coor[2] * image_h) + coor[1] = int(coor[1] * image_w) + coor[3] = int(coor[3] * image_w) + + score = float(out_scores[0][i]) + class_ind = int(out_classes[0][i]) + bbox = np.array([coor[1], coor[0], coor[3], coor[2]]).tolist() # [x1,y1,x2,y2] + json_result.append({'image': None, 'category_id': class_ind, 'bbox': bbox, 'score': score}) + + return json_result + + +def draw_boxes_and_labels_to_image_with_json(image, json_result, class_list, save_name=None): + """Draw bboxes and class labels on image. Return the image with bboxes. + + Parameters + ----------- + image : numpy.array + The RGB image [height, width, channel]. + json_result : list of dict + The object detection result with json format. + classes_list : list of str + For converting ID to string on image. + save_name : None or str + The name of image file (i.e. image.png), if None, not to save image. + + Returns + ------- + numpy.array + The saved image. + + References + ----------- + - OpenCV rectangle and putText. + - `scikit-image `__. + + """ + image_h, image_w, _ = image.shape + num_classes = len(class_list) + hsv_tuples = [(1.0 * x / num_classes, 1., 1.) for x in range(num_classes)] + colors = list(map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples)) + colors = list(map(lambda x: (int(x[0] * 255), int(x[1] * 255), int(x[2] * 255)), colors)) + random.seed(0) + random.shuffle(colors) + random.seed(None) + bbox_thick = int(0.6 * (image_h + image_w) / 600) + fontScale = 0.5 + + for bbox_info in json_result: + image_name = bbox_info['image'] + category_id = bbox_info['category_id'] + if category_id < 0 or category_id > num_classes: continue + bbox = bbox_info['bbox'] # the order of coordinates is [x1, y2, x2, y2] + score = bbox_info['score'] + + bbox_color = colors[category_id] + c1, c2 = (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])) + cv2.rectangle(image, c1, c2, bbox_color, bbox_thick) + + bbox_mess = '%s: %.2f' % (class_list[category_id], score) + t_size = cv2.getTextSize(bbox_mess, 0, fontScale, thickness=bbox_thick // 2)[0] + c3 = (c1[0] + t_size[0], c1[1] - t_size[1] - 3) + cv2.rectangle(image, c1, (np.float32(c3[0]), np.float32(c3[1])), bbox_color, -1) + + cv2.putText( + image, bbox_mess, (c1[0], np.float32(c1[1] - 2)), cv2.FONT_HERSHEY_SIMPLEX, fontScale, (0, 0, 0), + bbox_thick // 2, lineType=cv2.LINE_AA + ) + + if save_name is not None: + save_image(image, save_name) + + return image \ No newline at end of file diff --git a/examples/model_zoo/imagenet_classes.py b/examples/model_zoo/imagenet_classes.py new file mode 100644 index 0000000..d13cfda --- /dev/null +++ b/examples/model_zoo/imagenet_classes.py @@ -0,0 +1,1003 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +class_names = '''tench, Tinca tinca +goldfish, Carassius auratus +great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias +tiger shark, Galeocerdo cuvieri +hammerhead, hammerhead shark +electric ray, crampfish, numbfish, torpedo +stingray +cock +hen +ostrich, Struthio camelus +brambling, Fringilla montifringilla +goldfinch, Carduelis carduelis +house finch, linnet, Carpodacus mexicanus +junco, snowbird +indigo bunting, indigo finch, indigo bird, Passerina cyanea +robin, American robin, Turdus migratorius +bulbul +jay +magpie +chickadee +water ouzel, dipper +kite +bald eagle, American eagle, Haliaeetus leucocephalus +vulture +great grey owl, great gray owl, Strix nebulosa +European fire salamander, Salamandra salamandra +common newt, Triturus vulgaris +eft +spotted salamander, Ambystoma maculatum +axolotl, mud puppy, Ambystoma mexicanum +bullfrog, Rana catesbeiana +tree frog, tree-frog +tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui +loggerhead, loggerhead turtle, Caretta caretta +leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea +mud turtle +terrapin +box turtle, box tortoise +banded gecko +common iguana, iguana, Iguana iguana +American chameleon, anole, Anolis carolinensis +whiptail, whiptail lizard +agama +frilled lizard, Chlamydosaurus kingi +alligator lizard +Gila monster, Heloderma suspectum +green lizard, Lacerta viridis +African chameleon, Chamaeleo chamaeleon +Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis +African crocodile, Nile crocodile, Crocodylus niloticus +American alligator, Alligator mississipiensis +triceratops +thunder snake, worm snake, Carphophis amoenus +ringneck snake, ring-necked snake, ring snake +hognose snake, puff adder, sand viper +green snake, grass snake +king snake, kingsnake +garter snake, grass snake +water snake +vine snake +night snake, Hypsiglena torquata +boa constrictor, Constrictor constrictor +rock python, rock snake, Python sebae +Indian cobra, Naja naja +green mamba +sea snake +horned viper, cerastes, sand viper, horned asp, Cerastes cornutus +diamondback, diamondback rattlesnake, Crotalus adamanteus +sidewinder, horned rattlesnake, Crotalus cerastes +trilobite +harvestman, daddy longlegs, Phalangium opilio +scorpion +black and gold garden spider, Argiope aurantia +barn spider, Araneus cavaticus +garden spider, Aranea diademata +black widow, Latrodectus mactans +tarantula +wolf spider, hunting spider +tick +centipede +black grouse +ptarmigan +ruffed grouse, partridge, Bonasa umbellus +prairie chicken, prairie grouse, prairie fowl +peacock +quail +partridge +African grey, African gray, Psittacus erithacus +macaw +sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita +lorikeet +coucal +bee eater +hornbill +hummingbird +jacamar +toucan +drake +red-breasted merganser, Mergus serrator +goose +black swan, Cygnus atratus +tusker +echidna, spiny anteater, anteater +platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus +wallaby, brush kangaroo +koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus +wombat +jellyfish +sea anemone, anemone +brain coral +flatworm, platyhelminth +nematode, nematode worm, roundworm +conch +snail +slug +sea slug, nudibranch +chiton, coat-of-mail shell, sea cradle, polyplacophore +chambered nautilus, pearly nautilus, nautilus +Dungeness crab, Cancer magister +rock crab, Cancer irroratus +fiddler crab +king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica +American lobster, Northern lobster, Maine lobster, Homarus americanus +spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish +crayfish, crawfish, crawdad, crawdaddy +hermit crab +isopod +white stork, Ciconia ciconia +black stork, Ciconia nigra +spoonbill +flamingo +little blue heron, Egretta caerulea +American egret, great white heron, Egretta albus +bittern +crane +limpkin, Aramus pictus +European gallinule, Porphyrio porphyrio +American coot, marsh hen, mud hen, water hen, Fulica americana +bustard +ruddy turnstone, Arenaria interpres +red-backed sandpiper, dunlin, Erolia alpina +redshank, Tringa totanus +dowitcher +oystercatcher, oyster catcher +pelican +king penguin, Aptenodytes patagonica +albatross, mollymawk +grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus +killer whale, killer, orca, grampus, sea wolf, Orcinus orca +dugong, Dugong dugon +sea lion +Chihuahua +Japanese spaniel +Maltese dog, Maltese terrier, Maltese +Pekinese, Pekingese, Peke +Shih-Tzu +Blenheim spaniel +papillon +toy terrier +Rhodesian ridgeback +Afghan hound, Afghan +basset, basset hound +beagle +bloodhound, sleuthhound +bluetick +black-and-tan coonhound +Walker hound, Walker foxhound +English foxhound +redbone +borzoi, Russian wolfhound +Irish wolfhound +Italian greyhound +whippet +Ibizan hound, Ibizan Podenco +Norwegian elkhound, elkhound +otterhound, otter hound +Saluki, gazelle hound +Scottish deerhound, deerhound +Weimaraner +Staffordshire bullterrier, Staffordshire bull terrier +American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier +Bedlington terrier +Border terrier +Kerry blue terrier +Irish terrier +Norfolk terrier +Norwich terrier +Yorkshire terrier +wire-haired fox terrier +Lakeland terrier +Sealyham terrier, Sealyham +Airedale, Airedale terrier +cairn, cairn terrier +Australian terrier +Dandie Dinmont, Dandie Dinmont terrier +Boston bull, Boston terrier +miniature schnauzer +giant schnauzer +standard schnauzer +Scotch terrier, Scottish terrier, Scottie +Tibetan terrier, chrysanthemum dog +silky terrier, Sydney silky +soft-coated wheaten terrier +West Highland white terrier +Lhasa, Lhasa apso +flat-coated retriever +curly-coated retriever +golden retriever +Labrador retriever +Chesapeake Bay retriever +German short-haired pointer +vizsla, Hungarian pointer +English setter +Irish setter, red setter +Gordon setter +Brittany spaniel +clumber, clumber spaniel +English springer, English springer spaniel +Welsh springer spaniel +cocker spaniel, English cocker spaniel, cocker +Sussex spaniel +Irish water spaniel +kuvasz +schipperke +groenendael +malinois +briard +kelpie +komondor +Old English sheepdog, bobtail +Shetland sheepdog, Shetland sheep dog, Shetland +collie +Border collie +Bouvier des Flandres, Bouviers des Flandres +Rottweiler +German shepherd, German shepherd dog, German police dog, alsatian +Doberman, Doberman pinscher +miniature pinscher +Greater Swiss Mountain dog +Bernese mountain dog +Appenzeller +EntleBucher +boxer +bull mastiff +Tibetan mastiff +French bulldog +Great Dane +Saint Bernard, St Bernard +Eskimo dog, husky +malamute, malemute, Alaskan malamute +Siberian husky +dalmatian, coach dog, carriage dog +affenpinscher, monkey pinscher, monkey dog +basenji +pug, pug-dog +Leonberg +Newfoundland, Newfoundland dog +Great Pyrenees +Samoyed, Samoyede +Pomeranian +chow, chow chow +keeshond +Brabancon griffon +Pembroke, Pembroke Welsh corgi +Cardigan, Cardigan Welsh corgi +toy poodle +miniature poodle +standard poodle +Mexican hairless +timber wolf, grey wolf, gray wolf, Canis lupus +white wolf, Arctic wolf, Canis lupus tundrarum +red wolf, maned wolf, Canis rufus, Canis niger +coyote, prairie wolf, brush wolf, Canis latrans +dingo, warrigal, warragal, Canis dingo +dhole, Cuon alpinus +African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus +hyena, hyaena +red fox, Vulpes vulpes +kit fox, Vulpes macrotis +Arctic fox, white fox, Alopex lagopus +grey fox, gray fox, Urocyon cinereoargenteus +tabby, tabby cat +tiger cat +Persian cat +Siamese cat, Siamese +Egyptian cat +cougar, puma, catamount, mountain lion, painter, panther, Felis concolor +lynx, catamount +leopard, Panthera pardus +snow leopard, ounce, Panthera uncia +jaguar, panther, Panthera onca, Felis onca +lion, king of beasts, Panthera leo +tiger, Panthera tigris +cheetah, chetah, Acinonyx jubatus +brown bear, bruin, Ursus arctos +American black bear, black bear, Ursus americanus, Euarctos americanus +ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus +sloth bear, Melursus ursinus, Ursus ursinus +mongoose +meerkat, mierkat +tiger beetle +ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle +ground beetle, carabid beetle +long-horned beetle, longicorn, longicorn beetle +leaf beetle, chrysomelid +dung beetle +rhinoceros beetle +weevil +fly +bee +ant, emmet, pismire +grasshopper, hopper +cricket +walking stick, walkingstick, stick insect +cockroach, roach +mantis, mantid +cicada, cicala +leafhopper +lacewing, lacewing fly +dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk +damselfly +admiral +ringlet, ringlet butterfly +monarch, monarch butterfly, milkweed butterfly, Danaus plexippus +cabbage butterfly +sulphur butterfly, sulfur butterfly +lycaenid, lycaenid butterfly +starfish, sea star +sea urchin +sea cucumber, holothurian +wood rabbit, cottontail, cottontail rabbit +hare +Angora, Angora rabbit +hamster +porcupine, hedgehog +fox squirrel, eastern fox squirrel, Sciurus niger +marmot +beaver +guinea pig, Cavia cobaya +sorrel +zebra +hog, pig, grunter, squealer, Sus scrofa +wild boar, boar, Sus scrofa +warthog +hippopotamus, hippo, river horse, Hippopotamus amphibius +ox +water buffalo, water ox, Asiatic buffalo, Bubalus bubalis +bison +ram, tup +bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis +ibex, Capra ibex +hartebeest +impala, Aepyceros melampus +gazelle +Arabian camel, dromedary, Camelus dromedarius +llama +weasel +mink +polecat, fitch, foulmart, foumart, Mustela putorius +black-footed ferret, ferret, Mustela nigripes +otter +skunk, polecat, wood pussy +badger +armadillo +three-toed sloth, ai, Bradypus tridactylus +orangutan, orang, orangutang, Pongo pygmaeus +gorilla, Gorilla gorilla +chimpanzee, chimp, Pan troglodytes +gibbon, Hylobates lar +siamang, Hylobates syndactylus, Symphalangus syndactylus +guenon, guenon monkey +patas, hussar monkey, Erythrocebus patas +baboon +macaque +langur +colobus, colobus monkey +proboscis monkey, Nasalis larvatus +marmoset +capuchin, ringtail, Cebus capucinus +howler monkey, howler +titi, titi monkey +spider monkey, Ateles geoffroyi +squirrel monkey, Saimiri sciureus +Madagascar cat, ring-tailed lemur, Lemur catta +indri, indris, Indri indri, Indri brevicaudatus +Indian elephant, Elephas maximus +African elephant, Loxodonta africana +lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens +giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca +barracouta, snoek +eel +coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch +rock beauty, Holocanthus tricolor +anemone fish +sturgeon +gar, garfish, garpike, billfish, Lepisosteus osseus +lionfish +puffer, pufferfish, blowfish, globefish +abacus +abaya +academic gown, academic robe, judge's robe +accordion, piano accordion, squeeze box +acoustic guitar +aircraft carrier, carrier, flattop, attack aircraft carrier +airliner +airship, dirigible +altar +ambulance +amphibian, amphibious vehicle +analog clock +apiary, bee house +apron +ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin +assault rifle, assault gun +backpack, back pack, knapsack, packsack, rucksack, haversack +bakery, bakeshop, bakehouse +balance beam, beam +balloon +ballpoint, ballpoint pen, ballpen, Biro +Band Aid +banjo +bannister, banister, balustrade, balusters, handrail +barbell +barber chair +barbershop +barn +barometer +barrel, cask +barrow, garden cart, lawn cart, wheelbarrow +baseball +basketball +bassinet +bassoon +bathing cap, swimming cap +bath towel +bathtub, bathing tub, bath, tub +beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon +beacon, lighthouse, beacon light, pharos +beaker +bearskin, busby, shako +beer bottle +beer glass +bell cote, bell cot +bib +bicycle-built-for-two, tandem bicycle, tandem +bikini, two-piece +binder, ring-binder +binoculars, field glasses, opera glasses +birdhouse +boathouse +bobsled, bobsleigh, bob +bolo tie, bolo, bola tie, bola +bonnet, poke bonnet +bookcase +bookshop, bookstore, bookstall +bottlecap +bow +bow tie, bow-tie, bowtie +brass, memorial tablet, plaque +brassiere, bra, bandeau +breakwater, groin, groyne, mole, bulwark, seawall, jetty +breastplate, aegis, egis +broom +bucket, pail +buckle +bulletproof vest +bullet train, bullet +butcher shop, meat market +cab, hack, taxi, taxicab +caldron, cauldron +candle, taper, wax light +cannon +canoe +can opener, tin opener +cardigan +car mirror +carousel, carrousel, merry-go-round, roundabout, whirligig +carpenter's kit, tool kit +carton +car wheel +cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM +cassette +cassette player +castle +catamaran +CD player +cello, violoncello +cellular telephone, cellular phone, cellphone, cell, mobile phone +chain +chainlink fence +chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour +chain saw, chainsaw +chest +chiffonier, commode +chime, bell, gong +china cabinet, china closet +Christmas stocking +church, church building +cinema, movie theater, movie theatre, movie house, picture palace +cleaver, meat cleaver, chopper +cliff dwelling +cloak +clog, geta, patten, sabot +cocktail shaker +coffee mug +coffeepot +coil, spiral, volute, whorl, helix +combination lock +computer keyboard, keypad +confectionery, confectionary, candy store +container ship, containership, container vessel +convertible +corkscrew, bottle screw +cornet, horn, trumpet, trump +cowboy boot +cowboy hat, ten-gallon hat +cradle +crane +crash helmet +crate +crib, cot +Crock Pot +croquet ball +crutch +cuirass +dam, dike, dyke +desk +desktop computer +dial telephone, dial phone +diaper, nappy, napkin +digital clock +digital watch +dining table, board +dishrag, dishcloth +dishwasher, dish washer, dishwashing machine +disk brake, disc brake +dock, dockage, docking facility +dogsled, dog sled, dog sleigh +dome +doormat, welcome mat +drilling platform, offshore rig +drum, membranophone, tympan +drumstick +dumbbell +Dutch oven +electric fan, blower +electric guitar +electric locomotive +entertainment center +envelope +espresso maker +face powder +feather boa, boa +file, file cabinet, filing cabinet +fireboat +fire engine, fire truck +fire screen, fireguard +flagpole, flagstaff +flute, transverse flute +folding chair +football helmet +forklift +fountain +fountain pen +four-poster +freight car +French horn, horn +frying pan, frypan, skillet +fur coat +garbage truck, dustcart +gasmask, respirator, gas helmet +gas pump, gasoline pump, petrol pump, island dispenser +goblet +go-kart +golf ball +golfcart, golf cart +gondola +gong, tam-tam +gown +grand piano, grand +greenhouse, nursery, glasshouse +grille, radiator grille +grocery store, grocery, food market, market +guillotine +hair slide +hair spray +half track +hammer +hamper +hand blower, blow dryer, blow drier, hair dryer, hair drier +hand-held computer, hand-held microcomputer +handkerchief, hankie, hanky, hankey +hard disc, hard disk, fixed disk +harmonica, mouth organ, harp, mouth harp +harp +harvester, reaper +hatchet +holster +home theater, home theatre +honeycomb +hook, claw +hoopskirt, crinoline +horizontal bar, high bar +horse cart, horse-cart +hourglass +iPod +iron, smoothing iron +jack-o'-lantern +jean, blue jean, denim +jeep, landrover +jersey, T-shirt, tee shirt +jigsaw puzzle +jinrikisha, ricksha, rickshaw +joystick +kimono +knee pad +knot +lab coat, laboratory coat +ladle +lampshade, lamp shade +laptop, laptop computer +lawn mower, mower +lens cap, lens cover +letter opener, paper knife, paperknife +library +lifeboat +lighter, light, igniter, ignitor +limousine, limo +liner, ocean liner +lipstick, lip rouge +Loafer +lotion +loudspeaker, speaker, speaker unit, loudspeaker system, speaker system +loupe, jeweler's loupe +lumbermill, sawmill +magnetic compass +mailbag, postbag +mailbox, letter box +maillot +maillot, tank suit +manhole cover +maraca +marimba, xylophone +mask +matchstick +maypole +maze, labyrinth +measuring cup +medicine chest, medicine cabinet +megalith, megalithic structure +microphone, mike +microwave, microwave oven +military uniform +milk can +minibus +miniskirt, mini +minivan +missile +mitten +mixing bowl +mobile home, manufactured home +Model T +modem +monastery +monitor +moped +mortar +mortarboard +mosque +mosquito net +motor scooter, scooter +mountain bike, all-terrain bike, off-roader +mountain tent +mouse, computer mouse +mousetrap +moving van +muzzle +nail +neck brace +necklace +nipple +notebook, notebook computer +obelisk +oboe, hautboy, hautbois +ocarina, sweet potato +odometer, hodometer, mileometer, milometer +oil filter +organ, pipe organ +oscilloscope, scope, cathode-ray oscilloscope, CRO +overskirt +oxcart +oxygen mask +packet +paddle, boat paddle +paddlewheel, paddle wheel +padlock +paintbrush +pajama, pyjama, pj's, jammies +palace +panpipe, pandean pipe, syrinx +paper towel +parachute, chute +parallel bars, bars +park bench +parking meter +passenger car, coach, carriage +patio, terrace +pay-phone, pay-station +pedestal, plinth, footstall +pencil box, pencil case +pencil sharpener +perfume, essence +Petri dish +photocopier +pick, plectrum, plectron +pickelhaube +picket fence, paling +pickup, pickup truck +pier +piggy bank, penny bank +pill bottle +pillow +ping-pong ball +pinwheel +pirate, pirate ship +pitcher, ewer +plane, carpenter's plane, woodworking plane +planetarium +plastic bag +plate rack +plow, plough +plunger, plumber's helper +Polaroid camera, Polaroid Land camera +pole +police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria +poncho +pool table, billiard table, snooker table +pop bottle, soda bottle +pot, flowerpot +potter's wheel +power drill +prayer rug, prayer mat +printer +prison, prison house +projectile, missile +projector +puck, hockey puck +punching bag, punch bag, punching ball, punchball +purse +quill, quill pen +quilt, comforter, comfort, puff +racer, race car, racing car +racket, racquet +radiator +radio, wireless +radio telescope, radio reflector +rain barrel +recreational vehicle, RV, R.V. +reel +reflex camera +refrigerator, icebox +remote control, remote +restaurant, eating house, eating place, eatery +revolver, six-gun, six-shooter +rifle +rocking chair, rocker +rotisserie +rubber eraser, rubber, pencil eraser +rugby ball +rule, ruler +running shoe +safe +safety pin +saltshaker, salt shaker +sandal +sarong +sax, saxophone +scabbard +scale, weighing machine +school bus +schooner +scoreboard +screen, CRT screen +screw +screwdriver +seat belt, seatbelt +sewing machine +shield, buckler +shoe shop, shoe-shop, shoe store +shoji +shopping basket +shopping cart +shovel +shower cap +shower curtain +ski +ski mask +sleeping bag +slide rule, slipstick +sliding door +slot, one-armed bandit +snorkel +snowmobile +snowplow, snowplough +soap dispenser +soccer ball +sock +solar dish, solar collector, solar furnace +sombrero +soup bowl +space bar +space heater +space shuttle +spatula +speedboat +spider web, spider's web +spindle +sports car, sport car +spotlight, spot +stage +steam locomotive +steel arch bridge +steel drum +stethoscope +stole +stone wall +stopwatch, stop watch +stove +strainer +streetcar, tram, tramcar, trolley, trolley car +stretcher +studio couch, day bed +stupa, tope +submarine, pigboat, sub, U-boat +suit, suit of clothes +sundial +sunglass +sunglasses, dark glasses, shades +sunscreen, sunblock, sun blocker +suspension bridge +swab, swob, mop +sweatshirt +swimming trunks, bathing trunks +swing +switch, electric switch, electrical switch +syringe +table lamp +tank, army tank, armored combat vehicle, armoured combat vehicle +tape player +teapot +teddy, teddy bear +television, television system +tennis ball +thatch, thatched roof +theater curtain, theatre curtain +thimble +thresher, thrasher, threshing machine +throne +tile roof +toaster +tobacco shop, tobacconist shop, tobacconist +toilet seat +torch +totem pole +tow truck, tow car, wrecker +toyshop +tractor +trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi +tray +trench coat +tricycle, trike, velocipede +trimaran +tripod +triumphal arch +trolleybus, trolley coach, trackless trolley +trombone +tub, vat +turnstile +typewriter keyboard +umbrella +unicycle, monocycle +upright, upright piano +vacuum, vacuum cleaner +vase +vault +velvet +vending machine +vestment +viaduct +violin, fiddle +volleyball +waffle iron +wall clock +wallet, billfold, notecase, pocketbook +wardrobe, closet, press +warplane, military plane +washbasin, handbasin, washbowl, lavabo, wash-hand basin +washer, automatic washer, washing machine +water bottle +water jug +water tower +whiskey jug +whistle +wig +window screen +window shade +Windsor tie +wine bottle +wing +wok +wooden spoon +wool, woolen, woollen +worm fence, snake fence, snake-rail fence, Virginia fence +wreck +yawl +yurt +web site, website, internet site, site +comic book +crossword puzzle, crossword +street sign +traffic light, traffic signal, stoplight +book jacket, dust cover, dust jacket, dust wrapper +menu +plate +guacamole +consomme +hot pot, hotpot +trifle +ice cream, icecream +ice lolly, lolly, lollipop, popsicle +French loaf +bagel, beigel +pretzel +cheeseburger +hotdog, hot dog, red hot +mashed potato +head cabbage +broccoli +cauliflower +zucchini, courgette +spaghetti squash +acorn squash +butternut squash +cucumber, cuke +artichoke, globe artichoke +bell pepper +cardoon +mushroom +Granny Smith +strawberry +orange +lemon +fig +pineapple, ananas +banana +jackfruit, jak, jack +custard apple +pomegranate +hay +carbonara +chocolate sauce, chocolate syrup +dough +meat loaf, meatloaf +pizza, pizza pie +potpie +burrito +red wine +espresso +cup +eggnog +alp +bubble +cliff, drop, drop-off +coral reef +geyser +lakeside, lakeshore +promontory, headland, head, foreland +sandbar, sand bar +seashore, coast, seacoast, sea-coast +valley, vale +volcano +ballplayer, baseball player +groom, bridegroom +scuba diver +rapeseed +daisy +yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum +corn +acorn +hip, rose hip, rosehip +buckeye, horse chestnut, conker +coral fungus +agaric +gyromitra +stinkhorn, carrion fungus +earthstar +hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa +bolete +ear, spike, capitulum +toilet tissue, toilet paper, bathroom tissue'''.split("\n") diff --git a/examples/model_zoo/model/coco.names b/examples/model_zoo/model/coco.names new file mode 100644 index 0000000..ec82f0f --- /dev/null +++ b/examples/model_zoo/model/coco.names @@ -0,0 +1,80 @@ +person +bicycle +car +motorbike +aeroplane +bus +train +truck +boat +traffic light +fire hydrant +stop sign +parking meter +bench +bird +cat +dog +horse +sheep +cow +elephant +bear +zebra +giraffe +backpack +umbrella +handbag +tie +suitcase +frisbee +skis +snowboard +sports ball +kite +baseball bat +baseball glove +skateboard +surfboard +tennis racket +bottle +wine glass +cup +fork +knife +spoon +bowl +banana +apple +sandwich +orange +broccoli +carrot +hot dog +pizza +donut +cake +chair +sofa +potted plant +bed +dining table +toilet +tvmonitor +laptop +mouse +remote +keyboard +cell phone +microwave +oven +toaster +sink +refrigerator +book +clock +vase +scissors +teddy bear +hair drier +toothbrush diff --git a/examples/model_zoo/model/weights_2.txt b/examples/model_zoo/model/weights_2.txt new file mode 100644 index 0000000..42cc499 --- /dev/null +++ b/examples/model_zoo/model/weights_2.txt @@ -0,0 +1,541 @@ +conv2d_1/filters:0 +batchnorm2d_1/beta:0 +batchnorm2d_1/gamma:0 +batchnorm2d_1/moving_mean:0 +batchnorm2d_1/moving_var:0 +conv2d_2/filters:0 +batchnorm2d_2/beta:0 +batchnorm2d_2/gamma:0 +batchnorm2d_2/moving_mean:0 +batchnorm2d_2/moving_var:0 +conv_rote_block_1/filters:0 +conv2d_3/filters:0 +batchnorm2d_3/beta:0 +batchnorm2d_3/gamma:0 +batchnorm2d_3/moving_mean:0 +batchnorm2d_3/moving_var:0 +batchnorm2d_4/beta:0 +batchnorm2d_4/gamma:0 +batchnorm2d_4/moving_mean:0 +batchnorm2d_4/moving_var:0 +conv2d_4/filters:0 +batchnorm2d_5/beta:0 +batchnorm2d_5/gamma:0 +batchnorm2d_5/moving_mean:0 +batchnorm2d_5/moving_var:0 +conv2d_5/filters:0 +batchnorm2d_6/beta:0 +batchnorm2d_6/gamma:0 +batchnorm2d_6/moving_mean:0 +batchnorm2d_6/moving_var:0 +conv2d_6/filters:0 +batchnorm2d_7/beta:0 +batchnorm2d_7/gamma:0 +batchnorm2d_7/moving_mean:0 +batchnorm2d_7/moving_var:0 +conv2d_7/filters:0 +batchnorm2d_8/beta:0 +batchnorm2d_8/gamma:0 +batchnorm2d_8/moving_mean:0 +batchnorm2d_8/moving_var:0 +conv2d_8/filters:0 +batchnorm2d_9/beta:0 +batchnorm2d_9/gamma:0 +batchnorm2d_9/moving_mean:0 +batchnorm2d_9/moving_var:0 +conv_rote_block_2/filters:0 +conv2d_9/filters:0 +batchnorm2d_10/beta:0 +batchnorm2d_10/gamma:0 +batchnorm2d_10/moving_mean:0 +batchnorm2d_10/moving_var:0 +batchnorm2d_11/beta:0 +batchnorm2d_11/gamma:0 +batchnorm2d_11/moving_mean:0 +batchnorm2d_11/moving_var:0 +conv2d_10/filters:0 +batchnorm2d_12/beta:0 +batchnorm2d_12/gamma:0 +batchnorm2d_12/moving_mean:0 +batchnorm2d_12/moving_var:0 +conv2d_11/filters:0 +batchnorm2d_13/beta:0 +batchnorm2d_13/gamma:0 +batchnorm2d_13/moving_mean:0 +batchnorm2d_13/moving_var:0 +conv2d_12/filters:0 +batchnorm2d_14/beta:0 +batchnorm2d_14/gamma:0 +batchnorm2d_14/moving_mean:0 +batchnorm2d_14/moving_var:0 +conv2d_13/filters:0 +batchnorm2d_15/beta:0 +batchnorm2d_15/gamma:0 +batchnorm2d_15/moving_mean:0 +batchnorm2d_15/moving_var:0 +conv2d_14/filters:0 +batchnorm2d_16/beta:0 +batchnorm2d_16/gamma:0 +batchnorm2d_16/moving_mean:0 +batchnorm2d_16/moving_var:0 +conv2d_15/filters:0 +batchnorm2d_17/beta:0 +batchnorm2d_17/gamma:0 +batchnorm2d_17/moving_mean:0 +batchnorm2d_17/moving_var:0 +conv2d_16/filters:0 +batchnorm2d_18/beta:0 +batchnorm2d_18/gamma:0 +batchnorm2d_18/moving_mean:0 +batchnorm2d_18/moving_var:0 +conv_rote_block_3/filters:0 +conv2d_17/filters:0 +batchnorm2d_19/beta:0 +batchnorm2d_19/gamma:0 +batchnorm2d_19/moving_mean:0 +batchnorm2d_19/moving_var:0 +batchnorm2d_20/beta:0 +batchnorm2d_20/gamma:0 +batchnorm2d_20/moving_mean:0 +batchnorm2d_20/moving_var:0 +conv2d_18/filters:0 +batchnorm2d_21/beta:0 +batchnorm2d_21/gamma:0 +batchnorm2d_21/moving_mean:0 +batchnorm2d_21/moving_var:0 +conv2d_19/filters:0 +batchnorm2d_22/beta:0 +batchnorm2d_22/gamma:0 +batchnorm2d_22/moving_mean:0 +batchnorm2d_22/moving_var:0 +conv2d_20/filters:0 +batchnorm2d_23/beta:0 +batchnorm2d_23/gamma:0 +batchnorm2d_23/moving_mean:0 +batchnorm2d_23/moving_var:0 +conv2d_21/filters:0 +batchnorm2d_24/beta:0 +batchnorm2d_24/gamma:0 +batchnorm2d_24/moving_mean:0 +batchnorm2d_24/moving_var:0 +conv2d_22/filters:0 +batchnorm2d_25/beta:0 +batchnorm2d_25/gamma:0 +batchnorm2d_25/moving_mean:0 +batchnorm2d_25/moving_var:0 +conv2d_23/filters:0 +batchnorm2d_26/beta:0 +batchnorm2d_26/gamma:0 +batchnorm2d_26/moving_mean:0 +batchnorm2d_26/moving_var:0 +conv2d_24/filters:0 +batchnorm2d_27/beta:0 +batchnorm2d_27/gamma:0 +batchnorm2d_27/moving_mean:0 +batchnorm2d_27/moving_var:0 +conv2d_25/filters:0 +batchnorm2d_28/beta:0 +batchnorm2d_28/gamma:0 +batchnorm2d_28/moving_mean:0 +batchnorm2d_28/moving_var:0 +conv2d_26/filters:0 +batchnorm2d_29/beta:0 +batchnorm2d_29/gamma:0 +batchnorm2d_29/moving_mean:0 +batchnorm2d_29/moving_var:0 +conv2d_27/filters:0 +batchnorm2d_30/beta:0 +batchnorm2d_30/gamma:0 +batchnorm2d_30/moving_mean:0 +batchnorm2d_30/moving_var:0 +conv2d_28/filters:0 +batchnorm2d_31/beta:0 +batchnorm2d_31/gamma:0 +batchnorm2d_31/moving_mean:0 +batchnorm2d_31/moving_var:0 +conv2d_29/filters:0 +batchnorm2d_32/beta:0 +batchnorm2d_32/gamma:0 +batchnorm2d_32/moving_mean:0 +batchnorm2d_32/moving_var:0 +conv2d_30/filters:0 +batchnorm2d_33/beta:0 +batchnorm2d_33/gamma:0 +batchnorm2d_33/moving_mean:0 +batchnorm2d_33/moving_var:0 +conv2d_31/filters:0 +batchnorm2d_34/beta:0 +batchnorm2d_34/gamma:0 +batchnorm2d_34/moving_mean:0 +batchnorm2d_34/moving_var:0 +conv2d_32/filters:0 +batchnorm2d_35/beta:0 +batchnorm2d_35/gamma:0 +batchnorm2d_35/moving_mean:0 +batchnorm2d_35/moving_var:0 +conv2d_33/filters:0 +batchnorm2d_36/beta:0 +batchnorm2d_36/gamma:0 +batchnorm2d_36/moving_mean:0 +batchnorm2d_36/moving_var:0 +conv2d_34/filters:0 +batchnorm2d_37/beta:0 +batchnorm2d_37/gamma:0 +batchnorm2d_37/moving_mean:0 +batchnorm2d_37/moving_var:0 +conv2d_35/filters:0 +batchnorm2d_38/beta:0 +batchnorm2d_38/gamma:0 +batchnorm2d_38/moving_mean:0 +batchnorm2d_38/moving_var:0 +conv_yolo_2/filters:0 +batchnorm2d_87/beta:0 +batchnorm2d_87/gamma:0 +batchnorm2d_87/moving_mean:0 +batchnorm2d_87/moving_var:0 +conv2d_36/filters:0 +batchnorm2d_39/beta:0 +batchnorm2d_39/gamma:0 +batchnorm2d_39/moving_mean:0 +batchnorm2d_39/moving_var:0 +conv_rote_block_4/filters:0 +conv2d_37/filters:0 +batchnorm2d_40/beta:0 +batchnorm2d_40/gamma:0 +batchnorm2d_40/moving_mean:0 +batchnorm2d_40/moving_var:0 +batchnorm2d_41/beta:0 +batchnorm2d_41/gamma:0 +batchnorm2d_41/moving_mean:0 +batchnorm2d_41/moving_var:0 +conv2d_38/filters:0 +batchnorm2d_42/beta:0 +batchnorm2d_42/gamma:0 +batchnorm2d_42/moving_mean:0 +batchnorm2d_42/moving_var:0 +conv2d_39/filters:0 +batchnorm2d_43/beta:0 +batchnorm2d_43/gamma:0 +batchnorm2d_43/moving_mean:0 +batchnorm2d_43/moving_var:0 +conv2d_40/filters:0 +batchnorm2d_44/beta:0 +batchnorm2d_44/gamma:0 +batchnorm2d_44/moving_mean:0 +batchnorm2d_44/moving_var:0 +conv2d_41/filters:0 +batchnorm2d_45/beta:0 +batchnorm2d_45/gamma:0 +batchnorm2d_45/moving_mean:0 +batchnorm2d_45/moving_var:0 +conv2d_42/filters:0 +batchnorm2d_46/beta:0 +batchnorm2d_46/gamma:0 +batchnorm2d_46/moving_mean:0 +batchnorm2d_46/moving_var:0 +conv2d_43/filters:0 +batchnorm2d_47/beta:0 +batchnorm2d_47/gamma:0 +batchnorm2d_47/moving_mean:0 +batchnorm2d_47/moving_var:0 +conv2d_44/filters:0 +batchnorm2d_48/beta:0 +batchnorm2d_48/gamma:0 +batchnorm2d_48/moving_mean:0 +batchnorm2d_48/moving_var:0 +conv2d_45/filters:0 +batchnorm2d_49/beta:0 +batchnorm2d_49/gamma:0 +batchnorm2d_49/moving_mean:0 +batchnorm2d_49/moving_var:0 +conv2d_46/filters:0 +batchnorm2d_50/beta:0 +batchnorm2d_50/gamma:0 +batchnorm2d_50/moving_mean:0 +batchnorm2d_50/moving_var:0 +conv2d_47/filters:0 +batchnorm2d_51/beta:0 +batchnorm2d_51/gamma:0 +batchnorm2d_51/moving_mean:0 +batchnorm2d_51/moving_var:0 +conv2d_48/filters:0 +batchnorm2d_52/beta:0 +batchnorm2d_52/gamma:0 +batchnorm2d_52/moving_mean:0 +batchnorm2d_52/moving_var:0 +conv2d_49/filters:0 +batchnorm2d_53/beta:0 +batchnorm2d_53/gamma:0 +batchnorm2d_53/moving_mean:0 +batchnorm2d_53/moving_var:0 +conv2d_50/filters:0 +batchnorm2d_54/beta:0 +batchnorm2d_54/gamma:0 +batchnorm2d_54/moving_mean:0 +batchnorm2d_54/moving_var:0 +conv2d_51/filters:0 +batchnorm2d_55/beta:0 +batchnorm2d_55/gamma:0 +batchnorm2d_55/moving_mean:0 +batchnorm2d_55/moving_var:0 +conv2d_52/filters:0 +batchnorm2d_56/beta:0 +batchnorm2d_56/gamma:0 +batchnorm2d_56/moving_mean:0 +batchnorm2d_56/moving_var:0 +conv2d_53/filters:0 +batchnorm2d_57/beta:0 +batchnorm2d_57/gamma:0 +batchnorm2d_57/moving_mean:0 +batchnorm2d_57/moving_var:0 +conv2d_54/filters:0 +batchnorm2d_58/beta:0 +batchnorm2d_58/gamma:0 +batchnorm2d_58/moving_mean:0 +batchnorm2d_58/moving_var:0 +conv2d_55/filters:0 +batchnorm2d_59/beta:0 +batchnorm2d_59/gamma:0 +batchnorm2d_59/moving_mean:0 +batchnorm2d_59/moving_var:0 +conv_yolo_1/filters:0 +batchnorm2d_80/beta:0 +batchnorm2d_80/gamma:0 +batchnorm2d_80/moving_mean:0 +batchnorm2d_80/moving_var:0 +conv2d_56/filters:0 +batchnorm2d_60/beta:0 +batchnorm2d_60/gamma:0 +batchnorm2d_60/moving_mean:0 +batchnorm2d_60/moving_var:0 +conv_rote_block_5/filters:0 +conv2d_57/filters:0 +batchnorm2d_61/beta:0 +batchnorm2d_61/gamma:0 +batchnorm2d_61/moving_mean:0 +batchnorm2d_61/moving_var:0 +batchnorm2d_62/beta:0 +batchnorm2d_62/gamma:0 +batchnorm2d_62/moving_mean:0 +batchnorm2d_62/moving_var:0 +conv2d_58/filters:0 +batchnorm2d_63/beta:0 +batchnorm2d_63/gamma:0 +batchnorm2d_63/moving_mean:0 +batchnorm2d_63/moving_var:0 +conv2d_59/filters:0 +batchnorm2d_64/beta:0 +batchnorm2d_64/gamma:0 +batchnorm2d_64/moving_mean:0 +batchnorm2d_64/moving_var:0 +conv2d_60/filters:0 +batchnorm2d_65/beta:0 +batchnorm2d_65/gamma:0 +batchnorm2d_65/moving_mean:0 +batchnorm2d_65/moving_var:0 +conv2d_61/filters:0 +batchnorm2d_66/beta:0 +batchnorm2d_66/gamma:0 +batchnorm2d_66/moving_mean:0 +batchnorm2d_66/moving_var:0 +conv2d_62/filters:0 +batchnorm2d_67/beta:0 +batchnorm2d_67/gamma:0 +batchnorm2d_67/moving_mean:0 +batchnorm2d_67/moving_var:0 +conv2d_63/filters:0 +batchnorm2d_68/beta:0 +batchnorm2d_68/gamma:0 +batchnorm2d_68/moving_mean:0 +batchnorm2d_68/moving_var:0 +conv2d_64/filters:0 +batchnorm2d_69/beta:0 +batchnorm2d_69/gamma:0 +batchnorm2d_69/moving_mean:0 +batchnorm2d_69/moving_var:0 +conv2d_65/filters:0 +batchnorm2d_70/beta:0 +batchnorm2d_70/gamma:0 +batchnorm2d_70/moving_mean:0 +batchnorm2d_70/moving_var:0 +conv2d_66/filters:0 +batchnorm2d_71/beta:0 +batchnorm2d_71/gamma:0 +batchnorm2d_71/moving_mean:0 +batchnorm2d_71/moving_var:0 +conv2d_67/filters:0 +batchnorm2d_72/beta:0 +batchnorm2d_72/gamma:0 +batchnorm2d_72/moving_mean:0 +batchnorm2d_72/moving_var:0 +conv2d_68/filters:0 +batchnorm2d_73/beta:0 +batchnorm2d_73/gamma:0 +batchnorm2d_73/moving_mean:0 +batchnorm2d_73/moving_var:0 +conv2d_69/filters:0 +batchnorm2d_74/beta:0 +batchnorm2d_74/gamma:0 +batchnorm2d_74/moving_mean:0 +batchnorm2d_74/moving_var:0 +conv2d_70/filters:0 +batchnorm2d_75/beta:0 +batchnorm2d_75/gamma:0 +batchnorm2d_75/moving_mean:0 +batchnorm2d_75/moving_var:0 +conv2d_71/filters:0 +batchnorm2d_76/beta:0 +batchnorm2d_76/gamma:0 +batchnorm2d_76/moving_mean:0 +batchnorm2d_76/moving_var:0 +conv2d_72/filters:0 +batchnorm2d_77/beta:0 +batchnorm2d_77/gamma:0 +batchnorm2d_77/moving_mean:0 +batchnorm2d_77/moving_var:0 +conv2d_73/filters:0 +batchnorm2d_78/beta:0 +batchnorm2d_78/gamma:0 +batchnorm2d_78/moving_mean:0 +batchnorm2d_78/moving_var:0 +conv2d_74/filters:0 +batchnorm2d_79/beta:0 +batchnorm2d_79/gamma:0 +batchnorm2d_79/moving_mean:0 +batchnorm2d_79/moving_var:0 +conv2d_75/filters:0 +batchnorm2d_81/beta:0 +batchnorm2d_81/gamma:0 +batchnorm2d_81/moving_mean:0 +batchnorm2d_81/moving_var:0 +conv2d_76/filters:0 +batchnorm2d_82/beta:0 +batchnorm2d_82/gamma:0 +batchnorm2d_82/moving_mean:0 +batchnorm2d_82/moving_var:0 +conv2d_77/filters:0 +batchnorm2d_83/beta:0 +batchnorm2d_83/gamma:0 +batchnorm2d_83/moving_mean:0 +batchnorm2d_83/moving_var:0 +conv2d_78/filters:0 +batchnorm2d_84/beta:0 +batchnorm2d_84/gamma:0 +batchnorm2d_84/moving_mean:0 +batchnorm2d_84/moving_var:0 +conv2d_79/filters:0 +batchnorm2d_85/beta:0 +batchnorm2d_85/gamma:0 +batchnorm2d_85/moving_mean:0 +batchnorm2d_85/moving_var:0 +conv2d_80/filters:0 +batchnorm2d_86/beta:0 +batchnorm2d_86/gamma:0 +batchnorm2d_86/moving_mean:0 +batchnorm2d_86/moving_var:0 +conv2d_81/filters:0 +batchnorm2d_88/beta:0 +batchnorm2d_88/gamma:0 +batchnorm2d_88/moving_mean:0 +batchnorm2d_88/moving_var:0 +conv2d_82/filters:0 +batchnorm2d_89/beta:0 +batchnorm2d_89/gamma:0 +batchnorm2d_89/moving_mean:0 +batchnorm2d_89/moving_var:0 +conv2d_83/filters:0 +batchnorm2d_90/beta:0 +batchnorm2d_90/gamma:0 +batchnorm2d_90/moving_mean:0 +batchnorm2d_90/moving_var:0 +conv2d_84/filters:0 +batchnorm2d_91/beta:0 +batchnorm2d_91/gamma:0 +batchnorm2d_91/moving_mean:0 +batchnorm2d_91/moving_var:0 +conv2d_85/filters:0 +batchnorm2d_92/beta:0 +batchnorm2d_92/gamma:0 +batchnorm2d_92/moving_mean:0 +batchnorm2d_92/moving_var:0 +conv_route_1/filters:0 +batchnorm2d_93/beta:0 +batchnorm2d_93/gamma:0 +batchnorm2d_93/moving_mean:0 +batchnorm2d_93/moving_var:0 +conv_route_2/filters:0 +conv2d_86/filters:0 +conv2d_86/biases:0 +batchnorm2d_94/beta:0 +batchnorm2d_94/gamma:0 +batchnorm2d_94/moving_mean:0 +batchnorm2d_94/moving_var:0 +conv2d_87/filters:0 +batchnorm2d_95/beta:0 +batchnorm2d_95/gamma:0 +batchnorm2d_95/moving_mean:0 +batchnorm2d_95/moving_var:0 +conv2d_88/filters:0 +batchnorm2d_96/beta:0 +batchnorm2d_96/gamma:0 +batchnorm2d_96/moving_mean:0 +batchnorm2d_96/moving_var:0 +conv2d_89/filters:0 +batchnorm2d_97/beta:0 +batchnorm2d_97/gamma:0 +batchnorm2d_97/moving_mean:0 +batchnorm2d_97/moving_var:0 +conv2d_90/filters:0 +batchnorm2d_98/beta:0 +batchnorm2d_98/gamma:0 +batchnorm2d_98/moving_mean:0 +batchnorm2d_98/moving_var:0 +conv2d_91/filters:0 +batchnorm2d_99/beta:0 +batchnorm2d_99/gamma:0 +batchnorm2d_99/moving_mean:0 +batchnorm2d_99/moving_var:0 +conv_route_3/filters:0 +batchnorm2d_100/beta:0 +batchnorm2d_100/gamma:0 +batchnorm2d_100/moving_mean:0 +batchnorm2d_100/moving_var:0 +conv_route_4/filters:0 +conv2d_92/filters:0 +conv2d_92/biases:0 +batchnorm2d_101/beta:0 +batchnorm2d_101/gamma:0 +batchnorm2d_101/moving_mean:0 +batchnorm2d_101/moving_var:0 +conv2d_93/filters:0 +batchnorm2d_102/beta:0 +batchnorm2d_102/gamma:0 +batchnorm2d_102/moving_mean:0 +batchnorm2d_102/moving_var:0 +conv2d_94/filters:0 +batchnorm2d_103/beta:0 +batchnorm2d_103/gamma:0 +batchnorm2d_103/moving_mean:0 +batchnorm2d_103/moving_var:0 +conv2d_95/filters:0 +batchnorm2d_104/beta:0 +batchnorm2d_104/gamma:0 +batchnorm2d_104/moving_mean:0 +batchnorm2d_104/moving_var:0 +conv2d_96/filters:0 +batchnorm2d_105/beta:0 +batchnorm2d_105/gamma:0 +batchnorm2d_105/moving_mean:0 +batchnorm2d_105/moving_var:0 +conv2d_97/filters:0 +batchnorm2d_106/beta:0 +batchnorm2d_106/gamma:0 +batchnorm2d_106/moving_mean:0 +batchnorm2d_106/moving_var:0 +conv2d_98/filters:0 +batchnorm2d_107/beta:0 +batchnorm2d_107/gamma:0 +batchnorm2d_107/moving_mean:0 +batchnorm2d_107/moving_var:0 +conv2d_99/filters:0 +conv2d_99/biases:0 \ No newline at end of file diff --git a/examples/model_zoo/model/weights_3.txt b/examples/model_zoo/model/weights_3.txt new file mode 100644 index 0000000..b9ff6e1 --- /dev/null +++ b/examples/model_zoo/model/weights_3.txt @@ -0,0 +1,541 @@ +conv2d_1/filters:0 +batchnorm2d_1/beta:0 +batchnorm2d_1/gamma:0 +batchnorm2d_1/moving_mean:0 +batchnorm2d_1/moving_var:0 +conv2d_2/filters:0 +batchnorm2d_2/beta:0 +batchnorm2d_2/gamma:0 +batchnorm2d_2/moving_mean:0 +batchnorm2d_2/moving_var:0 +conv_rote_block_1/filters:0 +batchnorm2d_3/beta:0 +batchnorm2d_3/gamma:0 +batchnorm2d_3/moving_mean:0 +batchnorm2d_3/moving_var:0 +conv2d_3/filters:0 +batchnorm2d_4/beta:0 +batchnorm2d_4/gamma:0 +batchnorm2d_4/moving_mean:0 +batchnorm2d_4/moving_var:0 +conv2d_4/filters:0 +batchnorm2d_5/beta:0 +batchnorm2d_5/gamma:0 +batchnorm2d_5/moving_mean:0 +batchnorm2d_5/moving_var:0 +conv2d_5/filters:0 +batchnorm2d_6/beta:0 +batchnorm2d_6/gamma:0 +batchnorm2d_6/moving_mean:0 +batchnorm2d_6/moving_var:0 +conv2d_6/filters:0 +batchnorm2d_7/beta:0 +batchnorm2d_7/gamma:0 +batchnorm2d_7/moving_mean:0 +batchnorm2d_7/moving_var:0 +conv2d_7/filters:0 +batchnorm2d_8/beta:0 +batchnorm2d_8/gamma:0 +batchnorm2d_8/moving_mean:0 +batchnorm2d_8/moving_var:0 +conv2d_8/filters:0 +batchnorm2d_9/beta:0 +batchnorm2d_9/gamma:0 +batchnorm2d_9/moving_mean:0 +batchnorm2d_9/moving_var:0 +conv_rote_block_2/filters:0 +batchnorm2d_10/beta:0 +batchnorm2d_10/gamma:0 +batchnorm2d_10/moving_mean:0 +batchnorm2d_10/moving_var:0 +conv2d_9/filters:0 +batchnorm2d_11/beta:0 +batchnorm2d_11/gamma:0 +batchnorm2d_11/moving_mean:0 +batchnorm2d_11/moving_var:0 +conv2d_10/filters:0 +batchnorm2d_12/beta:0 +batchnorm2d_12/gamma:0 +batchnorm2d_12/moving_mean:0 +batchnorm2d_12/moving_var:0 +conv2d_11/filters:0 +batchnorm2d_13/beta:0 +batchnorm2d_13/gamma:0 +batchnorm2d_13/moving_mean:0 +batchnorm2d_13/moving_var:0 +conv2d_12/filters:0 +batchnorm2d_14/beta:0 +batchnorm2d_14/gamma:0 +batchnorm2d_14/moving_mean:0 +batchnorm2d_14/moving_var:0 +conv2d_13/filters:0 +batchnorm2d_15/beta:0 +batchnorm2d_15/gamma:0 +batchnorm2d_15/moving_mean:0 +batchnorm2d_15/moving_var:0 +conv2d_14/filters:0 +batchnorm2d_16/beta:0 +batchnorm2d_16/gamma:0 +batchnorm2d_16/moving_mean:0 +batchnorm2d_16/moving_var:0 +conv2d_15/filters:0 +batchnorm2d_17/beta:0 +batchnorm2d_17/gamma:0 +batchnorm2d_17/moving_mean:0 +batchnorm2d_17/moving_var:0 +conv2d_16/filters:0 +batchnorm2d_18/beta:0 +batchnorm2d_18/gamma:0 +batchnorm2d_18/moving_mean:0 +batchnorm2d_18/moving_var:0 +conv_rote_block_3/filters:0 +batchnorm2d_19/beta:0 +batchnorm2d_19/gamma:0 +batchnorm2d_19/moving_mean:0 +batchnorm2d_19/moving_var:0 +conv2d_17/filters:0 +batchnorm2d_20/beta:0 +batchnorm2d_20/gamma:0 +batchnorm2d_20/moving_mean:0 +batchnorm2d_20/moving_var:0 +conv2d_18/filters:0 +batchnorm2d_21/beta:0 +batchnorm2d_21/gamma:0 +batchnorm2d_21/moving_mean:0 +batchnorm2d_21/moving_var:0 +conv2d_19/filters:0 +batchnorm2d_22/beta:0 +batchnorm2d_22/gamma:0 +batchnorm2d_22/moving_mean:0 +batchnorm2d_22/moving_var:0 +conv2d_20/filters:0 +batchnorm2d_23/beta:0 +batchnorm2d_23/gamma:0 +batchnorm2d_23/moving_mean:0 +batchnorm2d_23/moving_var:0 +conv2d_21/filters:0 +batchnorm2d_24/beta:0 +batchnorm2d_24/gamma:0 +batchnorm2d_24/moving_mean:0 +batchnorm2d_24/moving_var:0 +conv2d_22/filters:0 +batchnorm2d_25/beta:0 +batchnorm2d_25/gamma:0 +batchnorm2d_25/moving_mean:0 +batchnorm2d_25/moving_var:0 +conv2d_23/filters:0 +batchnorm2d_26/beta:0 +batchnorm2d_26/gamma:0 +batchnorm2d_26/moving_mean:0 +batchnorm2d_26/moving_var:0 +conv2d_24/filters:0 +batchnorm2d_27/beta:0 +batchnorm2d_27/gamma:0 +batchnorm2d_27/moving_mean:0 +batchnorm2d_27/moving_var:0 +conv2d_25/filters:0 +batchnorm2d_28/beta:0 +batchnorm2d_28/gamma:0 +batchnorm2d_28/moving_mean:0 +batchnorm2d_28/moving_var:0 +conv2d_26/filters:0 +batchnorm2d_29/beta:0 +batchnorm2d_29/gamma:0 +batchnorm2d_29/moving_mean:0 +batchnorm2d_29/moving_var:0 +conv2d_27/filters:0 +batchnorm2d_30/beta:0 +batchnorm2d_30/gamma:0 +batchnorm2d_30/moving_mean:0 +batchnorm2d_30/moving_var:0 +conv2d_28/filters:0 +batchnorm2d_31/beta:0 +batchnorm2d_31/gamma:0 +batchnorm2d_31/moving_mean:0 +batchnorm2d_31/moving_var:0 +conv2d_29/filters:0 +batchnorm2d_32/beta:0 +batchnorm2d_32/gamma:0 +batchnorm2d_32/moving_mean:0 +batchnorm2d_32/moving_var:0 +conv2d_30/filters:0 +batchnorm2d_33/beta:0 +batchnorm2d_33/gamma:0 +batchnorm2d_33/moving_mean:0 +batchnorm2d_33/moving_var:0 +conv2d_31/filters:0 +batchnorm2d_34/beta:0 +batchnorm2d_34/gamma:0 +batchnorm2d_34/moving_mean:0 +batchnorm2d_34/moving_var:0 +conv2d_32/filters:0 +batchnorm2d_35/beta:0 +batchnorm2d_35/gamma:0 +batchnorm2d_35/moving_mean:0 +batchnorm2d_35/moving_var:0 +conv2d_33/filters:0 +batchnorm2d_36/beta:0 +batchnorm2d_36/gamma:0 +batchnorm2d_36/moving_mean:0 +batchnorm2d_36/moving_var:0 +conv2d_34/filters:0 +batchnorm2d_37/beta:0 +batchnorm2d_37/gamma:0 +batchnorm2d_37/moving_mean:0 +batchnorm2d_37/moving_var:0 +conv2d_35/filters:0 +batchnorm2d_38/beta:0 +batchnorm2d_38/gamma:0 +batchnorm2d_38/moving_mean:0 +batchnorm2d_38/moving_var:0 +conv2d_36/filters:0 +batchnorm2d_39/beta:0 +batchnorm2d_39/gamma:0 +batchnorm2d_39/moving_mean:0 +batchnorm2d_39/moving_var:0 +conv_rote_block_4/filters:0 +batchnorm2d_40/beta:0 +batchnorm2d_40/gamma:0 +batchnorm2d_40/moving_mean:0 +batchnorm2d_40/moving_var:0 +conv2d_37/filters:0 +batchnorm2d_41/beta:0 +batchnorm2d_41/gamma:0 +batchnorm2d_41/moving_mean:0 +batchnorm2d_41/moving_var:0 +conv2d_38/filters:0 +batchnorm2d_42/beta:0 +batchnorm2d_42/gamma:0 +batchnorm2d_42/moving_mean:0 +batchnorm2d_42/moving_var:0 +conv2d_39/filters:0 +batchnorm2d_43/beta:0 +batchnorm2d_43/gamma:0 +batchnorm2d_43/moving_mean:0 +batchnorm2d_43/moving_var:0 +conv2d_40/filters:0 +batchnorm2d_44/beta:0 +batchnorm2d_44/gamma:0 +batchnorm2d_44/moving_mean:0 +batchnorm2d_44/moving_var:0 +conv2d_41/filters:0 +batchnorm2d_45/beta:0 +batchnorm2d_45/gamma:0 +batchnorm2d_45/moving_mean:0 +batchnorm2d_45/moving_var:0 +conv2d_42/filters:0 +batchnorm2d_46/beta:0 +batchnorm2d_46/gamma:0 +batchnorm2d_46/moving_mean:0 +batchnorm2d_46/moving_var:0 +conv2d_43/filters:0 +batchnorm2d_47/beta:0 +batchnorm2d_47/gamma:0 +batchnorm2d_47/moving_mean:0 +batchnorm2d_47/moving_var:0 +conv2d_44/filters:0 +batchnorm2d_48/beta:0 +batchnorm2d_48/gamma:0 +batchnorm2d_48/moving_mean:0 +batchnorm2d_48/moving_var:0 +conv2d_45/filters:0 +batchnorm2d_49/beta:0 +batchnorm2d_49/gamma:0 +batchnorm2d_49/moving_mean:0 +batchnorm2d_49/moving_var:0 +conv2d_46/filters:0 +batchnorm2d_50/beta:0 +batchnorm2d_50/gamma:0 +batchnorm2d_50/moving_mean:0 +batchnorm2d_50/moving_var:0 +conv2d_47/filters:0 +batchnorm2d_51/beta:0 +batchnorm2d_51/gamma:0 +batchnorm2d_51/moving_mean:0 +batchnorm2d_51/moving_var:0 +conv2d_48/filters:0 +batchnorm2d_52/beta:0 +batchnorm2d_52/gamma:0 +batchnorm2d_52/moving_mean:0 +batchnorm2d_52/moving_var:0 +conv2d_49/filters:0 +batchnorm2d_53/beta:0 +batchnorm2d_53/gamma:0 +batchnorm2d_53/moving_mean:0 +batchnorm2d_53/moving_var:0 +conv2d_50/filters:0 +batchnorm2d_54/beta:0 +batchnorm2d_54/gamma:0 +batchnorm2d_54/moving_mean:0 +batchnorm2d_54/moving_var:0 +conv2d_51/filters:0 +batchnorm2d_55/beta:0 +batchnorm2d_55/gamma:0 +batchnorm2d_55/moving_mean:0 +batchnorm2d_55/moving_var:0 +conv2d_52/filters:0 +batchnorm2d_56/beta:0 +batchnorm2d_56/gamma:0 +batchnorm2d_56/moving_mean:0 +batchnorm2d_56/moving_var:0 +conv2d_53/filters:0 +batchnorm2d_57/beta:0 +batchnorm2d_57/gamma:0 +batchnorm2d_57/moving_mean:0 +batchnorm2d_57/moving_var:0 +conv2d_54/filters:0 +batchnorm2d_58/beta:0 +batchnorm2d_58/gamma:0 +batchnorm2d_58/moving_mean:0 +batchnorm2d_58/moving_var:0 +conv2d_55/filters:0 +batchnorm2d_59/beta:0 +batchnorm2d_59/gamma:0 +batchnorm2d_59/moving_mean:0 +batchnorm2d_59/moving_var:0 +conv2d_56/filters:0 +batchnorm2d_60/beta:0 +batchnorm2d_60/gamma:0 +batchnorm2d_60/moving_mean:0 +batchnorm2d_60/moving_var:0 +conv_rote_block_5/filters:0 +batchnorm2d_61/beta:0 +batchnorm2d_61/gamma:0 +batchnorm2d_61/moving_mean:0 +batchnorm2d_61/moving_var:0 +conv2d_57/filters:0 +batchnorm2d_62/beta:0 +batchnorm2d_62/gamma:0 +batchnorm2d_62/moving_mean:0 +batchnorm2d_62/moving_var:0 +conv2d_58/filters:0 +batchnorm2d_63/beta:0 +batchnorm2d_63/gamma:0 +batchnorm2d_63/moving_mean:0 +batchnorm2d_63/moving_var:0 +conv2d_59/filters:0 +batchnorm2d_64/beta:0 +batchnorm2d_64/gamma:0 +batchnorm2d_64/moving_mean:0 +batchnorm2d_64/moving_var:0 +conv2d_60/filters:0 +batchnorm2d_65/beta:0 +batchnorm2d_65/gamma:0 +batchnorm2d_65/moving_mean:0 +batchnorm2d_65/moving_var:0 +conv2d_61/filters:0 +batchnorm2d_66/beta:0 +batchnorm2d_66/gamma:0 +batchnorm2d_66/moving_mean:0 +batchnorm2d_66/moving_var:0 +conv2d_62/filters:0 +batchnorm2d_67/beta:0 +batchnorm2d_67/gamma:0 +batchnorm2d_67/moving_mean:0 +batchnorm2d_67/moving_var:0 +conv2d_63/filters:0 +batchnorm2d_68/beta:0 +batchnorm2d_68/gamma:0 +batchnorm2d_68/moving_mean:0 +batchnorm2d_68/moving_var:0 +conv2d_64/filters:0 +batchnorm2d_69/beta:0 +batchnorm2d_69/gamma:0 +batchnorm2d_69/moving_mean:0 +batchnorm2d_69/moving_var:0 +conv2d_65/filters:0 +batchnorm2d_70/beta:0 +batchnorm2d_70/gamma:0 +batchnorm2d_70/moving_mean:0 +batchnorm2d_70/moving_var:0 +conv2d_66/filters:0 +batchnorm2d_71/beta:0 +batchnorm2d_71/gamma:0 +batchnorm2d_71/moving_mean:0 +batchnorm2d_71/moving_var:0 +conv2d_67/filters:0 +batchnorm2d_72/beta:0 +batchnorm2d_72/gamma:0 +batchnorm2d_72/moving_mean:0 +batchnorm2d_72/moving_var:0 +conv2d_68/filters:0 +batchnorm2d_73/beta:0 +batchnorm2d_73/gamma:0 +batchnorm2d_73/moving_mean:0 +batchnorm2d_73/moving_var:0 +conv2d_69/filters:0 +batchnorm2d_74/beta:0 +batchnorm2d_74/gamma:0 +batchnorm2d_74/moving_mean:0 +batchnorm2d_74/moving_var:0 +conv2d_70/filters:0 +batchnorm2d_75/beta:0 +batchnorm2d_75/gamma:0 +batchnorm2d_75/moving_mean:0 +batchnorm2d_75/moving_var:0 +conv2d_71/filters:0 +batchnorm2d_76/beta:0 +batchnorm2d_76/gamma:0 +batchnorm2d_76/moving_mean:0 +batchnorm2d_76/moving_var:0 +conv2d_72/filters:0 +batchnorm2d_77/beta:0 +batchnorm2d_77/gamma:0 +batchnorm2d_77/moving_mean:0 +batchnorm2d_77/moving_var:0 +conv2d_73/filters:0 +batchnorm2d_78/beta:0 +batchnorm2d_78/gamma:0 +batchnorm2d_78/moving_mean:0 +batchnorm2d_78/moving_var:0 +conv2d_74/filters:0 +batchnorm2d_79/beta:0 +batchnorm2d_79/gamma:0 +batchnorm2d_79/moving_mean:0 +batchnorm2d_79/moving_var:0 +conv_yolo_1/filters:0 +batchnorm2d_80/beta:0 +batchnorm2d_80/gamma:0 +batchnorm2d_80/moving_mean:0 +batchnorm2d_80/moving_var:0 +conv2d_75/filters:0 +batchnorm2d_81/beta:0 +batchnorm2d_81/gamma:0 +batchnorm2d_81/moving_mean:0 +batchnorm2d_81/moving_var:0 +conv2d_76/filters:0 +batchnorm2d_82/beta:0 +batchnorm2d_82/gamma:0 +batchnorm2d_82/moving_mean:0 +batchnorm2d_82/moving_var:0 +conv2d_77/filters:0 +batchnorm2d_83/beta:0 +batchnorm2d_83/gamma:0 +batchnorm2d_83/moving_mean:0 +batchnorm2d_83/moving_var:0 +conv2d_78/filters:0 +batchnorm2d_84/beta:0 +batchnorm2d_84/gamma:0 +batchnorm2d_84/moving_mean:0 +batchnorm2d_84/moving_var:0 +conv2d_79/filters:0 +batchnorm2d_85/beta:0 +batchnorm2d_85/gamma:0 +batchnorm2d_85/moving_mean:0 +batchnorm2d_85/moving_var:0 +conv2d_80/filters:0 +batchnorm2d_86/beta:0 +batchnorm2d_86/gamma:0 +batchnorm2d_86/moving_mean:0 +batchnorm2d_86/moving_var:0 +conv_yolo_2/filters:0 +batchnorm2d_87/beta:0 +batchnorm2d_87/gamma:0 +batchnorm2d_87/moving_mean:0 +batchnorm2d_87/moving_var:0 +conv2d_81/filters:0 +batchnorm2d_88/beta:0 +batchnorm2d_88/gamma:0 +batchnorm2d_88/moving_mean:0 +batchnorm2d_88/moving_var:0 +conv2d_82/filters:0 +batchnorm2d_89/beta:0 +batchnorm2d_89/gamma:0 +batchnorm2d_89/moving_mean:0 +batchnorm2d_89/moving_var:0 +conv2d_83/filters:0 +batchnorm2d_90/beta:0 +batchnorm2d_90/gamma:0 +batchnorm2d_90/moving_mean:0 +batchnorm2d_90/moving_var:0 +conv2d_84/filters:0 +batchnorm2d_91/beta:0 +batchnorm2d_91/gamma:0 +batchnorm2d_91/moving_mean:0 +batchnorm2d_91/moving_var:0 +conv2d_85/filters:0 +batchnorm2d_92/beta:0 +batchnorm2d_92/gamma:0 +batchnorm2d_92/moving_mean:0 +batchnorm2d_92/moving_var:0 +conv_route_1/filters:0 +batchnorm2d_93/beta:0 +batchnorm2d_93/gamma:0 +batchnorm2d_93/moving_mean:0 +batchnorm2d_93/moving_var:0 +conv2d_86/filters:0 +conv2d_86/biases:0 +conv_route_2/filters:0 +batchnorm2d_94/beta:0 +batchnorm2d_94/gamma:0 +batchnorm2d_94/moving_mean:0 +batchnorm2d_94/moving_var:0 +conv2d_87/filters:0 +batchnorm2d_95/beta:0 +batchnorm2d_95/gamma:0 +batchnorm2d_95/moving_mean:0 +batchnorm2d_95/moving_var:0 +conv2d_88/filters:0 +batchnorm2d_96/beta:0 +batchnorm2d_96/gamma:0 +batchnorm2d_96/moving_mean:0 +batchnorm2d_96/moving_var:0 +conv2d_89/filters:0 +batchnorm2d_97/beta:0 +batchnorm2d_97/gamma:0 +batchnorm2d_97/moving_mean:0 +batchnorm2d_97/moving_var:0 +conv2d_90/filters:0 +batchnorm2d_98/beta:0 +batchnorm2d_98/gamma:0 +batchnorm2d_98/moving_mean:0 +batchnorm2d_98/moving_var:0 +conv2d_91/filters:0 +batchnorm2d_99/beta:0 +batchnorm2d_99/gamma:0 +batchnorm2d_99/moving_mean:0 +batchnorm2d_99/moving_var:0 +conv_route_3/filters:0 +batchnorm2d_100/beta:0 +batchnorm2d_100/gamma:0 +batchnorm2d_100/moving_mean:0 +batchnorm2d_100/moving_var:0 +conv2d_92/filters:0 +conv2d_92/biases:0 +conv_route_4/filters:0 +batchnorm2d_101/beta:0 +batchnorm2d_101/gamma:0 +batchnorm2d_101/moving_mean:0 +batchnorm2d_101/moving_var:0 +conv2d_93/filters:0 +batchnorm2d_102/beta:0 +batchnorm2d_102/gamma:0 +batchnorm2d_102/moving_mean:0 +batchnorm2d_102/moving_var:0 +conv2d_94/filters:0 +batchnorm2d_103/beta:0 +batchnorm2d_103/gamma:0 +batchnorm2d_103/moving_mean:0 +batchnorm2d_103/moving_var:0 +conv2d_95/filters:0 +batchnorm2d_104/beta:0 +batchnorm2d_104/gamma:0 +batchnorm2d_104/moving_mean:0 +batchnorm2d_104/moving_var:0 +conv2d_96/filters:0 +batchnorm2d_105/beta:0 +batchnorm2d_105/gamma:0 +batchnorm2d_105/moving_mean:0 +batchnorm2d_105/moving_var:0 +conv2d_97/filters:0 +batchnorm2d_106/beta:0 +batchnorm2d_106/gamma:0 +batchnorm2d_106/moving_mean:0 +batchnorm2d_106/moving_var:0 +conv2d_98/filters:0 +batchnorm2d_107/beta:0 +batchnorm2d_107/gamma:0 +batchnorm2d_107/moving_mean:0 +batchnorm2d_107/moving_var:0 +conv2d_99/filters:0 +conv2d_99/biases:0 \ No newline at end of file diff --git a/examples/model_zoo/model/yolov4_weights3_config.txt b/examples/model_zoo/model/yolov4_weights3_config.txt new file mode 100644 index 0000000..5f31bb5 --- /dev/null +++ b/examples/model_zoo/model/yolov4_weights3_config.txt @@ -0,0 +1,541 @@ +layer_with_weights-0/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-1/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-1/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-1/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-1/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-2/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-3/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-3/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-3/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-3/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-11/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-13/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-13/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-13/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-13/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-4/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-5/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-5/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-5/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-5/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-6/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-7/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-7/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-7/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-7/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-8/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-9/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-9/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-9/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-9/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-10/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-12/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-12/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-12/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-12/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-14/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-15/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-15/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-15/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-15/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-16/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-17/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-17/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-17/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-17/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-29/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-31/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-31/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-31/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-31/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-18/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-19/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-19/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-19/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-19/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-20/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-21/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-21/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-21/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-21/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-22/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-23/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-23/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-23/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-23/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-24/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-25/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-25/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-25/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-25/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-26/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-27/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-27/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-27/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-27/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-28/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-30/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-30/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-30/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-30/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-32/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-33/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-33/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-33/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-33/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-34/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-35/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-35/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-35/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-35/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-71/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-73/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-73/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-73/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-73/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-36/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-37/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-37/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-37/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-37/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-38/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-39/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-39/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-39/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-39/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-40/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-41/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-41/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-41/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-41/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-42/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-43/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-43/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-43/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-43/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-44/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-45/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-45/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-45/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-45/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-46/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-47/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-47/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-47/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-47/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-48/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-49/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-49/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-49/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-49/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-50/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-51/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-51/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-51/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-51/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-52/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-53/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-53/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-53/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-53/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-54/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-55/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-55/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-55/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-55/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-56/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-57/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-57/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-57/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-57/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-58/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-59/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-59/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-59/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-59/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-60/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-61/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-61/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-61/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-61/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-62/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-63/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-63/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-63/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-63/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-64/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-65/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-65/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-65/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-65/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-66/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-67/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-67/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-67/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-67/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-68/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-69/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-69/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-69/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-69/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-70/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-72/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-72/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-72/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-72/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-74/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-75/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-75/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-75/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-75/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-76/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-77/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-77/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-77/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-77/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-113/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-115/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-115/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-115/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-115/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-78/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-79/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-79/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-79/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-79/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-80/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-81/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-81/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-81/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-81/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-82/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-83/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-83/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-83/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-83/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-84/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-85/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-85/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-85/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-85/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-86/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-87/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-87/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-87/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-87/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-88/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-89/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-89/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-89/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-89/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-90/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-91/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-91/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-91/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-91/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-92/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-93/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-93/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-93/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-93/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-94/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-95/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-95/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-95/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-95/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-96/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-97/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-97/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-97/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-97/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-98/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-99/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-99/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-99/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-99/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-100/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-101/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-101/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-101/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-101/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-102/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-103/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-103/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-103/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-103/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-104/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-105/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-105/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-105/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-105/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-106/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-107/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-107/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-107/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-107/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-108/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-109/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-109/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-109/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-109/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-110/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-111/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-111/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-111/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-111/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-112/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-114/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-114/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-114/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-114/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-116/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-117/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-117/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-117/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-117/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-118/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-119/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-119/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-119/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-119/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-139/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-141/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-141/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-141/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-141/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-120/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-121/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-121/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-121/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-121/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-122/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-123/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-123/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-123/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-123/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-124/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-125/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-125/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-125/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-125/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-126/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-127/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-127/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-127/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-127/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-128/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-129/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-129/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-129/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-129/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-130/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-131/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-131/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-131/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-131/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-132/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-133/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-133/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-133/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-133/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-134/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-135/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-135/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-135/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-135/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-136/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-137/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-137/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-137/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-137/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-138/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-140/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-140/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-140/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-140/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-142/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-143/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-143/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-143/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-143/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-144/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-145/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-145/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-145/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-145/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-146/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-147/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-147/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-147/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-147/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-148/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-149/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-149/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-149/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-149/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-150/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-151/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-151/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-151/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-151/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-152/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-153/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-153/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-153/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-153/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-154/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-155/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-155/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-155/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-155/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-156/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-158/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-158/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-158/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-158/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-157/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-159/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-159/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-159/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-159/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-160/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-161/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-161/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-161/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-161/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-162/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-163/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-163/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-163/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-163/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-164/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-165/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-165/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-165/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-165/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-166/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-167/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-167/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-167/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-167/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-168/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-169/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-169/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-169/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-169/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-170/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-172/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-172/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-172/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-172/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-171/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-173/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-173/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-173/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-173/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-174/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-175/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-175/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-175/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-175/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-176/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-177/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-177/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-177/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-177/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-178/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-179/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-179/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-179/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-179/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-180/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-181/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-181/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-181/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-181/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-182/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-183/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-183/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-183/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-183/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-208/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-211/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-211/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-211/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-211/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-214/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-214/bias/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-184/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-185/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-185/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-185/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-185/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-186/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-187/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-187/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-187/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-187/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-188/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-189/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-189/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-189/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-189/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-190/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-191/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-191/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-191/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-191/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-192/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-193/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-193/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-193/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-193/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-194/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-195/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-195/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-195/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-195/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-209/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-212/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-212/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-212/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-212/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-215/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-215/bias/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-196/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-197/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-197/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-197/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-197/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-198/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-199/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-199/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-199/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-199/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-200/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-201/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-201/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-201/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-201/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-202/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-203/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-203/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-203/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-203/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-204/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-205/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-205/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-205/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-205/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-206/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-207/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-207/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-207/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-207/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-210/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-213/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-213/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-213/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-213/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-216/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-216/bias/.ATTRIBUTES/VARIABLE_VALUE \ No newline at end of file diff --git a/examples/model_zoo/model/yolov4_weights_config.txt b/examples/model_zoo/model/yolov4_weights_config.txt new file mode 100644 index 0000000..2c28be0 --- /dev/null +++ b/examples/model_zoo/model/yolov4_weights_config.txt @@ -0,0 +1,541 @@ +layer_with_weights-0/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-1/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-1/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-1/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-1/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-2/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-3/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-3/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-3/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-3/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-11/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-4/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-13/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-13/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-13/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-13/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-5/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-5/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-5/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-5/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-6/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-7/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-7/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-7/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-7/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-8/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-9/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-9/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-9/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-9/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-10/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-12/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-12/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-12/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-12/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-14/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-15/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-15/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-15/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-15/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-16/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-17/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-17/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-17/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-17/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-29/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-18/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-31/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-31/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-31/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-31/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-19/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-19/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-19/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-19/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-20/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-21/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-21/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-21/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-21/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-22/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-23/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-23/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-23/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-23/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-24/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-25/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-25/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-25/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-25/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-26/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-27/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-27/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-27/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-27/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-28/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-30/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-30/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-30/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-30/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-32/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-33/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-33/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-33/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-33/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-34/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-35/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-35/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-35/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-35/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-71/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-36/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-73/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-73/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-73/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-73/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-37/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-37/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-37/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-37/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-38/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-39/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-39/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-39/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-39/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-40/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-41/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-41/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-41/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-41/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-42/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-43/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-43/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-43/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-43/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-44/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-45/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-45/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-45/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-45/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-46/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-47/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-47/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-47/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-47/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-48/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-49/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-49/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-49/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-49/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-50/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-51/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-51/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-51/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-51/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-52/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-53/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-53/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-53/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-53/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-54/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-55/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-55/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-55/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-55/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-56/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-57/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-57/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-57/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-57/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-58/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-59/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-59/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-59/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-59/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-60/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-61/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-61/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-61/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-61/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-62/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-63/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-63/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-63/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-63/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-64/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-65/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-65/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-65/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-65/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-66/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-67/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-67/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-67/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-67/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-68/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-69/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-69/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-69/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-69/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-70/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-72/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-72/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-72/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-72/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-74/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-75/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-75/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-75/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-75/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-171/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-173/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-173/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-173/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-173/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-76/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-77/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-77/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-77/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-77/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-113/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-78/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-115/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-115/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-115/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-115/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-79/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-79/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-79/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-79/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-80/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-81/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-81/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-81/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-81/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-82/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-83/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-83/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-83/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-83/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-84/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-85/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-85/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-85/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-85/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-86/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-87/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-87/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-87/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-87/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-88/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-89/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-89/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-89/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-89/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-90/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-91/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-91/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-91/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-91/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-92/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-93/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-93/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-93/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-93/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-94/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-95/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-95/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-95/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-95/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-96/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-97/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-97/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-97/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-97/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-98/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-99/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-99/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-99/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-99/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-100/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-101/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-101/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-101/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-101/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-102/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-103/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-103/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-103/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-103/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-104/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-105/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-105/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-105/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-105/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-106/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-107/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-107/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-107/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-107/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-108/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-109/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-109/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-109/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-109/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-110/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-111/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-111/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-111/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-111/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-112/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-114/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-114/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-114/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-114/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-116/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-117/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-117/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-117/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-117/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-157/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-159/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-159/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-159/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-159/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-118/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-119/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-119/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-119/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-119/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-139/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-120/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-141/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-141/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-141/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-141/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-121/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-121/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-121/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-121/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-122/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-123/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-123/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-123/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-123/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-124/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-125/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-125/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-125/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-125/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-126/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-127/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-127/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-127/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-127/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-128/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-129/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-129/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-129/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-129/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-130/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-131/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-131/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-131/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-131/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-132/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-133/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-133/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-133/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-133/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-134/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-135/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-135/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-135/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-135/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-136/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-137/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-137/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-137/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-137/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-138/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-140/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-140/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-140/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-140/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-142/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-143/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-143/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-143/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-143/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-144/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-145/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-145/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-145/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-145/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-146/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-147/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-147/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-147/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-147/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-148/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-149/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-149/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-149/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-149/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-150/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-151/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-151/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-151/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-151/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-152/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-153/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-153/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-153/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-153/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-154/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-155/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-155/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-155/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-155/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-156/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-158/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-158/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-158/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-158/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-160/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-161/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-161/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-161/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-161/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-162/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-163/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-163/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-163/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-163/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-164/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-165/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-165/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-165/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-165/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-166/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-167/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-167/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-167/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-167/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-168/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-169/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-169/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-169/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-169/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-170/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-172/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-172/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-172/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-172/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-174/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-175/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-175/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-175/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-175/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-176/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-177/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-177/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-177/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-177/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-178/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-179/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-179/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-179/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-179/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-180/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-181/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-181/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-181/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-181/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-182/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-183/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-183/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-183/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-183/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-208/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-211/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-211/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-211/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-211/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-184/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-214/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-214/bias/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-185/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-185/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-185/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-185/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-186/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-187/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-187/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-187/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-187/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-188/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-189/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-189/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-189/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-189/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-190/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-191/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-191/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-191/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-191/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-192/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-193/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-193/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-193/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-193/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-194/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-195/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-195/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-195/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-195/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-209/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-212/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-212/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-212/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-212/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-196/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-215/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-215/bias/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-197/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-197/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-197/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-197/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-198/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-199/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-199/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-199/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-199/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-200/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-201/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-201/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-201/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-201/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-202/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-203/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-203/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-203/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-203/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-204/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-205/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-205/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-205/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-205/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-206/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-207/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-207/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-207/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-207/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-210/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-213/beta/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-213/gamma/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-213/moving_mean/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-213/moving_variance/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-216/kernel/.ATTRIBUTES/VARIABLE_VALUE +layer_with_weights-216/bias/.ATTRIBUTES/VARIABLE_VALUE \ No newline at end of file diff --git a/examples/model_zoo/pretrained_resnet50.py b/examples/model_zoo/pretrained_resnet50.py new file mode 100644 index 0000000..cac33eb --- /dev/null +++ b/examples/model_zoo/pretrained_resnet50.py @@ -0,0 +1,32 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +ResNet50 for ImageNet using TL models + +""" + +import time +import numpy as np +import tensorlayer as tl +from examples.model_zoo.imagenet_classes import class_names +from examples.model_zoo.resnet import ResNet50 + +tl.logging.set_verbosity(tl.logging.DEBUG) + +# get the whole model +resnet = ResNet50(pretrained=False) +resnet.set_eval() + +img1 = tl.vis.read_image('data/tiger.jpeg') +img1 = tl.prepro.imresize(img1, (224, 224))[:, :, ::-1] +img1 = img1 - np.array([103.939, 116.779, 123.68]).reshape((1, 1, 3)) + +img1 = img1.astype(np.float32)[np.newaxis, ...] + +start_time = time.time() +output = resnet(img1) +prob = tl.ops.softmax(output)[0].numpy() +print(" End time : %.5ss" % (time.time() - start_time)) +preds = (np.argsort(prob)[::-1])[0:5] +for p in preds: + print(class_names[p], prob[p]) diff --git a/examples/model_zoo/pretrained_vgg16.py b/examples/model_zoo/pretrained_vgg16.py new file mode 100644 index 0000000..9bf4264 --- /dev/null +++ b/examples/model_zoo/pretrained_vgg16.py @@ -0,0 +1,29 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +"""VGG-16 for ImageNet using TL models.""" + +import time + +import numpy as np +import tensorflow as tf + +import tensorlayer as tl +from examples.model_zoo.imagenet_classes import class_names +from examples.model_zoo.vgg import vgg16 + +tl.logging.set_verbosity(tl.logging.DEBUG) + +# get the whole model +vgg = vgg16(pretrained=True) +vgg.set_eval() + +img = tl.vis.read_image('data/tiger.jpeg') +img = tl.prepro.imresize(img, (224, 224)).astype(np.float32) / 255 + +start_time = time.time() +output = vgg(img) +probs = tf.nn.softmax(output)[0].numpy() +print(" End time : %.5ss" % (time.time() - start_time)) +preds = (np.argsort(probs)[::-1])[0:5] +for p in preds: + print(class_names[p], probs[p]) diff --git a/examples/model_zoo/pretrained_yolov4.py b/examples/model_zoo/pretrained_yolov4.py new file mode 100644 index 0000000..c8d3908 --- /dev/null +++ b/examples/model_zoo/pretrained_yolov4.py @@ -0,0 +1,28 @@ +import numpy as np +import cv2 +from PIL import Image +from examples.model_zoo.common import yolo4_input_processing, yolo4_output_processing, \ + result_to_json, read_class_names, draw_boxes_and_labels_to_image_with_json +from examples.model_zoo.yolo import YOLOv4 +import tensorlayer as tl + +tl.logging.set_verbosity(tl.logging.DEBUG) + +INPUT_SIZE = 416 +image_path = './data/kite.jpg' + +class_names = read_class_names('./model/coco.names') +original_image = cv2.imread(image_path) +image = cv2.cvtColor(np.array(original_image), cv2.COLOR_BGR2RGB) + +model = YOLOv4(NUM_CLASS=80, pretrained=True) +model.set_eval() + +batch_data = yolo4_input_processing(original_image) +feature_maps = model(batch_data) +pred_bbox = yolo4_output_processing(feature_maps) +json_result = result_to_json(image, pred_bbox) + +image = draw_boxes_and_labels_to_image_with_json(image, json_result, class_names) +image = Image.fromarray(image.astype(np.uint8)) +image.show() \ No newline at end of file diff --git a/examples/model_zoo/resnet.py b/examples/model_zoo/resnet.py new file mode 100644 index 0000000..c57bef9 --- /dev/null +++ b/examples/model_zoo/resnet.py @@ -0,0 +1,225 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +"""ResNet for ImageNet. + +# Reference: +- [Deep Residual Learning for Image Recognition]( + https://arxiv.org/abs/1512.03385) (CVPR 2016 Best Paper Award) + +""" + +import os + +import tensorlayer as tl + +from tensorlayer import logging +from tensorlayer.files import (assign_weights, maybe_download_and_extract) +from tensorlayer.layers import (BatchNorm, Conv2d, Dense, Elementwise, GlobalMeanPool2d, Input, MaxPool2d) +from tensorlayer.layers import Module, SequentialLayer + +__all__ = [ + 'ResNet50', +] + +block_names = ['2a', '2b', '2c', '3a', '3b', '3c', '3d', '4a', '4b', '4c', '4d', '4e', '4f', '5a', '5b', '5c' + ] + ['avg_pool', 'fc1000'] +block_filters = [[64, 64, 256], [128, 128, 512], [256, 256, 1024], [512, 512, 2048]] +in_channels_conv = [64, 256, 512, 1024] +in_channels_identity = [256, 512, 1024, 2048] +henorm = tl.initializers.he_normal() + +class identity_block(Module): + """The identity block where there is no conv layer at shortcut. + + Parameters + ---------- + input : tf tensor + Input tensor from above layer. + kernel_size : int + The kernel size of middle conv layer at main path. + n_filters : list of integers + The numbers of filters for 3 conv layer at main path. + stage : int + Current stage label. + block : str + Current block label. + + Returns + ------- + Output tensor of this block. + + """ + def __init__(self, kernel_size, n_filters, stage, block): + super(identity_block, self).__init__() + filters1, filters2, filters3 = n_filters + _in_channels = in_channels_identity[stage-2] + conv_name_base = 'res' + str(stage) + block + '_branch' + bn_name_base = 'bn' + str(stage) + block + '_branch' + + self.conv1 = Conv2d(filters1, (1, 1), W_init=henorm, name=conv_name_base + '2a', in_channels=_in_channels) + self.bn1 = BatchNorm(name=bn_name_base + '2a', act='relu', num_features=filters1) + + ks = (kernel_size, kernel_size) + self.conv2 = Conv2d(filters2, ks, padding='SAME', W_init=henorm, name=conv_name_base + '2b', in_channels=filters1) + self.bn2 = BatchNorm(name=bn_name_base + '2b', act='relu', num_features=filters2) + + self.conv3 = Conv2d(filters3, (1, 1), W_init=henorm, name=conv_name_base + '2c', in_channels=filters2) + self.bn3 = BatchNorm(name=bn_name_base + '2c', num_features=filters3) + + self.add = Elementwise(tl.add, act='relu') + + def forward(self, inputs): + output = self.conv1(inputs) + output = self.bn1(output) + output = self.conv2(output) + output = self.bn2(output) + output = self.conv3(output) + output = self.bn3(output) + result = self.add([output, inputs]) + return result + + +class conv_block(Module): + def __init__(self, kernel_size, n_filters, stage, block, strides=(2, 2)): + super(conv_block, self).__init__() + filters1, filters2, filters3 = n_filters + _in_channels = in_channels_conv[stage-2] + conv_name_base = 'res' + str(stage) + block + '_branch' + bn_name_base = 'bn' + str(stage) + block + '_branch' + self.conv1 = Conv2d(filters1, (1, 1), strides=strides, W_init=henorm, name=conv_name_base + '2a', in_channels=_in_channels) + self.bn1 = BatchNorm(name=bn_name_base + '2a', act='relu', num_features=filters1) + + ks = (kernel_size, kernel_size) + self.conv2 = Conv2d(filters2, ks, padding='SAME', W_init=henorm, name=conv_name_base + '2b', in_channels=filters1) + self.bn2 = BatchNorm(name=bn_name_base + '2b', act='relu', num_features=filters2) + + self.conv3 = Conv2d(filters3, (1, 1), W_init=henorm, name=conv_name_base + '2c', in_channels=filters2) + self.bn3 = BatchNorm(name=bn_name_base + '2c', num_features=filters3) + + self.shortcut_conv = Conv2d(filters3, (1, 1), strides=strides, W_init=henorm, name=conv_name_base + '1', in_channels=_in_channels) + self.shortcut_bn = BatchNorm(name=bn_name_base + '1', num_features=filters3) + + self.add = Elementwise(tl.add, act='relu') + + def forward(self, inputs): + output = self.conv1(inputs) + output = self.bn1(output) + output = self.conv2(output) + output = self.bn2(output) + output = self.conv3(output) + output = self.bn3(output) + + shortcut = self.shortcut_conv(inputs) + shortcut = self.shortcut_bn(shortcut) + + result = self.add([output, shortcut]) + return result + + +class ResNet50_model(Module): + def __init__(self, end_with='fc1000', n_classes=1000): + super(ResNet50_model, self).__init__() + self.end_with = end_with + self.n_classes = n_classes + self.conv1 = Conv2d(64, (7, 7), in_channels=3, strides=(2, 2), padding='SAME', W_init=henorm, name='conv1') + self.bn_conv1 = BatchNorm(name='bn_conv1', act="relu", num_features=64) + self.max_pool1 = MaxPool2d((3, 3), strides=(2, 2), name='max_pool1') + self.res_layer = self.make_layer() + + def forward(self, inputs): + z = self.conv1(inputs) + z = self.bn_conv1(z) + z = self.max_pool1(z) + z = self.res_layer(z) + return z + + def make_layer(self): + layer_list = [] + for i, block_name in enumerate(block_names): + if len(block_name) == 2: + stage = int(block_name[0]) + block = block_name[1] + if block == 'a': + strides = (1, 1) if stage == 2 else (2, 2) + layer_list.append(conv_block(3, block_filters[stage - 2], stage=stage, block=block, strides=strides)) + else: + layer_list.append(identity_block(3, block_filters[stage - 2], stage=stage, block=block)) + elif block_name == 'avg_pool': + layer_list.append(GlobalMeanPool2d(name='avg_pool')) + elif block_name == 'fc1000': + layer_list.append(Dense(self.n_classes, name='fc1000', in_channels=2048)) + + if block_name == self.end_with: + break + return SequentialLayer(layer_list) + + +def ResNet50(pretrained=False, end_with='fc1000', n_classes=1000): + """Pre-trained MobileNetV1 model (static mode). Input shape [?, 224, 224, 3]. + To use pretrained model, input should be in BGR format and subtracted from ImageNet mean [103.939, 116.779, 123.68]. + + Parameters + ---------- + pretrained : boolean + Whether to load pretrained weights. Default False. + end_with : str + The end point of the model [conv, depth1, depth2 ... depth13, globalmeanpool, out]. + Default ``out`` i.e. the whole model. + n_classes : int + Number of classes in final prediction. + name : None or str + Name for this model. + + Examples + --------- + Classify ImageNet classes, see `tutorial_models_resnet50.py` + TODO Modify the usage example according to the model storage location + >>> # get the whole model with pretrained weights + >>> resnet = tl.models.ResNet50(pretrained=True) + >>> # use for inferencing + >>> output = resnet(img1, is_train=False) + >>> prob = tf.nn.softmax(output)[0].numpy() + + Extract the features before fc layer + >>> resnet = tl.models.ResNet50(pretrained=True, end_with='5c') + >>> output = resnet(img1, is_train=False) + + Returns + ------- + ResNet50 model. + + """ + + network = ResNet50_model(end_with=end_with, n_classes=n_classes) + + if pretrained: + restore_params(network) + + return network + + +def restore_params(network, path='models'): + logging.info("Restore pre-trained parameters") + maybe_download_and_extract( + 'resnet50_weights_tf_dim_ordering_tf_kernels.h5', + path, + 'https://github.com/fchollet/deep-learning-models/releases/download/v0.2/', + ) # ls -al + try: + import h5py + except Exception: + raise ImportError('h5py not imported') + + f = h5py.File(os.path.join(path, 'resnet50_weights_tf_dim_ordering_tf_kernels.h5'), 'r') + + for layer in network.all_layers: + if len(layer.all_weights) == 0: + continue + w_names = list(f[layer.name]) + params = [f[layer.name][n][:] for n in w_names] + # if 'bn' in layer.name: + # params = [x.reshape(1, 1, 1, -1) for x in params] + assign_weights(params, layer) + del params + + f.close() diff --git a/examples/model_zoo/vgg.py b/examples/model_zoo/vgg.py new file mode 100644 index 0000000..779635d --- /dev/null +++ b/examples/model_zoo/vgg.py @@ -0,0 +1,347 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +VGG for ImageNet. + +Introduction +---------------- +VGG is a convolutional neural network model proposed by K. Simonyan and A. Zisserman +from the University of Oxford in the paper "Very Deep Convolutional Networks for +Large-Scale Image Recognition" . The model achieves 92.7% top-5 test accuracy in ImageNet, +which is a dataset of over 14 million images belonging to 1000 classes. + +Download Pre-trained Model +---------------------------- +- Model weights in this example - vgg16_weights.npz : http://www.cs.toronto.edu/~frossard/post/vgg16/ +- Model weights in this example - vgg19.npy : https://media.githubusercontent.com/media/tensorlayer/pretrained-models/master/models/ +- Caffe VGG 16 model : https://gist.github.com/ksimonyan/211839e770f7b538e2d8#file-readme-md +- Tool to convert the Caffe models to TensorFlow's : https://github.com/ethereon/caffe-tensorflow + +Note +------ +- For simplified CNN layer see "Convolutional layer (Simplified)" +in read the docs website. +- When feeding other images to the model be sure to properly resize or crop them +beforehand. Distorted images might end up being misclassified. One way of safely +feeding images of multiple sizes is by doing center cropping. + +""" + +import os + +import numpy as np + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.files import assign_weights, maybe_download_and_extract +from tensorlayer.layers import (BatchNorm, Conv2d, Dense, Flatten, Input, SequentialLayer, MaxPool2d) +from tensorlayer.layers import Module + +__all__ = [ + 'VGG', + 'vgg16', + 'vgg19', + 'VGG16', + 'VGG19', + # 'vgg11', 'vgg11_bn', 'vgg13', 'vgg13_bn', 'vgg16', 'vgg16_bn', + # 'vgg19_bn', 'vgg19', +] + +layer_names = [ + ['conv1_1', 'conv1_2'], 'pool1', ['conv2_1', 'conv2_2'], 'pool2', + ['conv3_1', 'conv3_2', 'conv3_3', 'conv3_4'], 'pool3', ['conv4_1', 'conv4_2', 'conv4_3', 'conv4_4'], 'pool4', + ['conv5_1', 'conv5_2', 'conv5_3', 'conv5_4'], 'pool5', 'flatten', 'fc1_relu', 'fc2_relu', 'outputs' +] + +cfg = { + 'A': [[64], 'M', [128], 'M', [256, 256], 'M', [512, 512], 'M', [512, 512], 'M', 'F', 'fc1', 'fc2', 'O'], + 'B': [[64, 64], 'M', [128, 128], 'M', [256, 256], 'M', [512, 512], 'M', [512, 512], 'M', 'F', 'fc1', 'fc2', 'O'], + 'D': + [ + [64, 64], 'M', [128, 128], 'M', [256, 256, 256], 'M', [512, 512, 512], 'M', [512, 512, 512], 'M', 'F', + 'fc1', 'fc2', 'O' + ], + 'E': + [ + [64, 64], 'M', [128, 128], 'M', [256, 256, 256, 256], 'M', [512, 512, 512, 512], 'M', [512, 512, 512, 512], + 'M', 'F', 'fc1', 'fc2', 'O' + ], +} + +mapped_cfg = { + 'vgg11': 'A', + 'vgg11_bn': 'A', + 'vgg13': 'B', + 'vgg13_bn': 'B', + 'vgg16': 'D', + 'vgg16_bn': 'D', + 'vgg19': 'E', + 'vgg19_bn': 'E' +} + +model_urls = { + 'vgg16': 'http://www.cs.toronto.edu/~frossard/vgg16/', + 'vgg19': 'https://media.githubusercontent.com/media/tensorlayer/pretrained-models/master/models/' +} + +model_saved_name = {'vgg16': 'vgg16_weights.npz', 'vgg19': 'vgg19.npy'} + + +class VGG(Module): + + def __init__(self, layer_type, batch_norm=False, end_with='outputs', name=None): + super(VGG, self).__init__(name=name) + self.end_with = end_with + + config = cfg[mapped_cfg[layer_type]] + self.make_layer = make_layers(config, batch_norm, end_with) + + def forward(self, inputs): + """ + inputs : tensor + Shape [None, 224, 224, 3], value range [0, 1]. + """ + + inputs = inputs * 255 - np.array([123.68, 116.779, 103.939], dtype=np.float32).reshape([1, 1, 1, 3]) + out = self.make_layer(inputs) + return out + + +def make_layers(config, batch_norm=False, end_with='outputs'): + layer_list = [] + is_end = False + for layer_group_idx, layer_group in enumerate(config): + if isinstance(layer_group, list): + for idx, layer in enumerate(layer_group): + layer_name = layer_names[layer_group_idx][idx] + n_filter = layer + if idx == 0: + if layer_group_idx > 0: + in_channels = config[layer_group_idx - 2][-1] + else: + in_channels = 3 + else: + in_channels = layer_group[idx - 1] + layer_list.append( + Conv2d( + n_filter=n_filter, filter_size=(3, 3), strides=(1, 1), act=tl.ReLU, padding='SAME', + in_channels=in_channels, name=layer_name + ) + ) + if batch_norm: + layer_list.append(BatchNorm(num_features=n_filter)) + if layer_name == end_with: + is_end = True + break + else: + layer_name = layer_names[layer_group_idx] + if layer_group == 'M': + layer_list.append(MaxPool2d(filter_size=(2, 2), strides=(2, 2), padding='SAME', name=layer_name)) + elif layer_group == 'O': + layer_list.append(Dense(n_units=1000, in_channels=4096, name=layer_name)) + elif layer_group == 'F': + layer_list.append(Flatten(name='flatten')) + elif layer_group == 'fc1': + layer_list.append(Dense(n_units=4096, act=tl.ReLU, in_channels=512 * 7 * 7, name=layer_name)) + elif layer_group == 'fc2': + layer_list.append(Dense(n_units=4096, act=tl.ReLU, in_channels=4096, name=layer_name)) + if layer_name == end_with: + is_end = True + if is_end: + break + return SequentialLayer(layer_list) + +def restore_model(model, layer_type): + logging.info("Restore pre-trained weights") + # download weights + maybe_download_and_extract(model_saved_name[layer_type], 'model', model_urls[layer_type]) + weights = [] + if layer_type == 'vgg16': + npz = np.load(os.path.join('model', model_saved_name[layer_type]), allow_pickle=True) + # get weight list + for val in sorted(npz.items()): + logging.info(" Loading weights %s in %s" % (str(val[1].shape), val[0])) + weights.append(val[1]) + if len(model.all_weights) == len(weights): + break + elif layer_type == 'vgg19': + npz = np.load(os.path.join('model', model_saved_name[layer_type]), allow_pickle=True, encoding='latin1').item() + # get weight list + for val in sorted(npz.items()): + logging.info(" Loading %s in %s" % (str(val[1][0].shape), val[0])) + logging.info(" Loading %s in %s" % (str(val[1][1].shape), val[0])) + weights.extend(val[1]) + if len(model.all_weights) == len(weights): + break + # assign weight values + assign_weights(weights, model) + del weights + +def vgg16(pretrained=False, end_with='outputs', mode='dynamic', name=None): + """Pre-trained VGG16 model. + + Parameters + ------------ + pretrained : boolean + Whether to load pretrained weights. Default False. + end_with : str + The end point of the model. Default ``fc3_relu`` i.e. the whole model. + mode : str. + Model building mode, 'dynamic' or 'static'. Default 'dynamic'. + name : None or str + A unique layer name. + + Examples + --------- + Classify ImageNet classes with VGG16, see `tutorial_models_vgg.py `__ + With TensorLayer + TODO Modify the usage example according to the model storage location + >>> # get the whole model, without pre-trained VGG parameters + >>> vgg = tl.models.vgg16() + >>> # get the whole model, restore pre-trained VGG parameters + >>> vgg = tl.models.vgg16(pretrained=True) + >>> # use for inferencing + >>> output = vgg(img, is_train=False) + >>> probs = tf.nn.softmax(output)[0].numpy() + + Extract features with VGG16 and Train a classifier with 100 classes + + >>> # get VGG without the last layer + >>> cnn = tl.models.vgg16(end_with='fc2_relu', mode='static').as_layer() + >>> # add one more layer and build a new model + >>> ni = Input([None, 224, 224, 3], name="inputs") + >>> nn = cnn(ni) + >>> nn = tl.layers.Dense(n_units=100, name='out')(nn) + >>> model = tl.models.Model(inputs=ni, outputs=nn) + >>> # train your own classifier (only update the last layer) + >>> train_params = model.get_layer('out').trainable_weights + + Reuse model + + >>> # in dynamic model, we can directly use the same model + >>> # in static model + >>> vgg_layer = tl.models.vgg16().as_layer() + >>> ni_1 = tl.layers.Input([None, 224, 244, 3]) + >>> ni_2 = tl.layers.Input([None, 224, 244, 3]) + >>> a_1 = vgg_layer(ni_1) + >>> a_2 = vgg_layer(ni_2) + >>> M = Model(inputs=[ni_1, ni_2], outputs=[a_1, a_2]) + + """ + if mode == 'dynamic': + model = VGG(layer_type='vgg16', batch_norm=False, end_with=end_with, name=name) + elif mode == 'static': + raise NotImplementedError + else: + raise Exception("No such mode %s" % mode) + if pretrained: + restore_model(model, layer_type='vgg16') + return model + + +def vgg19(pretrained=False, end_with='outputs', mode='dynamic', name=None): + """Pre-trained VGG19 model. + + Parameters + ------------ + pretrained : boolean + Whether to load pretrained weights. Default False. + end_with : str + The end point of the model. Default ``fc3_relu`` i.e. the whole model. + mode : str. + Model building mode, 'dynamic' or 'static'. Default 'dynamic'. + name : None or str + A unique layer name. + + Examples + --------- + Classify ImageNet classes with VGG19, see `tutorial_models_vgg.py `__ + With TensorLayer + + >>> # get the whole model, without pre-trained VGG parameters + >>> vgg = tl.models.vgg19() + >>> # get the whole model, restore pre-trained VGG parameters + >>> vgg = tl.models.vgg19(pretrained=True) + >>> # use for inferencing + >>> output = vgg(img, is_train=False) + >>> probs = tf.nn.softmax(output)[0].numpy() + + Extract features with VGG19 and Train a classifier with 100 classes + + >>> # get VGG without the last layer + >>> cnn = tl.models.vgg19(end_with='fc2_relu', mode='static').as_layer() + >>> # add one more layer and build a new model + >>> ni = Input([None, 224, 224, 3], name="inputs") + >>> nn = cnn(ni) + >>> nn = tl.layers.Dense(n_units=100, name='out')(nn) + >>> model = tl.models.Model(inputs=ni, outputs=nn) + >>> # train your own classifier (only update the last layer) + >>> train_params = model.get_layer('out').trainable_weights + + Reuse model + + >>> # in dynamic model, we can directly use the same model + >>> # in static model + >>> vgg_layer = tl.models.vgg19().as_layer() + >>> ni_1 = tl.layers.Input([None, 224, 244, 3]) + >>> ni_2 = tl.layers.Input([None, 224, 244, 3]) + >>> a_1 = vgg_layer(ni_1) + >>> a_2 = vgg_layer(ni_2) + >>> M = Model(inputs=[ni_1, ni_2], outputs=[a_1, a_2]) + + """ + if mode == 'dynamic': + model = VGG(layer_type='vgg19', batch_norm=False, end_with=end_with, name=name) + elif mode == 'static': + raise NotImplementedError + else: + raise Exception("No such mode %s" % mode) + if pretrained: + restore_model(model, layer_type='vgg19') + return model + + +VGG16 = vgg16 +VGG19 = vgg19 + +# models without pretrained parameters +# def vgg11(pretrained=False, end_with='outputs'): +# model = VGG(layer_type='vgg11', batch_norm=False, end_with=end_with) +# if pretrained: +# model.restore_weights() +# return model +# +# +# def vgg11_bn(pretrained=False, end_with='outputs'): +# model = VGG(layer_type='vgg11_bn', batch_norm=True, end_with=end_with) +# if pretrained: +# model.restore_weights() +# return model +# +# +# def vgg13(pretrained=False, end_with='outputs'): +# model = VGG(layer_type='vgg13', batch_norm=False, end_with=end_with) +# if pretrained: +# model.restore_weights() +# return model +# +# +# def vgg13_bn(pretrained=False, end_with='outputs'): +# model = VGG(layer_type='vgg13_bn', batch_norm=True, end_with=end_with) +# if pretrained: +# model.restore_weights() +# return model +# +# +# def vgg16_bn(pretrained=False, end_with='outputs'): +# model = VGG(layer_type='vgg16_bn', batch_norm=True, end_with=end_with) +# if pretrained: +# model.restore_weights() +# return model +# +# +# def vgg19_bn(pretrained=False, end_with='outputs'): +# model = VGG(layer_type='vgg19_bn', batch_norm=True, end_with=end_with) +# if pretrained: +# model.restore_weights() +# return model diff --git a/examples/model_zoo/yolo.py b/examples/model_zoo/yolo.py new file mode 100644 index 0000000..d3784b2 --- /dev/null +++ b/examples/model_zoo/yolo.py @@ -0,0 +1,376 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +"""YOLOv4 for MS-COCO. + +# Reference: +- [tensorflow-yolov4-tflite]( + https://github.com/hunglc007/tensorflow-yolov4-tflite) + +""" + +import numpy as np +import tensorlayer as tl +from tensorlayer.layers.activation import Mish +from tensorlayer.layers import Conv2d, MaxPool2d, BatchNorm2d, ZeroPad2d, UpSampling2d, Concat, Elementwise +from tensorlayer.layers import Module, SequentialLayer +from tensorlayer import logging + +INPUT_SIZE = 416 +weights_url = {'link': 'https://pan.baidu.com/s/1MC1dmEwpxsdgHO1MZ8fYRQ', 'password': 'idsz'} + + +class Convolutional(Module): + """ + Create Convolution layer + Because it is only a stack of reference layers, there is no build, so self._built=True + """ + def __init__(self, filters_shape, downsample=False, activate=True, bn=True, activate_type='leaky',name=None): + super(Convolutional, self).__init__() + self.act = activate + self.act_type = activate_type + self.downsample = downsample + self.bn = bn + self._built = True + if downsample: + padding = 'VALID' + strides = 2 + else: + strides = 1 + padding = 'SAME' + + if bn: + b_init = None + else: + b_init = tl.initializers.constant(value=0.0) + + self.zeropad = ZeroPad2d(((1, 0), (1, 0))) + self.conv = Conv2d(n_filter=filters_shape[-1], in_channels=filters_shape[2], filter_size=(filters_shape[0], filters_shape[1]), + strides=(strides, strides),padding=padding, b_init=b_init, name=name) + + if bn: + if activate == True: + if activate_type == 'leaky': + self.batchnorm2d = BatchNorm2d(act='leaky_relu0.1', num_features=filters_shape[-1]) + elif activate_type == 'mish': + self.batchnorm2d = BatchNorm2d(act=Mish, num_features=filters_shape[-1]) + else: + self.batchnorm2d = BatchNorm2d(act=None, num_features=filters_shape[-1]) + + def forward(self, input): + if self.downsample: + input = self.zeropad(input) + + output = self.conv(input) + + if self.bn: + output = self.batchnorm2d(output) + return output + +class residual_block(Module): + def __init__(self, input_channel, filter_num1, filter_num2, activate_type='leaky'): + super(residual_block, self).__init__() + self.conv1 = Convolutional(filters_shape=(1, 1, input_channel, filter_num1), activate_type=activate_type) + self.conv2 = Convolutional(filters_shape=(3, 3, filter_num1, filter_num2), activate_type=activate_type) + self.add = Elementwise(tl.add) + + def forward(self, inputs): + output = self.conv1(inputs) + output = self.conv2(output) + output = self.add([inputs, output]) + return output + +def residual_block_num(num, input_channel, filter_num1, filter_num2, activate_type='leaky'): + residual_list = [] + for i in range(num): + residual_list.append(residual_block(input_channel, filter_num1, filter_num2, activate_type=activate_type)) + return SequentialLayer(residual_list) + +class cspdarknet53(Module): + def __init__(self): + super(cspdarknet53, self).__init__() + self._built = True + self.conv1_1 = Convolutional((3, 3, 3, 32), activate_type='mish') + self.conv1_2 = Convolutional((3, 3, 32, 64), downsample=True, activate_type='mish') + self.conv1_3 = Convolutional((1, 1, 64, 64), activate_type='mish', name='conv_rote_block_1') + self.conv1_4 = Convolutional((1, 1, 64, 64), activate_type='mish') + self.residual_1 = residual_block_num(1, 64, 32, 64, activate_type="mish") + + self.conv2_1 = Convolutional((1, 1, 64, 64), activate_type='mish') + self.concat = Concat() + self.conv2_2 = Convolutional((1, 1, 128, 64), activate_type='mish') + self.conv2_3 = Convolutional((3, 3, 64, 128), downsample=True, activate_type='mish') + self.conv2_4 = Convolutional((1, 1, 128, 64), activate_type='mish', name='conv_rote_block_2') + self.conv2_5 = Convolutional((1, 1, 128, 64), activate_type='mish') + self.residual_2 = residual_block_num(2, 64, 64, 64, activate_type='mish') + + self.conv3_1 = Convolutional((1, 1, 64, 64), activate_type='mish') + self.conv3_2 = Convolutional((1, 1, 128, 128), activate_type='mish') + self.conv3_3 = Convolutional((3, 3, 128, 256), downsample=True, activate_type='mish') + self.conv3_4 = Convolutional((1, 1, 256, 128), activate_type='mish', name='conv_rote_block_3') + self.conv3_5 = Convolutional((1, 1, 256, 128), activate_type='mish') + self.residual_3 = residual_block_num(8, 128, 128, 128, activate_type="mish") + + self.conv4_1 = Convolutional((1, 1, 128, 128), activate_type='mish') + self.conv4_2 = Convolutional((1, 1, 256, 256), activate_type='mish') + self.conv4_3 = Convolutional((3, 3, 256, 512), downsample=True, activate_type='mish') + self.conv4_4 = Convolutional((1, 1, 512, 256), activate_type='mish', name='conv_rote_block_4') + self.conv4_5 = Convolutional((1, 1, 512, 256), activate_type='mish') + self.residual_4 = residual_block_num(8, 256, 256, 256, activate_type="mish") + + self.conv5_1 = Convolutional((1, 1, 256, 256), activate_type='mish') + self.conv5_2 = Convolutional((1, 1, 512, 512), activate_type='mish') + self.conv5_3 = Convolutional((3, 3, 512, 1024), downsample=True, activate_type='mish') + self.conv5_4 = Convolutional((1, 1, 1024, 512), activate_type='mish', name='conv_rote_block_5') + self.conv5_5 = Convolutional((1, 1, 1024, 512), activate_type='mish') + self.residual_5 = residual_block_num(4, 512, 512, 512, activate_type="mish") + + + self.conv6_1 = Convolutional((1, 1, 512, 512), activate_type='mish') + self.conv6_2 = Convolutional((1, 1, 1024, 1024), activate_type='mish') + self.conv6_3 = Convolutional((1, 1, 1024, 512)) + self.conv6_4 = Convolutional((3, 3, 512, 1024)) + self.conv6_5 = Convolutional((1, 1, 1024, 512)) + + self.maxpool1 = MaxPool2d(filter_size=(13, 13), strides=(1, 1)) + self.maxpool2 = MaxPool2d(filter_size=(9, 9), strides=(1, 1)) + self.maxpool3 = MaxPool2d(filter_size=(5, 5), strides=(1, 1)) + + self.conv7_1 = Convolutional((1, 1, 2048, 512)) + self.conv7_2 = Convolutional((3, 3, 512, 1024)) + self.conv7_3 = Convolutional((1, 1, 1024, 512)) + + def forward(self, input_data): + input_data = self.conv1_1(input_data) + input_data = self.conv1_2(input_data) + route = input_data + route = self.conv1_3(route) + input_data = self.conv1_4(input_data) + input_data = self.residual_1(input_data) + + input_data = self.conv2_1(input_data) + input_data = self.concat([input_data, route]) + input_data = self.conv2_2(input_data) + input_data = self.conv2_3(input_data) + route = input_data + route = self.conv2_4(route) + input_data = self.conv2_5(input_data) + input_data = self.residual_2(input_data) + + input_data = self.conv3_1(input_data) + input_data = self.concat([input_data, route]) + input_data = self.conv3_2(input_data) + input_data = self.conv3_3(input_data) + route = input_data + route = self.conv3_4(route) + input_data = self.conv3_5(input_data) + input_data = self.residual_3(input_data) + + input_data = self.conv4_1(input_data) + input_data = self.concat([input_data, route]) + input_data = self.conv4_2(input_data) + route_1 = input_data + input_data = self.conv4_3(input_data) + route = input_data + route = self.conv4_4(route) + input_data = self.conv4_5(input_data) + input_data = self.residual_4(input_data) + + input_data = self.conv5_1(input_data) + input_data = self.concat([input_data, route]) + input_data = self.conv5_2(input_data) + route_2 = input_data + input_data = self.conv5_3(input_data) + route = input_data + route = self.conv5_4(route) + input_data = self.conv5_5(input_data) + input_data = self.residual_5(input_data) + + input_data = self.conv6_1(input_data) + input_data = self.concat([input_data, route]) + + input_data = self.conv6_2(input_data) + input_data = self.conv6_3(input_data) + input_data = self.conv6_4(input_data) + input_data = self.conv6_5(input_data) + + maxpool1 = self.maxpool1(input_data) + maxpool2 = self.maxpool2(input_data) + maxpool3 = self.maxpool3(input_data) + input_data = self.concat([maxpool1, maxpool2, maxpool3, input_data]) + + input_data = self.conv7_1(input_data) + input_data = self.conv7_2(input_data) + input_data = self.conv7_3(input_data) + + return route_1, route_2, input_data + + +class YOLOv4_model(Module): + def __init__(self, NUM_CLASS): + super(YOLOv4_model, self).__init__() + self.cspdarnnet = cspdarknet53() + + self.conv1_1 = Convolutional((1, 1, 512, 256)) + self.upsamle = UpSampling2d(scale=2) + self.conv1_2 = Convolutional((1, 1, 512, 256), name='conv_yolo_1') + self.concat = Concat() + + self.conv2_1 = Convolutional((1, 1, 512, 256)) + self.conv2_2 = Convolutional((3, 3, 256, 512)) + self.conv2_3 = Convolutional((1, 1, 512, 256)) + self.conv2_4 = Convolutional((3, 3, 256, 512)) + self.conv2_5 = Convolutional((1, 1, 512, 256)) + + self.conv3_1 = Convolutional((1, 1, 256, 128)) + self.conv3_2 = Convolutional((1, 1, 256, 128), name='conv_yolo_2') + + self.conv4_1 = Convolutional((1, 1, 256, 128)) + self.conv4_2 = Convolutional((3, 3, 128, 256)) + self.conv4_3 = Convolutional((1, 1, 256, 128)) + self.conv4_4 = Convolutional((3, 3, 128, 256)) + self.conv4_5 = Convolutional((1, 1, 256, 128)) + + self.conv5_1 = Convolutional((3, 3, 128, 256), name='conv_route_1') + self.conv5_2 = Convolutional((1, 1, 256, 3 * (NUM_CLASS + 5)), activate=False, bn=False) + + self.conv6_1 = Convolutional((3, 3, 128, 256), downsample=True, name='conv_route_2') + self.conv6_2 = Convolutional((1, 1, 512, 256)) + self.conv6_3 = Convolutional((3, 3, 256, 512)) + self.conv6_4 = Convolutional((1, 1, 512, 256)) + self.conv6_5 = Convolutional((3, 3, 256, 512)) + self.conv6_6 = Convolutional((1, 1, 512, 256)) + + self.conv7_1 = Convolutional((3, 3, 256, 512), name='conv_route_3') + self.conv7_2 = Convolutional((1, 1, 512, 3 * (NUM_CLASS + 5)), activate=False, bn=False) + self.conv7_3 = Convolutional((3, 3, 256, 512), downsample=True, name='conv_route_4') + + self.conv8_1 = Convolutional((1, 1, 1024, 512)) + self.conv8_2 = Convolutional((3, 3, 512, 1024)) + self.conv8_3 = Convolutional((1, 1, 1024, 512)) + self.conv8_4 = Convolutional((3, 3, 512, 1024)) + self.conv8_5 = Convolutional((1, 1, 1024, 512)) + + self.conv9_1 = Convolutional((3, 3, 512, 1024)) + self.conv9_2 = Convolutional((1, 1, 1024, 3 * (NUM_CLASS + 5)), activate=False, bn=False) + + def forward(self, inputs): + route_1, route_2, conv = self.cspdarnnet(inputs) + + route = conv + conv = self.conv1_1(conv) + conv = self.upsamle(conv) + route_2 = self.conv1_2(route_2) + conv = self.concat([route_2, conv]) + + conv = self.conv2_1(conv) + conv = self.conv2_2(conv) + conv = self.conv2_3(conv) + conv = self.conv2_4(conv) + conv = self.conv2_5(conv) + + route_2 = conv + conv = self.conv3_1(conv) + conv = self.upsamle(conv) + route_1 = self.conv3_2(route_1) + conv = self.concat([route_1, conv]) + + conv = self.conv4_1(conv) + conv = self.conv4_2(conv) + conv = self.conv4_3(conv) + conv = self.conv4_4(conv) + conv = self.conv4_5(conv) + + route_1 = conv + conv = self.conv5_1(conv) + conv_sbbox = self.conv5_2(conv) + + conv = self.conv6_1(route_1) + conv = self.concat([conv, route_2]) + + conv = self.conv6_2(conv) + conv = self.conv6_3(conv) + conv = self.conv6_4(conv) + conv = self.conv6_5(conv) + conv = self.conv6_6(conv) + + route_2 = conv + conv = self.conv7_1(conv) + conv_mbbox = self.conv7_2(conv) + conv = self.conv7_3(route_2) + conv = self.concat([conv, route]) + + conv = self.conv8_1(conv) + conv = self.conv8_2(conv) + conv = self.conv8_3(conv) + conv = self.conv8_4(conv) + conv = self.conv8_5(conv) + + conv = self.conv9_1(conv) + conv_lbbox = self.conv9_2(conv) + + return conv_sbbox, conv_mbbox, conv_lbbox + +def YOLOv4(NUM_CLASS, pretrained=False): + """Pre-trained YOLOv4 model. + + Parameters + ------------ + NUM_CLASS : int + Number of classes in final prediction. + pretrained : boolean + Whether to load pretrained weights. Default False. + + Examples + --------- + Object Detection with YOLOv4, see `computer_vision.py + `__ + With TensorLayer + + >>> # get the whole model, without pre-trained YOLOv4 parameters + >>> yolov4 = tl.app.YOLOv4(NUM_CLASS=80, pretrained=False) + >>> # get the whole model, restore pre-trained YOLOv4 parameters + >>> yolov4 = tl.app.YOLOv4(NUM_CLASS=80, pretrained=True) + >>> # use for inferencing + >>> output = yolov4(img, is_train=False) + + """ + + network = YOLOv4_model(NUM_CLASS=NUM_CLASS) + + if pretrained: + restore_params(network, model_path='model/yolov4_model.npz') + + return network + + +def restore_params(network, model_path='models.npz'): + logging.info("Restore pre-trained weights") + + try: + npz = np.load(model_path, allow_pickle=True) + except: + print("Download the model file, placed in the /model ") + print("Weights download: ", weights_url['link'], "password:", weights_url['password']) + + txt_path = 'model/yolov4_weights3_config.txt' + f = open(txt_path, "r") + line = f.readlines() + for i in range(len(line)): + network.all_weights[i].assign(npz[line[i].strip()]) + logging.info(" Loading weights %s in %s" % (network.all_weights[i].shape, network.all_weights[i].name)) + +def tl2_weights_to_tl3_weights(weights_2_path='model/weights_2.txt', weights_3_path='model/weights_3.txt', txt_path='model/yolov4_weights_config.txt'): + weights_2_path = weights_2_path + weights_3_path = weights_3_path + txt_path = txt_path + f1 = open(weights_2_path, "r") + f2 = open(weights_3_path, "r") + f3 = open(txt_path, "r") + line1 = f1.readlines() + line2 = f2.readlines() + line3 = f3.readlines() + _dicts = {} + for i in range(len(line1)): + _dicts[line1[i].strip()] = line3[i].strip() + for j in range(len(line2)): + print(_dicts[line2[j].strip()]) diff --git a/img/TL_gardener.png b/img/TL_gardener.png new file mode 100644 index 0000000000000000000000000000000000000000..ca60068aa9cecf4831d143c1e01753e529c141dc GIT binary patch literal 267078 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%0ASwb+@w>jF$$48}_5}EUE1?3=OI0eE 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 literal 0 HcmV?d00001 diff --git a/img/TL_gardener.psd b/img/TL_gardener.psd new file mode 100644 index 0000000000000000000000000000000000000000..e45b8158d574fc64aef468dfdc46c551b15c31de GIT binary patch literal 1838933 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 z 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

g_P5 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

  • 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%0ApevY%mqs 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

    5Ye9=>UnQyeS6w- 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�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 HuZRB!tqRdq literal 0 HcmV?d00001 diff --git a/img/awesome-mentioned.png b/img/awesome-mentioned.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbc400e521a4ae10dd06776f763c39bc4d9a13d GIT binary patch literal 60636 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 literal 0 HcmV?d00001 diff --git a/img/github_mascot.png b/img/github_mascot.png new file mode 100644 index 0000000000000000000000000000000000000000..a93ba9974d7b982aab6774b1999d57f38a431fd5 GIT binary patch literal 65327 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 literal 0 HcmV?d00001 diff --git a/img/img_tensorflow.png b/img/img_tensorflow.png new file mode 100644 index 0000000000000000000000000000000000000000..a8190c9af6a681262727bc5bbae12d1f03cd354e GIT binary patch literal 27730 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 literal 0 HcmV?d00001 diff --git a/img/img_tensorlayer.png b/img/img_tensorlayer.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b1f7c73bd042cac39d903f8db70cccb3803751 GIT binary patch literal 14657 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 L(#I8O;BWsIKe#*ZylP|gF-E+_Ro!|ML z8~CCS1o|2qS{RZ@Bx64u3nq~ughZk~GoS*`l}+n7!1xOSLVbK=17e#m$9#V!vEjU2 zp?LiboL~#qS8uSD<>pPs5YCpXlShPq|AF?Si7^1yEFm~Bgk)X%yuNVsLCgb=cduC1 zfe3areUOk*Ubu`zn(@F7|(tYBrcruMWgQh9vr+Kw^)_{>)185DQ3s$z{ylzjS z5JT$-IHx<#Y1!oAWH(J!R?XR{ynIiVI52vyi&=BKK`UaPzsbnQE5vuN?sBzIXbN=E z4Q*zLJtDI=0zF$ef7!FDLaL zDmr&eg>lh3`xWEOU5wu4MwB2@qPWVZrowVCy*7yTpvUBtoNa^ct3*^R!RNG zmIYn5tj5dLMCAm;lCMuy%4JWjZj4M1c1#9O&41(TKjeapk|%5QA8yTC63f3ozl*Pb z!=O4rf)8JBJPxkKRj_sd;>AzoAyQ+1Ju^By3Doz#?q~HpGp7nD|#%S2LHn(dPr>`pBRT+ zrm%{kD$BU&ZqZ6Tv!&X18yj*qzAKj{o(`lc-Q=<`M@GD3^tyRcw6JwIgK6k0gt6xxcZbn*i0)=C+EXXx;)9P6m zy)!+8zAxoUvb_O$@I&StskfbY1vb{1QiVTHG=FXqaZL85@L^pX@+rmWizdf#lS3n& z*?w}aUsU)ErTS7kndk5<=@TlAMB>siDVge<>7nKHIp10KocxW4pgXodJrj`+`5A~V z8RRfwCY(e146ZfhoOLnPUsG{!F2Y4nGRk{{vH44&KRRh@NDcXs{N7?@5>$fX z6kPfSGZjh%UCN(&`y(Y{M}9jcg0;b0C=qm_x2W_&!4lSAss3kXv!}-F+!UCB5bx!0 znBQx&T`&dBK!{p1wQ25t!x@rJ2MXJh++B;B5=NjH^SH;RUC5lST%k7A7(co9?gLllgTnM=d+^+rh$vjAOw;-$*Zw ztuLwKd{&=(Q;c)9NfyUg1~A@MeWTkK=St%}F*}sW3sLdG<|i8`8!~*Lk_ZqSEJF}= z@uJ5^We^&rAdatMFpR4ez|Guc4EAyfgx>#bx-AHx@dzyW1jyBi#JE|6>tV`-?*v9e z)ViGzK;P6y06NYO0$769iPd>xU9u1dL84L=Wi~R2TuTH5j;2R}BqF`o<2u2l*Vfsa zf&}CdAT1M6wM%+fAP4gUIY<0E_NgUM22pAAD?Hwse>;lP^kD#CM1Y&4pi!n2Bz!vw zE?)@pR;PC00E$QWC!}&2^ap!Y9SG)3V5*rwGLN%mpoIyCZZzm6-#QzD`jI)H#0HR$ zZVSh_+INsj8_?5u_mebl=}*Jt`AEW&?e!j@z8p* z7KaQkz=sDU(9??CF&LiD_gHQhslf$70BUXv1STrHhSO3o)Eo| zp)T&A5irAH4jxKO`Y?4FLE>Jk9vr}x2IPU~+33-tGwNaC0q3~6E@W5_2E>ez4Mh^@ zl9$ug7CAHz6H$=$xr!VRoB@FlOr5+N=%lW}CmRNjk@{$qd?7fqNDYl2lt5lfaN0~Y zkTHNuq2Jw3AQGKoz*)QqbPLhN*)Tr3w?oZ*DNKtB6qYlAU^-jp2@WqZl2(9=_H$yDW(7p_WM$^oB}CuPd#AYubr7=^2;mp6@F!kj~n{TJgBc<_!CG zOOYrrB^$M}E~>wC-lw5c>__^S15Swoe^s}Gk3Ftk3YLleq#?y5`_)0uXQJdNR4iGJ z=n>`^t|euoMr|)lK~5~}%0phBz6hEycU)qXc~BepXK3MPUaXOk|7Z@hysG~?;0xTf z4rC%*m;Y!1Eb;j30%FOURwYV0z=Rv(T>UBBN4BuUzN5ST_7@SB5+2h)dg3u{8}{3e zIg(1f!=HU(d9z*OumL7Mr1Xt2Y2B7CJ5t33gp>*#r_a=q|C@d(SCQLKUCWdWS!ENf M{d@wkN^g<$cX%^b4gdfE literal 0 HcmV?d00001 diff --git a/img/join_slack.png b/img/join_slack.png new file mode 100644 index 0000000000000000000000000000000000000000..96e590260683420f32cd627c659920c3c8052bd8 GIT binary patch literal 61461 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

    4`e%THG+lO;yS3;3M&OnJKO*( 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

    CLU} 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

    yHIP+dzzC1PyVq^;gvwsiRZQ3U)q?)tW;0if9S- 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 VX#4WRq5d(a-}i?e{xUD>{a Layout, you can select a header size, upload a logo and add a background image (large header size only). + diff --git a/img/medium/medium_header.png b/img/medium/medium_header.png new file mode 100644 index 0000000000000000000000000000000000000000..87bebf3f845b442dfcf2918cc000c8a24725d0fb GIT binary patch literal 28430 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 literal 0 HcmV?d00001 diff --git a/img/medium/medium_header.psd b/img/medium/medium_header.psd new file mode 100644 index 0000000000000000000000000000000000000000..9212a0a42a920c11fed2420c05953ce7c782e6d9 GIT binary patch literal 96167 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

    C5b0#1UqFCN6#?zma{n7%cD+i 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 XqhBn2?q?g6D|s3T@3Kla;>!OA)!PB* literal 0 HcmV?d00001 diff --git a/img/tl_black_logo.png b/img/tl_black_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf892db9e0b6035c0ec9ebe9f08f4e28f9ba847 GIT binary patch literal 127091 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 literal 0 HcmV?d00001 diff --git a/img/tl_transparent_logo.png b/img/tl_transparent_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..359a232dd719a910628736ed4cd724eafa85c187 GIT binary patch literal 150323 zcmeFZXIN8P)HNDFiXs6#N;9E~1qDPzAoSjp-m8ER0qKNbLQ|0BP(qQWQlv@m9i#@O z_g+HpfdEpa-rzasz2E(H@6Y?=&GYbNWwY6P?K$TfbIdVU_*+w5iRK#1H2?rWqoORY z4FFKE0svRMsVIm?tPTii#J8(1%0})003X-o4~bWXlqUed4p5Po(e;|x!1X$V#v}L7 z+&P_Yap!I_d$Bh9GnO)MCBe^5FB}S?o=IVh6f8wFX?})QdedllrG_;{i2HbJ>`F6 z7r`sE|BYvDsfdsB&#SSUPW->I{}&Fg|Hc4ex&OVv|C)$sf&Y!7|5+3NyU_kK#s5#B zqHETKI3xcsi=&k<&disSn|*MJdH#M9=aEvtcULYCol7Pl(|H_?OyD~*M=42hV5NCY2t~5PgvrG8yh;pWQA8GiKE`LB*ITW z0&4a488h({KJ<5SFOc|m?lte&|J>*IbSG}M_cVf1^^D7c65w6G(i#4tl!Q2`pf6Yd z+%|beV(Rd_ZwOs#Lu>hY5*saG`)wls#p?um;%rTwdH%q&ujHZA%)&9{%;5=t98{|9 zOTf$tvR7#v^t-wYuMon-}3o>@)qGSX!u)9C7kSUUbGj&{kNI3-{=VmKx&hDH`{L+ zwSN0Tl=w_K(=Y#|2k-hrd;ag|O+|BdeJ*iIqsjG%JybZnQ1bY<`r#IzFlJ}cLdBTu z?@W%CdspZJiO;huW^Il*vvwLLX{jawG_D}h{+$vot#12xf3i1-W>f|{=+DvW)sIc9 zeiV1RZSbttmqph5j{i~g8l{su$!w+s)EnEd!Ywu9r+mMA{PHrMrT<=L>I?BQlw>H{ z4>Y43*uh2)PRXO+x$FHe7FZ=sQFNVtAQJ>gT6~a9<_G{tUNPDYK)z4HQ$;0hU5%0y z;W(7*q39tdM9H|@z&|eOU8vt6ADyNK6=dE9TGW^B`HmG`u+X3HRtVXN3vRlArNwDL zvAnO3qzb*O51s~&k)bP(dt*Jo(sYuiXvtr7klHv`T{NfF*JoitO5wb<<*dPGTCS_NDXgTTy`=*bLay=i zakQXF(fBpWW=gho^{^HE`Gy?Em zkes-97HOz1sZFEQay_1WRPupKm3ijgQ?c>Rh^@*PHrp@TkqRrMOxd!C&LnQ32 z=Fnu=Lf-nsc@2=GfDG-&R@$I+)Hp;2I6Z>)Qp%w+SHkXuH6%#deV8Fw54w*!TTl)U zENl}WcaUzLONZ_X9RT3%B+T)T>j-Bf)CGQpS5XbTZ{JdRfJMA_hkxIAwjm=YZ+ND@ zr3!TZi_QeVq2kj(_;rA*^5#I!YMPz#3=Oxc(G{cUoJ(p6sRy^7pX^}^!_VZflur62 zvlY-j_Z3XCx~M57FnNe^?_I%HT!vsm@v=r=qGNbNnT$m;o3F>k zucG=BxkQ;?{N);5Dr`WG14%UAU7pjQ==9R>^nd16btXYHi`n$~SzHLWnYkI9l?IkbvSYBfa553AMsjN-Szg z3e$b*8EkLr)^%`!!Ec{8Vaa#a)~6y_3k^GN0HmhhE@n3P8mw*?yDJ%EgAO491;_6X4iAR|Pa%6jsoTNqVBtXQO$dZ0^{}Z0H4VlEbK#`z>#EF@G`@vf8+icfB z>ac5*nCzlWo%T6yE3?X*#uFLLMJ*`I~* zdiCp~PzgrKjY4CII;6oUZSeV4;V#7E3tguC*#E76Rb)kl@ftyI);NE8!sXYp_!fm9mNnu6(TAT;v=0`e> zlYn|CU`Oumx`-b!RZ9xr`Qv#01{9)cUjqnAhm{YcHCmcD(;wdIB?lJkiVQH*XF@E# z-R@bzsEyIlcS6?ak{m_f@Fwv(Sk&&d*zhXCQA*jlVmO?coWuEJF}#b5UVeB`5N&S| zZNm|#gHccU9-|K=ah>a792Fa2_5eCmItXkCz1TNntz%T#TIt>K3Jp(`*izlf-!-|n z(GxrJH)PGSd%zvqSzl2I8!}tf^3x20sEnCV zTB=0iS_VTnXrN^EsX7ZQc=Dl5!_hFuQ!}9;u5Zf+fXwr~m_3v83{ro#wNS*?rUam2 z@FWGxv{1LZ@>p@q^QWkKqQJ688~wtpP9i8+B;AqL!7ka>LKc-dCwF*UdhxO{$b_ex z-~@}y!7PjogK>nxGi?Z;PaN(b>lU|r}(W9&>Axat$>LKd;W;#s!&B$dyIjnmx;kKZ#j}ySS?rv7k|Sq zqX(~btFq7c%-YThPQvfW5pl@+bYpUnx)n!+drC^62HXy6`~AySLgbFhJ2}zZxc#>gVB{FxTm-mukqYH-{A+(AiFb(` zQFRS$5e>FMh`D|bv+>C_Y!(e7dcYVz_4>Pu+DUiQhAk(!Sx zC9xCDD6i9f4~ak^7b}bk2Jh`5CfK9{s(lXRNS?v(buB>g;Z+Gn>5bets!Qil&P4y= zBjSF^dqkqZgTYW;{5Hc|FD3F{1$|54Q`)~lA32A%;fthyAeIB}cc)=B28!JoFUiP0 zG>@6U2Xm{K;bQQ|n>^5r+8l)Ka)Oy)jcp7R*qdWGgGo|b60dSl>`f7f6Lm0(MeHg_ zenyB8@e)bD`fOjimkcnqJcW3=S;VL+MFZxm1D^kUJF`Kec1kipm%bHTCPdj@Nf(t>~M^S%@#@ngV`gILrwT{)nVcShN@;YJoK;nTr+qm z;wSP20PuQ`xvV)_eO+d^JC7`IYhG)vZNe6&9ciQBiRuFpB0!4=&crq(Zq_dB*oS-m zh<9sqjZH)T9m(98`n;EkULa=8t;}`;lhS2$3moI7IC@eX#mR=G{b4-7kC(m*}kf^huq>rajCjTx<%*6(&PHoCey4xMYg)b!waayn$tE} zumjcZ*V*<}q1iK_uJbp5Bl;hw0qdRc0bK6>CRKPOt7W)&i?E**G8DD%OPhj?VrE`( zZ*A+EV-Df`?jipwIxga2`ZgME^PsZQ#Y6+aI+TxLMd`xhYHIRF5@PfXl=Kv7VEICF zMx{AGR8CG#wie1>37T+Xsxw#!bO5+o%$1YP=XQ*yK~Gb;QX6vC{iGBP^8aEiY-LRH z6WxbVwp^UVQVk7^)H0OT(D*33?+h!SKgNK_LiS!P$5s|$N z@aed-Db!@I!Fum5vJ?3 zXV{k(EZduu&x}WKJDSAh)CQG`?PaNDIp}9PWaT1g*}vbVGZXUm+PTuw5MGTTNC=Yb z=wFOS#a~h?iuga(qwl||!0fn~spG6R2$A?+t*u4rGRrEXzz9HY!e%RKi{1FV&a ziDX`Bi-;9@)$)5olh>8$Q^=FlggVL9_WsD>7;q2a`r-3z?H=9ki0CM6{~96UyE-Jx zI?;3N!sx&t&C}W8am^%e_K+U0f}$>5At%1I(KHAy4}8)x!gRI8yW37iuEm43O46WNlhvM7b&M`s_rlVh zppLETFj)35)@bQ7IANKRi_3(>W z_rK`ihZp%rn}z9EzjeQJ$frwlQvNB%FFKrbKxdh7R(K&RIS}c(2b=v`88YMfliLNo zovls}RR~I4pv#1`)_iNu_5_t!?I_3S)CF?7-Djf&3hB6YsOn`-**(lxZ|~nM5`)In z1<_hgu1}Dm&e-xd$Mh|-1a)~|lTNp|bl zT%R#Odf~x7$OA8%Wc#xg(I8kaQB*jJ>=9H6AAPjMbiP|Vvcsf)ft&FblKAOj`_tzI z^np5Wc)r2wP4~8}?8t1>Ogu<0hB>knJRW1GkdHrm)b6Qd{JE5^zMe3G-iHV48`$9* zb=M0#^=s8|*#zz74FZdq-jb2%{MUk{QrjP=ngG`>w`DVE;8rf;w{14R?|#AHeiL9m z%V5Aly#~ncd$BYS^&CJfvO6!)+TTw>m>Ps(qXNm!Ef|ua%0&=}P&v@A9FZEq5)g8h z9Ttko3Km}s{gLc*+}_8runho9YIcH`lUs4ODwPl}2mctK=7rHk3IH z0^4&ollc!&oVdFBTDAPB1j}xH#RHG*P3787Zg`F{y~N4}Rh(Y&eJ+Uw54SLS%W4l} z5Zva${$|`RFJi>RofsJ(*(0Fe`EkkJkHO(v&_M}WsUX1Gv zPAnF<;_~|Mto`_4O(OlL0VfE>(8oATKNjRFnV=8eNSdotd!3k7`dworW^u}vb!y$I zP;W3pvz=I$q!6OqbHwx<04Z5R38msW&AW794Kj2c*}V9qkI11w=OvffIybL-v>QMo zkLhCWtd@{7XvUoC-t4AA~SV{)- zJsv_5YVwTMBW_NTv5yWDHiLyCSI_h^@q;P$4#t=QyAPmil^s!HvJ#!(($T(@#1K;f zu>|^Jb>pFG5OV>Xn~l?yKCbs<1)gughFU4{I9q$TR*6@Q*lYp4 z!LL+TZ$I-2U28*o=E((t_6l8XCW*XXYaIp26~JsV>qR(GT04Ds)btL^zu?FJ4qNqc zx0^A}Agtg=|D-Xu-$Ep6d-7LhsSjM-JUC6mOyC>H?GZ!?-onHc=dOhK$srh5%9&Qe z`9xgX-Bu}Mp2wwV04G;R4#Z2C_2~aRPPg^ig0HHNYh_Gjg5T5{>#y#tQ*YTM7Zl|V z>)`s=VQ*62D70UT$$tiqbP)vFfWZ{JGgQrb2|M`Khmjxg;o6cEMa zW=4w2VW}7-lsz?89j`{w#A>H#isgBh%SL(Y9aX=8Do7AJG6CC zL%|!LOTk*%JRdqUj2E}HJttP81mAR;Q{Pp`D4%Rvf$L-Us5fVNp$JyP+$#X#GRozs zr>9~26=2sQ$C&YdN|76lM)*GV*EEH&+ar2@EdWw$donYK za@zE(N{a@($8RFPZ{Qs$DLe1YO-rUAiiW4fT5Qag14FtRT(^A8n=#EUb-T^-1K0wK-}-ITUaYfhiC3nD-x$v`mWT)_*#?TWe8Qe^`?6a6aUG zQoHWaCF;24<&x~jeOy0JoUin|NnGTB-aqR6#S_|>d(HE!JMZRK@r^Rhj18NiYO_W4 z#!u(-+KLY6SLJMzdV%E&k0Fd1&QBuZIifs<9*cz(`-bUHHDj3I!6ccUOVKf+bO$2z8}EFh}=&)SzHl8~xzH_M|ARkLB6xll|VU*z?L+3sb;R@lbO8fN#>; z-uC$!bf-2-X>0`skKzJh%rn89C7DkK@lU5K%HC5Z9z_E^QJ&fZfR#vx zz>4SH`&QRtfno@2BkBIFOz$fW3Q}gB4;M& zrYbSSdZL;k4LH>t zJp)EP{kcswNgw;|jo3)S_{extv8ULEnMBWhgDy-Px{R~dzKjPe&@410*(PD!F^%1J zE0CiB=HF{#5I}B5A5<(mo9!Do;L1AYVC7NYDQNPmeNs$THACbc{LmdmlE}kfjJk+R)L6zqGyW=?K|ufFc%M=WO3)e zy#Q*rc%TSHg~jc*>O+zHgJyDbQ~EqKq60bozaqqNEZkv+TQe0`slv1iw;VDy`*9Co zkZ3|rtlVbVEwj41iM_Re3qnyYawZ>F3hvaG&nJu+Q)+Drc_?Q)@Y2G1^mCS@!93#x zSiX*Y+md^s1TB8yu1Q^e$B1Qkg~ou5j{-5p*Zs~vBesyv{Tk-iqyXiX^+->x)Oc{@k)3f}J+DT#&VV3^JTXOywB{9jGSdRvQq`y)i)WT? zn@Oo0zd7Wf5>yg*QabNsth!%$Z*BNtn82gNw?(7?sey5???{-DGo$edxL#5N2gZ7e z%GS?}@QxpF=1<0&3go7iV<2ORm^MO(b|#Nvtx`u?zFeGAmC__LF3qGEMLYR+{+@+( zF4ClWah<@E{ivHaFg_|Xe;gN*VWeG?OwCSgCd2`(?36qVJoN4h*3_0fw0+AXmR@j3 zie4zT)l2m8%sufEAu3IWw+b2z8V(F%3R}|v^E2W7dY8Q4@BCQI2T9nvE&ce6XloN%jQQiN;@B+RThy@RHG%R*?H4><^|hN4h%}jrHa2+9sCL74w5ytT14Au z)xiohM2c}7!x}RmGJy=9P!h#8i5Pz$2n#XB?7}^Gm$=kVSO*3 zqO$r_m`P=N6twf?0BBO5O#6}cgsf=XLhblR+Qq;~Is3(rhBbhTwV&@Ogq6*gLTzAj z93npfQ3***iB~t^6|j<5QWy>OwC%lCUApufshr3grXS81P6e(xZ2#U?psMm9e=;FG zcys4Bwx&U|GIey0vb-jfYlPiYf?GqyoqCb6aAj8ez{TP1U4O%h8|%8G$H*1k!;PGB zGTB?>dPqROnR`#35{Wz;A4$v5UM@EGTobUPm*0eKC8YwN>s;)Psu0VoqqsjEOkcj! zW_+B%!4@)h2DCAHynrG@v4jVwEllrh)~@}(G79TWCl{x80opw~Mf%y=CxLQ~XEZ5V z`E&bC9SpKwG+jSY5KZnwqCxQntowq z!00?m$fHO}MJMCUAw)&1ql9a-&oqy!^B}?T!)C_D>q8^AM*}shlgyU;i!=7bso$qMoEYe>|F zju|;L^gVkE-%qF;9(lI^mG47NO=d>UNa%JR;m0r2lhCp^DQ9H~;rH0xa-bc?=}Ckh zj3E}43y=ltWLHzrY3YGc0XfTq0IMErHZEfr!CiueJ=QrE@zG+xl@y(3uHq-UMmTS{ z)o>Q$aino}-kHJuiCBwm_l92fDNo<9CV9`7L&;EeA_(uVBF7MyzR4fXVhcA!5w$qPj4l~hA`Mw)2Fgay8J0<5ZFlX6Z3efHl`n=tJfg`nmBmrpgW94_xGFl zf6Z4mPAdChX9OczHN{30%z^VS#v=6qiu|`yH^QOPeQylbp3JOK8)R&ZrF=`%#2YiLlk#BSR1RK9(#-PAl$>tzN?MuT2Tt%gHt#<%3zm3|V z+H{8_%JSui3ABbYTjD0mI_m-Jlh^mfbC4FL9!7O#8X_JJ)Ev>Vqv3T032pYMjB;ek z$()Rah1A+wg=x)AHF%lh;Rs-TRXc9NBvbCgMkwzaLo%9iC+Cm1Dn=u$6XW|BM9S2M zgH5HJMY_^%0FJJ*0^Ud{o^7i9l9~G$ccKpppXOou?jcrgs4jNXECgIlFQX#^6FBlo0v32) zubNY5497`Z(SSy-q9j}lx9}rQC|F0zXySxJ`yK;iZwWca1g-F$!-|gf@;C1S(#v_Rc;hNYV62ljTk0*uIYIPE;vyveUyQ}v zlU55yeNmhDoC19;esPSdCmF+8L>&^NOhzBQ-Tbw7Z8DpniIie=Gizm>L}b8@IVvnn zB;MHM>A3C`IjNK^5jwA%8#$Q_<1$8~P4%6Z2Jpw}jwQ}*=HG*^hm%q{j#lnJH<6yV zgH3!UsyuDV`y1<@xJHO}zW=bMMwR(i5^8l-)PaVbC}Z1#)-}x>00Ik4L|ETBbdJr* zIZq-9yt9U+pi4*r`1fABY|z z_PDMG%R#F)6joL-OxBBT1m)fct`*%^y80~>xW`b>A;@^2V20|4pd4+{AbTfT)e5Us zeN~gHmo(*yMqI}nhUh+-(ZA^G3N4K@S@+CmXX{$rO+M%%3*`bQ%B9dHW%`P_>3oHM z(M~ty*GZD{sB!OCC=#Lnt`fZUv&nr`x3~m6Hd|{=fFOCJFiadYg(+A|v0ZIk+LFZ0Lqt+p zMJW{dk}xvy*euo|(MhvhoLi%iunC9ryRgj`9^V`#b`AL!F|jp{ zy-vgRR(41$E&W1#-061l1W-@Gupgm$Z@&4^`Iy?JGsmxL5!wma=5NkmdL5P~P} zu_0(UjkEhq?{Op4f84-j7bq0p(opKr*U;;oOIZ3G2jB!#!iM(}mRgC`Qlf^M86{mN zLDHF|C3p1DJl0)-*s#^xFL`u^UpQ7?-al&I<n=UTU3uYp)#GO+V)|OWCp(Lt^%Cx?x z1257y9zm7=Fn+`!+H;FL$$<7jUb&|6aEXb;=qWBT&X;^eCsvsZOGxR=MFCv z_@fw9;$UjSiJr9k5SsoJN9|O`CFNn$o5(c}-px>b1p_6bLMl{~)=^rrFq%PdpgvWKZ@3QaVbAVpu2L2DRBUd#kjI$$IE&|NpO>$kAI4hYhU@B| z=-YG>n>ZD=?Y#VT&z_5mFB(ruN-Yv)ekf}!ps`yaP>vP{nWmTM2(sBq<8(Hq`6`2Q1Gv@NtU@(;b=CiH)lxy7zPKjqyBpVcq4) z*|Cnd2BYmg_jPSObVCbr+;lxRNm}}u1?~CtU?9p~9{!B1;vv`Q-0(Bco}7j_i`s`4 z4V%mjtLW9jigQ$sQ1Q$OTkOS=wco3=0r(54BE(g|_Q!u}t=Ga2F|2I&F}{*6B1ivn zA64jsKbt%{1LfM^wgnTLE7yq46}S7PHBXdYZ4Ck=9Z&($4jOV{v4fMrcYYWX_Z=h! z8D=sb2&oMW=gN#y-b2n7X-MSJI!@y~R-?sVIpbr>Zb`wtsM#valnY=#oAUSPCpN#1 znZJNk=Bqen=ju*K{lr3O49d&-=Fu<_*#dK^zjf;;hSIBj|0=5=^YAghWqfKn8o>44 z2}%m^W<~88;SV?^u8^7Eo3d>u?s{_p6X|UPBxls$*dcOngm&m89Sb3`%&g^1&vP^; z%;i;a@%;BT@o~gzK;W{*75%f_>7okCob0=q_71y4_D=4; zH^^ajmdbB;c#jD+Muvj#CgwgY0Ws6xOO#t@0vA7Tb@kxO(GmVZZuJTKX?@X}IZtvUFJ1TiSGCI+TRYcM=_quS0*K5u_>_>~_(BdpB-WmEMqd z`8qjVsryn#uj@Hn40-r6+1i#>>Qkhjo`Rd7bf3i3lmsU(z-AdbZf^0>gmHK*Pa~YH zi)s4T^ERXGJ6zw%{EJ^@&ONt$5@nUl}aJm-w7T7 z_W@2TG{jQ6t4K!K?jFe#t3-q{PEOwlEq^V;U6j*JfFfyNm0qN4?Qg0`-8@SldX+i)}mPG)L2CW7sYn{*|zkWIO5%Au0T`89$3n0n`n(40IA9nWcF(Oi# zYEBqyA3_yY)0k(dx+NDx@@@(qcD3d^3e{HK7vZ)z z!y4@PskG;Io;#>pg>~xAxjj`@VL_7RmY>(~9+u6op<6no8Fgt}6D4w5;*1rvzE|#t zj*cC?bS*1a1Sq@iW$Dewz44?=7HwEJnSBYt-_$mdeg_E%HXQ0Id-T|Pw5cmr(8ju% z74AFL#S4cUkFDt%k^skMuwS>#N;9JwM?Eq9Vay!=lIOt-Ik@~cL4Rwv}GLW6cZi!z;w!%)qoWmPG zmstQHSEQy~$mKEf{`=$gw<|Z5zVsmG(vxLvhm0smI@euadN|yL#VcgWwq*ycIej%! zePa2wJYT=P(vCvIlKW`@`L|3CM!ld?8Kc}gLP5?j)mLPqIWZ!v0YMxKUDvLa!AQ85 z_a}+%RHT31` zKXFRZGJ&Zn>>QX%y*-8kd=HL3hF_GMht11~+1U-BpI zI>{R5epfc>!H2fFw}$sP?!VHT&9h)R$?tP{@|t2Y&SClbve&fldJ|p0f}y_;4f}g8 z7c}`|y!}fyr@tv)l0^3e`HM!l*?p}Jx4--HT@gER4+rBF8S2e%_g{khmB@8G6b+S` zB|`z6Q;dPv86>8b9#@auZuVK*u=EwF;;(~47n&AgFXqNcy$?T7N_n%Q1qok#EQ zc0(@S752On`%Zi7$sb_3|DPMwM+METClQM08d4^J^wv4KQ*Rp30V|4M{nf4~2WEtN zJ(tyCmOaTUI3iiL`#E%6VHRNF@!FR9xtsCV+bSu8q)uOdHv6fI^-0vx$jW(j+{b-M zr%>qpLA7{=te>=0_HUG7ChPpqA+p;|4C4|Kq?8rKngfs1ygD|_?$MQ zT74TvwKcso-HvUlJIT1P9O7Tv!^TNSzG{^8_RKu7)aOrZxUlm++?EpgPAhzmm2i!X zC*l(6>lyw-e6#JImi|pv*F8y>#?lYH%|sFIhKBDA^DFsUBS6S+qZb1ueRM-jrqo|j zQ2tI4c^|s4-Jc)Te0lKbE5%`+Fz59--p1=!-}5rwnI9PZnqc0SXB4aqmFv>9qyVlV zsE&*?qJ>l~)rAzV_b)BGw>?0gz3&cdv>Y;7B<({iuh!^4HE{X)VWnBUK;f|xtGDi( z@D;>%nBQ zqf-1m4K|7M#f8>=)mzT>N)38GWes7qI8}<_-)!ENrLuiohm7nGUOpevs@AyuPM$Ec zT)*+NH=$r{PyE&OrZvQ4_L?VEOyz2mS6Zmp8MGM$)}sM(MWR-7EUedeo)-JJJ?0#_ zO6A@xa%BkAgTARh_}J&h9JRZ#tNvpGECcrgORY4$GuDiwJ1zD(K42 z*b|rd`BkC=;$Pb$rjrMoU#XApWPNm=e+?gRs$r;_En^ljjGw~Erl~&oCJiBbx8Ze= zAg%0L=GYVTS`tK~OF`4fpcvZs5^`ISNsGPl7(MCt< z=*Cm}f^FrC08<@lobltSI=JfyKX~#TE>Sp>Eta3rdkdaSIlm#|tI^;QKI7=}lA6s) zIdcngH+MUQxH686vu7{g?*|Ld<^SkkPcC3ZEeumm5x;ICMO$Vo{%p`@R@w|4PNcwd zkid3Xh$S^BR$Zw2Hx($9FD|dxXbTtrE`S4}&PYcQ9$V3t-~w>BYU29*4aLC-W(oY+ z$f5WlDzNh^+9*Hp^_3tH#92vSH1ws_(7nhPR3TJ+y;J5*Jfj7yoFL@IJq`OnPd1h5;AJc9DZ& zOag+vdavzdX^8B)Z12er(s&NUwHzEHJ3><}@ZppY`4Ay0{q(~TjvW8+Le!)at zWP%>Boy(8(UO`gEL-z;x&%XK`xg3XE1l3?2_)j!vO}ZY03j0BM(gT14zqf^Qf}RZ97F@Z9wA3-GZJw@qHS5 zbeu|Otp3b{Y>NF^)yfcA4SgGe+aiaH-!%T6L*E$UJ|2sf04}G;|Dq z+*g%UoU9_JGYN~LS`0J~!jb;m!!qPJpJWslb|ix%|GFu<6EU!M9Sqp>0R5n1m&G;= zH4T$+utVClx?7l)_A2$)(zJ?a@L`bU#Z5DnV!8{AG^%qx&aL!ON!5O%1L%2CB` z8UYJ*pvsDKF$h@n=sxDYe{-%5UR*xS2(Q4BOf&M;u4h>IRL{zJHXLt%BBqFgaU|xEJyPTn>>>8CctXqUj&K6uBK;uBvVA6~Y8l zd&Rl7H4Fg!^M3&@8P?Ch76^A_PmosOD}V_Fu<8MZfhy#yt6Au$8$F$k@6t=IT@`L{ zdcxrJwT=AtlL}Tswmmxj$-1fVXCc*hwPI1MJfS_(X(LaA=V45&sN|REw3#R(Qh7ap zahkOrXP@kYAGtFT=s}1ixMzLBUSA6a}pR?HM`pltLFmG ze|vCMrwdyVGxJRaikqtUu5ev{M^2xrxTF&(yB?(3hX~}KOL^SCrpr{@MwY0?Xi`d; z9-l~o!;@T^wSZ-0NxY4y-dKYmTB)-Q+U?dEXa3zk%=QN|LG+I;$wIy0-0#6& z2Edx@5uKC;v18Xd7xLHmcQbSvk?!VD8n`~y5dW~4sVO*UboXU{Q~K_w_xzBjrQ~-- zdHY^OrSyIdWEN?B|D;M-Q}MTl;B&iI0gq2<+~1S%{^ZVPptoMZ=iF$2qcNW6okpa@MdRaALI zb?vA2)Y^CUTrSF^q>(r5Qmc_%c75v>ubC`mL)XY7nMLH&OD$DXtto&HB7sMcZfSY- zr;8pf;%O!M99T)0HqEA=%wH?S@a_gOu7WPJPCIv(Q+u2op_QhkbrL7!Z01Ro2m#(= z^PZe^>O!)1+%I`@dW9WKmG7@TdUHOEufgd9f2nHXCjtM~CBOUAO-;?y^nuld@2tb< zNM(SBWTSut`Ds3vTq_pKA2ghFT{kkR6dy-K**Dzt?~B&7{=)j5ie1|UOx-BSL(?6Q zsC+1QT?H0Ivs(f4t8dTb>bXfnzZ@xZW$>!y6@3!eh_niofig8G`m1bll~{Kued4rA z+(#FuVYQ$UFjNra$kFHYfz~3SZAJ{kopd2ShrRGrdv;dh|8LElsPivBg8LkKuU5oS z09%oylrrKK*Fn!*_hcvsc`y}^Kj{b(+0sAEC@4ioT3C7H<{!;!sZHW!$J=8%sKlO4H;6( zG0c()&qY>2?!V^5qJ%G^h#bfwL0uAys(XWgztJ34yNvHq#eY?bsYwk#+F;E1i)?@j*|G(-i_e=T}8{zEUxLBEcGF86k^Sn!6Z8 zwr$5;Mo-+iyyIo$ruLVAac}v3xT>(j$~3>KNZ$`Z9+JJUJ-fm0K<=zhg~>GIXSRkia5Yx(`_qwFkfEY{!V~BxAYI)zNtl~!{_Kgqob~p;6Cwg*WzdV>q=5E!)JIt~Y9=0O4 zThudUS2=GV=Woxw2{NkP%O&znBFXtWSSO?k2BV2YvIW|^Gk-`gb@rwS9CK-Kg&p(% z7-uCAM7W`3;&8?PrqU!2#_1nP=u&rkMck=9XAi!aMGjR^&KEN2;rK@tdgbQc-eS9o zlTG?a(@(RV_rgus&|y1C777&DGmi9!tvAuXh;M54c=qxyRoZ0iv;Cs!QMBG2AFYg= zrIXAK8hfjVX;R995cbK@?PnW|76fXLIRj+s@R>Q4l&ewQ-b-;-zF5BC`Db#VGpeoD zh3#*rbd3!bMAjddb(}H(0(j@B=&YaNu1j#H^Jbje45RR&kOP38SsdV=$C<1TI6Vh& z9#gS^{42Jl4yI9Waq-irACau6sU#q3&hzyZ#z1~5zB{pBdqmf=I5L($wIRM0(^j%_ zP{2gbX0L?#52lo^GI47>hI=v-d5O90!1_A^mgn&p59VseEmC$=f1PfB7N>NG>kRrV$bOaQn zNEK8-P!K^{AXKG;g4EDKq=O*!+yUR`d*5&Gvwxg3&e;3>3d0|ctovSTUh|rBUMm#$ zYz{)f5Rg$zUr9-DXva;&QSDYQOqxv;<^7NJ6P+d@NE!3~H9%G(^eB}Qj5{eH4={Ok z!NTg|VNlE|S)uj<--KT8Pfc751*BsdQB7Qr@Pm}sQacGmt%urLv-S5nKm|iqNAlOu zU@IDNm+pulA>Z6Hgtc08+nZLs z=E^YbP?uf*v+)k1>--JQKLUfD9?vO^JcO703h>csF9d}<97SYdi`rgbXA+oj?}%a1 zEbe`fdOVbJe!GcI87!DEWZy;mx^=xoFVYD=u>&6%@0D#LzeYmUobfo7Q)P5N&+*|a zWg%r6+TWuEWf3)xX{`CdnG{hZ^vRsoocE32F#40gnUFCc>p|g{BD`#Jl}GaS zC0tzbM8v9{HbL!xTudH`LTfFuPVu%gWk&Hr%=-rWys;lLtlHdFEA}3^1!!1PJ~9+C zekeN)ZjVFRT$dv}VT;RW<)e1c@65Eiq;n|YaYDfa2@1| zC8e84eKbt}cr}1>CQglnn88zP)Saf*^hE#c2`e-XT_*4h04NCZzz~S-&e6>cp*SV) zuj6Ic)yGojYrbxkO*V8DG83tqk-*DC9QoeA493M?y%ZGJE*vC<$!UL(4<&Dp!x(%_ z-gFF_5$$X=D5>ye+hha@YbwtkvrUD(M%e1+Tw`RCPf$c&DN5SZsKMzj<~`Qp^dJsV zjzaFZi$8RW!h{-wuqh3)EyZU0hks}ryqs!nex5e>|HxmHiPQ(B?^j*{*49g`5NmiqPyV zXM3Rsc_)N6yX>Qhhws)F29Gy=ZHcXUmX=#@_qXa3u1>p9j zKZ!=_(c6Q`JCp5S#|?fJA_@}r>t~Y3f9$)SS8O(#>%kJyz!bmu`!eKee0lTaO92jm zDXub*)DkGB10D406Cg-2Z~pY$S7PK;O{n0=e99T77$(NY>KjIvYdNoU>G>k3eY@=Q zaH|5OOx_MANw04>_am>Yj7H6V;zYgsYWjVjnQ)C`deo&U&Nq- zxg4ymh`Ndz0hnM8UEWRwK!^5Onhlu7!g-P>g?lv7Bd=sWc;sG%7q>~#`Tj4@j$_2| z)Uq4K3d3#y1R>%HXRZNaGJaIbjG8;asOVY5G7&;a<=(p~_3xKZVboUSCLB(~9D<_hRAEznMZ6CDV&`kc}5x zMQpXwY-$C_eY$twm4Z!BhGByy<#Pzp$E=-BQYyTXDY{M(6N0l+Kj7n_o)I3e(2rzm zOD_0Sr*?r*0e?MX@jf~+BgG^X$m=}3+(ZBuT5R>%jYT*sCB1>ODXc8RHan<{+~~L1 znhM${g8SJms^uZ+abbFeR_9Nz(yNS6)vUozbh(HYH4q`_G(9uVuE+*5tzL8#Q)E2*S_h=Q1r6O*4 z-OQh~Vo;3HB3FiPOA(384$@mflxd6`l5fF(F)D#Uqkq^V27;LfsBOLwSsPxRYq+d9 z%XDtLojbIBQWy>+!EN4+g^|{vlR2A}tF;o93j<(De<SdpvIKv z`tK*E(dX1QUNX_nYwYc8BWnc$VfY@vcktf^Tp;!#3#E;0n|Om2uNy6smtW4*M>Tq; zR8bGFk#h)<4vGzP(9k?=NlFlXK-x>;{W)z|OcCD_NxJO$?mYb9Jk=x9+2$}vH5n{M zWKNL_!6eTi8&SyxS0ZDg=>y+p9OLv|Lt%u_9kSi_-Ve`(dQ1-D82C1KH2ep>*=EDHp>BrxMXNniY6)&5FK zmYT+D)Vac~hNuGL!}`RnLeYps4I0c-sG3%Tk<)f1_6Q=bVfU;#u!5P`HdFr77Gff7Gc0&ef|6I9+KP!q28U*v=`=J>=n3;&HxhgE-nP-ymy!`hq>O{>*K}}cZOkXTz z*na5G=Y(xJUGkUl2Y}_v8d@u5z-WOumt9QWZZIJC_|X?gpc1?{lRP4HXMvz(=P$nk z_+U=BphL(2JetFp@!=F!wDfWrR6eYniBU#{2tzc^g+|TmYOyR5 zRkeInU)>ur%BfPqN7qsVC}!;7y#Zed&}@F2!abm*Q@8KG%KE0WY3eWAG~@@e2pCPv z+xk5bQ$xq)GO=q13bX)CNrK5|^KnpC1d}2LGvx);tM}Lt@|IXfv|@tPt;XV8(_;2O^`2hc@u*9k7rq@fLHJs-9G{hMslEK|4*IZe3vetLZnjKnNqM;5n4?jk)y(R z9!6!y=EBLmpCIuSx?0r9G$r^j<^vanwv_npOR~BArefo!*E-Y5szBhn^9|b1#g_Du zYU-_68m3FX{9#O@P%m7nujbv*t^_M~c@zUOe<1iF7Ih0D*OOlh?7k1!DbDkP8xet* z)eK~VIOFQc)@OVrR%dSz9d-atNjyOn$n%wodQy!OY(60EX9xzb2^+c&1Z>@-rs62O z2r>mt4L?W?3rb>Ab-L*Y@T02NW+tsGJoBARkFUUK@=Pd3EvGYFFdGN@!6<61k}pz@ zoKH4TeksZ&IU`wRoS{8D+;-+omP5%B9ZlDjdg&*A$m0#b$-im%nePc9h&J*qMn&2-n=Jt` z8;*oLcu^!*d(aa&hJ#hU;0oioCS;aFnvtx-w|7dXkY^`>C$nu3ti-2ekgO^zQ|@2( zO|a|klKS{f0^rp${Iy9fzEV$>jy*0!nj8(>LHO712Z^CTK%35TapTL&NZLQ0f9_D< zV~yv!h44Q&#Hs7?sL`0_=EJV%?(M^*UwqMk7xAhl$BWWO@0zM4mP$Fah7gn4z6_Uo z4|gZ#bXCcgB9v*Y(ii7tlICJVWpQE^n4BxFds3K}!6wk^D=%F&vN8-v8Jb4El8h)$40n0PX$SgpUylKPS$wqYL{^Fl?{){>#N zkQ#bT-bjy^(!;)d@p`xNlt}{B@aGbda@4yBo!fPUXS<>I7X<5%YCZAmGW(w-2$ttp ztQ98j&qY%i2QnD?aqmV#FpiS%h)y)GI~)3Mt-9SrNpwi3wH{JGVx6q&-+T4a0dlD& z;Y-P9)mf?qj_4+nz_N(cQWI@;Em(qBfILjL8W{_HYD(wVpbyg&dDa3#Bu}Njl?AN$ zQy~UufP?F=!p3?KPBUS^+BoEW;=ukm!)P$4RJn4qP`C$OQ}zZY#7{-cM0 z*c1T!*3hDrcgNFomoUu35$*wOtbk?ooed9G&E`vh}ZhNl8A zu7NB(H&sB1dw;er%G08Nz4(Fq`0Hh-Q!n7^zuLuC^coQK23eMDaG@Aan{nTX>Zm-Q zX#pOE@U$1*qD0X!-pn4lyiq7(@pksYZ556041Lh4CC$^=OZjh%!*;tPNtb1?)K1Wp z4Y|1fe-FMqkBi7~8s=q97$h+Xtf^xm}$7yS?^s3HY;34hgk^cu-LKds#Apf`UDaBcty01^jB<#Fv0&y` zuivDk8X`_O4^^cEdWA|1a&}NWTrI;7b%{?z53*+D>196GT98bX*uEY!*DRc$eO^}=cmYhIi%a) zt;_q}mWpKRn;#4n_Pc%iyP`V#0PJRS)5T^II?W7e&$;B7jc*hyKXqLvtJh^^*NrOl zEKhe?>X|V+ZTkDofkb89?Nec5k`;;Y7Vhix*i0hNld@gOPRbghfI$9s&%IQM5~)5_ z#z`$1j}uPcH{Ox=7s#GJX5@Ix#|Hhn?b2jLFQFDB z0_gFViS?Rj7MaY-Li=!i!A8w)hqRnt8yCkp>Zzm?C{&Y&iFQ=7kCZz0I&(f4=p>98g zJy8yQfBzdBN>hBuK-$>n*R6K`zKB!pyi)rjKuE9|-sHbBsQMm>ax#CUWahfbA8Q1T z{Al9%nJv`?4a7Q3^h7!M*pS^&5o3f z;%oTs$@O#lk#iA0l}BUNx0O}FiyVbRjR^xUqlqi8%VC>1pQ=ZYT0t4feb}-v9>F|M z61d*0MzD+O_22?C!IO2OmsGWWd9f=DMp6-;kWAs5rM#8gsBd!=MJj+NLgQOp^O&|N;SqIqA_mPs!j^TBB9Vk*sO;`aoe>%ib_xl z$MvAt2VbBZAc3MR5^YfPVw#9b0!ijV)rwC-#jy<_oTP>P59-OkwvwF!xq|Iz zXiMLBW+IN3zC6Q7iw{4P{N@kex(0_X72ncyCL;X_y<}}5Ht+!(V-68B?M{xRfV5wk z4+GyPcU24!wo_GU4^%3)~m<%cP}NRVxlb#m9{wY-_u1*FX_Kr^O)?kBeXa zw)cHQ1$5#KB(o;Dj;QZ6+^+2sxl=nUFPRiBLyVD{Eu(ntdP4!E*j#+uL=f)Qw~)Mh zF~)~M1G}*C#pA}@ZiS*|7^gCkNq#RUpQx9o4)G{#WaVF30L=)ycL@z!&OP7`&s^K9 zsV~ibJUy8^iy5v_f73bDqb&~5Gw28y1LYWCuuPpC=5BdyyB@+77N*J?^g+7-$?kd-v-F%zmV_{+BO(!OWCp7rklO@E|00;W6 z`{;=u%1Fh>ii;Qww}VgQk*9eulDLZ4EgZuQzDxHGQAO;dwtfzK0ehM3o#NbX{{@=6 zn5swdwXwCEn9IfSOg+(6#NG(tqGRtEtVk($U}5bMXc~?u(&TG~DpX#*1`;e-BT8Q* z!lWlIrB5}x&|0TQU}*H$4Tas-rrVbfoq>}Z0jR0IRCxQ>y;GyzK;-R*cSF>4PTQT* za)mknHj`1h8QCezhWN>P>&&QpjQ$w%sg+kEj`@mebH-~rAeY_lb4c^2syGnAr&lbI zKo6toyrdb#_HH7Sl}EEFRIdMO&eX?%3Gjw>uy<}goo=+#j5iGkQ2ry=*o@lPPPbzo z?`a-qI{gUcH(BYA2XV;3*rykk!*CNb>n)K^6GF{>zDoYzLK8Qd&@B0E_1 ze4aEh{&s=L3@6MlB{ufKp>ons%SEatm<$x-YJ@pPkxFTnPTK;gJjUf7Z5}vZt{K62 zu*Fe8{pw^((ecZlx-Gfh6a;CC>4V{$=Dr4bKN5VY`cc2DdWrId>XwNnc%pQv-T2NUzJt#A?|`s5p2Yt2`WCdGS-n`oe~4^$+BD-@;Vdw-oN8-j5NEvHm= z%?vla;JdWv;KT)bb({HVJnH~FTR4OiM2v$Yl3-GTPrqs34znM|E74@M3BxqEQp0`} zBv)(b$tUFPyHU8z#pi3?#vH{3*6$aBjN088WVcA(TlqrsQNMdSdMnJw)np6cAKYp0oQk z)vYOqY*7bLrLc7v*}xBBWsE>tcN-PwjE73hn@Hh=YrO1NfC4$`A^J98^+la70Wn@SEq|OEi)t>L)UTC5RGKzMoxrHb>Ub++~f6pK5k6-_@ zrTDPbM$DWHHu!C$iVVi~P9^oqKfQT8wsG-M2Xp$)L@X1MF?Yd($ZFkzRa8X}86@={ zPjemjOt^shzXuOHU(V1!{lrb$%bm)&qh))(iK|IGzpp&N@@ib`_xDa)zZyTPJCeNU2?VL4J`ESvJMCM!G!zCn zKF9~x*g(wKuIdk)4dgY6TxO%W?F3xpGzaHk92t`B?zMWUIz^PoaZ9>OzEz%LVOTi< znwY(X;En=uJh-5n?sP%d^kH-K+lK@dcj8|y&CnLno>DMwZE^BDHpe{p_xM@~Ef&a+ zKm50H2q}%zm_r^J7otAG&JBi?bLD?e6I@7mziesul}WU^+Sa;!FPIgXDs&kC z@)q@?I>+)epe6#OGlF7y5I6BdSS8}LB=)Si|7^4)4>l+j_oJfH?BIgCzqKM~!2J#e zyME2O+sG~SGkIQI#ewAkw(F|Xkd0Xb6tVYncgtKb4uES=tMw_-`V`F0v7B>e{I;cRot>lr2-NK+Kj1yB1V{zsaIP1 zdSs|qvS)z9&7ik0V5^?#2`_tXJn#o$edW9EPvL02aLWYaZTZX3t}G|{=^+`Fsg##j zd2<_|e$-^PBKpB75<&{K5B*@M^#JNhljjoY#G&!AKQ+Oqkf;BL@Xu#Z%dc1>$reJ_ zM=-oI#hD*^Z6XIyM<{kviVtjTNRW+)B|CC#C*W?$O#?qL!3*TmjK>kWX45u+pdSzj zIt6}%K&8~`cv?)^aN`V$W?|Gmy21?GyUI&Dj3Hi`V`bMBf4ybH4IPN^v3^h%kh{(8 z$H8q)#kKiIRwZ0MDpmBUCCJEnnC_@3F`}mbzHX)YT7-{BOmp~~3_@mH#%a}2wDH}E?xR@s@p6;M@ElH);!-e&Y~4+c%qCWKX0vj71Ig)ibN*WEm~Hf z{zQ6UhaAbc9_4Zta*N*9T-qjQejKdw@`3}d&$8%>@70IRBjJ7`b3wq3ID&DlU}7}7 zHmmdxkO^!tCAe~+L$x~QmN<6MUd>yJOA}KY<6oQ5eV;shKCO_gHj%;0g&e6^MOD{_ ziGfMFFo`mZh$xK*`>4o%+I$a7{Mu9QJd&zre(NUQ7ZbJvEP%x6m+zYw4G5dNH~yMH z`|O(Rpa0iZuleILg4Ij+w^bY~X;Jfy?1XUKU)_fK52j4H|&>$_V z*!q7YBrX=~p2I;oMQ<}Uf|=Ws^)(n72^liDdT;x;m24VShq1>r$OO2x?zPU<83}I; zAlTiF%rgL5dcVtrC>}GDbTaaDRlIS-_FuRBd7JNUIJKAa=p>q9bE!gOEnedLrB^RRSN?y+HMy+^pv)i9$7hKe$cs6YG`!DwgO#a{t9jng7qiTa@{e zN&=DhfEmiD?5>0EUe5ddHfh05%0?vDRhR|)xs;!{iC+U6EGFSj=2s%5?*XB=3rloR z4x7AzUr$&8coFA+v9cDGKa@^8Itp)6^1P#G>b?K`mWZxm()?x0d^IF=*ah#Gh)Uq% zrlKu3j7(9X_c@6}u*cF#2~SKTXT5ibdggpjRSE9D+Ep#8eUI3S1Rhd9YAN-d>>nU752YoSSCi>;`p#Ti*!w~S%38ij zzC0MpohBR_zT|}EO=gov16N_ymC_Vx?&oSd>WUe0^b3mod0D_4|~QPbA6(0ER(O?n^oaKws=y?rUn$Y%ol{U$FJC>e9l^#MUr-T8ag z$4)pmb4J*GuVA*Ry?8JL1gwC3tN%1xi z5UFg7*!?cJ0^G;uZ2W@6iAAU=^>_RYM~{hBrC(Wdt?{GRWe6m?<F3fxGJ&By@InIA-3NygG-7I$f_teCZ~V zZVkE{*K@LKe==11^600O{GYv(cX#u>LuZ=2#}B$Znr7aGLMEyN;%~W3c(Ds5*h1}_ z8H2q4Too%|pKc*G+mQ|R9UW-#6VnYBUga)QEMbsd8Z;;ntj#l`m$? zRfycTv|A7h&xQ#)DV@)VFe2$NX&)Q!wCx*L{Fn`0B`e4xnj#}ak6%2~5#gn?zReRW ztYjMvWbsvJ)VgTJGB5_^B;rBOli+1EhWW+5R0xNZAx_IMSWwA_#Z06x`6~&M7zP-+ z?zqxiRQvvwJ5`rJqGNknvu3`Vy5~L&dvqK#(XqcvUzF|V@ zx>b0M0267rUd|W_G?^InCpcB6)Cz}KRjH_b*eAwDPzaR@EtTa36%{em@VAR4-DGy{ zWt0d%DtZ7#$@<|AQf@R6mZLW$pg$^{&r|0d)(L?jkNnszrCF;!BV3~LY?7pFuey2o zYhI1oZ71-Q5Gdlf44BC@-<%6P+Ps@})Nr!=tL|>Cw8G+h|e3x+Jwv*VW=G<|-Ixc;c~x1g2^6@~FK-pKOVl_b-5N z@bjm)85lwh_($~p6sGtxkGCCNQy~K}=0e6cAUlT5@7s z4acav`6;+8pyXoCyf^eoR^6^~+_HA5+|Yh~rdG!tp@YvCa>%Jycd+hHJPKF-unyy1 zKAXh)ftP81(!8}lB9>cw!6iOewVLmw6QZd#$bL@oWnII!(7N4@Bo2OJ9?g)!-RSoA z<_?lK(tI?emTo2N$dHJDh6t8KU%N`h(rpX`Fi)-r@ljg=d-@%H7Gp_t(9bQ2r>)t(!gEw zSiGeTD*43xeRRYHaMs*@6-+O_w~t8*WCi+%#If@Lk2?=Kd2Y{L4O~--{gGE*o)x&i zVFO~4<|#dR($3IKv_I#{S4k9R*tcEex902lRsdL-)+#BJED!KULnS-C>;72mS!neY z0*wA3_A=?lRc5dI_6O$F2%*rJ(9X=t;qIUZEz#f36~4V7`4FX%_tjF^t1ANRjLFLj zLTQtVLT;Ocu^7PHs`Ein?`@ks~nhQbL6@aJkOCStAL z=kO?rZ*o=n3zpL-ebV9_Urw{cROmY@9+#sdjq~^+KSNjPMWJIa!n!B<>3b#6ZV z6TE({r?dfo{HvIFkqu3~v9JJv8R#|lJ=S{S+gAk`RCpyjw}cB`rkzx;E8WZQ=WxEg z;8lt$&wl8Q=q>JH=+nT1Aaw})XVyr1ea4^8kn~34yIEjiHm^VK!Nxh$$U;?mXtg+c zK`D_vzOT&=Mg@+odx~n2zE2{)IDJ5h0?F?;yhS+CIGGcP?aCLDx4w+Ja?)SB{autmEuCgno zf5fP|c8qpzN6`|39Iqi~L5?F4Tb>e`^KR3q;XP)%Euz}Wm4xX<9v=ok&A0)Wm9ufx zdw&G#r4ObzK3riZ+FPg3+8^@yop^Weo@hFVum>OMh|oThIPc3 z1?u4~g;#Z`5plp0R>l@rA7erd@*&Oyp@ucKeydDdiW!r*lYil4>vF6W{RZI(k!~h>@Rm^^*N_=SoX5`htTU3In3BJ+%UrqR4ZfDE5s)kN&U)1ice_{`hxLW6j|U`823dY<95ln@JTL?IlKJu^^=O2bMF? z@eG!Q=ytz{wdF5@BfhV)~!Dt?zq5Al)wY!9Gyc+^#JN;aOd`y@30ygYO zmZ97BaU&!n7!2}os~G6q!}i45&HAi6o@f8HtNs`mf3cFO76Goj;VHivHKaE0M3(l6 z%$<_DeAUIF>waH4)dLuCOEG+E{U*HR-~wjCsMm>O+Xk);Zvk#I_|>`Z{t#@fcUdVM zo1oHTGrY&5ULI@+eWc~0!t9){1Kdvpk&a+A3F*NqaXT>zlEWHsAA@nV=I4=?ThdMi zDfc|&Tn{ER6K5~@>@6*vM6J5DV>zpDz4SZSn@)FS6Uc`m2{c+lkYL%@kz0Yzr zjS7;cVi1Ia>%CE&57LfCai6nx=H4#ArRqypvQ>7IEen#lAz6w+2AC;-xNMv}1Y!h= z6%KjF=2RuT_G687`TPyW^ExA%dG(!vY>FL2DD%N~!-rT~fu^S&R=c+O%RiLX@mCABO$u5&7Nv6f;+macM^dyHYk zCRukxFW*KiB)1bk(!K2F2h;Wv-?qcOU&0C{zU+?3BY+t&rho0_Xc+7$pz~r$4vrkr zemr79&hqkthCM!kXEy~HKII0!^_U1c+TG9dcgv5txw$r*GJ@)zlRtbSLjcUSBxM%l#v& zH_D+Kv+68N$B$5r#8}&@T{ELpbQOlHrJmQmlK8l8C;M^-Dchy{R`$?4MV?(D8M_2VJHHvLF6RGtUpBfDE4k zV0(42-bw*?vt?!;9S+2^gWG!vqyPY6IgU^?;nRG&ySZ;p3b+m(jAr$6@$iyq28J9U zonO0Q?~AF>ApZrcXOF}gdl7c`0I=G%e)r?C@EQz~4FN^<+sEvy(iVTssooJca=qI5 z;$qCwMLn$wJAAJ>wQ}(-ZGUwwwhHAp=yL-LC@51zja3EPzDFV;zFwOObtZ;r7Y=B< zDj|R%;^;+iqy-T$t$BDpA1PgJ!^K>GFu$>Tr2uf|Prvdm=Ipe41LR%?!t0RmS)UpBT~SYhKRi4RlhzY>HesviDw`mmMlIC- z!(xHhuZq!+gc883hj_&%;n_Yp6duTcxNQ0*@|0rX8iB<4z|-B&{?gCucrm?{ddZDY z7ZQ1V6gp0MSanbBhf{ot#{u{>Mh1(&8g?_|V7ihD(Rs?mW|bh6;VZNAzSmHwYv3-^ z(CTosv6p1U{D(z7hy7Uy-gmGM@>CA|vN7V7g*y|2@l;1>V+k8E|bs zvqSI%*S3@IX$wcn?6v$p_0K#5j-yszax{xo|8rYH)qYPaO#fybuQ|~g@M~F7} z!P>)pdIB0K5D|>~v)AmBuj!!!6aetJB7tX^?He&GWQYP7NfrCzmm|uJ1v4hC>G8u) zJgz{7@R$U69jmFI5$khzE#&Kwf%`N7J2_p>=3h4QD66XLYNqR1`!95#3Ne;(%C3+t zeJ;`FXDItVlgM)isoxcyE>Ts~XS-NJxb#Lwe4OfDT)DQJlUSJVXd{r#U3CPV6J{IO zFHZbRtrBcZB4^z7Kj-Dhu(Z|!2f#{Jo<@U(JY`W~YL28vvJp5d7q2?5xlWHneNQ!F(ymFWLU= z-OLUtofUEasrx3d!+-dq1Zvn9Q7@Np@k=CfM9A?*`gd%jH(u!jvOTIsaGoz1oICQa z>TZ>BZ}>b9Rjg20=(T{2$x&F$;sn`049oHoJi^^doL-nOxoTjI48x^M-mv~?*x5~auJBVgWb=J1a(yg|b z365PCGE!3Y5`@EA;Ig}sJi`XCI$!4EPYh1oSG2}|WHVjr#OBnng&7qle;!ae!>+{= z^mV`#BnPW6_Nw)Z83BWFD*Vp7}-qyHr6UCPv^&v?$}iq0O5orsngbWA7k>6(oKE~U6%kl#)PaI<7&EZ zqpfv|V;oHMNF0F$ZotedSGpL})8_cEEI>qF@b^$MJmbGzaB{Tek#Un52H9=}FXjEg zhh!Xi4lG&9`6WEv=8OggnrO*l1uk0Y@s|if%+4c)fotnFDIbQBO3Q6q^N=5g4?QrA z_rA96eNU5y=14HD)&OYa;x*ko9Rd)uk{PywVuZKnBYx%N#Sag8*IJh(k-04GFBfOn9qlxvTh}E zF!_xCOw_ZW4C1r7UbnOUi~VvCK9m>*!HZsPWdYK7$3T*m&r4Somtx`X_IvAwLO=}g z52uxi=P%K5uYH6^Wgk<9wR9(R+MoKQtZWXGy4A1*;B~B#lNE8O(2Er*`EDcQxDiu_tY*)HmFG zHqF)74Hqi2Uis)UmX6EjT@HM)**|uJEnxo--{R)t;oZfKOp%s8LOG`XrySc}JR=aE z?&%iNlYosDbO&Mng&A1|gi|cUSO0^a0>Jq#ioukg=}ujhacB+mbux5y(MPE_v;Oh| zcDP2)%fiX@Q|fdi`&SZU%Yv>XtCs~$IhDy5*&4p)?@u-5qHGr_5oe}-sFQmNpx`TV zDC`}#ieOY^cV4*_ckIh)hv8Hm6BRUI8Dx*kqClWcZ9Hmxr`!0|Q2e_w3;#zlrGq$d zi4Y|7Ufd4un0b>&N7yD%IWhA%X9xmgZcU(KN4{6Iv7_j%x^a&hNTE{@x>u2Z?`6*b z*6eSSv^;x;uau5~<=hI*S-=qIvfJKo#pnEd(+)NHa?aD2;^u=PFItog$DBnZvq!qS zo`*-guDrZ@!G+!d0iK!g#79X+2-t@k3>_*2x?lMdtxmfDzFp=V)^!>!zdu& z2KbCBkJ`)*59urv_8$O~seb6=ffJF^duInYo%`?WM%hmaubt6dppe9%k*NUV z?I%!1Baw2GCAc#{8e3>QUNaMrmuqa?Ob}5aN{n7L;rOhY#!q9QDebg#l`ckDDX-4b zmKu@2>Xe%3(1p#>$qzRgg@*a&<$U7yeck(NfZJi11XlMEkL$w&b{KaYo3bOz$?9SA z6lz-{BP!1=6g$N`wDo)~de&|+MShiUPj$7no6G7v*EV>tvMKlSROpWwC?MtB5iPMN z`L;#6Jh?(fLwbiQfsX$XIj6uRMQJ?14!}Wy-2~~vQwsmJwBFCp?RcBJHk}RaWOw$` zYn9HZ|7zmDGf$iWqOLp>m^pu3?b8d~w9(Q>GcV(6D4>x?)MYhKx|)MxVvVg^v7BIm z1tsy<{lR|wAp{dHbY5SC%;{4z zkw_`=-Tf3A%hA;OJ_#EfrUca3PKsAFvWp|wDYa<_Tl{)upJ3Lg`1vYF6%RoT2HhKh zp{n}%N{Q`KZQ@ylF^HRxFZ`^bQC+g<1$HEhS}lsLRn09pXojK-750OSU_MVRo^!?p zkmDz}oOrxC0GIb*Tr!XppC`+GhGHGp&v2}o@}4omdF4h?o7D*(>;gu&F(?ak`@6{i z5;yhl0|^v4fwzjv;2DvF>X+%+0M4D+)znED{b|Y#KK6!RSUPv7m8grL5e(ZuQ@#|j zWVhH&_8Xq7nYUxfue>W`l%iT1tm>-PyYSF{vG;y|UY8<$s9El4f;!7mqSNKLRs;GK zTWZGnn0^N(C%)ug5AedSr6Q=Rj;)R^Z>2KfHBZqLk8PP^YsW5|{(>FFbLQj1cF!Vo z(|&36tpy*y-KpvYM@~5QcFa9j72|)oBg^CU6%efgG4e&pC%H1!w*tI3$N%JMScv5N zxn4Y5{3oun{eH)L4m&07R*|9%TAX&UXz6S5YTd#Q@X8Ob#r~RJ3~kZ|Q&s$zoKWe$ z`x!gdgzJoL=}Y^XE6Fm5z{sc5o$3jcnNrQYX-OJJrqo0ia8UY!aw3hK?R6=HDfRNh zOe3{^zFXRPUHG5nf8L3dR!||TzU0P#ns{L3`mn~z8}ZBNK~*I3^T~7Xs65xRYUP5y z=ixN-c=)C7#`aE=fw=$v9)Eh=aitX7nhT_)t;WJ+wBwbV7)9c)5^r#rFFZuq!6$f` z^QNf(!+%OO;lQ8l%moHy0m|3u(r53Vbu2ziE?YVaEI=L}n7P+6216v*rWd1I&42s| z7y_fea?EhJ7YbI2Wt(hRe{6d5prwm>tZz}2vD3VKN|9xHk)I>uW^gCbGXk(Tqa?GV zbF`#uczo?sr*PyL~qU0lB8gAk% z^MIg}0LYDQ+ol?l$ogt;clsrM|M~sYhg()#ZZSh@fwf0|;lAWFb{W?(a7Hnw-k-sY zR20N|=NU&8iIr(+KtTzr9&MpKJ7tYe7A<`mUB3`yOAU{B6@s?@N(kb&(GnGtx4O8V#JQKMpx4FR$M`PG|kYd0a~dGmXc6f_zYwqR|+=xZ-#onB$|C zZNCEhFzpguP4w-tOXU@D)sNGscuy4%P6M=ae-ap~_p6(sK!goZcn%wV=WoK)zS?5^ zLMN?5c+^Y=tueM_S!rNgU-?l8X>Mq$Gnz>>Iqy@j`6WR{UzEuBzc}@Ky(_F>bkd7g z5C6)rRSaWD53Gp(Fx#X!%jX87AS426#`l6>nd=Rlm{BrKH>bX^86*%MF={2wuD&O1 zpAvJ8nBx54wGxVwa^0=#wCAJ{px)g315?1S7~t4Jhw?q@k5W{{{r-Gouva+Qo@oQB z!x;yE1Ucj2W63h-HBuHZz}EwJU+$T!B!k(>Ha9v2S3kXlsB_=FpQBV^{`4-LN^i~s z;VrH$%)gY6IC4l$7STC~0atFquOuC2D$>}URxW1d(`rEs8({hA7E?WENQ`MN4& zHH`Z1e*=1M1%D_&z(ISLq9-tUX#J7aN5_%4sl|uL3mP+I!MN-176d05I##ORDDJ2A z2AekE3jSd6P9m>AG44B)Q9&sh1B!bDmxjGlv+N@h;E7F`4SPJcjlpLedJ^u^iVDFpgT~i z^kAHwkfZ0dGBh+D%lX~XD)Z(g4p!x*SW2np56%SZjh%)1!||jiGcsYuCU|@a`)v+& z2T_tYIOQ2hXnsvySdcMoJrOX|9Pyy4k;kBdQl)f|wJa|<>N+xqgQ=ICwVg(qzZG%I zRUU2=@n&OunkZt&p^_( zUOvC=Ohe-FVLjUlvhjE6HB1i%e!2}S>;;Wtr#8a%quebBQrJl7Q2-S}84z8o|6M}% zurDXDdS_n*UQaE!FFr|oUX?DGG}+yo`E$8d6+^!A%$_&m%%967%*LTesDS@Sl1B9cy<}BgrNw)RqwH)oowl|}!n(eb(46~%>5ExhAtTLS zO^$n+MRAFj^u7$|rEnuX9NF>3px>P*dnbQ3N)JW{|4|j9v$Cd_H7qjC@7)9LB*Fbt zJ(vF~Y?n$ANHf0wv+OrEzz^Q0I#quvuNYQ+hGB_7hu3Q>k1G^VU#&0rA7w3>g zbijQvP5Q1f!%+IFeMHbk)z>Uw(CR{))Wr{$rz7Nvhu$&raWaZ2^EOT`ePm4+nThx; z2R2YpR)?TrQ+QkCD;i{(;UajC!ymFhhA6qQt74JR;Rr^*4}LS zNhfve{)$)7DblWMqy#~jbHDhe%L<>@7wQ}JGJ)HRmm`wbO8yd+*hGSn*io9E;wY6t z0$6MRqa;*LID3lSnZwxR0;jIu`{}pyJ@`ZTa(h|Tq!QZ?VKFNDGqH_ zI5o{eI?EKt?HOHb{dRxFo5%pK**%0AJnFXtQ}UI##Py-sk~Y>^ZQU|@U@7(tI_ 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 Ba_Rs8 literal 0 HcmV?d00001 diff --git a/img/tl_white_logo.png b/img/tl_white_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a42806d2026db643b4804914bc3a09f902dbb0cd GIT binary patch literal 83507 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%0A%rVo&u2i6PE>n8 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 ZR0yUkB(!S7gWd>)f}E;s?rlTw{{f9$#Cre$ literal 0 HcmV?d00001 diff --git a/requirements/requirements.txt b/requirements/requirements.txt new file mode 100644 index 0000000..f251c65 --- /dev/null +++ b/requirements/requirements.txt @@ -0,0 +1,10 @@ +imageio>=2.5.0 +numpy>=1.16 +progressbar2>=3.39.3 +requests>=2.21.0 +scikit-learn>=0.21.0 +scikit-image>=0.15.0 +scipy>=1.2.1 +wrapt>=1.11.1 +h5py>=2.9 +cloudpickle>=0.8.1 diff --git a/requirements/requirements_contrib_loggers.txt b/requirements/requirements_contrib_loggers.txt new file mode 100644 index 0000000..245d842 --- /dev/null +++ b/requirements/requirements_contrib_loggers.txt @@ -0,0 +1 @@ +hyperdash>=0.15,<0.16 \ No newline at end of file diff --git a/requirements/requirements_db.txt b/requirements/requirements_db.txt new file mode 100644 index 0000000..f9cb647 --- /dev/null +++ b/requirements/requirements_db.txt @@ -0,0 +1 @@ +pymongo>=3.8.0 diff --git a/requirements/requirements_dev.txt b/requirements/requirements_dev.txt new file mode 100644 index 0000000..ef32fc1 --- /dev/null +++ b/requirements/requirements_dev.txt @@ -0,0 +1 @@ +autopep8>=1.3,<1.5 diff --git a/requirements/requirements_doc.txt b/requirements/requirements_doc.txt new file mode 100644 index 0000000..02d813a --- /dev/null +++ b/requirements/requirements_doc.txt @@ -0,0 +1,8 @@ +flake8-docstrings>=1.3,<1.4 +pycodestyle>=2.5.0 +pydocstyle>=2.1,<3.1 +sphinx==2.0.1 +sphinx_rtd_theme>=0.4,<0.5 +wrapt>=1.11.1 +h5py>=2.9 +cloudpickle>=0.8.1 diff --git a/requirements/requirements_extra.txt b/requirements/requirements_extra.txt new file mode 100644 index 0000000..3a818c6 --- /dev/null +++ b/requirements/requirements_extra.txt @@ -0,0 +1,6 @@ +opencv-python>=4.1.0.25 +nltk>=3.3,<3.5 +matplotlib>=2.2,<3.1 +requests>=2.21.0 +tqdm>=4.31.1 +lxml>=4.3.3 diff --git a/requirements/requirements_test.txt b/requirements/requirements_test.txt new file mode 100644 index 0000000..e47c0ed --- /dev/null +++ b/requirements/requirements_test.txt @@ -0,0 +1,9 @@ +keras>=2.2,<2.3 +pycodestyle>=2.5.0 +pydocstyle>=2.1,<3.1 +pytest>=4.5.0 +pytest-cache>=1.0,<1.1 +pytest-cov>=2.7.1 +pytest-xdist>=1.28.0 +sphinx==2.0.1 +yapf>=0.27.0 diff --git a/requirements/requirements_tf_cpu.txt b/requirements/requirements_tf_cpu.txt new file mode 100644 index 0000000..72e758e --- /dev/null +++ b/requirements/requirements_tf_cpu.txt @@ -0,0 +1 @@ +tensorflow>=2.0.0-alpha0 diff --git a/requirements/requirements_tf_gpu.txt b/requirements/requirements_tf_gpu.txt new file mode 100644 index 0000000..25247e0 --- /dev/null +++ b/requirements/requirements_tf_gpu.txt @@ -0,0 +1 @@ +tensorflow-gpu>=2.0.0-alpha0 diff --git a/run_compile.py b/run_compile.py new file mode 100644 index 0000000..495272d --- /dev/null +++ b/run_compile.py @@ -0,0 +1,74 @@ +import tensorlayer as T +from dragon.vm.tensorlayer.layers import Dense +from dragon.vm.tensorlayer.models import Model +import dragon.vm.tensorlayer as tl + +import dragon as dg +import argparse +import numpy as np + +X_train, y_train, X_val, y_val, X_test, y_test = T.files.load_mnist_dataset(shape=(-1, 784)) + + +class MLP(Model): + + def __init__(self): + super(MLP, self).__init__() + self.dense1 = Dense(n_units=800, act=tl.act.relu, in_channels=784) + self.dense2 = Dense(n_units=800, act=tl.act.relu, in_channels=800) + self.dense3 = Dense(n_units=10, act=tl.act.relu, in_channels=800) + + def forward(self, x): + z = self.dense1(x) + z = self.dense2(z) + out = self.dense3(z) + return out + + +class Classifier(object): + """The base classifier class.""" + + # TensorSpec for graph execution + image_spec = dg.Tensor([None, 3, 32, 32], 'float32') + label_spec = dg.Tensor([None], 'int64') + + def __init__(self, optimizer): + super(Classifier, self).__init__() + self.net = MLP() + self.optimizer = optimizer + self.params = self.net.trainable_weights + + def step(self, image, label): + with dg.GradientTape() as tape: + logit = self.net(image) + # logit = dg.cast(logit, 'float64') + logit = dg.cast(dg.math.argmax(logit, -1), 'int32') + # label = dg.cast(label, 'float32') + # print("logit :\n", logit, label) + # loss = dg.losses.smooth_l1_loss([logit, label]) + # loss = tl.losses.sparse_softmax_crossentropy(logit, label) + loss = dg.math.sum( + (logit - label) * (logit - label) + ) # dg.losses.sparse_softmax_cross_entropy([logit, label]) + accuracy = dg.math.mean(dg.math.equal([logit, label]).astype('float32')) + grads = tape.gradient(loss, self.params) + self.optimizer.apply_gradients(zip(self.params, grads)) + return loss, accuracy, self.optimizer + + +if __name__ == '__main__': + dg.autograph.set_execution('EAGER_MODE') + # Define the model + model = Classifier(dg.optimizers.SGD(base_lr=0.001, momentum=0.9, weight_decay=1e-4)) + # Main loop + batch_size = 200 + for i in range(50): + for X_batch, y_batch in T.iterate.minibatches(X_train, y_train, batch_size, shuffle=True): + image = dg.EagerTensor(X_batch, copy=False) + label = dg.EagerTensor(y_batch, copy=False, dtype='float32') + loss, accuracy, _ = model.step(image, label) + if i % 20 == 0: + dg.logging.info( + 'Iteration %d, lr = %s, loss = %.5f, accuracy = %.3f' % + (i, str(model.optimizer.base_lr), loss, accuracy) + ) diff --git a/scripts/download_and_install_openmpi3_ubuntu.sh b/scripts/download_and_install_openmpi3_ubuntu.sh new file mode 100644 index 0000000..8aa233a --- /dev/null +++ b/scripts/download_and_install_openmpi3_ubuntu.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +set -e + +if [ $(uname) == "Darwin" ]; then + NPROC=$(sysctl -n hw.ncpu) +else + NPROC=$(nproc) +fi + +mkdir -p $HOME/openmpi_tmp && cd $HOME/openmpi_tmp + +# TODO: upgrade to latest version once https://github.com/open-mpi/ompi/pull/5296 is in the release +MPI_MAJOR=3 +MPI_MINOR=1 + +VERSION=${MPI_MAJOR}.${MPI_MINOR}.0 +FILENAME=openmpi-${VERSION}.tar.bz2 +FOLDER=openmpi-${VERSION} +URL=https://download.open-mpi.org/release/open-mpi/v${MPI_MAJOR}.${MPI_MINOR}/${FILENAME} + +[ ! -f ${FILENAME} ] && curl -vLOJ $URL +tar -xf ${FILENAME} +cd ${FOLDER} + +# will take about 8 min or longer depends on your machine +./configure --prefix=$HOME/local/openmpi +make -j ${NPROC} all +make install + +rm -rf $HOME/openmpi_tmp + +echo 'Update the PATH with OpenMPI bin by running: PATH=$PATH:$HOME/local/openmpi/bin' +echo 'Update the PATH in ~/.bashrc if you want OpenMPI to be ready once the machine start' diff --git a/scripts/install-horovod-for-doc-test.sh b/scripts/install-horovod-for-doc-test.sh new file mode 100644 index 0000000..22c0558 --- /dev/null +++ b/scripts/install-horovod-for-doc-test.sh @@ -0,0 +1,15 @@ +# This script is for installing horovod on travis-CI only! + +set -e + +[ ! -z "$1" ] && export PATH=$1:$PATH + +mkdir -p /opt +chmod a+rx /opt +cd /opt +wget https://github.com/lgarithm/openmpi-release/raw/master/releases/openmpi-bin-3.1.0.tar.bz2 +tar -xf openmpi-bin-3.1.0.tar.bz2 + +PATH=/opt/openmpi/bin:$PATH pip install horovod + +echo "done $0" diff --git a/scripts/install-requirements-for-rtd.sh b/scripts/install-requirements-for-rtd.sh new file mode 100644 index 0000000..fd0693c --- /dev/null +++ b/scripts/install-requirements-for-rtd.sh @@ -0,0 +1,28 @@ +# This script is for installing horovod on readthedocs only! +set -e + +pwd +SCRIPT_DIR=$(cd $(dirname $0) && pwd) + +[ ! -z "$1" ] && export PATH=$1:$PATH + +LOCATION=/home/docs +URL=https://github.com/lgarithm/openmpi-release/raw/master/releases/openmpi-bin-3.1.0-rtd.tar.bz2 + +mkdir -p ${LOCATION} +chmod a+rx ${LOCATION} +cd ${LOCATION} +curl -vLOJ ${URL} +tar -xf *.tar.bz2 + +pip install tensorflow==1.5.0 # must install tensorflow before horovod +PATH=${LOCATION}/openmpi/bin:$PATH pip install horovod + +# install all requirements except tensorflow +for req in $(find $SCRIPT_DIR/../requirements -type f); do + if [ ! $(grep tensorflow $req) ]; then + pip install -r $req + fi +done + +echo "done $0" diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..67f86fe --- /dev/null +++ b/setup.cfg @@ -0,0 +1,79 @@ +[tool:pytest] +testpaths = tests/ + +[flake8] +max-line-length = 120 +ignore = + D301 + E221 # Space before equal sign + E251 # Space after equal sign +exclude = + .git, + venv, + __pycache__, + .pytest_cache, + tensorlayer.egg-info, + build, + dist, + img + +[yapf] +based_on_style=google + +# The number of columns to use for indentation. +indent_width = 4 + +# The column limit. +column_limit=120 + +# Place each dictionary entry onto its own line. +each_dict_entry_on_separate_line = True + +# Put closing brackets on a separate line, dedented, if the bracketed +# expression can't fit in a single line. Applies to all kinds of brackets, +# including function definitions and calls. For example: +# +# config = { +# 'key1': 'value1', +# 'key2': 'value2', +# } # <--- this bracket is dedented and on a separate line +# +# time_series = self.remote_client.query_entity_counters( +# entity='dev3246.region1', +# key='dns.query_latency_tcp', +# transform=Transformation.AVERAGE(window=timedelta(seconds=60)), +# start_ts=now()-timedelta(days=3), +# end_ts=now(), +# ) # <--- this bracket is dedented and on a separate line +dedent_closing_brackets=True + +# Do not split consecutive brackets. Only relevant when DEDENT_CLOSING_BRACKETS is set +coalesce_brackets = False + +# Align closing bracket with visual indentation. +align_closing_bracket_with_visual_indent = False + +# Split named assignments onto individual lines. +split_before_named_assigns = False + +# If an argument / parameter list is going to be split, then split before the first argument. +split_before_first_argument = True + +# Split before arguments if the argument list is terminated by a comma. +split_arguments_when_comma_terminated = False + +# Insert a space between the ending comma and closing bracket of a list, etc. +space_between_ending_comma_and_closing_bracket = True + +# Join short lines into one line. E.g., single line if statements. +join_multiple_lines = True + +# Do not include spaces around selected binary operators. +# Example: 1 + 2 * 3 - 4 / 5 => 1 + 2*3 - 4/5 +no_spaces_around_selected_binary_operators = True + +# Allow lambdas to be formatted on more than one line. +allow_multiline_lambdas = True + +SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT = 10 +SPLIT_PENALTY_AFTER_OPENING_BRACKET = 500 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..76ac682 --- /dev/null +++ b/setup.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python +import codecs +import os +import sys + +os.environ['TENSORLAYER_PACKAGE_BUILDING'] = 'True' + + +try: + from setuptools import find_packages, setup, Extension + from setuptools.command.build_ext import build_ext + +except ImportError: + from distutils.core import ( + setup, + find_packages + ) + + +from tensorlayer import ( + __contact_emails__, + __contact_names__, + __description__, + __download_url__, + __homepage__, + __keywords__, + __license__, + __package_name__, + __repository_url__, + __version__ +) + + +# =================== Reading Readme file as TXT files =================== + +if os.path.exists('README.rst'): + # codec is used for consistent encoding + long_description = codecs.open( + os.path.join(os.path.abspath(os.path.dirname(__file__)), 'README.rst'), + 'r', 'utf-8' + ).read() + +else: + long_description = 'See ' + __homepage__ + +# ======================= Reading Requirements files as TXT files ======================= + + +def req_file(filename, folder="requirements"): + with open(os.path.join(folder, filename)) as f: + content = f.readlines() + # you may also want to remove whitespace characters + # Example: `\n` at the end of each line + return [x.strip() for x in content] + +# ======================= Defining the requirements var ======================= + + +install_requires = req_file("requirements.txt") + +extras_require = { + # User packages + 'tf_cpu': req_file("requirements_tf_cpu.txt"), + 'tf_gpu': req_file("requirements_tf_gpu.txt"), + 'extra': req_file("requirements_extra.txt"), + + # Contrib Packages + 'contrib_loggers': req_file("requirements_contrib_loggers.txt"), + + # Dev Packages + 'test': req_file("requirements_test.txt"), + 'dev': req_file("requirements_dev.txt"), + 'doc': req_file("requirements_doc.txt"), + 'db': req_file("requirements_db.txt"), +} + +extras_require['all'] = sum([extras_require.get(key) for key in ['extra', 'contrib_loggers']], list()) + +extras_require['all_cpu'] = sum([extras_require.get(key) for key in ['all', 'tf_cpu']], list()) +extras_require['all_gpu'] = sum([extras_require.get(key) for key in ['all', 'tf_gpu']], list()) + +extras_require['all_dev'] = sum([extras_require.get(key) for key in ['all', 'db', 'dev', 'doc', 'test']], list()) +extras_require['all_cpu_dev'] = sum([extras_require.get(key) for key in ['all_dev', 'tf_cpu']], list()) +extras_require['all_gpu_dev'] = sum([extras_require.get(key) for key in ['all_dev', 'tf_gpu']], list()) + + +cmdclass = dict() +ext_modules = [] + + +# Readthedocs requires TF 1.5.0 to build properly +if 'READTHEDOCS' in os.environ: + ext_modules = [ + Extension('install_requirements_for_rtd', []), + ] + + class custom_build_ext(build_ext): + def build_extensions(self): + os.system('./scripts/install-requirements-for-rtd.sh %s' % + os.path.dirname(sys.executable)) + + cmdclass = {'build_ext': custom_build_ext} + + +# ======================= Define the package setup ======================= + + +setup( + name=__package_name__, + + # Versions should comply with PEP440. For a discussion on single-sourcing + # the version across setup.py and the project code, see + # https://packaging.python.org/en/latest/single_source_version.html + version=__version__, + + description=__description__, + long_description=long_description, + + # The project's main homepage. + url=__repository_url__, + download_url=__download_url__, + + # Author details + author=__contact_names__, + author_email=__contact_emails__, + + # maintainer Details + maintainer=__contact_names__, + maintainer_email=__contact_emails__, + + # The licence under which the project is released + license=__license__, + + classifiers=[ + # How mature is this project? Common values are + # 1 - Planning + # 2 - Pre-Alpha + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + # 6 - Mature + # 7 - Inactive + 'Development Status :: 5 - Production/Stable', + + # Indicate who your project is intended for + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'Intended Audience :: Information Technology', + + # Indicate what your project relates to + 'Topic :: Scientific/Engineering', + 'Topic :: Scientific/Engineering :: Image Recognition', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'Topic :: Software Development :: Libraries', + 'Topic :: Utilities', + + # Pick your license as you wish (should match "license" above) + 'License :: OSI Approved :: Apache Software License', + + # Specify the Python versions you support here. In particular, ensure + # that you indicate whether you support Python 2, Python 3 or both. + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + + # Additionnal Settings + 'Environment :: Console', + 'Natural Language :: English', + 'Operating System :: OS Independent', + ], + + keywords=__keywords__, + packages=find_packages(), + + # List run-time dependencies here. These will be installed by pip when + # your project is installed. For an analysis of "install_requires" vs pip's + # requirements files see: + # https://packaging.python.org/en/latest/requirements.html + install_requires=install_requires, + + cmdclass=cmdclass, + + # List additional groups of dependencies here (e.g. development + # dependencies). You can install these using the following syntax, + # $ pip install -e .[test] + extras_require=extras_require, + ext_modules=ext_modules, + + scripts=[ + 'tl', + ], +) diff --git a/setup.travis.cfg b/setup.travis.cfg new file mode 100644 index 0000000..b786d1b --- /dev/null +++ b/setup.travis.cfg @@ -0,0 +1,111 @@ +[tool:pytest] +testpaths = tests/ +addopts = --ignore=tests/test_documentation.py + --ignore=tests/test_yapf_format.py + --ignore=tests/pending/test_decorators.py + --ignore=tests/pending/test_documentation.py + --ignore=tests/pending/test_logging.py + --ignore=tests/pending/test_pydocstyle.py + --ignore=tests/pending/test_layers_padding.py + --ignore=tests/pending/test_timeout.py + --ignore=tests/pending/test_layers_super_resolution.py + --ignore=tests/pending/test_reuse_mlp.py + --ignore=tests/pending/test_layers_importer.py + --ignore=tests/pending/test_layers_time_distributed.py + --ignore=tests/pending/test_layers_spatial_transformer.py + --ignore=tests/pending/test_layers_stack.py + --ignore=tests/pending/test_mnist_simple.py + --ignore=tests/pending/test_tf_layers.py + --ignore=tests/pending/test_array_ops.py + --ignore=tests/pending/test_layers_basic.py + --ignore=tests/pending/test_models.py + --ignore=tests/pending/test_optimizer_amsgrad.py + --ignore=tests/pending/test_logging_hyperdash.py + --ignore=tests/pending/test_yapf_format.py + --ignore=tests/pending/test_layers_normalization.py + --ignore=tests/pending/test_utils_predict.py + --ignore=tests/pending/test_layers_flow_control.py + --ignore=tests/performance_test/vgg/tl2-autograph.py + --ignore=tests/performance_test/vgg/tf2-eager.py + --ignore=tests/performance_test/vgg/exp_config.py + --ignore=tests/performance_test/vgg/tl2-eager.py + --ignore=tests/performance_test/vgg/tf2-autograph.py + --ignore=tests/performance_test/vgg/keras_test.py + --ignore=tests/performance_test/vgg/pytorch_test.py + +[flake8] +max-line-length = 120 +ignore = + D301 + E221 # Space before equal sign + E251 # Space after equal sign +exclude = + .git, + venv, + __pycache__, + .pytest_cache, + tensorlayer.egg-info, + build, + dist, + img + +[yapf] +based_on_style=google + +# The number of columns to use for indentation. +indent_width = 4 + +# The column limit. +column_limit=120 + +# Place each dictionary entry onto its own line. +each_dict_entry_on_separate_line = True + +# Put closing brackets on a separate line, dedented, if the bracketed +# expression can't fit in a single line. Applies to all kinds of brackets, +# including function definitions and calls. For example: +# +# config = { +# 'key1': 'value1', +# 'key2': 'value2', +# } # <--- this bracket is dedented and on a separate line +# +# time_series = self.remote_client.query_entity_counters( +# entity='dev3246.region1', +# key='dns.query_latency_tcp', +# transform=Transformation.AVERAGE(window=timedelta(seconds=60)), +# start_ts=now()-timedelta(days=3), +# end_ts=now(), +# ) # <--- this bracket is dedented and on a separate line +dedent_closing_brackets=True + +# Do not split consecutive brackets. Only relevant when DEDENT_CLOSING_BRACKETS is set +coalesce_brackets = False + +# Align closing bracket with visual indentation. +align_closing_bracket_with_visual_indent = False + +# Split named assignments onto individual lines. +split_before_named_assigns = False + +# If an argument / parameter list is going to be split, then split before the first argument. +split_before_first_argument = True + +# Split before arguments if the argument list is terminated by a comma. +split_arguments_when_comma_terminated = False + +# Insert a space between the ending comma and closing bracket of a list, etc. +space_between_ending_comma_and_closing_bracket = True + +# Join short lines into one line. E.g., single line if statements. +join_multiple_lines = True + +# Do not include spaces around selected binary operators. +# Example: 1 + 2 * 3 - 4 / 5 => 1 + 2*3 - 4/5 +no_spaces_around_selected_binary_operators = True + +# Allow lambdas to be formatted on more than one line. +allow_multiline_lambdas = True + +SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT = 10 +SPLIT_PENALTY_AFTER_OPENING_BRACKET = 500 diff --git a/setup.travis_doc.cfg b/setup.travis_doc.cfg new file mode 100644 index 0000000..55267cf --- /dev/null +++ b/setup.travis_doc.cfg @@ -0,0 +1,81 @@ +[tool:pytest] +testpaths = tests/ +python_files=*test_documentation* + *test_yapf_format* + +[flake8] +max-line-length = 120 +ignore = + D301 + E221 # Space before equal sign + E251 # Space after equal sign +exclude = + .git, + venv, + __pycache__, + .pytest_cache, + tensorlayer.egg-info, + build, + dist, + img + +[yapf] +based_on_style=google + +# The number of columns to use for indentation. +indent_width = 4 + +# The column limit. +column_limit=120 + +# Place each dictionary entry onto its own line. +each_dict_entry_on_separate_line = True + +# Put closing brackets on a separate line, dedented, if the bracketed +# expression can't fit in a single line. Applies to all kinds of brackets, +# including function definitions and calls. For example: +# +# config = { +# 'key1': 'value1', +# 'key2': 'value2', +# } # <--- this bracket is dedented and on a separate line +# +# time_series = self.remote_client.query_entity_counters( +# entity='dev3246.region1', +# key='dns.query_latency_tcp', +# transform=Transformation.AVERAGE(window=timedelta(seconds=60)), +# start_ts=now()-timedelta(days=3), +# end_ts=now(), +# ) # <--- this bracket is dedented and on a separate line +dedent_closing_brackets=True + +# Do not split consecutive brackets. Only relevant when DEDENT_CLOSING_BRACKETS is set +coalesce_brackets = False + +# Align closing bracket with visual indentation. +align_closing_bracket_with_visual_indent = False + +# Split named assignments onto individual lines. +split_before_named_assigns = False + +# If an argument / parameter list is going to be split, then split before the first argument. +split_before_first_argument = True + +# Split before arguments if the argument list is terminated by a comma. +split_arguments_when_comma_terminated = False + +# Insert a space between the ending comma and closing bracket of a list, etc. +space_between_ending_comma_and_closing_bracket = True + +# Join short lines into one line. E.g., single line if statements. +join_multiple_lines = True + +# Do not include spaces around selected binary operators. +# Example: 1 + 2 * 3 - 4 / 5 => 1 + 2*3 - 4/5 +no_spaces_around_selected_binary_operators = True + +# Allow lambdas to be formatted on more than one line. +allow_multiline_lambdas = True + +SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT = 10 +SPLIT_PENALTY_AFTER_OPENING_BRACKET = 500 \ No newline at end of file diff --git a/tensorlayer/__init__.py b/tensorlayer/__init__.py new file mode 100644 index 0000000..b111a3e --- /dev/null +++ b/tensorlayer/__init__.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Deep learning and Reinforcement learning library for Researchers and Engineers""" + +# import backend +from .backend import * +# from .backend import ops +# import dataflow +# from .dataflow import * + +import os +from distutils.version import LooseVersion + +from tensorlayer.package_info import ( + VERSION, __contact_emails__, __contact_names__, __description__, __download_url__, __homepage__, __keywords__, + __license__, __package_name__, __repository_url__, __shortversion__, __version__ +) + +if 'TENSORLAYER_PACKAGE_BUILDING' not in os.environ: + + try: + import tensorflow + except Exception as e: + raise ImportError( + "Tensorflow is not installed, please install it with the one of the following commands:\n" + " - `pip install --upgrade tensorflow`\n" + " - `pip install --upgrade tensorflow-gpu`" + ) + + if ("SPHINXBUILD" not in os.environ and "READTHEDOCS" not in os.environ and + LooseVersion(tensorflow.__version__) < LooseVersion("2.0.0")): + raise RuntimeError( + "TensorLayer does not support Tensorflow version older than 2.0.0.\n" + "Please update Tensorflow with:\n" + " - `pip install --upgrade tensorflow`\n" + " - `pip install --upgrade tensorflow-gpu`" + ) + + from tensorlayer import array_ops + from tensorlayer import cost + from tensorlayer import decorators + from tensorlayer import files + from tensorlayer import initializers + from tensorlayer import iterate + from tensorlayer import layers + from tensorlayer import lazy_imports + from tensorlayer import logging + from tensorlayer import models + from tensorlayer import optimizers + from tensorlayer import rein + from tensorlayer import utils + from tensorlayer import dataflow + + from tensorlayer.lazy_imports import LazyImport + + # Lazy Imports + db = LazyImport("tensorlayer.db") + distributed = LazyImport("tensorlayer.distributed") + nlp = LazyImport("tensorlayer.nlp") + prepro = LazyImport("tensorlayer.prepro") + utils = LazyImport("tensorlayer.utils") + visualize = LazyImport("tensorlayer.visualize") + + # alias + vis = visualize + + alphas = array_ops.alphas + alphas_like = array_ops.alphas_like + + # global vars + global_flag = {} + global_dict = {} diff --git a/tensorlayer/array_ops.py b/tensorlayer/array_ops.py new file mode 100644 index 0000000..f09e833 --- /dev/null +++ b/tensorlayer/array_ops.py @@ -0,0 +1,110 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +"""A file containing functions related to array manipulation.""" + +from tensorflow.python.eager import context +from tensorflow.python.framework import constant_op, dtypes, ops, tensor_shape +from tensorflow.python.framework.constant_op import constant +from tensorflow.python.framework.ops import convert_to_tensor +from tensorflow.python.ops.array_ops import shape_internal +from tensorflow.python.ops.gen_array_ops import fill, reshape + +__all__ = ['alphas', 'alphas_like'] + + +def alphas(shape, alpha_value, name=None): + """Creates a tensor with all elements set to `alpha_value`. + This operation returns a tensor of type `dtype` with shape `shape` and all + elements set to alpha. + + Parameters + ---------- + shape: A list of integers, a tuple of integers, or a 1-D `Tensor` of type `int32`. + The shape of the desired tensor + alpha_value: `float32`, `float64`, `int8`, `uint8`, `int16`, `uint16`, int32`, `int64` + The value used to fill the resulting `Tensor`. + name: str + A name for the operation (optional). + + Returns + ------- + A `Tensor` with all elements set to alpha. + + Examples + -------- + >>> tl.alphas([2, 3], tf.int32) # [[alpha, alpha, alpha], [alpha, alpha, alpha]] + """ + with ops.name_scope(name, "alphas", [shape]) as name: + + alpha_tensor = convert_to_tensor(alpha_value) + alpha_dtype = dtypes.as_dtype(alpha_tensor.dtype).base_dtype + + if not isinstance(shape, ops.Tensor): + try: + shape = constant_op._tensor_shape_tensor_conversion_function(tensor_shape.TensorShape(shape)) + except (TypeError, ValueError): + shape = ops.convert_to_tensor(shape, dtype=dtypes.int32) + + if not shape._shape_tuple(): + shape = reshape(shape, [-1]) # Ensure it's a vector + + try: + output = constant(alpha_value, shape=shape, dtype=alpha_dtype, name=name) + + except (TypeError, ValueError): + output = fill(shape, constant(alpha_value, dtype=alpha_dtype), name=name) + + if output.dtype.base_dtype != alpha_dtype: + raise AssertionError("Dtypes do not corresponds: %s and %s" % (output.dtype.base_dtype, alpha_dtype)) + + return output + + +def alphas_like(tensor, alpha_value, name=None, optimize=True): + """Creates a tensor with all elements set to `alpha_value`. + Given a single tensor (`tensor`), this operation returns a tensor of the same + type and shape as `tensor` with all elements set to `alpha_value`. + + Parameters + ---------- + tensor: tf.Tensor + The Tensorflow Tensor that will be used as a template. + alpha_value: `float32`, `float64`, `int8`, `uint8`, `int16`, `uint16`, int32`, `int64` + The value used to fill the resulting `Tensor`. + name: str + A name for the operation (optional). + optimize: bool + if true, attempt to statically determine the shape of 'tensor' and encode it as a constant. + + Returns + ------- + A `Tensor` with all elements set to `alpha_value`. + + Examples + -------- + >>> tensor = tf.constant([[1, 2, 3], [4, 5, 6]]) + >>> tl.alphas_like(tensor, 0.5) # [[0.5, 0.5, 0.5], [0.5, 0.5, 0.5]] + """ + with ops.name_scope(name, "alphas_like", [tensor]) as name: + tensor = ops.convert_to_tensor(tensor, name="tensor") + + if context.in_eager_mode(): # and dtype is not None and dtype != tensor.dtype: + ret = alphas(shape_internal(tensor, optimize=optimize), alpha_value=alpha_value, name=name) + + else: # if context.in_graph_mode(): + + # For now, variant types must be created via zeros_like; as we need to + # pass the input variant object to the proper zeros callback. + + if (optimize and tensor.shape.is_fully_defined()): + # We can produce a zeros tensor independent of the value of 'tensor', + # since the shape is known statically. + ret = alphas(tensor.shape, alpha_value=alpha_value, name=name) + + # elif dtype is not None and dtype != tensor.dtype and dtype != dtypes.variant: + else: + ret = alphas(shape_internal(tensor, optimize=optimize), alpha_value=alpha_value, name=name) + + ret.set_shape(tensor.get_shape()) + + return ret diff --git a/tensorlayer/backend/__init__.py b/tensorlayer/backend/__init__.py new file mode 100644 index 0000000..01e5c83 --- /dev/null +++ b/tensorlayer/backend/__init__.py @@ -0,0 +1,6 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +# load ops +from .ops import * +from tensorlayer.backend import ops \ No newline at end of file diff --git a/tensorlayer/backend/ops/__init__.py b/tensorlayer/backend/ops/__init__.py new file mode 100644 index 0000000..5b8a61b --- /dev/null +++ b/tensorlayer/backend/ops/__init__.py @@ -0,0 +1,126 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +# load nn ops +from .load_backend import padding_format +from .load_backend import preprocess_1d_format +from .load_backend import preprocess_2d_format +from .load_backend import preprocess_3d_format +from .load_backend import nchw_to_nhwc +from .load_backend import nhwc_to_nchw +from .load_backend import relu +from .load_backend import relu6 +from .load_backend import leaky_relu +from .load_backend import softplus +from .load_backend import tanh +from .load_backend import sigmoid +from .load_backend import softmax +from .load_backend import bias_add +from .load_backend import conv1d +from .load_backend import conv2d +from .load_backend import conv3d +from .load_backend import lrn +from .load_backend import moments +from .load_backend import max_pool +from .load_backend import avg_pool +from .load_backend import max_pool3d +from .load_backend import avg_pool3d +from .load_backend import pool +from .load_backend import depthwise_conv2d +from .load_backend import Conv1d_transpose +from .load_backend import Conv2d_transpose +from .load_backend import Conv3d_transpose + +from .load_backend import ReLU +from .load_backend import ReLU6 +from .load_backend import LeakyReLU +from .load_backend import Softplus +from .load_backend import Tanh +from .load_backend import Sigmoid +from .load_backend import Softmax +from .load_backend import Conv1D +from .load_backend import Conv2D +from .load_backend import Conv3D +from .load_backend import BiasAdd +from .load_backend import MaxPool +from .load_backend import AvgPool +from .load_backend import Dropout +from .load_backend import BatchNorm +from .load_backend import DepthwiseConv2d + +# load ops +from .load_backend import Variable +from .load_backend import matmul +from .load_backend import add +from .load_backend import dtypes +from .load_backend import minimum +from .load_backend import reshape +from .load_backend import concat +from .load_backend import convert_to_tensor +from .load_backend import sqrt +from .load_backend import reduce_mean +from .load_backend import reduce_min +from .load_backend import reduce_max +from .load_backend import pad +from .load_backend import stack +from .load_backend import meshgrid +from .load_backend import range +from .load_backend import expand_dims +from .load_backend import tile +from .load_backend import cast +from .load_backend import transpose +from .load_backend import gather_nd +from .load_backend import clip_by_value +from .load_backend import split +from .load_backend import get_tensor_shape +from .load_backend import set_context +from .load_backend import resize +from .load_backend import floor +from .load_backend import gather +from .load_backend import linspace +from .load_backend import slice +from .load_backend import add_n +from .load_backend import ceil +from .load_backend import multiply +from .load_backend import divide +from .load_backend import identity + +# dtype +from .load_backend import (DType, float16, float32, float64, int8, int16, int32, int64, uint8, uint16, uint32, uint64) +# initlizers +from .load_backend import (zeros, ones, constant, random_uniform, random_normal, truncated_normal, he_normal) +# backend +from .load_backend import BACKEND +from .load_backend import BACKEND_VERSION + +from .load_backend import Reshape +from .load_backend import ReduceSum +from .load_backend import ReduceMax +from .load_backend import ReduceMean +from .load_backend import OneHot +from .load_backend import L2Normalize +from .load_backend import EmbeddingLookup +from .load_backend import NCELoss +from .load_backend import Not_equal +from .load_backend import Cast +from .load_backend import ExpandDims +from .load_backend import Count_nonzero +from .load_backend import FlattenReshape +from .load_backend import Transpose +from .load_backend import MatMul +from .load_backend import Tile +from .load_backend import Concat +from .load_backend import ZeroPadding1D +from .load_backend import ZeroPadding2D +from .load_backend import ZeroPadding3D +from .load_backend import Stack +from .load_backend import Unstack +from .load_backend import Sign +from .load_backend import Resize +from .load_backend import Pad +from .load_backend import Minimum +from .load_backend import Maximum +from .load_backend import Meshgrid +from .load_backend import BatchToSpace +from .load_backend import DepthToSpace + diff --git a/tensorlayer/backend/ops/dragon_backend.py b/tensorlayer/backend/ops/dragon_backend.py new file mode 100644 index 0000000..37e6e5a --- /dev/null +++ b/tensorlayer/backend/ops/dragon_backend.py @@ -0,0 +1,1039 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function + +import numpy as np +import dragon as D + +from dragon.core.eager import context +from dragon.core.ops import init_ops +from dragon.core.ops import vision_ops + +_dtypeDict = ['float16', 'float32', 'float64', 'int8', 'int16', 'int32', 'int64', 'uint8', 'uint16', 'uint32', 'uint64'] +# TODO NotImplemented +DType = None +float16 = 'float16' +float32 = 'float32' +float64 = 'float64' +int8 = 'int8' +int16 = 'int16' +int32 = 'int32' +int64 = 'int64' +uint8 = 'uint8' +uint16 = 'uint16' +uint32 = 'uint32' +uint64 = 'uint64' + +# isinstance input output +# TODO NotImplemented +# TensorLike = None + + +def _getter(init_fn, **kwargs): + """Return an named eager tensor.""" + with context.eager_mode(): + value = init_fn(**kwargs) + value._name = kwargs.get('name', value.id) + return value + + +def set_context(**kwargs): + raise Exception("Using Dragon backend,You don't need to set context") + + +def get_tensor_shape(x): + return x.shape + + +# initializers +def zeros(shape, dtype='float32'): + """ + Creates a tensor with all elements set to zero. + + Parameters + ---------- + shape : A list of integers + a tuple of integers, or a 1-D Tensor of type int32. + dtype : tensor + The DType of an element in the resulting Tensor + + Returns + ------- + A Tensor with all elements set to zero. + + """ + return _getter( + init_ops.fill, + value=0, + shape=shape, + dtype=dtype, + ) + + +def ones(shape, dtype='float32'): + """ + Creates a tensor with all elements set to ones. + + Parameters + ---------- + shape : A list of integers + a tuple of integers, or a 1-D Tensor of type int32. + dtype : tensor + The DType of an element in the resulting Tensor + + Returns + ------- + A Tensor with all elements set to zero. + + """ + return _getter( + init_ops.fill, + value=1, + shape=shape, + dtype=dtype, + ) + + +def constant(value, shape, dtype='float32'): + """ + Creates a constant tensor from a tensor-like object. + + Parameters + ---------- + value : list + A constant value (or list) of output type dtype. + dtype : tensor + The type of the elements of the resulting tensor. + shape : tuple + Optional dimensions of resulting tensor. + + Returns + ------- + A Constant Tensor. + + """ + # shape = shape[::-1] + return _getter( + init_ops.fill, + value=value, + shape=shape, + dtype=dtype, + ) + + +def random_uniform(shape, minval=0, maxval=None, dtype='float32', seed=None): + """ + Outputs random values from a uniform distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + minval : int + The lower bound on the range of random values to generate (inclusive). Defaults to 0. + maxval : int + The upper bound on the range of random values to generate (exclusive). Defaults to 1 if dtype is floating point. + dtype : tensor + The type of the output: float16, float32, float64, int32, or int64. + seed : int + Used in combination with dragon.random.set_seed to create a reproducible sequence of tensors across multiple calls. + Returns + ------- + A tensor of the specified shape filled with random uniform values. + + """ + return _getter(init_ops.random_uniform, low=minval, high=maxval, shape=shape, dtype=dtype) + + +def random_normal(shape, mean=0.0, stddev=1.0, dtype='float32', seed=None): + """ + Outputs random values from a normal distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + mean : float + The mean of the normal distribution + stddev : float + The standard deviation of the normal distribution. + dtype : tensor + The type of the output. + seed : A Python integer + Used to create a random seed for the distribution + + Returns + ------- + A tensor of the specified shape filled with random normal values. + + """ + return _getter( + init_ops.random_normal, + mean=mean, + std=stddev, + shape=shape, + dtype=dtype, + ) + + +def truncated_normal(shape, mean=0.0, stddev=1.0, dtype='float32', seed=None): + """ + Outputs random values from a truncated normal distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + mean : float + The mean of the normal distribution + stddev : float + The standard deviation of the normal distribution. + dtype : tensor + The type of the output. + seed : A Python integer + Used to create a random seed for the distribution + + Returns + ------- + A tensor of the specified shape filled with random truncated normal values. + + """ + return _getter( + init_ops.truncated_normal, + mean=mean, + std=stddev, + shape=shape, + dtype=dtype, + ) + + +def he_normal(shape, dtype, seed=None): + """ + He normal initializer. + + Parameters + ---------- + seed : A Python integer. + Used to seed the random generator. + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + dtype : tensor + The type of the output. + + Returns + ------- + A tensor of the specified shape filled with he normal values. + """ + # shape = shape[::-1] + raise NotImplementedError("He_Normal is not implemented") + + +def Variable(initial_value, name, trainable=None): + """ + Creates a new variable with value initial_value. + + Parameters + ---------- + initial_value : tensor + A Tensor, or Python object convertible to a Tensor + name : str + Optional name for the variable. Defaults to 'Variable' and gets uniquified automatically. + Returns + ------- + Variable + """ + return D.Tensor(name=name, shape=initial_value) + + +class MatMul(object): + + def __init__(self): + pass + + def __call__(self, a, b): + inputs = [a, b] + return D.math.matmul(inputs) + + +def matmul(a, b): + """ + Multiplies matrix a by matrix b, producing a * b. + + Parameters + ---------- + a : tensor + type float16, float32, float64, int32, complex64, complex128 and rank > 1. + b : tensor + with same type and rank as a. + + Returns + ------- + A Tensor of the same type as a and b + """ + inputs = [a, b] + return D.math.matmul(inputs) + + +def add(value, bias): + """ + Returns x + y element-wise. + + Parameters + ---------- + value : tensor. + Must be one of the following types: bfloat16, half, float32, float64, + uint8, int8, int16, int32, int64, complex64, complex128, string. + bias : tensor + Must have the same type as a + name : str + A name for the operation + + Returns + ------- + A Tensor. Has the same type as a. + """ + + inputs = [value, bias] + return D.math.add(inputs) + + +def dtypes(dt): + """ + Data dtypes. + + Parameters + ---------- + dt : string + It could be 'uint8', 'uint16', 'uint32', 'uint64', 'int8', 'int16', + 'int32', 'int64', 'float16', 'float32', 'float64', 'DType'. + + Returns + ------- + Data dtypes + """ + if dt not in _dtypeDict: + raise Exception("Unsupported dtype: {}".format(dt)) + return dt + + +def minimum(x, y): + """ + Returns the min of x and y (i.e. x < y ? x : y) element-wise. + + Parameters + ---------- + x : tensor. + Must be one of the following types: bfloat16, half, float32, float64, int32, int64. + y : A Tensor. + Must have the same type as x. + name : str + A name for the operation (optional). + + Returns + ------- + A Tensor. Has the same type as x + """ + inputs = [x, y] + return D.math.minimum(inputs) + + +class FlattenReshape(object): + + def __init__(self): + pass + + def __call__(self, inputs): + dim = 1 + for d in get_tensor_shape(inputs)[1:]: + dim *= d + return D.reshape(inputs, [-1, dim]) + + +class Reshape(object): + + def __init__(self, shape): + self.shape = shape + + def __call__(self, tensor): + return D.reshape(tensor, shape=self.shape) + + +def reshape(tensor, shape): + """ + Reshapes a tensor. + + Parameters + ---------- + tensor : tensor + A Tensor. + shape : tensor + Defines the shape of the output tensor. + Returns + ------- + A Tensor. Has the same type as tensor + """ + return D.reshape(tensor, shape=shape) + + +class Concat(object): + + def __init__(self, axis): + super(Concat, self).__init__() + self.axis = axis + + def __call__(self, values): + return D.concat(values=values, axis=self.axis) + + +def concat(values, axis): + """ + Concatenates tensors along one dimension. + + Parameters + ---------- + values : list + A list of Tensor objects or a single Tensor + axis : int + 0-D int32 Tensor. Dimension along which to concatenate + Returns + ------- + A Tensor resulting from concatenation of the input tensors. + """ + return D.concat(values, axis=axis) + + +def convert_to_tensor(value, dtype=None): + """ + Converts the given value to a Tensor. + + Parameters + ---------- + value : object + An object whose type has a registered Tensor conversion function. + dtype : optional + Optional element type for the returned tensor. If missing, the type is inferred from the type of value. + + Returns + ------- + A Tensor based on value. + """ + return D.Tensor.convert_to(value, dtype) + + +def sqrt(x): + """ + Computes square root of x element-wise. + + Parameters + ---------- + x : tensor + Must be one of the following types: bfloat16, half, float32, float64, complex64, complex128. + + Returns + ------- + A Tensor. Has the same type as x. + """ + return D.math.sqrt(x) + + +class ReduceSum(object): + + def __init__(self, axis): + pass + + def construct(self, input): + pass + + +class ReduceMean(object): + + def __init__(self, axis): + if axis == [1, 2]: + self.data_format = 'NHWC' + elif axis == [2, 3]: + self.data_format = 'NCHW' + else: + raise ("`data_format` should have one of the following values: [`channels_last`, `channels_first`]") + + def __call__(self, inputs): + return vision_ops.pool2d( + inputs, + kernel_shape=1, + strides=1, + pads=0, + mode='AVG', + global_pooling=True, + data_format=self.data_format, + ) + + +def reduce_mean(input_tensor, axis=None): + """ + Computes the mean of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + return D.mean(input_tensor, axes=axis) + + +class ReduceMax(object): + + def __init__(self, axis): + if axis == [1, 2]: + self.data_format = 'NHWC' + elif axis == [2, 3]: + self.data_format = 'NCHW' + else: + raise ("`data_format` should have one of the following values: [`channels_last`, `channels_first`]") + + def __call__(self, inputs): + return vision_ops.pool2d( + inputs, kernel_shape=1, strides=1, pads=0, mode='MAX', global_pooling=True, data_format=self.data_format + ) + + +def reduce_max(input_tensor, axis=None): + """ + Computes the maximum of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have real numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + return D.max(input_tensor, axis) + + +def reduce_min(input_tensor, axis=None): + """ + Computes the minimum of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have real numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + return D.min(input_tensor, axis) + +class Pad(object): + def __init__(self, paddings, mode="REFLECT"): + if mode not in ['CONSTANT', 'REFLECT', 'SYMMETRIC']: + raise Exception("Unsupported mode: {}".format(mode)) + if mode == 'SYMMETRIC': + mode = 'EDGE' + self.paddings = paddings + self.mode = mode + + def __call__(self, x): + outputs = D.pad(x, pads=self.paddings, mode=self.mode, value=0) + return outputs + +def pad(tensor, paddings, mode='CONSTANT', constant_values=0): + """ + Pads a tensor. + + Parameters + ---------- + tensor : tensor + A Tensor. + paddings : tuple + A tuple of type int32. + mode : str + One of "CONSTANT", "REFLECT", or "SYMMETRIC" (case-insensitive) + constant_values : int + In "CONSTANT" mode, the scalar pad value to use. Must be same type as tensor. + + Returns + ------- + A Tensor. Has the same type as tensor. + """ + if mode not in ['CONSTANT', 'REFLECT', 'SYMMETRIC']: + raise Exception("Unsupported mode: {}".format(mode)) + if mode == 'SYMMETRIC': + mode = 'EDGE' + outputs = D.pad(tensor, pads=paddings, mode=mode, value=constant_values) + return outputs + + +class Unstack(object): + + def __init__(self, axis, num=None): + self.axis = axis + self.num = num + + def __call__(self, values): + raise NotImplementedError + + +class Stack(object): + + def __init__(self, axis): + self.axis = axis + + def __call__(self, values): + return D.stack(values, axis=self.axis) + + +def stack(values, axis=0): + """ + Stacks a list of rank-R tensors into one rank-(R+1) tensor. + + Parameters + ---------- + values : list + A list of Tensor objects with the same shape and type. + axis : int + An int. The axis to stack along. Defaults to the first dimension. + Negative values wrap around, so the valid range is [-(R+1), R+1). + + Returns + ------- + A stacked Tensor with the same type as values. + """ + return D.stack(values, axis=axis) + + +class Meshgrid(object): + def __init__(self, indexing='xy'): + super(Meshgrid, self).__init__() + self.index = indexing + + def __call__(self, inputs): + pass + + +def meshgrid(x, y): + """ + Broadcasts parameters for evaluation on an N-D grid. + + Parameters + ---------- + x : tensor + Tensors with rank 1. + y : tensor + Tensors with rank 1. + + Returns + ------- + A list of N Tensors with rank N. + """ + + pass + + +def range(start, limit=None, delta=1, dtype=None): + """ + Creates a sequence of numbers. + + Parameters + ---------- + start : tensor + A 0-D Tensor (scalar). Acts as first entry in the range if limit is not None; + otherwise, acts as range limit and first entry defaults to 0. + limit : tensor + A 0-D Tensor (scalar). Upper limit of sequence, exclusive. If None, + defaults to the value of start while the first entry of the range defaults to 0. + delta : tensor + A 0-D Tensor (scalar). Number that increments start. Defaults to 1. + dtype : type + The type of the elements of the resulting tensor. + + Returns + ------- + An 1-D Tensor of type dtype. + """ + if dtype is None: + dtype = 'int32' + if limit is None: + outputs = D.arange(start=0, stop=start, step=delta, dtype=dtype) + else: + outputs = D.arange(start, stop=limit, step=delta, dtype=dtype) + return outputs + + +class ExpandDims(object): + + def __init__(self, axis): + pass + + def construct(self, input): + pass + + +def expand_dims(input, axis): + """ + Inserts a dimension of 1 into a tensor's shape. + + Parameters + ---------- + input : tensor + A Tensor. + axis : int + 0-D (scalar). Specifies the dimension index at which to expand the shape of input. + Must be in the range [-rank(input) - 1, rank(input)]. + + Returns + ------- + A Tensor with the same data as input, but its shape has an additional dimension of size 1 added. + """ + + return D.expand_dims(input, axis=axis) + + +class Tile(object): + + def __init__(self): + pass + + def __call__(self, input, multiples): + return D.tile(input, multiples) + + +def tile(input, multiples): + """ + Constructs a tensor by tiling a given tensor. + + Parameters + ---------- + input : tensor + A Tensor. 1-D or higher. + multiples : tensor + Must be one of the following types: int32, int64. 1-D. + Length must be the same as the number of dimensions in input + + Returns + ------- + A Tensor. Has the same type as input. + """ + return D.tile(input, multiples) + + +class Cast(object): + + def __init__(self, dtype): + pass + + def __call__(self, input): + pass + + +def cast(x, dtype): + """ + Casts a tensor to a new type. + + Parameters + ---------- + x : tensor + A Tensor or SparseTensor or IndexedSlices of numeric type. + It could be uint8, uint16, uint32, uint64, int8, int16, int32, int64, float16, float32, float64. + dtype : dtpye + The destination type. The list of supported dtypes is the same as x + + Returns + ------- + A Tensor or SparseTensor or IndexedSlices with same shape as x and same type as dtype. + """ + return D.cast(x, dtype=dtype) + + +class Transpose(object): + + def __init__(self, perm, conjugate=False): + self.perm = perm + if conjugate: + raise ("The conjugate Parameters not supported") + + def __call__(self, a): + return D.transpose(a, self.perm) + + +def transpose(a, perm=None, conjugate=False): + """ + Transposes a. + + Parameters + ---------- + a : tensor + A Tensor. + perm : int + A permutation of the dimensions of a. + conjugate : bool + Setting it to True is mathematically equivalent to ms.math.conj(ms.transpose(input)). + + Returns + ------- + A transposed Tensor. + """ + + conjugate = conjugate + return D.transpose(a, perm=perm) + + +def gather_nd(params, indices, batch_dims=0): + """ + Gather slices from params into a Tensor with shape specified by indices. + + Parameters + ---------- + params : tensor + The tensor from which to gather values. + indices : tensor + Must be one of the following types: int32, int64. Index tensor. + batch_dims : int + An integer or a scalar 'Tensor'. The number of batch dimensions. + + Returns + ------- + A Tensor. Has the same type as params. + """ + + pass + + +def clip_by_value(t, clip_value_min, clip_value_max): + """ + Clips tensor values to a specified min and max. + + Parameters + ---------- + t : tensor + A Tensor or IndexedSlices + clip_value_min : tensor + A 0-D (scalar) Tensor, or a Tensor with the same shape as t. The minimum value to clip by + clip_value_max : tensor + A 0-D (scalar) Tensor, or a Tensor with the same shape as t. The minimum value to clip by + + Returns + ------- + A clipped Tensor or IndexedSlices. + """ + + pass + + +def split(value, num_or_size_splits, axis=0, num=None): + """ + Splits a tensor into sub tensors. + + Parameters + ---------- + value : tensor + The Tensor to split. + num_or_size_splits : list + Either an integer indicating the number of splits along split_dim or a 1-D integer Tensor or + Python list containing the sizes of each output tensor along split_dim. + axis : int + The dimension along which to split. Must be in the range [-rank(value), rank(value)). Defaults to 0. + num : int + used to specify the number of outputs when it cannot be inferred from the shape of size_splits. + + Returns + ------- + Tensor objects resulting from splitting value. + """ + pass + + +def floor(x): + return D.math.floor(x) + + +def gather(params, indices): + return NotImplementedError + + +def linspace(start, stop, num): + return D.linspace(start, stop, num) + + +def slice(inputs, starts, sizes): + return D.slice(inputs, starts, sizes) + + +def add_n(inputs): + return NotImplementedError + + +class OneHot(object): + + def __init__(self, axis=-1, depth=1, on_value=1.0, off_value=0.0, dtype='float32'): + self.depth = depth + self.dtype = dtype + + def __call__(self, indices): + outputs = np.zeros(shape=(indices.shape[0], self.depth)) + for i in np.arange(indices.shape[0]): + outputs[int(i)][int(indices[int(i)].get_value())] = 1 + outputs = D.constant(outputs, dtype=self.dtype) + return outputs + + +class L2Normalize(object): + + def __init__(self, axis=None, epsilon=1e-12): + super(L2Normalize, self).__init__() + pass + + def __call__(self, input, *args, **kwargs): + pass + + +class EmbeddingLookup(object): + + def __init__(self, max_norm=None): + self.max_norm = max_norm + + def __call__(self, params, ids, *args, **kwargs): + pass + + +class NCELoss(object): + + def __init__(self, num_true=1, sampled_values=None, remove_accidental_hits=False): + super(NCELoss, self).__init__() + + def __call__(self, weights, biases, labels, inputs, num_sampled, num_classes): + pass + + +class Not_equal(object): + + def __init__(self): + pass + + def __call__(self, x, y): + pass + + +class Count_nonzero(object): + + def __init__(self, keepdims=None, dtype='int64'): + pass + + def __call__(self, *args, **kwargs): + pass + + + +class Resize: + + def __init__(self, scale, method, antialias=False, data_format='channels_last', ksize=None): + if method not in ['nearest', 'linear', 'bilinear']: + raise ('Current resize does not support this method.') + if method == 'bilinear': + method = 'linear' + self.method = method + self.antialias = antialias + self.scale = scale + if data_format != 'channel_last': + raise Exception("UpSampling2d resize_images only support channel_last") + + def __call__(self, inputs): + output_size = (int(inputs.shape[1] * self.scale[0]), int(inputs.shape[2] * self.scale[1])) + outputs = D.vision.resize(inputs, sizes=output_size, mode=self.method, align_corners=self.antialias) + return outputs + + +def resize(inputs, output_size, method, antialias): + if method not in ['nearest', 'linear', 'bilinear']: + raise ('Current resize does not support this method.') + if method == 'bilinear': + method = 'linear' + return D.vision.resize(inputs, sizes=output_size, mode=method, align_corners=antialias) + + +class ZeroPadding1D(object): + + def __init__(self): + pass + + def __call__(self, padding): + raise NotImplementedError + + +class ZeroPadding2D(object): + + def __init__(self): + pass + + def __call__(self, padding): + raise NotImplementedError + + +class ZeroPadding3D(object): + + def __init__(self): + pass + + def __call__(self, padding): + raise NotImplementedError + + +class Sign(object): + + def __init__(self): + pass + + def __call__(self, x): + return D.math.sign(x) + +def ceil(x): + raise NotImplementedError + +def multiply(x, y): + raise NotImplementedError + +def divide(x, y): + raise NotImplementedError + +def identity(x): + raise NotImplementedError + +class BatchToSpace(object): + def __init__(self, block_size, crops): + super(BatchToSpace, self).__init__() + pass + + def __call__(self, input_x): + raise NotImplementedError + + +class DepthToSpace(object): + def __init__(self, block_size, data_format='NHWC'): + pass + + def __call__(self, input): + raise NotImplementedError \ No newline at end of file diff --git a/tensorlayer/backend/ops/dragon_nn.py b/tensorlayer/backend/ops/dragon_nn.py new file mode 100644 index 0000000..e6b5105 --- /dev/null +++ b/tensorlayer/backend/ops/dragon_nn.py @@ -0,0 +1,910 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +import dragon as D +from dragon.core.ops import vision_ops +from dragon.core.ops import activation_ops + + +def padding_format(padding): + """ + Checks that the padding format correspond format. + + Parameters + ---------- + padding : str + Must be one of the following:"same", "SAME", "VALID", "valid" + + Returns + ------- + str "SAME" or "VALID" + """ + + if padding in ["SAME", "same"]: + padding = "SAME" + elif padding in ["VALID", "valid"]: + padding = "VALID" + elif padding == None: + padding = None + else: + raise Exception("Unsupported padding: " + str(padding)) + return padding + + +def preprocess_1d_format(data_format, padding): + """ + Checks that the 1-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NWC","NCW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NWC" or "NCW" and "SAME" or "VALID" + """ + + if data_format in ["channels_last", "NWC"]: + data_format = "NWC" + elif data_format in ["channels_first", "NCW"]: + data_format = "NCW" + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def preprocess_2d_format(data_format, padding): + """ + Checks that the 2-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NHWC","NCHW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NHWC" or "NCHW" and "SAME" or "VALID" + """ + + if data_format in ["channels_last", "NHWC", "nhwc"]: + data_format = "NHWC" + elif data_format in ["channels_first", "NCHW", "nchw"]: + data_format = "NCHW" + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def preprocess_3d_format(data_format, padding): + """ + Checks that the 3-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NDHWC","NCDHW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NDHWC" or "NCDHW" and "SAME" or "VALID" + """ + + if data_format in ['channels_last', 'NDHWC']: + data_format = 'NDHWC' + elif data_format in ['channels_first', 'NCDHW']: + data_format = 'NCDHW' + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def nchw_to_nhwc(x): + """ + Channels first to channels last + + Parameters + ---------- + x : tensor + channels first tensor data + + Returns + ------- + channels last tensor data + """ + + pass + + +def nhwc_to_nchw(x): + """ + Channles last to channels first + + Parameters + ---------- + x : tensor + channels last tensor data + + Returns + ------- + channels first tensor data + """ + + pass + + +class ReLU(object): + + def __init__(self): + pass + + def __call__(self, x): + return D.nn.relu(x) + + +def relu(x): + """ + Computes rectified linear: max(features, 0). + + Parameters + ---------- + x : tensor + Must be one of the following types: float32, float64, int32, uint8, int16, + int8, int64, bfloat16, uint16, half, uint32, uint64, qint8. + + Returns + ------- + A Tensor. Has the same type as features. + """ + return D.nn.relu(x) + + +class ReLU6(object): + + def __init__(self): + pass + + def __call__(self, x): + return D.nn.relu6(x) + + +def relu6(x): + """ + Computes Rectified Linear 6: min(max(features, 0), 6). + + Parameters + ---------- + x : tensor + Must be one of the following types: float32, float64, int32, uint8, int16, + int8, int64, bfloat16, uint16, half, uint32, uint64, qint8. + + Returns + ------- + A Tensor with the same type as features. + """ + return D.nn.relu6(x) + + +class LeakyReLU(object): + + def __init__(self, alpha=0.2): + self.alpha = alpha + + def __call__(self, x): + return D.nn.leaky_relu(x, alpha=self.alpha) + + +def leaky_relu(x): + """ + Compute the Leaky ReLU activation function. + + Parameters + ---------- + x : tensor + representing preactivation values. Must be one of the following types: + float16, float32, float64, int32, int64. + + Returns + ------- + The activation value. + """ + + return D.nn.leaky_relu(x) + + +class Softplus(object): + + def __init__(self): + pass + + def __call__(self, x): + raise NotImplementedError + + +def softplus(x): + """ + Computes softplus: log(exp(features) + 1). + + Parameters + ---------- + x : tensor + Must be one of the following types: half, bfloat16, float32, float64. + + Returns + ------- + A Tensor. Has the same type as features. + """ + + raise NotImplementedError + + +class Tanh(object): + + def __init__(self): + pass + + def __call__(self, x): + return activation_ops.tanh(x) + + +def tanh(x): + """ + Computes hyperbolic tangent of x element-wise. + + Parameters + ---------- + x : tensor + Must be one of the following types: bfloat16, half, float32, float64, complex64, complex128. + + Returns + ------- + A Tensor. Has the same type as x. + """ + + return activation_ops.tanh(x) + + +class Sigmoid(object): + + def __init__(self): + pass + + def __call__(self, x): + return activation_ops.sigmoid(x) + + +def sigmoid(x): + """ + Computes sigmoid of x element-wise. + + Parameters + ---------- + x : tensor + A Tensor with type float16, float32, float64, complex64, or complex128. + + Returns + ------- + A Tensor with the same type as x. + """ + return activation_ops.sigmoid(x) + + +class Softmax(object): + + def __init__(self): + pass + + def __call__(self, x): + return D.nn.softmax(x) + + +def softmax(logits, axis=None): + """ + Computes softmax activations. + + Parameters + ---------- + logits : tensor + Must be one of the following types: half, float32, float64. + axis : int + The dimension softmax would be performed on. The default is -1 which indicates the last dimension. + + Returns + ------- + A Tensor. Has the same type and shape as logits. + """ + return D.nn.softmax(logits) + + +class Dropout(object): + + def __init__(self, keep, seed=1): + self.keep = 1 - keep + self.seed = seed + + def __call__(self, inputs): + return D.nn.dropout(inputs, prob=self.keep) + + +class BiasAdd(object): + """ + Adds bias to value. + + Parameters + ---------- + x : tensor + A Tensor with type float, double, int64, int32, uint8, int16, int8, complex64, or complex128. + bias : tensor + Must be the same type as value unless value is a quantized type, + in which case a different quantized type may be used. + Returns + ------- + A Tensor with the same type as value. + """ + + def __init__(self, data_format='NHWC'): + self.data_format = data_format + + def __call__(self, x, bias): + inputs = [x, bias] + return vision_ops.bias_add(inputs, data_format=self.data_format) + + +def bias_add(x, bias): + """ + Adds bias to value. + + Parameters + ---------- + x : tensor + A Tensor with type float, double, int64, int32, uint8, int16, int8, complex64, or complex128. + bias : tensor + Must be the same type as value unless value is a quantized type, + in which case a different quantized type may be used. + data_format : A string. + 'N...C' and 'NC...' are supported. + name : str + A name for the operation (optional). + Returns + ------- + A Tensor with the same type as value. + """ + inputs = [x, bias] + return vision_ops.bias_add(inputs, data_format='NHWC') + + +class Conv1D(object): + pass + # raise NotImplementedError + + +def conv1d(input, filters, stride, padding, data_format='NWC', dilations=None, name=None): + """ + Computes a 1-D convolution given 3-D input and filter tensors. + + Parameters + ---------- + input : tensor + A 3D Tensor. Must be of type float16, float32, or float64 + filters : tensor + A 3D Tensor. Must have the same type as input. + stride : int of list + An int or list of ints that has length 1 or 3. The number of entries by which the filter is moved right at each step. + padding : string + 'SAME' or 'VALID' + data_format : string + An optional string from "NWC", "NCW". Defaults to "NWC", the data is stored in the order of + [batch, in_width, in_channels]. The "NCW" format stores data as [batch, in_channels, in_width]. + dilations : int or list + An int or list of ints that has length 1 or 3 which defaults to 1. + The dilation factor for each dimension of input. If set to k > 1, + there will be k-1 skipped cells between each filter element on that dimension. + Dilations in the batch and depth dimensions must be 1. + name : string + A name for the operation (optional). + Returns + ------- + A Tensor. Has the same type as input. + """ + + pass + + +class Conv2D(object): + + def __init__(self, strides, padding, data_format='NHWC', dilations=None, out_channel=None, k_size=None): + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.ksize = k_size[0] + if self.data_format is 'NHWC': + self.dg_stride = strides[1] + self.dg_dilation = dilations[1] + elif self.data_format is 'NCHW': + self.dg_stride = strides[2] + self.dg_dilation = dilations[2] + + def __call__(self, inputs, filters): + outputs = vision_ops.conv2d( + [inputs, filters], + kernel_shape=self.ksize, + strides=self.dg_stride, + padding=self.padding, + dilations=self.dg_dilation, + data_format=self.data_format, + ) + return outputs + + +def conv2d(input, filters, strides, padding, data_format='NCHW', dilations=None): + """ + Computes a 2-D convolution given 4-D input and filters tensors. + + Parameters + ---------- + input : tensor + Must be one of the following types: half, bfloat16, float32, float64. A 4-D tensor. + The dimension order is interpreted according to the value of data_format, see below for details. + filters : tensor + Must have the same type as input. A 4-D tensor of shape [filter_height, filter_width, in_channels, out_channels] + strides : int of list + The stride of the sliding window for each dimension of input. If a single value is given it is replicated in the H and W dimension. + By default the N and C dimensions are set to 1. The dimension order is determined by the value of data_format, see below for details. + padding : string + "SAME" or "VALID" + data_format : string + "NHWC", "NCHW". Defaults to "NCHW". + dilations : list or ints + list of ints that has length 1, 2 or 4, defaults to 1. The dilation factor for each dimension ofinput. + + Returns + ------- + A Tensor. Has the same type as input. + """ + raise NotImplementedError + + +class Conv3D(object): + pass + # raise NotImplementedError + + +def conv3d(input, filters, strides, padding, data_format='NDHWC', dilations=None, name=None): + """ + Computes a 3-D convolution given 5-D input and filters tensors. + + Parameters + ---------- + input : tensor + Must be one of the following types: half, bfloat16, float32, float64. + Shape [batch, in_depth, in_height, in_width, in_channels]. + filters : tensor + Must have the same type as input. Shape [filter_depth, filter_height, filter_width, in_channels, out_channels]. + in_channels must match between input and filters. + strides : list of ints + A list of ints that has length >= 5. 1-D tensor of length 5. + The stride of the sliding window for each dimension of input. + Must have strides[0] = strides[4] = 1. + padding : string + A string from: "SAME", "VALID". The type of padding algorithm to use. + data_format : string + An optional string from: "NDHWC", "NCDHW". Defaults to "NDHWC". The data format of the input and output data. + With the default format "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, in_width, in_channels]. + Alternatively, the format could be "NCDHW", the data storage order is: [batch, in_channels, in_depth, in_height, in_width]. + dilations : list of ints + Defaults to [1, 1, 1, 1, 1]. 1-D tensor of length 5. The dilation factor for each dimension of input. + If set to k > 1, there will be k-1 skipped cells between each filter element on that dimension. + The dimension order is determined by the value of data_format, see above for details. + Dilations in the batch and depth dimensions must be 1. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor. Has the same type as input. + """ + + raise NotImplementedError + + +def lrn(inputs, depth_radius, bias, alpha, beta): + """ + Local Response Normalization. + + Parameters + ---------- + inputs : tensor + Must be one of the following types: half, bfloat16, float32. 4-D. + depth_radius : int + Defaults to 5. 0-D. Half-width of the 1-D normalization window. + bias : float + Defaults to 1. An offset (usually positive to avoid dividing by 0). + alpha : float + Defaults to 1. A scale factor, usually positive. + beta : float + Defaults to 0.5. An exponent. + + Returns + ------- + A Tensor. Has the same type as input. + """ + pass + + +def moments(x, axes, shift=None, keepdims=False): + """ + Calculates the mean and variance of x. + + Parameters + ---------- + x : tensor + A Tensor + axes : ints + Axes along which to compute mean and variance. + shift : int + Not used in the current implementation. + keepdims : bool + produce moments with the same dimensionality as the input. + + Returns + ------- + Two Tensor objects: mean and variance. + """ + + pass + + +class MaxPool(object): + + def __init__(self, ksize, strides, padding, data_format=None): + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.ksize = ksize + self.strides = strides + + def __call__(self, inputs): + return vision_ops.pool2d( + inputs, + kernel_shape=self.ksize, + strides=self.strides, + padding=self.padding, + mode='MAX', + global_pooling=False, + data_format=self.data_format, + ) + + +def max_pool(input, ksize, strides, padding, data_format=None): + """ + Performs the max pooling on the input. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] if data_format does not start + with "NC" (default), or [batch_size, num_channels] + input_spatial_shape if data_format starts with "NC". + Pooling happens over the spatial dimensions only. + ksize : int or list of ints + An int or list of ints that has length 1, N or N+2. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, N or N+2. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + + Returns + ------- + A Tensor of format specified by data_format. The max pooled output tensor. + """ + pass + + +class AvgPool(object): + + def __init__(self, ksize, strides, padding, data_format=None): + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.filter_size = ksize + self.strides = strides + + def __call__(self, inputs): + return vision_ops.pool2d( + inputs, + kernel_shape=self.filter_size, + strides=self.strides, + padding=self.padding, + mode='AVG', + global_pooling=False, + data_format=self.data_format, + ) + + +def avg_pool(input, ksize, strides, padding): + """ + Performs the avg pooling on the input. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] + if data_format does not start with "NC" (default), or [batch_size, num_channels] + input_spatial_shape + if data_format starts with "NC". Pooling happens over the spatial dimensions only. + ksize : int or list of ints + An int or list of ints that has length 1, N or N+2. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, N or N+2. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + + Returns + ------- + A Tensor of format specified by data_format. The average pooled output tensor. + """ + pass + + +def max_pool3d(input, ksize, strides, padding, data_format=None, name=None): + """ + Performs the max pooling on the input. + + Parameters + ---------- + input : tensor + A 5-D Tensor of the format specified by data_format. + ksize : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + "NDHWC", "NCDHW". Defaults to "NDHWC". The data format of the input and output data. + With the default format "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, in_width, in_channels]. + Alternatively, the format could be "NCDHW", the data storage order is: [batch, in_channels, in_depth, in_height, in_width]. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor of format specified by data_format. The max pooled output tensor. + """ + pass + + +def avg_pool3d(input, ksize, strides, padding, data_format=None, name=None): + """ + Performs the average pooling on the input. + + Parameters + ---------- + input : tensor + A 5-D Tensor of shape [batch, height, width, channels] and type float32, float64, qint8, quint8, or qint32. + ksize : int or list of ints + An int or list of ints that has length 1, 3 or 5. The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NDHWC' and 'NCDHW' are supported. + name : string + Optional name for the operation. + + Returns + ------- + A Tensor with the same type as value. The average pooled output tensor. + """ + pass + + +def pool(input, window_shape, pooling_type, strides=None, padding='VALID', data_format=None, dilations=None, name=None): + """ + Performs an N-D pooling operation. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] + if data_format does not start with "NC" (default), or [batch_size, num_channels] + input_spatial_shape + if data_format starts with "NC". Pooling happens over the spatial dimensions only. + window_shape : int + Sequence of N ints >= 1. + pooling_type : string + Specifies pooling operation, must be "AVG" or "MAX". + strides : ints + Sequence of N ints >= 1. Defaults to [1]*N. If any value of strides is > 1, then all values of dilation_rate must be 1. + padding : string + The padding algorithm, must be "SAME" or "VALID". Defaults to "SAME". + See the "returns" section of tf.ops.convolution for details. + data_format : string + Specifies whether the channel dimension of the input and output is the last dimension (default, or if data_format does not start with "NC"), + or the second dimension (if data_format starts with "NC"). + For N=1, the valid values are "NWC" (default) and "NCW". For N=2, the valid values are "NHWC" (default) and "NCHW". + For N=3, the valid values are "NDHWC" (default) and "NCDHW". + dilations : list of ints + Dilation rate. List of N ints >= 1. Defaults to [1]*N. If any value of dilation_rate is > 1, then all values of strides must be 1. + name : string + Optional. Name of the op. + + Returns + ------- + Tensor of rank N+2, of shape [batch_size] + output_spatial_shape + [num_channels] + """ + pass + + +class DepthwiseConv2d(object): + + def __init__(self, strides, padding, data_format=None, dilations=None, ksize=None, channel_multiplier=1): + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.stride = strides + self.dilations = dilations + + def __call__(self, input, filter): + raise NotImplementedError("Not implemented depthwiseconv2d") + + +def depthwise_conv2d(input, filter, strides, padding, data_format=None, dilations=None, name=None): + """ + Depthwise 2-D convolution. + + Parameters + ---------- + input : tensor + 4-D with shape according to data_format. + filter : tensor + 4-D with shape [filter_height, filter_width, in_channels, channel_multiplier]. + strides : list + 1-D of size 4. The stride of the sliding window for each dimension of input. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + The data format for input. Either "NHWC" (default) or "NCHW". + dilations : list + 1-D of size 2. The dilation rate in which we sample input values across the height and width dimensions in atrous convolution. + If it is greater than 1, then all values of strides must be 1. + name : string + A name for this operation (optional). + + Returns + ------- + A 4-D Tensor with shape according to data_format. + E.g., for "NHWC" format, shape is [batch, out_height, out_width, in_channels * channel_multiplier]. + """ + + pass + + +def conv1d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NWC', dilations=None, name=None +): + """ + The transpose of conv1d. + + Parameters + ---------- + input : tensor + A 3-D Tensor of type float and shape [batch, in_width, in_channels] + for NWC data format or [batch, in_channels, in_width] for NCW data format. + filters : tensor + A 3-D Tensor with the same type as value and shape [filter_width, output_channels, in_channels]. + filter's in_channels dimension must match that of value. + output_shape : tensor + A 1-D Tensor, containing three elements, representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1 or 3. The number of entries by which the filter is moved right at each step. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NWC' and 'NCW' are supported. + dilations : list + An int or list of ints that has length 1 or 3 which defaults to 1. + The dilation factor for each dimension of input. If set to k > 1, + there will be k-1 skipped cells between each filter element on that dimension. + Dilations in the batch and depth dimensions must be 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as value. + """ + pass + + +def conv2d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NHWC', dilations=None, name=None +): + """ + The transpose of conv2d. + + Parameters + ---------- + input : tensor + A 4-D Tensor of type float and shape [batch, height, width, in_channels] + for NHWC data format or [batch, in_channels, height, width] for NCHW data format. + filters : tensor + A 4-D Tensor with the same type as input and shape [height, width, + output_channels, in_channels]. filter's in_channels dimension must match that of input. + output_shape : tensor + A 1-D Tensor representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1, 2 or 4. The stride of the sliding window for each dimension of input. + If a single value is given it is replicated in the H and W dimension. + By default the N and C dimensions are set to 0. + The dimension order is determined by the value of data_format, see below for details. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NHWC' and 'NCHW' are supported. + dilations : list + An int or list of ints that has length 1, 2 or 4, defaults to 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as input. + """ + pass + + +def conv3d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NDHWC', dilations=None, name=None +): + """ + The transpose of conv3d. + + Parameters + ---------- + input : tensor + A 5-D Tensor of type float and shape [batch, height, width, in_channels] for + NHWC data format or [batch, in_channels, height, width] for NCHW data format. + filters : tensor + A 5-D Tensor with the same type as value and shape [height, width, output_channels, in_channels]. + filter's in_channels dimension must match that of value. + output_shape : tensor + A 1-D Tensor representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1, 3 or 5. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NDHWC' and 'NCDHW' are supported. + dilations : list of ints + An int or list of ints that has length 1, 3 or 5, defaults to 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as value. + """ + + pass + + +class BatchNorm(object): + + def __init__(self): + pass + + def __call__(self, *args, **kwargs): + pass diff --git a/tensorlayer/backend/ops/load_backend.py b/tensorlayer/backend/ops/load_backend.py new file mode 100644 index 0000000..4343507 --- /dev/null +++ b/tensorlayer/backend/ops/load_backend.py @@ -0,0 +1,81 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import json +import os +import sys + +BACKEND = 'tensorflow' +# BACKEND = 'mindspore' +# BACKEND = 'dragon' + +# Check for backend.json files +tl_backend_dir = os.path.expanduser('~') +if not os.access(tl_backend_dir, os.W_OK): + tl_backend_dir = '/tmp' +tl_dir = os.path.join(tl_backend_dir, '.tl') + +config = { + 'backend': BACKEND, +} +if not os.path.exists(tl_dir): + path = os.path.join(tl_dir, 'tl_backend.json') + os.makedirs(tl_dir) + with open(path, "w") as f: + json.dump(config, f) + BACKEND = config['backend'] + sys.stderr.write("Create the backend configuration file :" + path + '\n') +else: + path = os.path.join(tl_dir, 'tl_backend.json') + with open(path, 'r') as load_f: + load_dict = json.load(load_f) + if load_dict['backend'] is not config['backend']: + BACKEND = config['backend'] + else: + BACKEND = load_dict['backend'] + +# Set backend based on TL_BACKEND flag. +if 'TL_BACKEND' in os.environ: + backend = os.environ['TL_BACKEND'] + if backend: + BACKEND = backend + +# import backend functions +if BACKEND == 'tensorflow': + from .tensorflow_backend import * + from .tensorflow_nn import * + import tensorflow as tf + BACKEND_VERSION = tf.__version__ + sys.stderr.write('Using TensorFlow backend.\n') + +elif BACKEND == 'mindspore': + from .mindspore_backend import * + from .mindspore_nn import * + import mindspore as ms + BACKEND_VERSION = ms.__version__ + # set context + import mindspore.context as context + import os + os.environ['DEVICE_ID'] = '0' + #context.set_context(mode=context.PYNATIVE_MODE,device_target='GPU'), + context.set_context(mode=context.GRAPH_MODE, device_target='CPU'), + # enable_task_sink=True, enable_loop_sink=True) + # context.set_context(mode=context.GRAPH_MODE, backend_policy='ms', + # device_target='Ascend', enable_task_sink=True, enable_loop_sink=True) + sys.stderr.write('Using MindSpore backend.\n') + +elif BACKEND == 'dragon': + from .dragon_backend import * + from .dragon_nn import * + import dragon as dg + BACKEND_VERSION = dg.__version__ + sys.stderr.write('Using Dragon backend.\n') + +elif BACKEND == 'paddle': + from .paddle_backend import * + from .paddle_nn import * + import paddle as pd + BACKEND_VERSION = pd.__version__ + sys.stderr.write('Using Paddle backend.\n') +else: + raise NotImplementedError("This backend is not supported") diff --git a/tensorlayer/backend/ops/mindspore_backend.py b/tensorlayer/backend/ops/mindspore_backend.py new file mode 100644 index 0000000..d067be2 --- /dev/null +++ b/tensorlayer/backend/ops/mindspore_backend.py @@ -0,0 +1,1239 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function +from .mindspore_nn import nchw_to_nhwc, nhwc_to_nchw +from mindspore._c_expression.typing import Type +from mindspore.common import dtype as mstype + +from mindspore.common.parameter import Parameter +from mindspore.common.initializer import ( + initializer, Constant, Normal, TruncatedNormal, Initializer, _assignment, _calculate_in_and_out, One, Zero +) +from mindspore.common.tensor import Tensor +from mindspore._c_expression import Tensor as Tensor_ +from mindspore.ops import operations as P +from mindspore.ops import functional as F +from mindspore.ops import composite as C +import mindspore.context as context +from mindspore.nn import Cell + +import numpy as np +from scipy.stats import truncnorm +import random + +_dtypeDict = { + 'DType': Type, + 'float16': mstype.float16, + 'float32': mstype.float32, + 'float64': mstype.float64, + 'int8': mstype.int8, + 'int16': mstype.int16, + 'int32': mstype.int32, + 'int64': mstype.int64, + 'uint8': mstype.uint8, + 'uint16': mstype.uint16, + 'uint32': mstype.uint32, + 'uint64': mstype.uint64 +} + +DType = Type +float16 = mstype.float16 +float32 = mstype.float32 +float64 = mstype.float64 +int8 = mstype.int8 +int16 = mstype.int16 +int32 = mstype.int32 +int64 = mstype.int64 +uint8 = mstype.uint8 +uint16 = mstype.uint16 +uint32 = mstype.uint32 +uint64 = mstype.uint64 + +# isinstance input output +# TensorLike = Tensor_ + + +def set_context(**kwargs): + return context.set_context(**kwargs) + + +def get_tensor_shape(x): + return list(P.Shape()(x)) + + +# initializers +def zeros(shape, dtype=mstype.float32): + """ + Creates a tensor with all elements set to zero. + + Parameters + ---------- + shape : A list of integers + a tuple of integers, or a 1-D Tensor of type int32. + dtype : tensor + The DType of an element in the resulting Tensor + + Returns + ------- + A Tensor with all elements set to zero. + + """ + # shape = shape[::-1] + arr = np.ndarray(shape) + init_obj = Zero() + init_obj(arr) + return Tensor(arr, dtype=dtype) + + +def ones(shape, dtype=mstype.float32): + """ + Creates a tensor with all elements set to ones. + + Parameters + ---------- + shape : A list of integers + a tuple of integers, or a 1-D Tensor of type int32. + dtype : tensor + The DType of an element in the resulting Tensor + + Returns + ------- + A Tensor with all elements set to zero. + + """ + # shape = shape[::-1] + arr = np.ndarray(shape) + init_obj = One() + init_obj(arr) + return Tensor(arr, dtype=dtype) + + +def constant(value, dtype=mstype.float32, shape=None): + """ + Creates a constant tensor from a tensor-like object. + + Parameters + ---------- + value : list + A constant value (or list) of output type dtype. + dtype : tensor + The type of the elements of the resulting tensor. + shape : tuple + Optional dimensions of resulting tensor. + + Returns + ------- + A Constant Tensor. + + """ + # shape = shape[::-1] + arr = np.ndarray(shape) + Constant(value)(arr=arr) + return Tensor(arr, dtype=dtype) + + +class Uniform(Initializer): + """ + Initialize a uniform array, and obtain values U(-scale, scale) from the uniform distribution + to fill the input tensor. + + Args: + minval : int + The lower bound on the range of random values to generate (inclusive). Defaults to 0. + maxval : int + The upper bound on the range of random values to generate (exclusive). Defaults to 1 if dtype is floating point. + seed : int + Used in combination with tf.random.set_seed to create a reproducible sequence of tensors across multiple calls. + + Returns: + Array, uniform array. + """ + + def __init__(self, minval=0, maxval=None, seed=None): + super(Uniform, self).__init__(minval=minval, maxval=maxval, seed=seed) + self.minval = minval + self.maxval = maxval + self.seed = seed + + def _initialize(self, arr): + random.seed(self.seed) + tmp = np.random.uniform(self.minval, self.maxval, arr.shape) + _assignment(arr, tmp) + + +def random_uniform(shape, minval=0, maxval=None, dtype=mstype.float32, seed=None): + """ + Outputs random values from a uniform distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + minval : int + The lower bound on the range of random values to generate (inclusive). Defaults to 0. + maxval : int + The upper bound on the range of random values to generate (exclusive). Defaults to 1 if dtype is floating point. + dtype : tensor + The type of the output: float16, float32, float64, int32, or int64. + seed : int + Used in combination with tf.random.set_seed to create a reproducible sequence of tensors across multiple calls. + Returns + ------- + A tensor of the specified shape filled with random uniform values. + + """ + # shape = shape[::-1] + arr = np.ndarray(shape) + init_obj = Uniform(minval=minval, maxval=maxval, seed=seed) + init_obj(arr) + return Tensor(arr, dtype=dtype) + + +class Normal(Initializer): + """ + Initialize a normal array, and obtain values N(0, sigma) from the uniform distribution + to fill the input tensor. + + Parameters + ---------- + mean : float + The mean of the normal distribution + stddev : float + The standard deviation of the normal distribution. + seed : A Python integer + Used to create a random seed for the distribution + + Returns: + Array, normal array. + """ + + def __init__(self, mean=0.0, stddev=0.01, seed=None): + super(Normal, self).__init__(mean=mean, stddev=stddev) + self.mean = mean + self.stddev = stddev + self.seed = seed + + def _initialize(self, arr): + random.seed(self.seed) + tmp = np.random.normal(self.mean, self.stddev, arr.shape) + _assignment(arr, tmp) + + +class RandomNormal(Cell): + def __init__(self, mean=0.0, stddev=0.01, seed=None): + super(RandomNormal, self).__init__() + self.normal = Normal(mean=mean, stddev=stddev, seed=seed) + + def construct(self, shape): + arr = np.ndarray(shape) + outputs = self.normal(arr) + return outputs + + +def random_normal(shape, mean=0.0, stddev=1.0, dtype=mstype.float32, seed=None): + """ + Outputs random values from a normal distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + mean : float + The mean of the normal distribution + stddev : float + The standard deviation of the normal distribution. + dtype : tensor + The type of the output. + seed : A Python integer + Used to create a random seed for the distribution + + Returns + ------- + A tensor of the specified shape filled with random normal values. + + """ + # shape = shape[::-1] + arr = np.ndarray(shape) + init_obj = Normal(mean=mean, stddev=stddev, seed=seed) + init_obj(arr) + return Tensor(arr, dtype=dtype) + + +class TruncatedNormal(Initializer): + """ + Initialize a truncated normal distribution which is a bounded normal distribution within N(low, high). + + Args: + sigma (float): The sigma of the array. Default: 0.01. + + Returns: + Array, truncated normal array. + """ + + def __init__(self, mean=0.0, stddev=0.01, seed=None): + super(TruncatedNormal, self).__init__(mean=mean, stddev=stddev, seed=seed) + self.mean = mean + self.stddev = stddev + self.seed = seed + + def _initialize(self, arr): + tmp = truncnorm.rvs(-2, 2, loc=self.mean, scale=self.stddev, size=arr.shape, random_state=None) + _assignment(arr, tmp) + + +def truncated_normal(shape, mean=0.0, stddev=1.0, dtype=mstype.float32, seed=None): + """ + Outputs random values from a truncated normal distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + mean : float + The mean of the normal distribution + stddev : float + The standard deviation of the normal distribution. + dtype : tensor + The type of the output. + seed : A Python integer + Used to create a random seed for the distribution + + Returns + ------- + A tensor of the specified shape filled with random truncated normal values. + + """ + # shape = shape[::-1] + arr = np.ndarray(shape) + init_obj = TruncatedNormal(mean=mean, stddev=stddev, seed=seed) + init_obj(arr) + return Tensor(arr, dtype=dtype) + + +class HeNormal(Initializer): + r""" + he_normal: It draws samples from a truncated normal distribution centered on 0 with + stddev = sqrt(2 / fan_in) where fan_in is the number of input units in the weight tensor. + + Args: + arr (Array): The array to be assigned. + + Returns: + Array, assigned array. + """ + + def __init__(self, seed=None): + super(HeNormal, self).__init__(seed=seed) + self.seed = seed + + def _initialize(self, arr): + n_in, _ = _calculate_in_and_out(arr) + boundary = np.sqrt(2.0 / n_in) + random.seed(self.seed) + data = np.random.normal(-boundary, boundary, arr.shape) + _assignment(arr, data) + + +def he_normal(shape, dtype, seed=None): + """ + He normal initializer. + + Parameters + ---------- + seed : A Python integer. + Used to seed the random generator. + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + dtype : tensor + The type of the output. + + Returns + ------- + A tensor of the specified shape filled with he normal values. + """ + # shape = shape[::-1] + arr = np.ndarray(shape) + init_obj = HeNormal(seed) + init_obj(arr) + return Tensor(arr, dtype=dtype) + + +def Variable(initial_value, name, trainable=True): + """ + Creates a new variable with value initial_value. + + Parameters + ---------- + initial_value : tensor + A Tensor, or Python object convertible to a Tensor + name : str + Optional name for the variable. Defaults to 'Variable' and gets uniquified automatically. + Returns + ------- + Variable + """ + + var = Parameter(initial_value, name=name, requires_grad=trainable) + return var + + +class MatMul(Cell): + + def __init__(self): + super(MatMul, self).__init__() + self.matmul = P.MatMul() + + def construct(self, a, b): + return self.matmul(a, b) + + +def matmul(a, b): + """ + Multiplies matrix a by matrix b, producing a * b. + + Parameters + ---------- + a : tensor + type float16, float32, float64, int32, complex64, complex128 and rank > 1. + b : tensor + with same type and rank as a. + + Returns + ------- + A Tensor of the same type as a and b + """ + matmul_obj = P.MatMul() + outputs = matmul_obj(a, b) + return outputs + + +def add(value, bias): + """ + Returns x + y element-wise. + + Parameters + ---------- + value : tensor. + Must be one of the following types: bfloat16, half, float32, float64, + uint8, int8, int16, int32, int64, complex64, complex128, string. + bias : tensor + Must have the same type as a + name : str + A name for the operation + + Returns + ------- + A Tensor. Has the same type as a. + """ + + add_obj = P.TensorAdd() + outputs = add_obj(value, bias) + return outputs + + +def dtypes(dt): + """ + Data dtypes. + + Parameters + ---------- + dt : string + It could be 'uint8', 'uint16', 'uint32', 'uint64', 'int8', 'int16', + 'int32', 'int64', 'float16', 'float32', 'float64', 'DType'. + + Returns + ------- + Data dtypes + """ + + if dt not in _dtypeDict.keys(): + raise Exception("Unsupported dtype: {}".format(dt)) + return _dtypeDict[dt] + + +class Maximum(Cell): + + def __init__(self): + super(Maximum, self).__init__() + self.maximum = P.Maximum() + + def construct(self, x, y): + return self.maximum(x, y) + + +class Minimum(Cell): + + def __init__(self): + super(Minimum, self).__init__() + self.minimum = P.Minimum() + + def construct(self, x, y): + return self.minimum(x, y) + + +def minimum(x, y): + """ + Returns the min of x and y (i.e. x < y ? x : y) element-wise. + + Parameters + ---------- + x : tensor. + Must be one of the following types: bfloat16, half, float32, float64, int32, int64. + y : A Tensor. + Must have the same type as x. + name : str + A name for the operation (optional). + + Returns + ------- + A Tensor. Has the same type as x + """ + minimum_obj = P.Minimum() + outputs = minimum_obj(x, y) + return outputs + + +class FlattenReshape(Cell): + + def __init__(self): + super(FlattenReshape, self).__init__() + self.shape = P.Shape() + self.reshape = P.Reshape() + + def construct(self, inputs): + dim = 1 + for d in self.shape(inputs)[1:]: + dim *= d + return self.reshape(inputs, (-1, dim)) + + +class Reshape(Cell): + + def __init__(self, shape): + super(Reshape, self).__init__() + self.reshape = P.Reshape() + self.shape = tuple(shape) + + def construct(self, tensor): + return self.reshape(tensor, self.shape) + + +def reshape(tensor, shape): + """ + Reshapes a tensor. + + Parameters + ---------- + tensor : tensor + A Tensor. + shape : tensor + Defines the shape of the output tensor. + Returns + ------- + A Tensor. Has the same type as tensor + """ + reshape_obj = P.Reshape() + outputs = reshape_obj(tensor, tuple(shape)) + return outputs + + +class Concat(Cell): + + def __init__(self, axis): + super(Concat, self).__init__() + self.concat = P.Concat(axis) + + def construct(self, values): + return self.concat(values) + + +def concat(values, axis): + """ + Concatenates tensors along one dimension. + + Parameters + ---------- + values : list + A list of Tensor objects or a single Tensor + axis : int + 0-D int32 Tensor. Dimension along which to concatenate + Returns + ------- + A Tensor resulting from concatenation of the input tensors. + """ + # TODO testing axis + concat_obj = P.Concat(axis) + outputs = concat_obj(values) + return outputs + + +def convert_to_tensor(value, dtype=None): + """ + Converts the given value to a Tensor. + + Parameters + ---------- + value : object + An object whose type has a registered Tensor conversion function. + dtype : optional + Optional element type for the returned tensor. If missing, the type is inferred from the type of value. + + Returns + ------- + A Tensor based on value. + """ + #todo testing value + return Tensor(value, dtype=dtype) + + +def sqrt(x): + """ + Computes square root of x element-wise. + + Parameters + ---------- + x : tensor + Must be one of the following types: bfloat16, half, float32, float64, complex64, complex128. + + Returns + ------- + A Tensor. Has the same type as x. + """ + sqrt_obj = P.Sqrt() + outputs = sqrt_obj(x) + return outputs + + +class ReduceSum(Cell): + + def __init__(self, axis): + super(ReduceSum, self).__init__() + self.axis = axis + self.reduce_sum = P.ReduceSum(keep_dims=True) + + def construct(self, input): + return self.reduce_sum(input, self.axis) + + +class ReduceMean(Cell): + + def __init__(self, axis): + super(ReduceMean, self).__init__() + self.axis = axis + self.reducemean = P.ReduceMean(keep_dims=False) + + def construct(self, inputs): + output = self.reducemean(inputs, self.axis) + return output + + +def reduce_mean(input_tensor, axis=None): + """ + Computes the mean of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + Rmean_obj = P.ReduceMean(keep_dims=False) + outputs = Rmean_obj(input_tensor, axis) + return outputs + + +class ReduceMax(Cell): + + def __init__(self, axis): + super(ReduceMax, self).__init__() + self.axis = axis + self.reducemax = P.ReduceMax(keep_dims=False) + + def construct(self, inputs): + output = self.reducemax(inputs, self.axis) + return output + + +def reduce_max(input_tensor, axis=None): + """ + Computes the maximum of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have real numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + Rmax_obj = P.ReduceMax(keep_dims=False) + outputs = Rmax_obj(input_tensor, axis) + return outputs + + +def reduce_min(input_tensor, axis=None): + """ + Computes the minimum of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have real numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + Rmin_obj = P.ReduceMin(keep_dims=False) + outputs = Rmin_obj(input_tensor, axis) + return outputs + +class Pad(Cell): + def __init__(self, paddings, mode="REFLECT"): + super(Pad, self).__init__() + if mode not in ["REFLECT", "SYMMETRIC"]: + raise Exception("Unsupported mode: {}".format(mode)) + self.pad = P.MirrorPad(mode=mode) + self.paddings = Tensor(paddings) + + def construct(self, x): + return self.pad(x, self.paddings) + +def pad(tensor, paddings, mode='CONSTANT', constant_values=0): + """ + Pads a tensor. + + Parameters + ---------- + tensor : tensor + A Tensor. + paddings : tuple + A tuple of type int32. + mode : str + One of "CONSTANT", "REFLECT", or "SYMMETRIC" (case-insensitive) + constant_values : int + In "CONSTANT" mode, the scalar pad value to use. Must be same type as tensor. + + Returns + ------- + A Tensor. Has the same type as tensor. + """ + raise NotImplementedError + + +class Unstack(Cell): + def __init__(self, axis, num=None): + super(Unstack, self).__init__() + if num is not None: + raise ("The num Parameters do not need to be set.") + self.unstack = P.Unpack(axis=axis) + + def construct(self, values): + return self.unstack(values) + + +class Stack(Cell): + def __init__(self, axis=0): + super(Stack, self).__init__() + self.stack = P.Pack(axis=axis) + + def construct(self, values): + return self.stack(values) + + +def stack(values, axis=0): + """ + Stacks a list of rank-R tensors into one rank-(R+1) tensor. + + Parameters + ---------- + values : list + A list of Tensor objects with the same shape and type. + axis : int + An int. The axis to stack along. Defaults to the first dimension. + Negative values wrap around, so the valid range is [-(R+1), R+1). + + Returns + ------- + A stacked Tensor with the same type as values. + """ + _stack = P.Pack(axis=axis) + return _stack(values) + + +class Meshgrid(Cell): + def __init__(self, indexing='xy'): + super(Meshgrid, self).__init__() + self._meshgrid = P.Meshgrid(indexing=indexing) + + def construct(self, *args): + inputs = tuple(*args) + return self._meshgrid(inputs) + + + +def meshgrid(*args, **kwargs): + """ + Broadcasts parameters for evaluation on an N-D grid. + + Parameters + ---------- + x : tensor + Tensors with rank 1. + y : tensor + Tensors with rank 1. + + Returns + ------- + A list of N Tensors with rank N. + """ + + _meshgrid = P.Meshgrid(**kwargs) + return _meshgrid(*args) + + + +def range(start, limit=None, delta=1, dtype=None): + """ + Creates a sequence of numbers. + + Parameters + ---------- + start : tensor + A 0-D Tensor (scalar). Acts as first entry in the range if limit is not None; + otherwise, acts as range limit and first entry defaults to 0. + limit : tensor + A 0-D Tensor (scalar). Upper limit of sequence, exclusive. If None, + defaults to the value of start while the first entry of the range defaults to 0. + delta : tensor + A 0-D Tensor (scalar). Number that increments start. Defaults to 1. + dtype : type + The type of the elements of the resulting tensor. + + Returns + ------- + An 1-D Tensor of type dtype. + """ + + pass + + +class ExpandDims(Cell): + + def __init__(self, axis): + super(ExpandDims, self).__init__() + self.axis = axis + self.expand_dims = P.ExpandDims() + + def construct(self, input): + output = self.expand_dims(input, self.axis) + return output + + +def expand_dims(input, axis): + """ + Inserts a dimension of 1 into a tensor's shape. + + Parameters + ---------- + input : tensor + A Tensor. + axis : int + 0-D (scalar). Specifies the dimension index at which to expand the shape of input. + Must be in the range [-rank(input) - 1, rank(input)]. + + Returns + ------- + A Tensor with the same data as input, but its shape has an additional dimension of size 1 added. + """ + + expand_obj = P.ExpandDims() + outputs = expand_obj(input, axis) + return outputs + + +class Tile(Cell): + + def __init__(self): + super(Tile, self).__init__() + self.tile = P.Tile() + + def construct(self, input, multiples): + return self.tile(input, tuple(multiples)) + + + +def tile(input, multiples): + """ + Constructs a tensor by tiling a given tensor. + + Parameters + ---------- + input : tensor + A Tensor. 1-D or higher. + multiples : tensor + Must be one of the following types: int32, int64. 1-D. + Length must be the same as the number of dimensions in input + + Returns + ------- + A Tensor. Has the same type as input. + """ + tile_obj = P.Tile() + outputs = tile_obj(input, multiples) + return outputs + + +class Cast(Cell): + + def __init__(self, dtype): + super(Cast, self).__init__() + self.dtype = dtype + self.cast = P.Cast() + + def construct(self, input): + return self.cast(input, dtype=self.dtype) + + +def cast(x, dtype): + """ + Casts a tensor to a new type. + + Parameters + ---------- + x : tensor + A Tensor or SparseTensor or IndexedSlices of numeric type. + It could be uint8, uint16, uint32, uint64, int8, int16, int32, int64, float16, float32, float64. + dtype : dtpye + The destination type. The list of supported dtypes is the same as x + + Returns + ------- + A Tensor or SparseTensor or IndexedSlices with same shape as x and same type as dtype. + """ + cast_obj = P.Cast() + outputs = cast_obj(x, dtype) + return outputs + + +class Transpose(Cell): + + def __init__(self, perm, conjugate=False): + super(Transpose, self).__init__() + self.perm = tuple(perm) + self.conjugate = conjugate + self.transpose = P.Transpose() + if self.conjugate: + raise NotImplementedError("conjugate not implemented") + + def construct(self, a): + return self.transpose(a, self.perm) + + +def transpose(a, perm=None, conjugate=False): + """ + Transposes a. + + Parameters + ---------- + a : tensor + A Tensor. + perm : int + A permutation of the dimensions of a. + conjugate : bool + Setting it to True is mathematically equivalent to ms.math.conj(ms.transpose(input)). + + Returns + ------- + A transposed Tensor. + """ + # TODO conjugate + trans_obj = P.Transpose() + outputs = trans_obj(a, perm) + print(outputs) + + +def gather_nd(params, indices, batch_dims=0): + """ + Gather slices from params into a Tensor with shape specified by indices. + + Parameters + ---------- + params : tensor + The tensor from which to gather values. + indices : tensor + Must be one of the following types: int32, int64. Index tensor. + batch_dims : int + An integer or a scalar 'Tensor'. The number of batch dimensions. + + Returns + ------- + A Tensor. Has the same type as params. + """ + + pass + + +def clip_by_value(t, clip_value_min, clip_value_max): + """ + Clips tensor values to a specified min and max. + + Parameters + ---------- + t : tensor + A Tensor or IndexedSlices + clip_value_min : tensor + A 0-D (scalar) Tensor, or a Tensor with the same shape as t. The minimum value to clip by + clip_value_max : tensor + A 0-D (scalar) Tensor, or a Tensor with the same shape as t. The minimum value to clip by + + Returns + ------- + A clipped Tensor or IndexedSlices. + """ + min_value = Tensor(clip_value_min, mstype.float32) + max_value = Tensor(clip_value_max, mstype.float32) + output = C.clip_by_value(t, min_value, max_value) + return output + + +def split(value, num_or_size_splits, axis=0, num=None): + """ + Splits a tensor into sub tensors. + + Parameters + ---------- + value : tensor + The Tensor to split. + num_or_size_splits : list + Either an integer indicating the number of splits along split_dim or a 1-D integer Tensor or + Python list containing the sizes of each output tensor along split_dim. + axis : int + The dimension along which to split. Must be in the range [-rank(value), rank(value)). Defaults to 0. + num : int + used to specify the number of outputs when it cannot be inferred from the shape of size_splits. + + Returns + ------- + Tensor objects resulting from splitting value. + """ + pass + + +def floor(x): + return NotImplementedError + + +def gather(params, indices): + return NotImplementedError + + +def linspace(start, stop, num): + return NotImplementedError + + +def slice(inputs, starts, sizes): + return NotImplementedError + + +def add_n(inputs): + return NotImplementedError + + +class OneHot(Cell): + + def __init__(self, axis=-1, depth=1, on_value=1.0, off_value=0.0, dtype=mstype.float32): + super(OneHot, self).__init__() + self.onehot = P.OneHot(axis) + self.depth = depth + self.dtype = dtype + self.on_value = F.cast(on_value, self.dtype) + self.off_value = F.cast(off_value, self.dtype) + + def construct(self, indices): + return self.onehot(indices, self.depth, self.on_value, self.off_value) + + +class L2Normalize(Cell): + + def __init__(self, axis=None, epsilon=1e-12): + super(L2Normalize, self).__init__() + pass + + def __call__(self, input, *args, **kwargs): + pass + + +class EmbeddingLookup(Cell): + + def __init__(self, max_norm=None): + self.max_norm = max_norm + + def __call__(self, params, ids, *args, **kwargs): + pass + + +class NCELoss(object): + + def __init__(self, num_true=1, sampled_values=None, remove_accidental_hits=False): + super(NCELoss, self).__init__() + + def __call__(self, weights, biases, labels, inputs, num_sampled, num_classes): + pass + + +class Not_equal(object): + + def __init__(self): + pass + + def __call__(self, x, y): + pass + + +class Count_nonzero(object): + + def __init__(self, keepdims=None, dtype=int64): + pass + + def __call__(self, *args, **kwargs): + pass + + +class Resize(Cell): + + def __init__(self, scale, method, antialias=False, data_format='channels_last', ksize=None): + super(Resize, self).__init__() + self.data_format = data_format + if method not in ['nearest', 'bilinear']: + raise ('The method must be "nearest" or "bilinear".') + self.method = method + + if ksize is None: + raise ('The "bilinear" and "nearest" method must enter ksize. The dimension of size must be 2 (H, W).') + + out_seize = (int(ksize[0] * scale[0]), int(ksize[1] * scale[1])) + if self.method == 'nearest': + self.resize = P.ResizeNearestNeighbor(size=out_seize, align_corners=antialias) + elif self.method == 'bilinear': + + self.resize = P.ResizeBilinear(size=out_seize) + + def construct(self, inputs): + if self.data_format == 'channels_last': + inputs = nhwc_to_nchw(inputs) + outputs = self.resize(inputs) + if self.data_format == 'channels_last': + outputs = nchw_to_nhwc(outputs) + return outputs + + +def resize(inputs, output_size, method, antialias): + raise NotImplementedError + + +class ZeroPadding1D(Cell): + def __init__(self, padding): + super(ZeroPadding1D, self).__init__() + if np.size(padding) == 2: + self.pad = P.Pad(paddings=padding) + else: + raise ("The shape of parameter paddings is (N, 2). N is the rank of input data.") + + def construct(self, inputs): + return self.pad(inputs) + + +class ZeroPadding2D(Cell): + def __init__(self, padding): + super(ZeroPadding2D, self).__init__() + if np.size(padding) == 4: + self.pad = P.Pad(paddings=padding) + else: + raise ("The shape of parameter paddings is (N, 2). N is the rank of input data.") + + def construct(self, inputs): + return self.pad(inputs) + + +class ZeroPadding3D(Cell): + def __init__(self, padding): + super(ZeroPadding3D, self).__init__() + if np.size(padding) == 6: + self.pad = P.Pad(paddings=padding) + else: + raise ("The shape of parameter paddings is (N, 2). N is the rank of input data.") + + def construct(self, inputs): + return self.pad(inputs) + + +class Sign(Cell): + + def __init__(self): + super(Sign, self).__init__() + self.sign = P.Sign() + + def construct(self, x): + return self.sign(x) + +def ceil(x): + _ceil = P.Ceil() + return _ceil(x) + +def multiply(x, y): + raise NotImplementedError + +def divide(x, y): + raise NotImplementedError + +def identity(x): + raise NotImplementedError + +class BatchToSpace(Cell): + def __init__(self, block_size, crops): + super(BatchToSpace, self).__init__() + self.batch_to_space = P.BatchToSpace(block_size=block_size, crops=crops) + + def __call__(self, input_x): + return self.batch_to_space(input_x) + +class DepthToSpace(Cell): + def __init__(self, block_size, data_format='NHWC'): + super(DepthToSpace, self).__init__() + self.data_format = data_format + self.depth_to_space = P.DepthToSpace(block_size=block_size) + + def __call__(self, input): + if self.data_format == 'NHWC': + input = nhwc_to_nchw(input) + + output = self.depth_to_space(input) + + if self.data_format == 'NHWC': + output = nchw_to_nhwc(output) + + return output \ No newline at end of file diff --git a/tensorlayer/backend/ops/mindspore_nn.py b/tensorlayer/backend/ops/mindspore_nn.py new file mode 100644 index 0000000..3af4430 --- /dev/null +++ b/tensorlayer/backend/ops/mindspore_nn.py @@ -0,0 +1,1323 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function + +from mindspore.nn.cell import Cell +from mindspore import context +import mindspore as ms +from mindspore.ops import operations as P +from mindspore.ops import functional as F +from mindspore.communication.management import get_group_size, get_rank +from mindspore.communication import management +from mindspore._checkparam import check_int_positive +from mindspore._extends import cell_attr_register + + + +def padding_format(padding): + """ + Checks that the padding format correspond format. + + Parameters + ---------- + padding : str + Must be one of the following:"same", "SAME", "VALID", "valid" + + Returns + ------- + str "SAME" or "VALID" + """ + + if padding in ["SAME", "same"]: + padding = "same" + elif padding in ["VALID", "valid"]: + padding = "valid" + elif padding == None: + padding = None + else: + raise Exception("Unsupported padding: " + str(padding)) + return padding + + +def preprocess_1d_format(data_format, padding): + """ + Checks that the 1-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NWC","NCW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NWC" or "NCW" and "SAME" or "VALID" + """ + + if data_format in ["channels_last", "NWC"]: + data_format = "NWC" + elif data_format in ["channels_first", "NCW"]: + data_format = "NCW" + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def preprocess_2d_format(data_format, padding): + """ + Checks that the 2-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NHWC","NCHW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NHWC" or "NCHW" and "SAME" or "VALID" + """ + + if data_format in ["channels_last", "NHWC", "nhwc"]: + data_format = "NHWC" + elif data_format in ["channels_first", "NCHW", "nchw"]: + data_format = "NCHW" + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def preprocess_3d_format(data_format, padding): + """ + Checks that the 3-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NDHWC","NCDHW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NDHWC" or "NCDHW" and "SAME" or "VALID" + """ + + if data_format in ['channels_last', 'NDHWC']: + data_format = 'NDHWC' + elif data_format in ['channels_first', 'NCDHW']: + data_format = 'NCDHW' + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def nchw_to_nhwc(x): + """ + Channels first to channels last + + Parameters + ---------- + x : tensor + channels first tensor data + + Returns + ------- + channels last tensor data + """ + + if len(P.Shape()(x)) == 3: + x = P.Transpose()(x, (0, 2, 1)) + elif len(P.Shape()(x)) == 4: + x = P.Transpose()(x, (0, 2, 3, 1)) + elif len(P.Shape()(x)) == 5: + x = P.Transpose()(x, (0, 2, 3, 4, 1)) + # else: + # raise Exception("Unsupported dimensions") + return x + + +def nhwc_to_nchw(x): + """ + Channles last to channels first + + Parameters + ---------- + x : tensor + channels last tensor data + + Returns + ------- + channels first tensor data + """ + + if len(P.Shape()(x)) == 3: + x = P.Transpose()(x, (0, 2, 1)) + elif len(P.Shape()(x)) == 4: + x = P.Transpose()(x, (0, 3, 1, 2)) + elif len(P.Shape()(x)) == 5: + x = P.Transpose()(x, (0, 4, 1, 2, 3)) + # else: + # raise Exception("Unsupported dimensions") + return x + + +class ReLU(Cell): + + def __init__(self): + super(ReLU, self).__init__() + self.relu = P.ReLU() + + def construct(self, x): + return self.relu(x) + + +def relu(x): + """ + Computes rectified linear: max(features, 0). + + Parameters + ---------- + x : tensor + Must be one of the following types: float32, float64, int32, uint8, int16, + int8, int64, bfloat16, uint16, half, uint32, uint64, qint8. + + Returns + ------- + A Tensor. Has the same type as features. + """ + outputs = P.ReLU() + return outputs(x) + + +class ReLU6(Cell): + + def __init__(self): + super(ReLU6, self).__init__() + self.relu6 = P.ReLU6() + + def construct(self, x): + return self.relu6(x) + + +def relu6(x): + """ + Computes Rectified Linear 6: min(max(features, 0), 6). + + Parameters + ---------- + x : tensor + Must be one of the following types: float32, float64, int32, uint8, int16, + int8, int64, bfloat16, uint16, half, uint32, uint64, qint8. + + Returns + ------- + A Tensor with the same type as features. + """ + outputs = P.ReLU6() + return outputs(x) + + +class LeakyReLU(Cell): + + def __init__(self, alpha=0.2): + super(LeakyReLU, self).__init__() + self.leakyrelu = ms.nn.LeakyReLU(alpha=alpha) + + def construct(self, x): + return self.leakyrelu(x) + + +def leaky_relu(x, alpha=0.2): + """ + Compute the Leaky ReLU activation function. + + Parameters + ---------- + x : tensor + representing preactivation values. Must be one of the following types: + float16, float32, float64, int32, int64. + + Returns + ------- + The activation value. + """ + + leaky_relu = LeakyReLU(alpha=alpha) + output = leaky_relu(x) + return leaky_relu + + +class Softplus(Cell): + + def __init__(self): + super(Softplus, self).__init__() + self.softplus = P.Softplus() + + def construct(self, x): + return self.softplus(x) + + +def softplus(x): + """ + Computes softplus: log(exp(features) + 1). + + Parameters + ---------- + x : tensor + Must be one of the following types: half, bfloat16, float32, float64. + + Returns + ------- + A Tensor. Has the same type as features. + """ + + obj = Softplus() + return obj(x) + + +class Tanh(Cell): + + def __init__(self): + super(Tanh, self).__init__() + self.tanh = P.Tanh() + + def construct(self, x): + return self.tanh(x) + + +def tanh(x): + """ + Computes hyperbolic tangent of x element-wise. + + Parameters + ---------- + x : tensor + Must be one of the following types: bfloat16, half, float32, float64, complex64, complex128. + + Returns + ------- + A Tensor. Has the same type as x. + """ + + _tanh = Tanh() + return _tanh(x) + + +class Sigmoid(Cell): + + def __init__(self): + super(Sigmoid, self).__init__() + self.sigmoid = P.Sigmoid() + + def construct(self, x): + return self.sigmoid(x) + + +def sigmoid(x): + """ + Computes sigmoid of x element-wise. + + Parameters + ---------- + x : tensor + A Tensor with type float16, float32, float64, complex64, or complex128. + + Returns + ------- + A Tensor with the same type as x. + """ + outputs = P.Sigmoid() + return outputs(x) + + +class Softmax(Cell): + + def __init__(self): + super(Softmax, self).__init__() + self.softmax = P.Softmax() + + def construct(self, x): + return self.softmax(x) + + +def softmax(logits, axis=None): + """ + Computes softmax activations. + + Parameters + ---------- + logits : tensor + Must be one of the following types: half, float32, float64. + axis : int + The dimension softmax would be performed on. The default is -1 which indicates the last dimension. + + Returns + ------- + A Tensor. Has the same type and shape as logits. + """ + outputs = P.Softmax(axis) + return outputs(logits) + + +class Dropout(Cell): + + def __init__(self, keep, seed=0): + super(Dropout, self).__init__() + self.dropout = P.Dropout(keep_prob=keep) + self.is_gpu = context.get_context('device_target') in ["GPU"] + self.get_shape = P.Shape() + self.dropout_gen_mask = P.DropoutGenMask(Seed0=seed, Seed1=0) + self.dropout_do_mask = P.DropoutDoMask() + self.cast = P.Cast() + self.keep_prob = keep # ms.Tensor(keep, dtype=ms.float32) + # print(self.keep_prob, type(self.keep_prob)) + + def construct(self, inputs): + if self.is_gpu: + outputs, _ = self.dropout(inputs) + return outputs + if self.keep_prob == 1: + return inputs + shape = self.get_shape(inputs) + dtype = P.DType()(inputs) + if self._is_float_dtype(dtype): + keep_prob = self.cast(self.keep_prob, dtype=dtype) + else: + keep_prob = self.cast(self.keep_prob, ms.float16) + output = self.dropout_gen_mask(shape, keep_prob) + return self.dropout_do_mask(inputs, output, keep_prob) + + def _is_float_dtype(dtype): + if dtype in [ms.float32, ms.float16]: + return True + return False + + +class BiasAdd(Cell): + """ + Adds bias to value. + + Parameters + ---------- + x : tensor + A Tensor with type float, double, int64, int32, uint8, int16, int8, complex64, or complex128. + bias : tensor + Must be the same type as value unless value is a quantized type, + in which case a different quantized type may be used. + Returns + ------- + A Tensor with the same type as value. + """ + + def __init__(self, data_format='channels_first'): + super(BiasAdd, self).__init__() + self.bias_add = P.BiasAdd() + if data_format in ['channels_first', 'NCW', 'NCHW', 'NCDHW']: + self.data_format = 'channels_first' + elif data_format in ['channels_last', 'NWC', 'NHWC', 'NDHWC']: + self.data_format = 'channels_last' + else: + raise ("Unsupported data format: " + str(data_format)) + + def construct(self, x, bias): + if self.data_format == 'channels_last': + x = nhwc_to_nchw(x) + outputs = self.bias_add(x, bias) + if self.data_format == 'channels_last': + outputs = nchw_to_nhwc(outputs) + return outputs + + +def bias_add(x, bias): + """ + Adds bias to value. + + Parameters + ---------- + x : tensor + A Tensor with type float, double, int64, int32, uint8, int16, int8, complex64, or complex128. + bias : tensor + Must be the same type as value unless value is a quantized type, + in which case a different quantized type may be used. + data_format : A string. + 'N...C' and 'NC...' are supported. + name : str + A name for the operation (optional). + Returns + ------- + A Tensor with the same type as value. + """ + raise NotImplementedError + + +class Conv1D(Cell): + + def __init__(self, stride, padding, data_format='NWC', dilations=None, out_channel=None, k_size=None): + super(Conv1D, self).__init__() + self.data_format, self.padding = preprocess_1d_format(data_format, padding) + self.stride = (1, stride) + self.dilations = (1, dilations) + self.k_size = (1, k_size) + self.out_channel = out_channel + + self.conv2d = P.Conv2D( + out_channel=self.out_channel, kernel_size=self.k_size, pad_mode=self.padding, stride=self.stride, + dilation=self.dilations, mode=1, group=1 + ) + + self.expand_dims = P.ExpandDims() + self.squeeze = P.Squeeze(2) + + def construct(self, x, filters): + if self.data_format == 'NWC': + x = nhwc_to_nchw(x) + + x = self.expand_dims(x, 2) + filters = self.expand_dims(filters, 2) + + output = self.conv2d(x, filters) + output = self.squeeze(output) + + if self.data_format == 'NWC': + output = nchw_to_nhwc(output) + return output + + +def conv1d(input, filters, stride, padding, data_format='NWC', dilations=None, name=None): + """ + Computes a 1-D convolution given 3-D input and filter tensors. + + Parameters + ---------- + input : tensor + A 3D Tensor. Must be of type float16, float32, or float64 + filters : tensor + A 3D Tensor. Must have the same type as input. + stride : int of list + An int or list of ints that has length 1 or 3. The number of entries by which the filter is moved right at each step. + padding : string + 'SAME' or 'VALID' + data_format : string + An optional string from "NWC", "NCW". Defaults to "NWC", the data is stored in the order of + [batch, in_width, in_channels]. The "NCW" format stores data as [batch, in_channels, in_width]. + dilations : int or list + An int or list of ints that has length 1 or 3 which defaults to 1. + The dilation factor for each dimension of input. If set to k > 1, + there will be k-1 skipped cells between each filter element on that dimension. + Dilations in the batch and depth dimensions must be 1. + name : string + A name for the operation (optional). + Returns + ------- + A Tensor. Has the same type as input. + """ + + pass + + +class Conv2D(Cell): + + def __init__(self, strides, padding, data_format='NHWC', dilations=None, out_channel=None, k_size=None): + super(Conv2D, self).__init__() + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + + if self.data_format is 'NHWC': + self.ms_stride = strides[1] + self.ms_dilation = dilations[1] + # self.transpose = P.Transpose() + elif self.data_format is 'NCHW': + self.ms_stride = strides[2] + self.ms_dilation = dilations[2] + + # print(out_channel, k_size, self.padding, self.ms_stride, self.ms_dilation) + self.conv2d = P.Conv2D( + out_channel=out_channel, kernel_size=k_size, pad_mode=self.padding, stride=self.ms_stride, + dilation=self.ms_dilation, mode=1, group=1 + ) + + def construct(self, inputs, filters): + if self.data_format == 'NHWC': + inputs = nhwc_to_nchw(inputs) + + outputs = self.conv2d(inputs, filters) + + if self.data_format == 'NHWC': + outputs = nchw_to_nhwc(outputs) + return outputs + + +def conv2d(input, filters, strides, padding, data_format='NCHW', dilations=None): + """ + Computes a 2-D convolution given 4-D input and filters tensors. + + Parameters + ---------- + input : tensor + Must be one of the following types: half, bfloat16, float32, float64. A 4-D tensor. + The dimension order is interpreted according to the value of data_format, see below for details. + filters : tensor + Must have the same type as input. A 4-D tensor of shape [filter_height, filter_width, in_channels, out_channels] + strides : int of list + The stride of the sliding window for each dimension of input. If a single value is given it is replicated in the H and W dimension. + By default the N and C dimensions are set to 1. The dimension order is determined by the value of data_format, see below for details. + padding : string + "SAME" or "VALID" + data_format : string + "NHWC", "NCHW". Defaults to "NCHW". + dilations : list or ints + list of ints that has length 1, 2 or 4, defaults to 1. The dilation factor for each dimension ofinput. + + Returns + ------- + A Tensor. Has the same type as input. + """ + raise NotImplementedError + + +class Conv3D(Cell): + pass + # raise NotImplementedError + + +def conv3d(input, filters, strides, padding, data_format='NDHWC', dilations=None, name=None): + """ + Computes a 3-D convolution given 5-D input and filters tensors. + + Parameters + ---------- + input : tensor + Must be one of the following types: half, bfloat16, float32, float64. + Shape [batch, in_depth, in_height, in_width, in_channels]. + filters : tensor + Must have the same type as input. Shape [filter_depth, filter_height, filter_width, in_channels, out_channels]. + in_channels must match between input and filters. + strides : list of ints + A list of ints that has length >= 5. 1-D tensor of length 5. + The stride of the sliding window for each dimension of input. + Must have strides[0] = strides[4] = 1. + padding : string + A string from: "SAME", "VALID". The type of padding algorithm to use. + data_format : string + An optional string from: "NDHWC", "NCDHW". Defaults to "NDHWC". The data format of the input and output data. + With the default format "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, in_width, in_channels]. + Alternatively, the format could be "NCDHW", the data storage order is: [batch, in_channels, in_depth, in_height, in_width]. + dilations : list of ints + Defaults to [1, 1, 1, 1, 1]. 1-D tensor of length 5. The dilation factor for each dimension of input. + If set to k > 1, there will be k-1 skipped cells between each filter element on that dimension. + The dimension order is determined by the value of data_format, see above for details. + Dilations in the batch and depth dimensions must be 1. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor. Has the same type as input. + """ + + raise NotImplementedError + + +def lrn(inputs, depth_radius, bias, alpha, beta): + """ + Local Response Normalization. + + Parameters + ---------- + inputs : tensor + Must be one of the following types: half, bfloat16, float32. 4-D. + depth_radius : int + Defaults to 5. 0-D. Half-width of the 1-D normalization window. + bias : float + Defaults to 1. An offset (usually positive to avoid dividing by 0). + alpha : float + Defaults to 1. A scale factor, usually positive. + beta : float + Defaults to 0.5. An exponent. + + Returns + ------- + A Tensor. Has the same type as input. + """ + pass + + +def moments(x, axes, shift=None, keepdims=False): + """ + Calculates the mean and variance of x. + + Parameters + ---------- + x : tensor + A Tensor + axes : ints + Axes along which to compute mean and variance. + shift : int + Not used in the current implementation. + keepdims : bool + produce moments with the same dimensionality as the input. + + Returns + ------- + Two Tensor objects: mean and variance. + """ + + pass + + +class MaxPool(Cell): + + def __init__(self, ksize, strides, padding, data_format=None): + super(MaxPool, self).__init__() + self.data_format, self.padding = preprocess_2d_format(data_format=data_format, padding=padding) + ms_ksize = ksize[1] + ms_strides = strides[1] + self.maxpool = P.MaxPool(ksize=ms_ksize, strides=ms_strides, padding=self.padding) + + def construct(self, inputs): + if self.data_format == 'NHWC': + inputs = nhwc_to_nchw(inputs) + + outputs = self.maxpool(inputs) + + if self.data_format == 'NHWC': + outputs = nchw_to_nhwc(outputs) + return outputs + + +def max_pool(input, ksize, strides, padding, data_format=None): + """ + Performs the max pooling on the input. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] if data_format does not start + with "NC" (default), or [batch_size, num_channels] + input_spatial_shape if data_format starts with "NC". + Pooling happens over the spatial dimensions only. + ksize : int or list of ints + An int or list of ints that has length 1, N or N+2. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, N or N+2. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + + Returns + ------- + A Tensor of format specified by data_format. The max pooled output tensor. + """ + data_format, padding = preprocess_2d_format(data_format=data_format, padding=padding) + if data_format == 'NHWC': + input = nhwc_to_nchw(input) + + ms_ksize = ksize[1] + ms_strides = strides[2] + outputs = P.MaxPool(ksize=ms_ksize, strides=ms_strides, padding=padding)(input) + # channel first to channel last + if data_format == 'NHWC': + outputs = nchw_to_nhwc(outputs) + return outputs + + +class AvgPool(Cell): + + def __init__(self, ksize, strides, padding, data_format=None): + super(AvgPool, self).__init__() + self.data_format, self.padding = preprocess_2d_format(data_format=data_format, padding=padding) + ms_ksize = ksize[1] + ms_strides = strides[1] + self.avgpool = P.AvgPool(ksize=ms_ksize, strides=ms_strides, padding=padding) + + def construct(self, inputs): + if self.data_format == 'NHWC': + inputs = nhwc_to_nchw(inputs) + + outputs = self.avgpool(inputs) + + if self.data_format == 'NHWC': + outputs = nchw_to_nhwc(outputs) + return outputs + + +def avg_pool(input, ksize, strides, padding): + """ + Performs the avg pooling on the input. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] + if data_format does not start with "NC" (default), or [batch_size, num_channels] + input_spatial_shape + if data_format starts with "NC". Pooling happens over the spatial dimensions only. + ksize : int or list of ints + An int or list of ints that has length 1, N or N+2. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, N or N+2. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + + Returns + ------- + A Tensor of format specified by data_format. The average pooled output tensor. + """ + padding = padding_format(padding) + ms_ksize = ksize[0] + ms_strides = strides[1] + outputs = P.AvgPool(ksize=ms_ksize, strides=ms_strides, padding=padding) + return outputs(input) + + +def max_pool3d(input, ksize, strides, padding, data_format=None, name=None): + """ + Performs the max pooling on the input. + + Parameters + ---------- + input : tensor + A 5-D Tensor of the format specified by data_format. + ksize : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + "NDHWC", "NCDHW". Defaults to "NDHWC". The data format of the input and output data. + With the default format "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, in_width, in_channels]. + Alternatively, the format could be "NCDHW", the data storage order is: [batch, in_channels, in_depth, in_height, in_width]. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor of format specified by data_format. The max pooled output tensor. + """ + pass + + +def avg_pool3d(input, ksize, strides, padding, data_format=None, name=None): + """ + Performs the average pooling on the input. + + Parameters + ---------- + input : tensor + A 5-D Tensor of shape [batch, height, width, channels] and type float32, float64, qint8, quint8, or qint32. + ksize : int or list of ints + An int or list of ints that has length 1, 3 or 5. The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NDHWC' and 'NCDHW' are supported. + name : string + Optional name for the operation. + + Returns + ------- + A Tensor with the same type as value. The average pooled output tensor. + """ + pass + + +def pool(input, window_shape, pooling_type, strides=None, padding='VALID', data_format=None, dilations=None, name=None): + """ + Performs an N-D pooling operation. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] + if data_format does not start with "NC" (default), or [batch_size, num_channels] + input_spatial_shape + if data_format starts with "NC". Pooling happens over the spatial dimensions only. + window_shape : int + Sequence of N ints >= 1. + pooling_type : string + Specifies pooling operation, must be "AVG" or "MAX". + strides : ints + Sequence of N ints >= 1. Defaults to [1]*N. If any value of strides is > 1, then all values of dilation_rate must be 1. + padding : string + The padding algorithm, must be "SAME" or "VALID". Defaults to "SAME". + See the "returns" section of tf.ops.convolution for details. + data_format : string + Specifies whether the channel dimension of the input and output is the last dimension (default, or if data_format does not start with "NC"), + or the second dimension (if data_format starts with "NC"). + For N=1, the valid values are "NWC" (default) and "NCW". For N=2, the valid values are "NHWC" (default) and "NCHW". + For N=3, the valid values are "NDHWC" (default) and "NCDHW". + dilations : list of ints + Dilation rate. List of N ints >= 1. Defaults to [1]*N. If any value of dilation_rate is > 1, then all values of strides must be 1. + name : string + Optional. Name of the op. + + Returns + ------- + Tensor of rank N+2, of shape [batch_size] + output_spatial_shape + [num_channels] + """ + pass + + + +class DepthwiseConv2d(Cell): + + def __init__(self, strides, padding, data_format=None, dilations=None, ksize=None, channel_multiplier=1): + super(DepthwiseConv2d, self).__init__() + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.ms_stride = strides[1] + self.ms_dilation = dilations[1] + self.depthwise_conv2d = P.DepthwiseConv2dNative( + channel_multiplier=channel_multiplier, kernel_size=ksize, stride=self.ms_stride, dilation=self.ms_dilation + ) + + def construct(self, input, filter): + if self.data_format == 'NHWC': + input = nhwc_to_nchw(input) + outputs = self.depthwise_conv2d(input, filter) + if self.data_format == 'NHWC': + outputs = nchw_to_nhwc(outputs) + return outputs + + +def depthwise_conv2d(input, filter, strides, padding, data_format=None, dilations=None, name=None): + """ + Depthwise 2-D convolution. + + Parameters + ---------- + input : tensor + 4-D with shape according to data_format. + filter : tensor + 4-D with shape [filter_height, filter_width, in_channels, channel_multiplier]. + strides : list + 1-D of size 4. The stride of the sliding window for each dimension of input. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + The data format for input. Either "NHWC" (default) or "NCHW". + dilations : list + 1-D of size 2. The dilation rate in which we sample input values across the height and width dimensions in atrous convolution. + If it is greater than 1, then all values of strides must be 1. + name : string + A name for this operation (optional). + + Returns + ------- + A 4-D Tensor with shape according to data_format. + E.g., for "NHWC" format, shape is [batch, out_height, out_width, in_channels * channel_multiplier]. + """ + + pass + + +class Conv1d_transpose(Cell): + + def __init__(self, strides, padding, data_format, dilations=None, out_channel=None, k_size=None, in_channels=None): + super(Conv1d_transpose, self).__init__() + self.data_format, self.padding = preprocess_1d_format(data_format, padding) + self.in_channels = in_channels + self.out_channel = out_channel + self.strides = (1, strides) + self.dilations = (1, dilations) + self.k_size = (1, k_size) + + self.conv2d_transpose = P.Conv2DBackpropInput( + out_channel=self.in_channels, kernel_size=self.k_size, pad_mode=self.padding, stride=self.strides, + dilation=self.dilations, mode=1, group=1 + ) + self.shape = P.Shape() + self.expand_dims = P.ExpandDims() + self.squeeze = P.Squeeze(2) + + def _deconv_output_length(self, input_length, filter_size, stride_size, dilation_size): + length = 0 + filter_size = filter_size + (filter_size - 1) * (dilation_size - 1) + + if self.padding == 'same': + length = input_length * stride_size + elif self.padding == 'valid': + length = input_length * stride_size + max(filter_size - stride_size, 0) + + return length + + def construct(self, x, filters): + if self.data_format == 'NWC': + x = nhwc_to_nchw(x) + x = self.expand_dims(x, 2) + filters = self.expand_dims(filters, 2) + n, _, h, w = self.shape(x) + + h_out = self._deconv_output_length(h, self.k_size[0], self.strides[0], self.dilations[0]) + w_out = self._deconv_output_length(w, self.k_size[1], self.strides[1], self.dilations[1]) + output = self.conv2d_transpose(x, filters, (n, self.out_channel, h_out, w_out)) + output = self.squeeze(output) + + if self.data_format == 'NWC': + output = nchw_to_nhwc(output) + return output + + +def conv1d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NWC', dilations=None, name=None +): + """ + The transpose of conv1d. + + Parameters + ---------- + input : tensor + A 3-D Tensor of type float and shape [batch, in_width, in_channels] + for NWC data format or [batch, in_channels, in_width] for NCW data format. + filters : tensor + A 3-D Tensor with the same type as value and shape [filter_width, output_channels, in_channels]. + filter's in_channels dimension must match that of value. + output_shape : tensor + A 1-D Tensor, containing three elements, representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1 or 3. The number of entries by which the filter is moved right at each step. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NWC' and 'NCW' are supported. + dilations : list + An int or list of ints that has length 1 or 3 which defaults to 1. + The dilation factor for each dimension of input. If set to k > 1, + there will be k-1 skipped cells between each filter element on that dimension. + Dilations in the batch and depth dimensions must be 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as value. + """ + pass + + +class Conv2d_transpose(Cell): + + def __init__(self, strides, padding, data_format, dilations=None, out_channel=None, k_size=None, in_channels=None): + super(Conv2d_transpose, self).__init__() + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.in_channels = in_channels + self.out_channel = out_channel + + self.k_size = k_size + if self.data_format == 'NHWC': + self.strides = (strides[1], strides[2]) + self.dilations = (dilations[1], dilations[2]) + elif self.data_format == 'NCHW': + self.strides = (strides[2], strides[3]) + self.dilations = (dilations[2], dilations[3]) + + self.conv2d_transpose = P.Conv2DBackpropInput( + out_channel=self.in_channels, kernel_size=self.k_size, pad_mode=self.padding, stride=self.strides, + dilation=self.dilations, mode=1, group=1 + ) + self.shape = P.Shape() + + def _deconv_output_length(self, input_length, filter_size, stride_size, dilation_size): + length = 0 + filter_size = filter_size + (filter_size - 1) * (dilation_size - 1) + + if self.padding == 'same': + length = input_length * stride_size + elif self.padding == 'valid': + length = input_length * stride_size + max(filter_size - stride_size, 0) + + return length + + def construct(self, x, filters): + if self.data_format == 'NHWC': + x = nhwc_to_nchw(x) + + n, _, h, w = self.shape(x) + + h_out = self._deconv_output_length(h, self.k_size[0], self.strides[0], self.dilations[0]) + w_out = self._deconv_output_length(w, self.k_size[1], self.strides[1], self.dilations[1]) + + output = self.conv2d_transpose(x, filters, (n, self.out_channel, h_out, w_out)) + + if self.data_format == 'NHWC': + output = nchw_to_nhwc(x) + + return output + + +def conv2d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NHWC', dilations=None, name=None +): + """ + The transpose of conv2d. + + Parameters + ---------- + input : tensor + A 4-D Tensor of type float and shape [batch, height, width, in_channels] + for NHWC data format or [batch, in_channels, height, width] for NCHW data format. + filters : tensor + A 4-D Tensor with the same type as input and shape [height, width, + output_channels, in_channels]. filter's in_channels dimension must match that of input. + output_shape : tensor + A 1-D Tensor representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1, 2 or 4. The stride of the sliding window for each dimension of input. + If a single value is given it is replicated in the H and W dimension. + By default the N and C dimensions are set to 0. + The dimension order is determined by the value of data_format, see below for details. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NHWC' and 'NCHW' are supported. + dilations : list + An int or list of ints that has length 1, 2 or 4, defaults to 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as input. + """ + pass + + +class Conv3d_transpose(Cell): + pass + + +def conv3d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NDHWC', dilations=None, name=None +): + """ + The transpose of conv3d. + + Parameters + ---------- + input : tensor + A 5-D Tensor of type float and shape [batch, height, width, in_channels] for + NHWC data format or [batch, in_channels, height, width] for NCHW data format. + filters : tensor + A 5-D Tensor with the same type as value and shape [height, width, output_channels, in_channels]. + filter's in_channels dimension must match that of value. + output_shape : tensor + A 1-D Tensor representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1, 3 or 5. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NDHWC' and 'NCDHW' are supported. + dilations : list of ints + An int or list of ints that has length 1, 3 or 5, defaults to 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as value. + """ + + pass + + + +class BatchNorm(Cell): + """Batch Normalization base class.""" + + @cell_attr_register + def __init__( + self, num_features, epsilon=1e-5, decay=0.9, gamma=None, beta=None, moving_mean=None, moving_var=None, + is_train=None, device_num_each_group=1, data_format='channels_last' + ): + super(BatchNorm, self).__init__() + if num_features < 1: + raise ValueError("num_features must be at least 1") + + if decay < 0 or decay > 1: + raise ValueError("momentum should be a number in range [0, 1], but got {}".format(decay)) + + self.data_format = data_format + self.use_batch_statistics = is_train + self.num_features = num_features + self.eps = epsilon + self.moving_mean = moving_mean + self.moving_variance = moving_var + self.gamma = gamma + self.beta = beta + self.group = check_int_positive(device_num_each_group) + self.is_global = False + if self.group != 1: + self.rank_id = get_rank() + self.rank_size = get_group_size() + self.device_list = [i for i in range(0, self.rank_size)] + self.rank_list = self.list_group(self.device_list, self.group) + self.rank_list_idx = len(self.rank_list) + for i in range(self.rank_list_idx): + if self.rank_id in self.rank_list[i] and self.group != 1: + self.is_global = True + management.create_group('group' + str(i), self.rank_list[i]) + self.all_reduce = P.AllReduce(P.ReduceOp.SUM, 'group' + str(i)).add_prim_attr('fusion', 1) + self.shape = P.Shape() + self.reduce_mean = P.ReduceMean(keep_dims=True) + self.square = P.Square() + self.sqrt = P.Sqrt() + self.cast = P.Cast() + self.dtype = P.DType() + self.reshape = P.Reshape() + self.is_ascend = context.get_context("device_target") == "Ascend" + self.is_gpu = context.get_context("device_target") == "GPU" + self.is_graph_mode = context.get_context("mode") == context.GRAPH_MODE + self.momentum = 1.0 - decay + if context.get_context("enable_ge"): + self.is_ge_backend = True + else: + self.is_ge_backend = False + + if self.is_graph_mode and (self.is_ge_backend or self.is_ascend): + self.bn_train = P.BatchNorm(is_training=True, epsilon=self.eps) + elif self.is_gpu: + self.bn_train = P.FusedBatchNormEx(mode=1, epsilon=self.eps, momentum=self.momentum) + else: + self.bn_train = P.FusedBatchNorm(mode=1, epsilon=self.eps, momentum=self.momentum) + self.bn_infer = P.BatchNorm(is_training=False, epsilon=self.eps) + self.enable_global_sync = self.is_global and (self.is_ge_backend or (self.is_graph_mode and self.is_ascend)) + self.enable_default_train = self.is_graph_mode and not self.is_global and \ + (self.is_ge_backend or self.is_ascend) + + data_parallel_strategy = ((1, ), (1, )) + data_parallel_strategy_one = ((1, ), ()) + self.sub_mean = P.Sub().shard(data_parallel_strategy) + self.sub_var = P.Sub().shard(data_parallel_strategy) + self.mul_mean = P.Mul().shard(data_parallel_strategy_one) + self.mul_var = P.Mul().shard(data_parallel_strategy_one) + self.assign_sub_mean = P.AssignSub().shard(data_parallel_strategy) + self.assign_sub_var = P.AssignSub().shard(data_parallel_strategy) + + def _check_data_dim(self, x): + raise NotImplementedError + + def list_group(self, world_rank, group_size): + if group_size > get_group_size(): + raise ValueError( + "group size can not be greater than local rank size, group size is {}, " + "local_rank_size is {}".format(group_size, get_group_size()) + ) + if len(world_rank) % group_size != 0: + raise ValueError("please make your group size correct.") + world_rank_list = zip(*(iter(world_rank), ) * group_size) + group_list = [list(i) for i in world_rank_list] + return group_list + + def _global_sync(self, x, axes, re_shape): + """calculate global batch normalization output""" + x_mean = self.reduce_mean(x, axes) + x_mean_square = self.reduce_mean(self.square(x), axes) + global_batch_mean = self.all_reduce(x_mean) / self.group + global_batch_mean_square = self.all_reduce(x_mean_square) / self.group + global_mean = global_batch_mean + global_var = global_batch_mean_square - self.square(global_mean) + var_sqrt = self.sqrt(global_var + self.eps) + mean_first = (x - global_mean) / var_sqrt + y = mean_first * self.reshape(self.gamma, re_shape) + self.reshape(self.beta, re_shape) + + mean_sub = self.sub_mean(self.reshape(self.moving_mean, re_shape), global_mean) + tmp_mean = self.mul_mean(mean_sub, self.cast(self.momentum, self.dtype(mean_sub))) + mean_sub2 = self.sub_var(self.reshape(self.moving_mean, re_shape), global_var) + tmp_variance = self.mul_var(mean_sub2, self.cast(self.momentum, self.dtype(mean_sub2))) + y = F.depend(y, self.assign_sub_mean(self.moving_mean, self.reshape(tmp_mean, self.shape(self.moving_mean)))) + y = F.depend( + y, self.assign_sub_var(self.moving_variance, self.reshape(tmp_variance, self.shape(self.moving_variance))) + ) + return y + + def get_dim(self, input): + dim = len(self.shape(input)) + if dim == 2: + return '1d' + elif dim == 4: + return '2d' + else: + raise ValueError("The input must has 2 dims or 4 dims.") + + def _shape_check_bn(self, in_shape, in_dims): + dim = len(in_shape) + if in_dims == '1d' and dim != 2: + raise ValueError("The input must has 2 dims.") + if in_dims == '2d' and dim != 4: + raise ValueError("The input must has 4 dims.") + if in_dims == 'both' and dim != 2 and dim != 4: + raise ValueError("The input must has 2 dims or 4 dims.") + + def _shape_infer(self, x_shape, num_feature): + """global batch normalization shape and axes infer""" + if len(x_shape) == 4: + axes = (0, 2, 3) + re_shape = (1, num_feature, 1, 1) + else: + axes = (0, ) + re_shape = (1, num_feature) + return axes, re_shape + + def construct(self, inputs): + x = inputs + self._shape_check_bn(self.shape(x), self.get_dim(x)) + if self.use_batch_statistics is None: + flag = self.training + else: + flag = self.use_batch_statistics + + if flag: + if self.enable_global_sync: + if self.data_format == 'channels_last' and self.get_dim(x) == '2d': + x = nhwc_to_nchw(x) + axes, re_shape = self._shape_infer(F.shape(x), self.num_features) + y = self._global_sync(x, axes, re_shape) + if self.data_format == 'channels_last' and self.get_dim(x) == '2d': + y = nchw_to_nhwc(y) + return y + + if self.enable_default_train: + if self.data_format == 'channels_last' and self.get_dim(x) == '2d': + x = nhwc_to_nchw(x) + y, batch_mean, batch_var, _, _ = self.bn_train(x, self.gamma, self.beta, None, None) + + mean_sub = self.sub_mean(self.moving_mean, batch_mean) + temp_mean = self.mul_mean(mean_sub, self.momentum) + mean_sub2 = self.sub_var(self.moving_variance, batch_var) + temp_variance = self.mul_var(mean_sub2, self.momentum) + y = F.depend(y, self.assign_sub_mean(self.moving_mean, temp_mean)) + y = F.depend(y, self.assign_sub_var(self.moving_variance, temp_variance)) + if self.data_format == 'channels_last' and self.get_dim(x) == '2d': + y = nchw_to_nhwc(y) + return y + + if self.data_format == 'channels_last' and self.get_dim(x) == '2d': + x = nhwc_to_nchw(x) + y = self.bn_train(x, self.gamma, self.beta, self.moving_mean, self.moving_variance)[0] + if self.data_format == 'channels_last' and self.get_dim(x) == '2d': + y = nchw_to_nhwc(y) + return y + if self.data_format == 'channels_last' and self.get_dim(x) == '2d': + x = nhwc_to_nchw(x) + y = self.bn_infer(x, self.gamma, self.beta, self.moving_mean, self.moving_variance)[0] + if self.data_format == 'channels_last' and self.get_dim(x) == '2d': + y = nchw_to_nhwc(y) + return y diff --git a/tensorlayer/backend/ops/paddle_backend.py b/tensorlayer/backend/ops/paddle_backend.py new file mode 100644 index 0000000..e9b37c5 --- /dev/null +++ b/tensorlayer/backend/ops/paddle_backend.py @@ -0,0 +1,972 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function +import paddle as pd +import paddle.nn as nn + +_dtypeDict = ["float16", "float32", "float64", "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64"] +# TODO NotImplemented +DType = None +float16 = "float16" +float32 = "float32" +float64 = "float64" +int8 = "int8" +int16 = "int16" +int32 = "int32" +int64 = "int64" +uint8 = "uint8" +uint16 = "uint16" +uint32 = "uint32" +uint64 = "uint64" + +def _getter(init_fn, **kwargs): + """Return an named eager tensor.""" + raise NotImplementedError + + +def set_context(**kwargs): + raise Exception("Using Paddle backend,You don't need to set context") + + +def get_tensor_shape(x): + return pd.shape(x) + + +# initializers +def zeros(shape, dtype="float32"): + """ + Creates a tensor with all elements set to zero. + + Parameters + ---------- + shape : A list of integers + a tuple of integers, or a 1-D Tensor of type int32. + dtype : tensor + The DType of an element in the resulting Tensor + + Returns + ------- + A Tensor with all elements set to zero. + + """ + return pd.zeros(shape=shape, dtype=dtype) + + +def ones(shape, dtype="float32"): + """ + Creates a tensor with all elements set to ones. + + Parameters + ---------- + shape : A list of integers + a tuple of integers, or a 1-D Tensor of type int32. + dtype : tensor + The DType of an element in the resulting Tensor + + Returns + ------- + A Tensor with all elements set to zero. + + """ + return pd.ones(shape=shape, dtype=dtype) + + +def constant(value, shape, dtype="float32"): + """ + Creates a constant tensor from a tensor-like object. + + Parameters + ---------- + value : list + A constant value (or list) of output type dtype. + dtype : tensor + The type of the elements of the resulting tensor. + shape : tuple + Optional dimensions of resulting tensor. + + Returns + ------- + A Constant Tensor. + + """ + return nn.initializer.constant(value=value) + + +def random_uniform(shape, minval=0, maxval=None, dtype="float32", seed=None): + """ + Outputs random values from a uniform distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + minval : int + The lower bound on the range of random values to generate (inclusive). Defaults to 0. + maxval : int + The upper bound on the range of random values to generate (exclusive). Defaults to 1 if dtype is floating point. + dtype : tensor + The type of the output: float16, float32, float64, int32, or int64. + seed : int + Used in combination with dragon.random.set_seed to create a reproducible sequence of tensors across multiple calls. + Returns + ------- + A tensor of the specified shape filled with random uniform values. + + """ + raise NotImplementedError + + +def random_normal(shape, mean=0.0, stddev=1.0, dtype="float32", seed=None): + """ + Outputs random values from a normal distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + mean : float + The mean of the normal distribution + stddev : float + The standard deviation of the normal distribution. + dtype : tensor + The type of the output. + seed : A Python integer + Used to create a random seed for the distribution + + Returns + ------- + A tensor of the specified shape filled with random normal values. + + """ + raise NotImplementedError + + +def truncated_normal(shape, mean=0.0, stddev=1.0, dtype="float32", seed=None): + """ + Outputs random values from a truncated normal distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + mean : float + The mean of the normal distribution + stddev : float + The standard deviation of the normal distribution. + dtype : tensor + The type of the output. + seed : A Python integer + Used to create a random seed for the distribution + + Returns + ------- + A tensor of the specified shape filled with random truncated normal values. + + """ + raise NotImplementedError + + +def he_normal(shape, dtype, seed=None): + """ + He normal initializer. + + Parameters + ---------- + seed : A Python integer. + Used to seed the random generator. + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + dtype : tensor + The type of the output. + + Returns + ------- + A tensor of the specified shape filled with he normal values. + """ + # shape = shape[::-1] + raise NotImplementedError + + +def Variable(initial_value, name, trainable=None): + """ + Creates a new variable with value initial_value. + + Parameters + ---------- + initial_value : tensor + A Tensor, or Python object convertible to a Tensor + name : str + Optional name for the variable. Defaults to 'Variable' and gets uniquified automatically. + Returns + ------- + Variable + """ + raise NotImplementedError + + +class MatMul(object): + + def __init__(self): + pass + + def __call__(self, a, b): + return pd.matmul(x=a, y=b) + + +def matmul(a, b): + """ + Multiplies matrix a by matrix b, producing a * b. + + Parameters + ---------- + a : tensor + type float16, float32, float64, int32, complex64, complex128 and rank > 1. + b : tensor + with same type and rank as a. + + Returns + ------- + A Tensor of the same type as a and b + """ + raise NotImplementedError + + +def add(value, bias): + """ + Returns x + y element-wise. + + Parameters + ---------- + value : tensor. + Must be one of the following types: bfloat16, half, float32, float64, + uint8, int8, int16, int32, int64, complex64, complex128, string. + bias : tensor + Must have the same type as a + name : str + A name for the operation + + Returns + ------- + A Tensor. Has the same type as a. + """ + + raise NotImplementedError + + +def dtypes(dt): + """ + Data dtypes. + + Parameters + ---------- + dt : string + It could be 'uint8', 'uint16', 'uint32', 'uint64', 'int8', 'int16', + 'int32', 'int64', 'float16', 'float32', 'float64', 'DType'. + + Returns + ------- + Data dtypes + """ + raise NotImplementedError + + +class Maximum(object): + def __init__(self): + pass + + def __call__(self, x, y): + raise NotImplementedError + + +class Minimum(object): + def __init__(self): + pass + + def __call__(self, x, y): + raise NotImplementedError + + +def minimum(x, y): + """ + Returns the min of x and y (i.e. x < y ? x : y) element-wise. + + Parameters + ---------- + x : tensor. + Must be one of the following types: bfloat16, half, float32, float64, int32, int64. + y : A Tensor. + Must have the same type as x. + name : str + A name for the operation (optional). + + Returns + ------- + A Tensor. Has the same type as x + """ + raise NotImplementedError + + +class FlattenReshape(object): + + def __init__(self): + pass + + def __call__(self, inputs): + return pd.flatten(x=inputs, start_axis=1,stop_axis=-1) + + +class Reshape(object): + + def __init__(self, shape): + self.shape = shape + + def __call__(self, tensor): + raise NotImplementedError + + +def reshape(tensor, shape): + """ + Reshapes a tensor. + + Parameters + ---------- + tensor : tensor + A Tensor. + shape : tensor + Defines the shape of the output tensor. + Returns + ------- + A Tensor. Has the same type as tensor + """ + raise NotImplementedError + + +class Concat(object): + + def __init__(self, axis): + super(Concat, self).__init__() + self.axis = axis + + def __call__(self, values): + raise NotImplementedError + + +def concat(values, axis): + """ + Concatenates tensors along one dimension. + + Parameters + ---------- + values : list + A list of Tensor objects or a single Tensor + axis : int + 0-D int32 Tensor. Dimension along which to concatenate + Returns + ------- + A Tensor resulting from concatenation of the input tensors. + """ + raise NotImplementedError + + +def convert_to_tensor(value, dtype=None): + """ + Converts the given value to a Tensor. + + Parameters + ---------- + value : object + An object whose type has a registered Tensor conversion function. + dtype : optional + Optional element type for the returned tensor. If missing, the type is inferred from the type of value. + + Returns + ------- + A Tensor based on value. + """ + raise NotImplementedError + + +def sqrt(x): + """ + Computes square root of x element-wise. + + Parameters + ---------- + x : tensor + Must be one of the following types: bfloat16, half, float32, float64, complex64, complex128. + + Returns + ------- + A Tensor. Has the same type as x. + """ + raise NotImplementedError + + +class ReduceSum(object): + + def __init__(self, axis): + pass + + def construct(self, input): + pass + + +class ReduceMean(object): + + def __init__(self, axis): + if axis == [1, 2]: + self.data_format = 'NHWC' + elif axis == [2, 3]: + self.data_format = 'NCHW' + else: + raise ("`data_format` should have one of the following values: [`channels_last`, `channels_first`]") + + def __call__(self, inputs): + raise NotImplementedError + + +def reduce_mean(input_tensor, axis=None): + """ + Computes the mean of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + raise NotImplementedError + + +class ReduceMax(object): + + def __init__(self, axis): + if axis == [1, 2]: + self.data_format = 'NHWC' + elif axis == [2, 3]: + self.data_format = 'NCHW' + else: + raise ("`data_format` should have one of the following values: [`channels_last`, `channels_first`]") + + def __call__(self, inputs): + raise NotImplementedError + + +def reduce_max(input_tensor, axis=None): + """ + Computes the maximum of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have real numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + raise NotImplementedError + + +def reduce_min(input_tensor, axis=None): + """ + Computes the minimum of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have real numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + raise NotImplementedError + +class Pad(object): + def __init__(self, paddings, mode="REFLECT"): + if mode not in ['CONSTANT', 'REFLECT', 'SYMMETRIC']: + raise Exception("Unsupported mode: {}".format(mode)) + if mode == 'SYMMETRIC': + mode = 'EDGE' + self.paddings = paddings + self.mode = mode + + def __call__(self, x): + raise NotImplementedError + +def pad(tensor, paddings, mode='CONSTANT', constant_values=0): + """ + Pads a tensor. + + Parameters + ---------- + tensor : tensor + A Tensor. + paddings : tuple + A tuple of type int32. + mode : str + One of "CONSTANT", "REFLECT", or "SYMMETRIC" (case-insensitive) + constant_values : int + In "CONSTANT" mode, the scalar pad value to use. Must be same type as tensor. + + Returns + ------- + A Tensor. Has the same type as tensor. + """ + raise NotImplementedError + + +class Unstack(object): + + def __init__(self, axis, num=None): + self.axis = axis + self.num = num + + def __call__(self, values): + raise NotImplementedError + + +class Stack(object): + + def __init__(self, axis): + self.axis = axis + + def __call__(self, values): + raise NotImplementedError + + +def stack(values, axis=0): + """ + Stacks a list of rank-R tensors into one rank-(R+1) tensor. + + Parameters + ---------- + values : list + A list of Tensor objects with the same shape and type. + axis : int + An int. The axis to stack along. Defaults to the first dimension. + Negative values wrap around, so the valid range is [-(R+1), R+1). + + Returns + ------- + A stacked Tensor with the same type as values. + """ + raise NotImplementedError + + +class Meshgrid(object): + def __init__(self, indexing='xy'): + super(Meshgrid, self).__init__() + self.index = indexing + + def __call__(self, inputs): + pass + + +def meshgrid(x, y): + """ + Broadcasts parameters for evaluation on an N-D grid. + + Parameters + ---------- + x : tensor + Tensors with rank 1. + y : tensor + Tensors with rank 1. + + Returns + ------- + A list of N Tensors with rank N. + """ + + pass + + +def range(start, limit=None, delta=1, dtype=None): + """ + Creates a sequence of numbers. + + Parameters + ---------- + start : tensor + A 0-D Tensor (scalar). Acts as first entry in the range if limit is not None; + otherwise, acts as range limit and first entry defaults to 0. + limit : tensor + A 0-D Tensor (scalar). Upper limit of sequence, exclusive. If None, + defaults to the value of start while the first entry of the range defaults to 0. + delta : tensor + A 0-D Tensor (scalar). Number that increments start. Defaults to 1. + dtype : type + The type of the elements of the resulting tensor. + + Returns + ------- + An 1-D Tensor of type dtype. + """ + raise NotImplementedError + + +class ExpandDims(object): + + def __init__(self, axis): + pass + + def construct(self, input): + pass + + +def expand_dims(input, axis): + """ + Inserts a dimension of 1 into a tensor's shape. + + Parameters + ---------- + input : tensor + A Tensor. + axis : int + 0-D (scalar). Specifies the dimension index at which to expand the shape of input. + Must be in the range [-rank(input) - 1, rank(input)]. + + Returns + ------- + A Tensor with the same data as input, but its shape has an additional dimension of size 1 added. + """ + + raise NotImplementedError + + +class Tile(object): + + def __init__(self): + pass + + def __call__(self, input, multiples): + raise NotImplementedError + + +def tile(input, multiples): + """ + Constructs a tensor by tiling a given tensor. + + Parameters + ---------- + input : tensor + A Tensor. 1-D or higher. + multiples : tensor + Must be one of the following types: int32, int64. 1-D. + Length must be the same as the number of dimensions in input + + Returns + ------- + A Tensor. Has the same type as input. + """ + raise NotImplementedError + + +class Cast(object): + + def __init__(self, dtype): + pass + + def __call__(self, input): + pass + + +def cast(x, dtype): + """ + Casts a tensor to a new type. + + Parameters + ---------- + x : tensor + A Tensor or SparseTensor or IndexedSlices of numeric type. + It could be uint8, uint16, uint32, uint64, int8, int16, int32, int64, float16, float32, float64. + dtype : dtpye + The destination type. The list of supported dtypes is the same as x + + Returns + ------- + A Tensor or SparseTensor or IndexedSlices with same shape as x and same type as dtype. + """ + raise NotImplementedError + + +class Transpose(object): + + def __init__(self, perm, conjugate=False): + self.perm = perm + if conjugate: + raise ("The conjugate Parameters not supported") + + def __call__(self, a): + raise NotImplementedError + + +def transpose(a, perm=None, conjugate=False): + """ + Transposes a. + + Parameters + ---------- + a : tensor + A Tensor. + perm : int + A permutation of the dimensions of a. + conjugate : bool + Setting it to True is mathematically equivalent to ms.math.conj(ms.transpose(input)). + + Returns + ------- + A transposed Tensor. + """ + + raise NotImplementedError + + +def gather_nd(params, indices, batch_dims=0): + """ + Gather slices from params into a Tensor with shape specified by indices. + + Parameters + ---------- + params : tensor + The tensor from which to gather values. + indices : tensor + Must be one of the following types: int32, int64. Index tensor. + batch_dims : int + An integer or a scalar 'Tensor'. The number of batch dimensions. + + Returns + ------- + A Tensor. Has the same type as params. + """ + + pass + + +def clip_by_value(t, clip_value_min, clip_value_max): + """ + Clips tensor values to a specified min and max. + + Parameters + ---------- + t : tensor + A Tensor or IndexedSlices + clip_value_min : tensor + A 0-D (scalar) Tensor, or a Tensor with the same shape as t. The minimum value to clip by + clip_value_max : tensor + A 0-D (scalar) Tensor, or a Tensor with the same shape as t. The minimum value to clip by + + Returns + ------- + A clipped Tensor or IndexedSlices. + """ + + pass + + +def split(value, num_or_size_splits, axis=0, num=None): + """ + Splits a tensor into sub tensors. + + Parameters + ---------- + value : tensor + The Tensor to split. + num_or_size_splits : list + Either an integer indicating the number of splits along split_dim or a 1-D integer Tensor or + Python list containing the sizes of each output tensor along split_dim. + axis : int + The dimension along which to split. Must be in the range [-rank(value), rank(value)). Defaults to 0. + num : int + used to specify the number of outputs when it cannot be inferred from the shape of size_splits. + + Returns + ------- + Tensor objects resulting from splitting value. + """ + pass + + +def floor(x): + raise NotImplementedError + + +def gather(params, indices): + raise NotImplementedError + + +def linspace(start, stop, num): + raise NotImplementedError + + +def slice(inputs, starts, sizes): + raise NotImplementedError + + +def add_n(inputs): + raise NotImplementedError + + +class OneHot(object): + + def __init__(self, axis=-1, depth=1, on_value=1.0, off_value=0.0, dtype="float32"): + self.depth = depth + self.dtype = dtype + + def __call__(self, indices): + raise NotImplementedError + + +class L2Normalize(object): + + def __init__(self, axis=None, epsilon=1e-12): + super(L2Normalize, self).__init__() + pass + + def __call__(self, input, *args, **kwargs): + pass + + +class EmbeddingLookup(object): + + def __init__(self, max_norm=None): + self.max_norm = max_norm + + def __call__(self, params, ids, *args, **kwargs): + pass + + +class NCELoss(object): + + def __init__(self, num_true=1, sampled_values=None, remove_accidental_hits=False): + super(NCELoss, self).__init__() + + def __call__(self, weights, biases, labels, inputs, num_sampled, num_classes): + pass + + +class Not_equal(object): + + def __init__(self): + pass + + def __call__(self, x, y): + pass + + +class Count_nonzero(object): + + def __init__(self, keepdims=None, dtype="int64"): + pass + + def __call__(self, *args, **kwargs): + pass + + + +class Resize: + + def __init__(self, scale, method, antialias=False, data_format='channels_last', ksize=None): + if method not in ['nearest', 'linear', 'bilinear']: + raise ('Current resize does not support this method.') + if method == 'bilinear': + method = 'linear' + self.method = method + self.antialias = antialias + self.scale = scale + if data_format != 'channel_last': + raise Exception("UpSampling2d resize_images only support channel_last") + + def __call__(self, inputs): + raise NotImplementedError + + +def resize(inputs, output_size, method, antialias): + raise NotImplementedError + + +class ZeroPadding1D(object): + + def __init__(self): + pass + + def __call__(self, padding): + raise NotImplementedError + + +class ZeroPadding2D(object): + + def __init__(self): + pass + + def __call__(self, padding): + raise NotImplementedError + + +class ZeroPadding3D(object): + + def __init__(self): + pass + + def __call__(self, padding): + raise NotImplementedError + + +class Sign(object): + + def __init__(self): + pass + + def __call__(self, x): + raise NotImplementedError + +def ceil(x): + raise NotImplementedError + +def multiply(x, y): + raise NotImplementedError + +def divide(x, y): + raise NotImplementedError + +def identity(x): + raise NotImplementedError + +class BatchToSpace(object): + def __init__(self, block_size, crops): + super(BatchToSpace, self).__init__() + pass + + def __call__(self, input_x): + raise NotImplementedError + + +class DepthToSpace(object): + def __init__(self, block_size, data_format='NHWC'): + pass + + def __call__(self, input): + raise NotImplementedError \ No newline at end of file diff --git a/tensorlayer/backend/ops/paddle_nn.py b/tensorlayer/backend/ops/paddle_nn.py new file mode 100644 index 0000000..47d9dd0 --- /dev/null +++ b/tensorlayer/backend/ops/paddle_nn.py @@ -0,0 +1,926 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import paddle as pd +import paddle.nn.functional as F + +def padding_format(padding): + """ + Checks that the padding format correspond format. + + Parameters + ---------- + padding : str + Must be one of the following:"same", "SAME", "VALID", "valid" + + Returns + ------- + str "SAME" or "VALID" + """ + + if padding in ["SAME", "same"]: + padding = "SAME" + elif padding in ["VALID", "valid"]: + padding = "VALID" + elif padding == None: + padding = None + else: + raise Exception("Unsupported padding: " + str(padding)) + return padding + + +def preprocess_1d_format(data_format, padding): + """ + Checks that the 1-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NWC","NCW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NWC" or "NCW" and "SAME" or "VALID" + """ + + if data_format in ["channels_last", "NWC"]: + data_format = "NWC" + elif data_format in ["channels_first", "NCW"]: + data_format = "NCW" + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def preprocess_2d_format(data_format, padding): + """ + Checks that the 2-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NHWC","NCHW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NHWC" or "NCHW" and "SAME" or "VALID" + """ + + if data_format in ["channels_last", "NHWC", "nhwc"]: + data_format = "NHWC" + elif data_format in ["channels_first", "NCHW", "nchw"]: + data_format = "NCHW" + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def preprocess_3d_format(data_format, padding): + """ + Checks that the 3-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NDHWC","NCDHW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NDHWC" or "NCDHW" and "SAME" or "VALID" + """ + + if data_format in ['channels_last', 'NDHWC']: + data_format = 'NDHWC' + elif data_format in ['channels_first', 'NCDHW']: + data_format = 'NCDHW' + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def nchw_to_nhwc(x): + """ + Channels first to channels last + + Parameters + ---------- + x : tensor + channels first tensor data + + Returns + ------- + channels last tensor data + """ + + pass + + +def nhwc_to_nchw(x): + """ + Channles last to channels first + + Parameters + ---------- + x : tensor + channels last tensor data + + Returns + ------- + channels first tensor data + """ + + pass + + +class ReLU(object): + + def __init__(self): + pass + + def __call__(self, x): + return F.relu(x) + + +def relu(x): + """ + Computes rectified linear: max(features, 0). + + Parameters + ---------- + x : tensor + Must be one of the following types: float32, float64, int32, uint8, int16, + int8, int64, bfloat16, uint16, half, uint32, uint64, qint8. + + Returns + ------- + A Tensor. Has the same type as features. + """ + return F.relu(x) + + +class ReLU6(object): + + def __init__(self): + pass + + def __call__(self, x): + return F.relu6(x) + + +def relu6(x): + """ + Computes Rectified Linear 6: min(max(features, 0), 6). + + Parameters + ---------- + x : tensor + Must be one of the following types: float32, float64, int32, uint8, int16, + int8, int64, bfloat16, uint16, half, uint32, uint64, qint8. + + Returns + ------- + A Tensor with the same type as features. + """ + return F.relu6(x) + + +class LeakyReLU(object): + + def __init__(self, alpha=0.2): + self.alpha = alpha + + def __call__(self, x): + return F.leaky_relu(x, negative_slope=self.alpha) + + +def leaky_relu(x): + """ + Compute the Leaky ReLU activation function. + + Parameters + ---------- + x : tensor + representing preactivation values. Must be one of the following types: + float16, float32, float64, int32, int64. + + Returns + ------- + The activation value. + """ + + return F.leaky_relu(x) + + +class Softplus(object): + + def __init__(self): + pass + + def __call__(self, x): + return F.softplus(x) + + +def softplus(x): + """ + Computes softplus: log(exp(features) + 1). + + Parameters + ---------- + x : tensor + Must be one of the following types: half, bfloat16, float32, float64. + + Returns + ------- + A Tensor. Has the same type as features. + """ + + return F.softplus(x) + + +class Tanh(object): + + def __init__(self): + pass + + def __call__(self, x): + return F.tanh(x) + + +def tanh(x): + """ + Computes hyperbolic tangent of x element-wise. + + Parameters + ---------- + x : tensor + Must be one of the following types: bfloat16, half, float32, float64, complex64, complex128. + + Returns + ------- + A Tensor. Has the same type as x. + """ + + return F.tanh(x) + + +class Sigmoid(object): + + def __init__(self): + pass + + def __call__(self, x): + return F.sigmoid(x) + + +def sigmoid(x): + """ + Computes sigmoid of x element-wise. + + Parameters + ---------- + x : tensor + A Tensor with type float16, float32, float64, complex64, or complex128. + + Returns + ------- + A Tensor with the same type as x. + """ + return F.sigmoid(x) + + +class Softmax(object): + + def __init__(self): + pass + + def __call__(self, x): + return F.softmax(x) + + +def softmax(logits, axis=-1): + """ + Computes softmax activations. + + Parameters + ---------- + logits : tensor + Must be one of the following types: half, float32, float64. + axis : int + The dimension softmax would be performed on. The default is -1 which indicates the last dimension. + + Returns + ------- + A Tensor. Has the same type and shape as logits. + """ + return F.softmax(logits, axis=axis) + + +class Dropout(object): + + def __init__(self, keep, seed=1): + self.keep = 1 - keep + self.seed = seed + + def __call__(self, inputs): + raise NotImplementedError + + +class BiasAdd(object): + """ + Adds bias to value. + + Parameters + ---------- + x : tensor + A Tensor with type float, double, int64, int32, uint8, int16, int8, complex64, or complex128. + bias : tensor + Must be the same type as value unless value is a quantized type, + in which case a different quantized type may be used. + Returns + ------- + A Tensor with the same type as value. + """ + + def __init__(self, data_format='NHWC'): + self.data_format = data_format + + def __call__(self, x, bias): + return pd.add(x, bias) + + +def bias_add(x, bias): + """ + Adds bias to value. + + Parameters + ---------- + x : tensor + A Tensor with type float, double, int64, int32, uint8, int16, int8, complex64, or complex128. + bias : tensor + Must be the same type as value unless value is a quantized type, + in which case a different quantized type may be used. + data_format : A string. + 'N...C' and 'NC...' are supported. + name : str + A name for the operation (optional). + Returns + ------- + A Tensor with the same type as value. + """ + raise NotImplementedError + + +class Conv1D(object): + pass + # raise NotImplementedError + + +def conv1d(input, filters, stride, padding, data_format='NWC', dilations=None, name=None): + """ + Computes a 1-D convolution given 3-D input and filter tensors. + + Parameters + ---------- + input : tensor + A 3D Tensor. Must be of type float16, float32, or float64 + filters : tensor + A 3D Tensor. Must have the same type as input. + stride : int of list + An int or list of ints that has length 1 or 3. The number of entries by which the filter is moved right at each step. + padding : string + 'SAME' or 'VALID' + data_format : string + An optional string from "NWC", "NCW". Defaults to "NWC", the data is stored in the order of + [batch, in_width, in_channels]. The "NCW" format stores data as [batch, in_channels, in_width]. + dilations : int or list + An int or list of ints that has length 1 or 3 which defaults to 1. + The dilation factor for each dimension of input. If set to k > 1, + there will be k-1 skipped cells between each filter element on that dimension. + Dilations in the batch and depth dimensions must be 1. + name : string + A name for the operation (optional). + Returns + ------- + A Tensor. Has the same type as input. + """ + + pass + + +class Conv2D(object): + + def __init__(self, strides, padding, data_format='NHWC', dilations=None, out_channel=None, k_size=None): + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.ksize = k_size[0] + if self.data_format is 'NHWC': + self.dg_stride = strides[1] + self.dg_dilation = dilations[1] + elif self.data_format is 'NCHW': + self.dg_stride = strides[2] + self.dg_dilation = dilations[2] + + def __call__(self, inputs, filters): + raise NotImplementedError + + +def conv2d(input, filters, strides, padding, data_format='NCHW', dilations=None): + """ + Computes a 2-D convolution given 4-D input and filters tensors. + + Parameters + ---------- + input : tensor + Must be one of the following types: half, bfloat16, float32, float64. A 4-D tensor. + The dimension order is interpreted according to the value of data_format, see below for details. + filters : tensor + Must have the same type as input. A 4-D tensor of shape [filter_height, filter_width, in_channels, out_channels] + strides : int of list + The stride of the sliding window for each dimension of input. If a single value is given it is replicated in the H and W dimension. + By default the N and C dimensions are set to 1. The dimension order is determined by the value of data_format, see below for details. + padding : string + "SAME" or "VALID" + data_format : string + "NHWC", "NCHW". Defaults to "NCHW". + dilations : list or ints + list of ints that has length 1, 2 or 4, defaults to 1. The dilation factor for each dimension ofinput. + + Returns + ------- + A Tensor. Has the same type as input. + """ + raise NotImplementedError + + +class Conv3D(object): + pass + # raise NotImplementedError + + +def conv3d(input, filters, strides, padding, data_format='NDHWC', dilations=None, name=None): + """ + Computes a 3-D convolution given 5-D input and filters tensors. + + Parameters + ---------- + input : tensor + Must be one of the following types: half, bfloat16, float32, float64. + Shape [batch, in_depth, in_height, in_width, in_channels]. + filters : tensor + Must have the same type as input. Shape [filter_depth, filter_height, filter_width, in_channels, out_channels]. + in_channels must match between input and filters. + strides : list of ints + A list of ints that has length >= 5. 1-D tensor of length 5. + The stride of the sliding window for each dimension of input. + Must have strides[0] = strides[4] = 1. + padding : string + A string from: "SAME", "VALID". The type of padding algorithm to use. + data_format : string + An optional string from: "NDHWC", "NCDHW". Defaults to "NDHWC". The data format of the input and output data. + With the default format "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, in_width, in_channels]. + Alternatively, the format could be "NCDHW", the data storage order is: [batch, in_channels, in_depth, in_height, in_width]. + dilations : list of ints + Defaults to [1, 1, 1, 1, 1]. 1-D tensor of length 5. The dilation factor for each dimension of input. + If set to k > 1, there will be k-1 skipped cells between each filter element on that dimension. + The dimension order is determined by the value of data_format, see above for details. + Dilations in the batch and depth dimensions must be 1. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor. Has the same type as input. + """ + + raise NotImplementedError + + +def lrn(inputs, depth_radius, bias, alpha, beta): + """ + Local Response Normalization. + + Parameters + ---------- + inputs : tensor + Must be one of the following types: half, bfloat16, float32. 4-D. + depth_radius : int + Defaults to 5. 0-D. Half-width of the 1-D normalization window. + bias : float + Defaults to 1. An offset (usually positive to avoid dividing by 0). + alpha : float + Defaults to 1. A scale factor, usually positive. + beta : float + Defaults to 0.5. An exponent. + + Returns + ------- + A Tensor. Has the same type as input. + """ + pass + + +def moments(x, axes, shift=None, keepdims=False): + """ + Calculates the mean and variance of x. + + Parameters + ---------- + x : tensor + A Tensor + axes : ints + Axes along which to compute mean and variance. + shift : int + Not used in the current implementation. + keepdims : bool + produce moments with the same dimensionality as the input. + + Returns + ------- + Two Tensor objects: mean and variance. + """ + + pass + + +class MaxPool(object): + + def __init__(self, ksize, strides, padding, data_format=None): + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.ksize = ksize + self.strides = strides + + def __call__(self, inputs): + raise NotImplementedError + + +def max_pool(input, ksize, strides, padding, data_format=None): + """ + Performs the max pooling on the input. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] if data_format does not start + with "NC" (default), or [batch_size, num_channels] + input_spatial_shape if data_format starts with "NC". + Pooling happens over the spatial dimensions only. + ksize : int or list of ints + An int or list of ints that has length 1, N or N+2. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, N or N+2. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + + Returns + ------- + A Tensor of format specified by data_format. The max pooled output tensor. + """ + pass + + +class AvgPool(object): + + def __init__(self, ksize, strides, padding, data_format=None): + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.filter_size = ksize + self.strides = strides + + def __call__(self, inputs): + raise NotImplementedError + + +def avg_pool(input, ksize, strides, padding): + """ + Performs the avg pooling on the input. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] + if data_format does not start with "NC" (default), or [batch_size, num_channels] + input_spatial_shape + if data_format starts with "NC". Pooling happens over the spatial dimensions only. + ksize : int or list of ints + An int or list of ints that has length 1, N or N+2. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, N or N+2. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + + Returns + ------- + A Tensor of format specified by data_format. The average pooled output tensor. + """ + pass + + +def max_pool3d(input, ksize, strides, padding, data_format=None, name=None): + """ + Performs the max pooling on the input. + + Parameters + ---------- + input : tensor + A 5-D Tensor of the format specified by data_format. + ksize : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + "NDHWC", "NCDHW". Defaults to "NDHWC". The data format of the input and output data. + With the default format "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, in_width, in_channels]. + Alternatively, the format could be "NCDHW", the data storage order is: [batch, in_channels, in_depth, in_height, in_width]. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor of format specified by data_format. The max pooled output tensor. + """ + pass + + +def avg_pool3d(input, ksize, strides, padding, data_format=None, name=None): + """ + Performs the average pooling on the input. + + Parameters + ---------- + input : tensor + A 5-D Tensor of shape [batch, height, width, channels] and type float32, float64, qint8, quint8, or qint32. + ksize : int or list of ints + An int or list of ints that has length 1, 3 or 5. The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NDHWC' and 'NCDHW' are supported. + name : string + Optional name for the operation. + + Returns + ------- + A Tensor with the same type as value. The average pooled output tensor. + """ + pass + + +def pool(input, window_shape, pooling_type, strides=None, padding='VALID', data_format=None, dilations=None, name=None): + """ + Performs an N-D pooling operation. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] + if data_format does not start with "NC" (default), or [batch_size, num_channels] + input_spatial_shape + if data_format starts with "NC". Pooling happens over the spatial dimensions only. + window_shape : int + Sequence of N ints >= 1. + pooling_type : string + Specifies pooling operation, must be "AVG" or "MAX". + strides : ints + Sequence of N ints >= 1. Defaults to [1]*N. If any value of strides is > 1, then all values of dilation_rate must be 1. + padding : string + The padding algorithm, must be "SAME" or "VALID". Defaults to "SAME". + See the "returns" section of tf.ops.convolution for details. + data_format : string + Specifies whether the channel dimension of the input and output is the last dimension (default, or if data_format does not start with "NC"), + or the second dimension (if data_format starts with "NC"). + For N=1, the valid values are "NWC" (default) and "NCW". For N=2, the valid values are "NHWC" (default) and "NCHW". + For N=3, the valid values are "NDHWC" (default) and "NCDHW". + dilations : list of ints + Dilation rate. List of N ints >= 1. Defaults to [1]*N. If any value of dilation_rate is > 1, then all values of strides must be 1. + name : string + Optional. Name of the op. + + Returns + ------- + Tensor of rank N+2, of shape [batch_size] + output_spatial_shape + [num_channels] + """ + pass + + +class DepthwiseConv2d(object): + + def __init__(self, strides, padding, data_format=None, dilations=None, ksize=None, channel_multiplier=1): + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.stride = strides + self.dilations = dilations + + def __call__(self, input, filter): + raise NotImplementedError("Not implemented depthwiseconv2d") + + +def depthwise_conv2d(input, filter, strides, padding, data_format=None, dilations=None, name=None): + """ + Depthwise 2-D convolution. + + Parameters + ---------- + input : tensor + 4-D with shape according to data_format. + filter : tensor + 4-D with shape [filter_height, filter_width, in_channels, channel_multiplier]. + strides : list + 1-D of size 4. The stride of the sliding window for each dimension of input. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + The data format for input. Either "NHWC" (default) or "NCHW". + dilations : list + 1-D of size 2. The dilation rate in which we sample input values across the height and width dimensions in atrous convolution. + If it is greater than 1, then all values of strides must be 1. + name : string + A name for this operation (optional). + + Returns + ------- + A 4-D Tensor with shape according to data_format. + E.g., for "NHWC" format, shape is [batch, out_height, out_width, in_channels * channel_multiplier]. + """ + + pass + +class Conv1d_transpose(object): + + def __init__( + self, strides, padding, data_format='NWC', dilations=None, out_channel=None, k_size=None, in_channels=None + ): + self.strides = strides + self.dilations = dilations + self.data_format, self.padding = preprocess_1d_format(data_format, padding) + + def __call__(self, input, filters): + raise NotImplementedError + + +def conv1d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NWC', dilations=None, name=None +): + """ + The transpose of conv1d. + + Parameters + ---------- + input : tensor + A 3-D Tensor of type float and shape [batch, in_width, in_channels] + for NWC data format or [batch, in_channels, in_width] for NCW data format. + filters : tensor + A 3-D Tensor with the same type as value and shape [filter_width, output_channels, in_channels]. + filter's in_channels dimension must match that of value. + output_shape : tensor + A 1-D Tensor, containing three elements, representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1 or 3. The number of entries by which the filter is moved right at each step. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NWC' and 'NCW' are supported. + dilations : list + An int or list of ints that has length 1 or 3 which defaults to 1. + The dilation factor for each dimension of input. If set to k > 1, + there will be k-1 skipped cells between each filter element on that dimension. + Dilations in the batch and depth dimensions must be 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as value. + """ + pass + + +class Conv2d_transpose(object): + + def __init__( + self, strides, padding, data_format='NHWC', dilations=None, name=None, out_channel=None, k_size=None, + in_channels=None + ): + self.strides = strides + self.dilations = dilations + self.name = name + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + + def __call__(self, input, filters): + raise NotImplementedError + + +def conv2d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NHWC', dilations=None, name=None +): + """ + The transpose of conv2d. + + Parameters + ---------- + input : tensor + A 4-D Tensor of type float and shape [batch, height, width, in_channels] + for NHWC data format or [batch, in_channels, height, width] for NCHW data format. + filters : tensor + A 4-D Tensor with the same type as input and shape [height, width, + output_channels, in_channels]. filter's in_channels dimension must match that of input. + output_shape : tensor + A 1-D Tensor representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1, 2 or 4. The stride of the sliding window for each dimension of input. + If a single value is given it is replicated in the H and W dimension. + By default the N and C dimensions are set to 0. + The dimension order is determined by the value of data_format, see below for details. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NHWC' and 'NCHW' are supported. + dilations : list + An int or list of ints that has length 1, 2 or 4, defaults to 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as input. + """ + pass + + +class Conv3d_transpose(object): + + def __init__( + self, strides, padding, data_format='NDHWC', dilations=None, name=None, out_channel=None, k_size=None, + in_channels=None + ): + self.strides = strides + self.dilations = dilations + self.name = name + self.out_channel = out_channel + self.data_format, self.padding = preprocess_3d_format(data_format, padding) + + def __call__(self, input, filters): + raise NotImplementedError + + +def conv3d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NDHWC', dilations=None, name=None +): + """ + The transpose of conv3d. + + Parameters + ---------- + input : tensor + A 5-D Tensor of type float and shape [batch, height, width, in_channels] for + NHWC data format or [batch, in_channels, height, width] for NCHW data format. + filters : tensor + A 5-D Tensor with the same type as value and shape [height, width, output_channels, in_channels]. + filter's in_channels dimension must match that of value. + output_shape : tensor + A 1-D Tensor representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1, 3 or 5. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NDHWC' and 'NCDHW' are supported. + dilations : list of ints + An int or list of ints that has length 1, 3 or 5, defaults to 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as value. + """ + + pass + + +class BatchNorm(object): + + def __init__(self): + pass + + def __call__(self, *args, **kwargs): + pass diff --git a/tensorlayer/backend/ops/tensorflow_backend.py b/tensorlayer/backend/ops/tensorflow_backend.py new file mode 100644 index 0000000..74df53d --- /dev/null +++ b/tensorlayer/backend/ops/tensorflow_backend.py @@ -0,0 +1,1021 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, division, print_function +from .tensorflow_nn import nchw_to_nhwc, nhwc_to_nchw +import tensorflow as tf + +_dtypeDict = { + 'DType': tf.DType, + 'float16': tf.float16, + 'float32': tf.float32, + 'float64': tf.float64, + 'int8': tf.int8, + 'int16': tf.int16, + 'int32': tf.int32, + 'int64': tf.int64, + 'uint8': tf.uint8, + 'uint16': tf.uint16, + 'uint32': tf.uint32, + 'uint64': tf.uint64 +} + +DType = tf.DType +float16 = tf.float16 +float32 = tf.float32 +float64 = tf.float64 +int8 = tf.int8 +int16 = tf.int16 +int32 = tf.int32 +int64 = tf.int64 +uint8 = tf.uint8 +uint16 = tf.uint16 +uint32 = tf.uint32 +uint64 = tf.uint64 + +# isinstance input output +# TensorLike = tf_ops._TensorLike + + +def set_context(**kwargs): + raise Exception("Using TenosrFlow backend,You don't need to set context") + + +def get_tensor_shape(x): + return x.get_shape().as_list() + + +# initializers +def zeros(shape, dtype=tf.float32): + """ + Creates a tensor with all elements set to zero. + + Parameters + ---------- + shape : A list of integers + a tuple of integers, or a 1-D Tensor of type int32. + dtype : tensor + The DType of an element in the resulting Tensor + + Returns + ------- + A Tensor with all elements set to zero. + + """ + return tf.zeros(shape=shape, dtype=dtype) + + +def ones(shape, dtype=tf.float32): + """ + Creates a tensor with all elements set to ones. + + Parameters + ---------- + shape : A list of integers + a tuple of integers, or a 1-D Tensor of type int32. + dtype : tensor + The DType of an element in the resulting Tensor + + Returns + ------- + A Tensor with all elements set to zero. + + """ + return tf.ones(shape=shape, dtype=dtype) + + +def constant(value, dtype=tf.float32, shape=None): + """ + Creates a constant tensor from a tensor-like object. + + Parameters + ---------- + value : list + A constant value (or list) of output type dtype. + dtype : tensor + The type of the elements of the resulting tensor. + shape : tuple + Optional dimensions of resulting tensor. + + Returns + ------- + A Constant Tensor. + + """ + return tf.constant(value=value, dtype=dtype, shape=shape) + + +def random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None): + """ + Outputs random values from a uniform distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + minval : int + The lower bound on the range of random values to generate (inclusive). Defaults to 0. + maxval : int + The upper bound on the range of random values to generate (exclusive). Defaults to 1 if dtype is floating point. + dtype : tensor + The type of the output: float16, float32, float64, int32, or int64. + seed : int + Used in combination with tf.random.set_seed to create a reproducible sequence of tensors across multiple calls. + Returns + ------- + A tensor of the specified shape filled with random uniform values. + + """ + outputs = tf.random.uniform(shape=shape, minval=minval, maxval=maxval, dtype=dtype, seed=seed) + return outputs + + +def random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.dtypes.float32, seed=None): + """ + Outputs random values from a normal distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + mean : float + The mean of the normal distribution + stddev : float + The standard deviation of the normal distribution. + dtype : tensor + The type of the output. + seed : A Python integer + Used to create a random seed for the distribution + + Returns + ------- + A tensor of the specified shape filled with random normal values. + + """ + outputs = tf.random.normal(shape=shape, mean=mean, stddev=stddev, dtype=dtype, seed=seed) + return outputs + + +def truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None): + """ + Outputs random values from a truncated normal distribution. + + Parameters + ---------- + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + mean : float + The mean of the normal distribution + stddev : float + The standard deviation of the normal distribution. + dtype : tensor + The type of the output. + seed : A Python integer + Used to create a random seed for the distribution + + Returns + ------- + A tensor of the specified shape filled with random truncated normal values. + + """ + outputs = tf.random.truncated_normal(shape=shape, mean=mean, stddev=stddev, dtype=dtype, seed=seed) + return outputs + + +def he_normal(shape, dtype, seed=None): + """ + He normal initializer. + + Parameters + ---------- + seed : A Python integer. + Used to seed the random generator. + shape : tuple + A 1-D integer Tensor or Python array. The shape of the output tensor. + dtype : tensor + The type of the output. + + Returns + ------- + A tensor of the specified shape filled with he normal values. + """ + return tf.initializers.he_normal(seed)(shape=shape, dtype=dtype) + + +def Variable(initial_value, name, trainable=True): + """ + Creates a new variable with value initial_value. + + Parameters + ---------- + initial_value : tensor + A Tensor, or Python object convertible to a Tensor + name : str + Optional name for the variable. Defaults to 'Variable' and gets uniquified automatically. + Returns + ------- + Variable + """ + + var = tf.Variable(initial_value=initial_value, name=name, trainable=trainable) + return var + + +class MatMul(object): + + def __init__(self): + pass + + def __call__(self, a, b): + return tf.matmul(a, b) + + +def matmul(a, b): + """ + Multiplies matrix a by matrix b, producing a * b. + + Parameters + ---------- + a : tensor + type float16, float32, float64, int32, complex64, complex128 and rank > 1. + b : tensor + with same type and rank as a. + + Returns + ------- + A Tensor of the same type as a and b + """ + + outputs = tf.matmul(a, b) + return outputs + + +def add(value, bias): + """ + Returns x + y element-wise. + + Parameters + ---------- + value : tensor. + Must be one of the following types: bfloat16, half, float32, float64, + uint8, int8, int16, int32, int64, complex64, complex128, string. + bias : tensor + Must have the same type as a + + Returns + ------- + A Tensor. Has the same type as a. + """ + + outputs = tf.add(value, bias) + return outputs + + +def dtypes(dt): + """ + Data dtypes. + + Parameters + ---------- + dt : string + It could be 'uint8', 'uint16', 'uint32', 'uint64', 'int8', 'int16', + 'int32', 'int64', 'float16', 'float32', 'float64', 'DType'. + + Returns + ------- + Data dtypes + """ + + if dt not in _dtypeDict.keys(): + raise Exception("Unsupported dtype: {}".format(dt)) + return _dtypeDict[dt] + + +class Maximum(object): + def __init__(self): + pass + + def __call__(self, x, y): + return tf.maximum(x=x, y=y) + + +class Minimum(object): + def __init__(self): + pass + + def __call__(self, x, y): + return tf.minimum(x=x, y=y) + + +def minimum(x, y): + """ + Returns the min of x and y (i.e. x < y ? x : y) element-wise. + + Parameters + ---------- + x : tensor. + Must be one of the following types: bfloat16, half, float32, float64, int32, int64. + y : A Tensor. + Must have the same type as x. + + Returns + ------- + A Tensor. Has the same type as x + """ + + outputs = tf.minimum(x=x, y=y) + return outputs + + +class FlattenReshape(object): + + def __init__(self): + pass + + def __call__(self, inputs): + dim = 1 + for d in get_tensor_shape(inputs)[1:]: + dim *= d + return tf.reshape(inputs, [-1, dim]) + + +class Reshape(object): + + def __init__(self, shape): + self.shape = shape + + def __call__(self, tensor): + return tf.reshape(tensor, self.shape) + + +def reshape(tensor, shape): + """ + Reshapes a tensor. + + Parameters + ---------- + tensor : tensor + A Tensor. + shape : tensor + Defines the shape of the output tensor. + Returns + ------- + A Tensor. Has the same type as tensor + """ + + return tf.reshape(tensor, shape) + + +class Concat(object): + + def __init__(self, axis): + super(Concat, self).__init__() + self.axis = axis + + def __call__(self, values): + return tf.concat(values=values, axis=self.axis) + + +def concat(values, axis): + """ + Concatenates tensors along one dimension. + + Parameters + ---------- + values : list + A list of Tensor objects or a single Tensor + axis : int + 0-D int32 Tensor. Dimension along which to concatenate + Returns + ------- + A Tensor resulting from concatenation of the input tensors. + """ + + return tf.concat(values, axis) + + +def convert_to_tensor(value, dtype=None): + """ + Converts the given value to a Tensor. + + Parameters + ---------- + value : object + An object whose type has a registered Tensor conversion function. + dtype : optional + Optional element type for the returned tensor. If missing, the type is inferred from the type of value. + + Returns + ------- + A Tensor based on value. + """ + + return tf.convert_to_tensor(value, dtype) + + +def sqrt(x): + """ + Computes square root of x element-wise. + + Parameters + ---------- + x : tensor + Must be one of the following types: bfloat16, half, float32, float64, complex64, complex128. + + Returns + ------- + A Tensor. Has the same type as x. + """ + return tf.sqrt(x) + + +class ReduceSum(object): + + def __init__(self, axis=None): + self.axis = axis + + def __call__(self, input): + return tf.reduce_sum(input, axis=self.axis) + + +class ReduceMean(object): + + def __init__(self, axis): + self.axis = axis + + def __call__(self, inputs): + output = tf.reduce_mean(inputs, self.axis) + return output + + +def reduce_mean(input_tensor, axis=None): + """ + Computes the mean of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have numeric type. + axis : list + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + return tf.reduce_mean(input_tensor, axis=axis) + + +class ReduceMax(object): + + def __init__(self, axis): + self.axis = axis + + def __call__(self, inputs): + output = tf.reduce_max(inputs, self.axis) + return output + + +def reduce_max(input_tensor, axis=None): + """ + Computes the maximum of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have real numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + return tf.reduce_max(input_tensor, axis=axis) + + +def reduce_min(input_tensor, axis=None): + """ + Computes the minimum of elements across dimensions of a tensor. + + Parameters + ---------- + input_tensor : tensor + The tensor to reduce. Should have real numeric type. + axis : int + The dimensions to reduce. If None (the default), reduces all dimensions. + Must be in the range [-rank(input_tensor), rank(input_tensor)). + name : str + A name for the operation (optional). + + Returns + ------- + The reduced tensor. + """ + + return tf.reduce_min(input_tensor, axis=axis) + + +class Pad(object): + def __init__(self, paddings, mode="REFLECT"): + if mode not in ['CONSTANT', 'REFLECT', 'SYMMETRIC']: + raise Exception("Unsupported mode: {}".format(mode)) + self.paddings = paddings + self.mode = mode + + def __call__(self, x): + outputs = tf.pad(x, self.paddings, mode=self.mode, constant_values=0) + return outputs + +def pad(tensor, paddings, mode='CONSTANT', constant_values=0): + """ + Pads a tensor. + + Parameters + ---------- + tensor : tensor + A Tensor. + paddings : tensor + A Tensor of type int32. + mode : str + One of "CONSTANT", "REFLECT", or "SYMMETRIC" (case-insensitive) + constant_values : int + In "CONSTANT" mode, the scalar pad value to use. Must be same type as tensor. + + Returns + ------- + A Tensor. Has the same type as tensor. + """ + + if mode not in ['CONSTANT', 'REFLECT', 'SYMMETRIC']: + raise Exception("Unsupported mode: {}".format(mode)) + outputs = tf.pad(tensor, paddings, mode=mode, constant_values=constant_values) + return outputs + + +class Unstack(object): + + def __init__(self, axis, num=None): + self.axis = axis + self.num = num + + def __call__(self, values): + return tf.unstack(values, num=self.num, axis=self.axis) + + +class Stack(object): + + def __init__(self, axis=0): + self.axis = axis + + def __call__(self, values): + return tf.stack(values, axis=self.axis) + + +def stack(values, axis=0): + """ + Stacks a list of rank-R tensors into one rank-(R+1) tensor. + + Parameters + ---------- + values : list + A list of Tensor objects with the same shape and type. + axis : int + An int. The axis to stack along. Defaults to the first dimension. + Negative values wrap around, so the valid range is [-(R+1), R+1). + + Returns + ------- + A stacked Tensor with the same type as values. + """ + + return tf.stack(values, axis=axis) + + +class Meshgrid(object): + def __init__(self, indexing='xy'): + super(Meshgrid, self).__init__() + self.index = indexing + + def __call__(self, inputs): + return tf.meshgrid(inputs) + + +def meshgrid(*args, **kwargs): + """ + Broadcasts parameters for evaluation on an N-D grid. + + Parameters + ---------- + x : tensor + Tensors with rank 1. + y : tensor + Tensors with rank 1. + + Returns + ------- + A list of N Tensors with rank N. + """ + + return tf.meshgrid(*args, **kwargs) + + +def range(start, limit=None, delta=1, dtype=None): + """ + Creates a sequence of numbers. + + Parameters + ---------- + start : tensor + A 0-D Tensor (scalar). Acts as first entry in the range if limit is not None; + otherwise, acts as range limit and first entry defaults to 0. + limit : tensor + A 0-D Tensor (scalar). Upper limit of sequence, exclusive. If None, + defaults to the value of start while the first entry of the range defaults to 0. + delta : tensor + A 0-D Tensor (scalar). Number that increments start. Defaults to 1. + dtype : type + The type of the elements of the resulting tensor. + + Returns + ------- + An 1-D Tensor of type dtype. + """ + + if limit is None: + outputs = tf.range(start, delta=delta, dtype=dtype) + else: + outputs = tf.range(start, limit, delta=delta, dtype=dtype) + return outputs + + +class ExpandDims(object): + + def __init__(self, axis): + self.axis = axis + + def __call__(self, input): + return tf.expand_dims(input, axis=self.axis) + + +def expand_dims(input, axis): + """ + Inserts a dimension of 1 into a tensor's shape. + + Parameters + ---------- + input : tensor + A Tensor. + axis : int + 0-D (scalar). Specifies the dimension index at which to expand the shape of input. + Must be in the range [-rank(input) - 1, rank(input)]. + + Returns + ------- + A Tensor with the same data as input, but its shape has an additional dimension of size 1 added. + """ + + return tf.expand_dims(input, axis) + + +class Tile(object): + + def __init__(self): + pass + + def __call__(self, input, multiples): + return tf.tile(input, multiples) + + +def tile(input, multiples): + """ + Constructs a tensor by tiling a given tensor. + + Parameters + ---------- + input : tensor + A Tensor. 1-D or higher. + multiples : tensor + Must be one of the following types: int32, int64. 1-D. + Length must be the same as the number of dimensions in input + + Returns + ------- + A Tensor. Has the same type as input. + """ + + return tf.tile(input, multiples) + + +class Cast(object): + + def __init__(self, dtype): + self.dtype = dtype + + def __call__(self, x): + return tf.cast(x, dtype=self.dtype) + + +def cast(x, dtype): + """ + Casts a tensor to a new type. + + Parameters + ---------- + x : tensor + A Tensor or SparseTensor or IndexedSlices of numeric type. + It could be uint8, uint16, uint32, uint64, int8, int16, int32, int64, float16, float32, float64. + dtype : dtpye + The destination type. The list of supported dtypes is the same as x + + Returns + ------- + A Tensor or SparseTensor or IndexedSlices with same shape as x and same type as dtype. + """ + + return tf.cast(x, dtype=dtype) + + +class Transpose(object): + + def __init__(self, perm, conjugate=False): + self.perm = perm + self.conjugate = conjugate + + def __call__(self, a): + return tf.transpose(a, self.perm, self.conjugate) + + +def transpose(a, perm=None, conjugate=False): + """ + Transposes a. + + Parameters + ---------- + a : tensor + A Tensor. + perm : list / int + A permutation of the dimensions of a. + conjugate : bool + Setting it to True is mathematically equivalent to tf.math.conj(tf.transpose(input)). + + Returns + ------- + A transposed Tensor. + """ + + return tf.transpose(a, perm, conjugate) + + +def gather_nd(params, indices, batch_dims=0): + """ + Gather slices from params into a Tensor with shape specified by indices. + + Parameters + ---------- + params : tensor + The tensor from which to gather values. + indices : tensor + Must be one of the following types: int32, int64. Index tensor. + batch_dims : int + An integer or a scalar 'Tensor'. The number of batch dimensions. + + Returns + ------- + A Tensor. Has the same type as params. + """ + + return tf.gather_nd(params, indices, batch_dims) + + +def clip_by_value(t, clip_value_min, clip_value_max): + """ + Clips tensor values to a specified min and max. + + Parameters + ---------- + t : tensor + A Tensor or IndexedSlices + clip_value_min : tensor + A 0-D (scalar) Tensor, or a Tensor with the same shape as t. The minimum value to clip by + clip_value_max : tensor + A 0-D (scalar) Tensor, or a Tensor with the same shape as t. The minimum value to clip by + + Returns + ------- + A clipped Tensor or IndexedSlices. + """ + + return tf.clip_by_value(t, clip_value_min, clip_value_max) + + +def split(value, num_or_size_splits, axis=0, num=None): + """ + Splits a tensor into sub tensors. + + Parameters + ---------- + value : tensor + The Tensor to split. + num_or_size_splits : list + Either an integer indicating the number of splits along split_dim or a 1-D integer Tensor or + Python list containing the sizes of each output tensor along split_dim. + axis : int + The dimension along which to split. Must be in the range [-rank(value), rank(value)). Defaults to 0. + num : int + used to specify the number of outputs when it cannot be inferred from the shape of size_splits. + + Returns + ------- + Tensor objects resulting from splitting value. + """ + + return tf.split(value=value, num_or_size_splits=num_or_size_splits, axis=axis, num=num) + + +def floor(x): + return tf.floor(x) + + +def gather(params, indices): + return tf.gather(params, indices) + + +def linspace(start, stop, num): + return tf.linspace(start, stop, num) + + +def slice(inputs, starts, sizes): + return tf.slice(inputs, starts, sizes) + + +def add_n(inputs): + return tf.add_n(inputs) + + +class OneHot(object): + + def __init__(self, depth, on_value, off_value, axis, dtype): + self.depth = depth + self.on_value = on_value + self.off_value = off_value + self.axis = axis + self.dtype = dtype + + def __call__(self, inputs, *args, **kwargs): + outputs = tf.one_hot( + inputs, self.depth, on_value=self.on_value, off_value=self.off_value, axis=self.axis, dtype=self.dtype + ) + return outputs + + +class L2Normalize(object): + + def __init__(self, axis=None, epsilon=1e-12): + self.axis = axis + self.epsilon = epsilon + + def __call__(self, input, *args, **kwargs): + outputs = tf.math.l2_normalize(input, axis=self.axis, epsilon=self.epsilon) + return outputs + + +class EmbeddingLookup(object): + + def __init__(self, max_norm=None): + self.max_norm = max_norm + + def __call__(self, params, ids, *args, **kwargs): + outputs = tf.nn.embedding_lookup(params=params, ids=ids, max_norm=self.max_norm) + return outputs + + +class NCELoss(object): + + def __init__(self, num_true=1, sampled_values=None, remove_accidental_hits=False): + self.num_true = num_true + self.sampled_values = sampled_values + self.remove_accidental_hits = remove_accidental_hits + + def __call__(self, weights, biases, labels, inputs, num_sampled, num_classes): + outputs = tf.nn.nce_loss( + weights=weights, biases=biases, inputs=inputs, labels=labels, num_sampled=num_sampled, + num_classes=num_classes + ) + return outputs + + +class Not_equal(object): + + def __init__(self): + pass + + def __call__(self, x, y): + return tf.not_equal(x, y) + + +class Count_nonzero(object): + + def __init__(self, keepdims=None, dtype=int64): + self.keepdims = keepdims + self.dtype = dtype + + def __call__(self, input, axis=None): + return tf.math.count_nonzero(input, axis=axis, keepdims=self.keepdims, dtype=self.dtype) + + + +class Resize: + + def __init__(self, scale, method, antialias=False, data_format='channels_last', ksize=None): + self.method = method + self.antialias = antialias + self.scale = scale + self.data_format = data_format + + def __call__(self, inputs): + if self.data_format == 'channels_first': + inputs = nchw_to_nhwc(inputs) + if len(get_tensor_shape(inputs)) == 4: + output_size = [int(inputs.shape[1] * self.scale[0]), int(inputs.shape[2] * self.scale[1])] + else: + raise ("The inputs shape must be 4-D Tensor.") + outputs = tf.image.resize(inputs, size=output_size, method=self.method, antialias=self.antialias) + if self.data_format == 'channels_first': + outputs = nhwc_to_nchw(outputs) + return outputs + + +def resize(inputs, output_size, method, antialias): + return tf.image.resize(inputs, size=output_size, method=method, antialias=antialias) + + +class ZeroPadding1D(object): + + def __init__(self, padding): + self.zeropad = tf.keras.layers.ZeroPadding1D(padding=padding) + + def __call__(self, inputs): + return self.zeropad(inputs) + + +class ZeroPadding2D(object): + + def __init__(self, padding): + self.zeropad = tf.keras.layers.ZeroPadding2D(padding=padding) + + def __call__(self, inputs): + return self.zeropad(inputs) + + +class ZeroPadding3D(object): + + def __init__(self, padding): + self.zeropad = tf.keras.layers.ZeroPadding3D(padding=padding) + + def __call__(self, inputs): + return self.zeropad(inputs) + + +class Sign(object): + + def __init__(self): + pass + + def __call__(self, x): + return tf.sign(x) + +def ceil(x): + return tf.math.ceil(x) + +def multiply(x, y): + return tf.multiply(x, y) + +def divide(x, y): + return tf.divide(x, y) + +def identity(x): + return tf.identity(x) + +class BatchToSpace(object): + def __init__(self, block_size, crops): + self.bolock_size = block_size + self.crops = crops + + def __call__(self, input_x): + return tf.batch_to_space(input=input_x, block_shape=self.bolock_size, crops=self.crops) + +class DepthToSpace(object): + def __init__(self, block_size, data_format='NHWC'): + self.block_size = block_size + self.data_format = data_format + + def __call__(self, input): + return tf.nn.depth_to_space(input, block_size=self.block_size, data_format=self.data_format) diff --git a/tensorlayer/backend/ops/tensorflow_nn.py b/tensorlayer/backend/ops/tensorflow_nn.py new file mode 100644 index 0000000..71d978f --- /dev/null +++ b/tensorlayer/backend/ops/tensorflow_nn.py @@ -0,0 +1,1519 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorflow as tf +from tensorflow.python.framework import ops +from tensorflow.python.ops import math_ops +from tensorflow.python.training import moving_averages + +# loss function +sparse_softmax_cross_entropy_with_logits = tf.nn.sparse_softmax_cross_entropy_with_logits +sigmoid_cross_entropy_with_logits = tf.nn.sigmoid_cross_entropy_with_logits + + +def padding_format(padding): + """ + Checks that the padding format correspond format. + + Parameters + ---------- + padding : str + Must be one of the following:"same", "SAME", "VALID", "valid" + + Returns + ------- + str "SAME" or "VALID" + """ + + if padding in ["SAME", "same"]: + padding = "SAME" + elif padding in ["VALID", "valid"]: + padding = "VALID" + elif padding == None: + padding = None + else: + raise Exception("Unsupported padding: " + str(padding)) + return padding + + +def preprocess_1d_format(data_format, padding): + """ + Checks that the 1-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NWC","NCW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NWC" or "NCW" and "SAME" or "VALID" + """ + if data_format in ["channels_last", "NWC"]: + data_format = "NWC" + elif data_format in ["channels_first", "NCW"]: + data_format = "NCW" + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def preprocess_2d_format(data_format, padding): + """ + Checks that the 2-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NHWC","NCHW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NHWC" or "NCHW" and "SAME" or "VALID" + """ + + if data_format in ["channels_last", "NHWC"]: + data_format = "NHWC" + elif data_format in ["channels_first", "NCHW"]: + data_format = "NCHW" + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def preprocess_3d_format(data_format, padding): + """ + Checks that the 3-D dataformat format correspond format. + + Parameters + ---------- + data_format : str + Must be one of the following:"channels_last","NDHWC","NCDHW","channels_first" + padding : str + Must be one of the following:"same","valid","SAME","VALID" + + Returns + ------- + str "NDHWC" or "NCDHW" and "SAME" or "VALID" + """ + + if data_format in ['channels_last', 'NDHWC']: + data_format = 'NDHWC' + elif data_format in ['channels_first', 'NCDHW']: + data_format = 'NCDHW' + elif data_format == None: + data_format = None + else: + raise Exception("Unsupported data format: " + str(data_format)) + padding = padding_format(padding) + return data_format, padding + + +def nchw_to_nhwc(x): + """ + Channels first to channels last + + Parameters + ---------- + x : tensor + channels first tensor data + + Returns + ------- + channels last tensor data + """ + + if len(x.shape) == 3: + x = tf.transpose(x, (0, 2, 1)) + elif len(x.shape) == 4: + x = tf.transpose(x, (0, 2, 3, 1)) + elif len(x.shape) == 5: + x = tf.transpose(x, (0, 2, 3, 4, 1)) + else: + raise Exception("Unsupported dimensions") + return x + + +def nhwc_to_nchw(x): + """ + Channles last to channels first + + Parameters + ---------- + x : tensor + channels last tensor data + + Returns + ------- + channels first tensor data + """ + + if len(x.shape) == 3: + x = tf.transpose(x, (0, 2, 1)) + elif len(x.shape) == 4: + x = tf.transpose(x, (0, 3, 1, 2)) + elif len(x.shape) == 5: + x = tf.transpose(x, (0, 4, 1, 2, 3)) + else: + raise Exception("Unsupported dimensions") + return x + + +class ReLU(object): + + def __init__(self): + pass + + def __call__(self, x): + return tf.nn.relu(x) + + +def relu(x): + """ + Computes rectified linear: max(features, 0). + + Parameters + ---------- + x : tensor + Must be one of the following types: float32, float64, int32, uint8, int16, + int8, int64, bfloat16, uint16, half, uint32, uint64, qint8. + + Returns + ------- + A Tensor. Has the same type as features. + """ + + return tf.nn.relu(x) + + +class ReLU6(object): + + def __init__(self): + pass + + def __call__(self, x): + return tf.nn.relu6(x) + + +def relu6(x): + """ + Computes Rectified Linear 6: min(max(features, 0), 6). + + Parameters + ---------- + x : tensor + Must be one of the following types: float32, float64, int32, uint8, int16, + int8, int64, bfloat16, uint16, half, uint32, uint64, qint8. + + Returns + ------- + A Tensor with the same type as features. + """ + + return tf.nn.relu6(x) + + +class LeakyReLU(object): + + def __init__(self, alpha=0.2): + self.alpha = alpha + + def __call__(self, x): + return tf.nn.leaky_relu(x, alpha=self.alpha) + + +def leaky_relu(x, alpha=0.2): + """ + Compute the Leaky ReLU activation function. + + Parameters + ---------- + x : tensor + representing preactivation values. Must be one of the following types: + float16, float32, float64, int32, int64. + + Returns + ------- + The activation value. + """ + + return tf.nn.leaky_relu(x, alpha=alpha) + + +class Softplus(object): + + def __init__(self): + pass + + def __call__(self, x): + return tf.nn.softplus(x) + + +def softplus(x): + """ + Computes softplus: log(exp(features) + 1). + + Parameters + ---------- + x : tensor + Must be one of the following types: half, bfloat16, float32, float64. + + Returns + ------- + A Tensor. Has the same type as features. + """ + + return tf.nn.softplus(x) + + +class Tanh(object): + + def __init__(self): + pass + + def __call__(self, x): + return tf.nn.tanh(x) + + +def tanh(x): + """ + Computes hyperbolic tangent of x element-wise. + + Parameters + ---------- + x : tensor + Must be one of the following types: bfloat16, half, float32, float64, complex64, complex128. + + Returns + ------- + A Tensor. Has the same type as x. + """ + + return tf.nn.tanh(x) + + +class Sigmoid(object): + + def __init__(self): + pass + + def __call__(self, x): + return tf.nn.sigmoid(x) + + +def sigmoid(x): + """ + Computes sigmoid of x element-wise. + + Parameters + ---------- + x : tensor + A Tensor with type float16, float32, float64, complex64, or complex128. + + Returns + ------- + A Tensor with the same type as x. + """ + + return tf.nn.sigmoid(x) + + +class Softmax(object): + + def __init__(self): + pass + + def __call__(self, x): + return tf.nn.softmax(x) + + +def softmax(logits, axis=None): + """ + Computes softmax activations. + + Parameters + ---------- + logits : tensor + Must be one of the following types: half, float32, float64. + axis : int + The dimension softmax would be performed on. The default is -1 which indicates the last dimension. + + Returns + ------- + A Tensor. Has the same type and shape as logits. + """ + + return tf.nn.softmax(logits, axis) + + +class Dropout(object): + + def __init__(self, keep, seed=0): + self.keep = keep + self.seed = seed + + def __call__(self, inputs, *args, **kwargs): + outputs = tf.nn.dropout(inputs, rate=1 - (self.keep), seed=self.seed) + return outputs + + +class BiasAdd(object): + """ + Adds bias to value. + + Parameters + ---------- + x : tensor + A Tensor with type float, double, int64, int32, uint8, int16, int8, complex64, or complex128. + bias : tensor + Must be the same type as value unless value is a quantized type, + in which case a different quantized type may be used. + Returns + ------- + A Tensor with the same type as value. + """ + + def __init__(self, data_format=None): + self.data_format = data_format + + def __call__(self, x, bias): + return tf.nn.bias_add(x, bias, data_format=self.data_format) + + +def bias_add(x, bias, data_format=None, name=None): + """ + Adds bias to value. + + Parameters + ---------- + x : tensor + A Tensor with type float, double, int64, int32, uint8, int16, int8, complex64, or complex128. + bias : tensor + Must be the same type as value unless value is a quantized type, + in which case a different quantized type may be used. + data_format : A string. + 'N...C' and 'NC...' are supported. + name : str + A name for the operation (optional). + Returns + ------- + A Tensor with the same type as value. + """ + + x = tf.nn.bias_add(x, bias, data_format=data_format, name=name) + return x + + +class Conv1D(object): + + def __init__(self, stride, padding, data_format='NWC', dilations=None, out_channel=None, k_size=None): + self.stride = stride + self.dilations = dilations + self.data_format, self.padding = preprocess_1d_format(data_format, padding) + + def __call__(self, input, filters): + outputs = tf.nn.conv1d( + input=input, + filters=filters, + stride=self.stride, + padding=self.padding, + data_format=self.data_format, + dilations=self.dilations, + # name=name + ) + return outputs + + +def conv1d(input, filters, stride, padding, data_format='NWC', dilations=None): + """ + Computes a 1-D convolution given 3-D input and filter tensors. + + Parameters + ---------- + input : tensor + A 3D Tensor. Must be of type float16, float32, or float64 + filters : tensor + A 3D Tensor. Must have the same type as input. + stride : int of list + An int or list of ints that has length 1 or 3. The number of entries by which the filter is moved right at each step. + padding : string + 'SAME' or 'VALID' + data_format : string + An optional string from "NWC", "NCW". Defaults to "NWC", the data is stored in the order of + [batch, in_width, in_channels]. The "NCW" format stores data as [batch, in_channels, in_width]. + dilations : int or list + An int or list of ints that has length 1 or 3 which defaults to 1. + The dilation factor for each dimension of input. If set to k > 1, + there will be k-1 skipped cells between each filter element on that dimension. + Dilations in the batch and depth dimensions must be 1. + name : string + A name for the operation (optional). + Returns + ------- + A Tensor. Has the same type as input. + """ + + data_format, padding = preprocess_1d_format(data_format, padding) + outputs = tf.nn.conv1d( + input=input, + filters=filters, + stride=stride, + padding=padding, + data_format=data_format, + dilations=dilations, + # name=name + ) + return outputs + + +class Conv2D(object): + + def __init__(self, strides, padding, data_format='NHWC', dilations=None, out_channel=None, k_size=None): + self.strides = strides + self.dilations = dilations + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + + def __call__(self, input, filters): + outputs = tf.nn.conv2d( + input=input, + filters=filters, + strides=self.strides, + padding=self.padding, + data_format=self.data_format, + dilations=self.dilations, + ) + return outputs + + +def conv2d(input, filters, strides, padding, data_format='NHWC', dilations=None): + """ + Computes a 2-D convolution given 4-D input and filters tensors. + + Parameters + ---------- + input : tensor + Must be one of the following types: half, bfloat16, float32, float64. A 4-D tensor. + The dimension order is interpreted according to the value of data_format, see below for details. + filters : tensor + Must have the same type as input. A 4-D tensor of shape [filter_height, filter_width, in_channels, out_channels] + strides : int of list + The stride of the sliding window for each dimension of input. If a single value is given it is replicated in the H and W dimension. + By default the N and C dimensions are set to 1. The dimension order is determined by the value of data_format, see below for details. + padding : string + "SAME" or "VALID" + data_format : string + "NHWC", "NCHW". Defaults to "NHWC". + dilations : list or ints + list of ints that has length 1, 2 or 4, defaults to 1. The dilation factor for each dimension ofinput. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor. Has the same type as input. + """ + + data_format, padding = preprocess_2d_format(data_format, padding) + outputs = tf.nn.conv2d( + input=input, + filters=filters, + strides=strides, + padding=padding, + data_format=data_format, + dilations=dilations, + ) + return outputs + + +class Conv3D(object): + + def __init__(self, strides, padding, data_format='NDHWC', dilations=None, out_channel=None, k_size=None): + self.strides = strides + self.dilations = dilations + self.data_format, self.padding = preprocess_3d_format(data_format, padding) + + def __call__(self, input, filters): + outputs = tf.nn.conv3d( + input=input, + filters=filters, + strides=self.strides, + padding=self.padding, + data_format=self.data_format, + dilations=self.dilations, + ) + return outputs + + +def conv3d(input, filters, strides, padding, data_format='NDHWC', dilations=None): + """ + Computes a 3-D convolution given 5-D input and filters tensors. + + Parameters + ---------- + input : tensor + Must be one of the following types: half, bfloat16, float32, float64. + Shape [batch, in_depth, in_height, in_width, in_channels]. + filters : tensor + Must have the same type as input. Shape [filter_depth, filter_height, filter_width, in_channels, out_channels]. + in_channels must match between input and filters. + strides : list of ints + A list of ints that has length >= 5. 1-D tensor of length 5. + The stride of the sliding window for each dimension of input. + Must have strides[0] = strides[4] = 1. + padding : string + A string from: "SAME", "VALID". The type of padding algorithm to use. + data_format : string + An optional string from: "NDHWC", "NCDHW". Defaults to "NDHWC". The data format of the input and output data. + With the default format "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, in_width, in_channels]. + Alternatively, the format could be "NCDHW", the data storage order is: [batch, in_channels, in_depth, in_height, in_width]. + dilations : list of ints + Defaults to [1, 1, 1, 1, 1]. 1-D tensor of length 5. The dilation factor for each dimension of input. + If set to k > 1, there will be k-1 skipped cells between each filter element on that dimension. + The dimension order is determined by the value of data_format, see above for details. + Dilations in the batch and depth dimensions must be 1. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor. Has the same type as input. + """ + + data_format, padding = preprocess_3d_format(data_format, padding) + outputs = tf.nn.conv3d( + input=input, + filters=filters, + strides=strides, + padding=padding, + data_format=data_format, # 'NDHWC', + dilations=dilations, # [1, 1, 1, 1, 1], + # name=name, + ) + return outputs + + +def lrn(inputs, depth_radius, bias, alpha, beta): + """ + Local Response Normalization. + + Parameters + ---------- + inputs : tensor + Must be one of the following types: half, bfloat16, float32. 4-D. + depth_radius : int + Defaults to 5. 0-D. Half-width of the 1-D normalization window. + bias : float + Defaults to 1. An offset (usually positive to avoid dividing by 0). + alpha : float + Defaults to 1. A scale factor, usually positive. + beta : float + Defaults to 0.5. An exponent. + + Returns + ------- + A Tensor. Has the same type as input. + """ + + outputs = tf.nn.lrn(inputs, depth_radius=depth_radius, bias=bias, alpha=alpha, beta=beta) + return outputs + + +def moments(x, axes, shift=None, keepdims=False): + """ + Calculates the mean and variance of x. + + Parameters + ---------- + x : tensor + A Tensor + axes : list or ints + Axes along which to compute mean and variance. + shift : int + Not used in the current implementation. + keepdims : bool + produce moments with the same dimensionality as the input. + + Returns + ------- + Two Tensor objects: mean and variance. + """ + + outputs = tf.nn.moments(x, axes, shift, keepdims) + return outputs + + +class MaxPool(object): + + def __init__(self, ksize, strides, padding, data_format=None): + self.ksize = ksize + self.strides = strides + self.data_format = data_format + self.padding = padding + + def __call__(self, inputs): + if inputs.ndim == 3: + self.data_format, self.padding = preprocess_1d_format(data_format=self.data_format, padding=self.padding) + elif inputs.ndim == 4: + self.data_format, self.padding = preprocess_2d_format(data_format=self.data_format, padding=self.padding) + elif inputs.ndim == 5: + self.data_format, self.padding = preprocess_3d_format(data_format=self.data_format, padding=self.padding) + + outputs = tf.nn.max_pool( + input=inputs, ksize=self.ksize, strides=self.strides, padding=self.padding, data_format=self.data_format + ) + return outputs + + +def max_pool(input, ksize, strides, padding, data_format=None): + """ + Performs the max pooling on the input. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] if data_format does not start + with "NC" (default), or [batch_size, num_channels] + input_spatial_shape if data_format starts with "NC". + Pooling happens over the spatial dimensions only. + ksize : int or list of ints + An int or list of ints that has length 1, N or N+2. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, N or N+2. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor of format specified by data_format. The max pooled output tensor. + """ + + if input.ndim == 3: + data_format, padding = preprocess_1d_format(data_format=data_format, padding=padding) + elif input.ndim == 4: + data_format, padding = preprocess_2d_format(data_format=data_format, padding=padding) + elif input.ndim == 5: + data_format, padding = preprocess_3d_format(data_format=data_format, padding=padding) + + outputs = tf.nn.max_pool(input=input, ksize=ksize, strides=strides, padding=padding, data_format=data_format) + return outputs + + +class AvgPool(object): + + def __init__(self, ksize, strides, padding, data_format=None): + self.ksize = ksize + self.strides = strides + self.data_format = data_format + self.padding = padding_format(padding) + + def __call__(self, inputs): + outputs = tf.nn.avg_pool( + input=inputs, ksize=self.ksize, strides=self.strides, padding=self.padding, data_format=self.data_format + ) + return outputs + + +def avg_pool(input, ksize, strides, padding): + """ + Performs the avg pooling on the input. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] + if data_format does not start with "NC" (default), or [batch_size, num_channels] + input_spatial_shape + if data_format starts with "NC". Pooling happens over the spatial dimensions only. + ksize : int or list of ints + An int or list of ints that has length 1, N or N+2. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, N or N+2. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + name : string + Optional name for the operation. + + Returns + ------- + A Tensor of format specified by data_format. The average pooled output tensor. + """ + + padding = padding_format(padding) + outputs = tf.nn.avg_pool( + input=input, + ksize=ksize, + strides=strides, + padding=padding, + ) + return outputs + + +def max_pool3d(input, ksize, strides, padding, data_format=None): + """ + Performs the max pooling on the input. + + Parameters + ---------- + input : tensor + A 5-D Tensor of the format specified by data_format. + ksize : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + "NDHWC", "NCDHW". Defaults to "NDHWC". The data format of the input and output data. + With the default format "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, in_width, in_channels]. + Alternatively, the format could be "NCDHW", the data storage order is: [batch, in_channels, in_depth, in_height, in_width]. + name : string + A name for the operation (optional). + + Returns + ------- + A Tensor of format specified by data_format. The max pooled output tensor. + """ + + data_format, padding = preprocess_3d_format(data_format, padding) + outputs = tf.nn.max_pool3d( + input=input, + ksize=ksize, + strides=strides, + padding=padding, + data_format=data_format, + ) + return outputs + + +def avg_pool3d(input, ksize, strides, padding, data_format=None): + """ + Performs the average pooling on the input. + + Parameters + ---------- + input : tensor + A 5-D Tensor of shape [batch, height, width, channels] and type float32, float64, qint8, quint8, or qint32. + ksize : int or list of ints + An int or list of ints that has length 1, 3 or 5. The size of the window for each dimension of the input tensor. + strides : int or list of ints + An int or list of ints that has length 1, 3 or 5. + The stride of the sliding window for each dimension of the input tensor. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NDHWC' and 'NCDHW' are supported. + name : string + Optional name for the operation. + + Returns + ------- + A Tensor with the same type as value. The average pooled output tensor. + """ + + data_format, padding = preprocess_3d_format(data_format, padding) + outputs = tf.nn.avg_pool3d( + input=input, + ksize=ksize, + strides=strides, + padding=padding, + data_format=data_format, + ) + return outputs + + +def pool(input, window_shape, pooling_type, strides=None, padding='VALID', data_format=None, dilations=None, name=None): + """ + Performs an N-D pooling operation. + + Parameters + ---------- + input : tensor + Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] + if data_format does not start with "NC" (default), or [batch_size, num_channels] + input_spatial_shape + if data_format starts with "NC". Pooling happens over the spatial dimensions only. + window_shape : int + Sequence of N ints >= 1. + pooling_type : string + Specifies pooling operation, must be "AVG" or "MAX". + strides : ints + Sequence of N ints >= 1. Defaults to [1]*N. If any value of strides is > 1, then all values of dilation_rate must be 1. + padding : string + The padding algorithm, must be "SAME" or "VALID". Defaults to "SAME". + See the "returns" section of tf.ops.convolution for details. + data_format : string + Specifies whether the channel dimension of the input and output is the last dimension (default, or if data_format does not start with "NC"), + or the second dimension (if data_format starts with "NC"). + For N=1, the valid values are "NWC" (default) and "NCW". For N=2, the valid values are "NHWC" (default) and "NCHW". + For N=3, the valid values are "NDHWC" (default) and "NCDHW". + dilations : list of ints + Dilation rate. List of N ints >= 1. Defaults to [1]*N. If any value of dilation_rate is > 1, then all values of strides must be 1. + name : string + Optional. Name of the op. + + Returns + ------- + Tensor of rank N+2, of shape [batch_size] + output_spatial_shape + [num_channels] + """ + if pooling_type in ["MAX", "max"]: + pooling_type = "MAX" + elif pooling_type in ["AVG", "avg"]: + pooling_type = "AVG" + else: + raise ValueError('Unsupported pool_mode: ' + str(pooling_type)) + padding = padding_format(padding) + outputs = tf.nn.pool( + input=input, + window_shape=window_shape, + pooling_type=pooling_type, + strides=strides, + padding=padding, + data_format=data_format, + dilations=dilations, + name=name, + ) + return outputs + + +class DepthwiseConv2d(object): + + def __init__(self, strides, padding, data_format=None, dilations=None, ksize=None, channel_multiplier=1): + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + self.strides = strides + self.dilations = dilations + + def __call__(self, input, filter): + outputs = tf.nn.depthwise_conv2d( + input=input, + filter=filter, + strides=self.strides, + padding=self.padding, + data_format=self.data_format, + dilations=self.dilations, + ) + return outputs + + +def depthwise_conv2d(input, filter, strides, padding, data_format=None, dilations=None, name=None): + """ + Depthwise 2-D convolution. + + Parameters + ---------- + input : tensor + 4-D with shape according to data_format. + filter : tensor + 4-D with shape [filter_height, filter_width, in_channels, channel_multiplier]. + strides : list + 1-D of size 4. The stride of the sliding window for each dimension of input. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + The data format for input. Either "NHWC" (default) or "NCHW". + dilations : list + 1-D of size 2. The dilation rate in which we sample input values across the height and width dimensions in atrous convolution. + If it is greater than 1, then all values of strides must be 1. + name : string + A name for this operation (optional). + + Returns + ------- + A 4-D Tensor with shape according to data_format. + E.g., for "NHWC" format, shape is [batch, out_height, out_width, in_channels * channel_multiplier]. + """ + + data_format, padding = preprocess_2d_format(data_format, padding) + outputs = tf.nn.depthwise_conv2d( + input=input, + filter=filter, + strides=strides, + padding=padding, + data_format=data_format, + dilations=dilations, + name=name, + ) + return outputs + + +class Conv1d_transpose(object): + + def __init__( + self, strides, padding, data_format='NWC', dilations=None, out_channel=None, k_size=None, in_channels=None + ): + self.strides = strides + self.dilations = dilations + self.data_format, self.padding = preprocess_1d_format(data_format, padding) + + def __call__(self, input, filters): + batch_size = input.shape[0] + if self.data_format == 'NWC': + w_axis, c_axis = 1, 2 + else: + w_axis, c_axis = 2, 1 + + input_shape = input.shape.as_list() + filters_shape = filters.shape.as_list() + input_w = input_shape[w_axis] + filters_w = filters_shape[0] + output_channels = filters_shape[1] + dilations_w = 1 + + if isinstance(self.strides, int): + strides_w = self.strides + else: + strides_list = list(self.strides) + strides_w = strides_list[w_axis] + + if self.dilations is not None: + if isinstance(self.dilations, int): + dilations_w = self.dilations + else: + dilations_list = list(self.dilations) + dilations_w = dilations_list[w_axis] + + filters_w = filters_w + (filters_w - 1) * (dilations_w - 1) + assert self.padding in {'SAME', 'VALID'} + if self.padding == 'VALID': + output_w = input_w * strides_w + max(filters_w - strides_w, 0) + elif self.padding == 'SAME': + output_w = input_w * strides_w + + if self.data_format == 'NCW': + output_shape = (batch_size, output_channels, output_w) + else: + output_shape = (batch_size, output_w, output_channels) + output_shape = tf.stack(output_shape) + outputs = tf.nn.conv1d_transpose( + input=input, + filters=filters, + output_shape=output_shape, + strides=self.strides, + padding=self.padding, + data_format=self.data_format, + dilations=self.dilations, + ) + return outputs + + +def conv1d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NWC', dilations=None, name=None +): + """ + The transpose of conv1d. + + Parameters + ---------- + input : tensor + A 3-D Tensor of type float and shape [batch, in_width, in_channels] + for NWC data format or [batch, in_channels, in_width] for NCW data format. + filters : tensor + A 3-D Tensor with the same type as value and shape [filter_width, output_channels, in_channels]. + filter's in_channels dimension must match that of value. + output_shape : tensor + A 1-D Tensor, containing three elements, representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1 or 3. The number of entries by which the filter is moved right at each step. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NWC' and 'NCW' are supported. + dilations : list + An int or list of ints that has length 1 or 3 which defaults to 1. + The dilation factor for each dimension of input. If set to k > 1, + there will be k-1 skipped cells between each filter element on that dimension. + Dilations in the batch and depth dimensions must be 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as value. + """ + + data_format, padding = preprocess_1d_format(data_format, padding) + outputs = tf.nn.conv1d_transpose( + input=input, + filters=filters, + output_shape=output_shape, + strides=strides, + padding=padding, + data_format=data_format, + dilations=dilations, + name=name, + ) + return outputs + + +class Conv2d_transpose(object): + + def __init__( + self, strides, padding, data_format='NHWC', dilations=None, name=None, out_channel=None, k_size=None, + in_channels=None + ): + self.strides = strides + self.dilations = dilations + self.name = name + self.data_format, self.padding = preprocess_2d_format(data_format, padding) + + def __call__(self, input, filters): + if self.data_format == 'NHWC': + h_axis, w_axis = 1, 2 + else: + h_axis, w_axis = 2, 3 + + input_shape = input.shape.as_list() + filters_shape = filters.shape.as_list() + batch_size = input.shape[0] + input_h, input_w = input_shape[h_axis], input_shape[w_axis] + kernel_h, kernel_w = filters_shape[0], filters_shape[1] + output_channels = filters_shape[2] + dilations_h, dilations_w = 1, 1 + + if isinstance(self.strides, int): + strides_h = self.strides + strides_w = self.strides + else: + strides_list = list(self.strides) + if len(strides_list) != 4: + strides_h = strides_list[0] + strides_w = strides_list[1] + else: + strides_h = strides_list[h_axis] + strides_w = strides_list[w_axis] + + if self.dilations is not None: + if isinstance(self.dilations, int): + dilations_h = self.dilations + dilations_w = self.dilations + else: + dilations_list = list(self.dilations) + if len(dilations_list) != 4: + dilations_h = dilations_list[0] + dilations_w = dilations_list[1] + else: + dilations_h = dilations_list[h_axis] + dilations_w = dilations_list[w_axis] + + kernel_h = kernel_h + (kernel_h - 1) * (dilations_h - 1) + kernel_w = kernel_w + (kernel_w - 1) * (dilations_w - 1) + + assert self.padding in {'SAME', 'VALID'} + if self.padding == 'VALID': + output_h = input_h * strides_h + max(kernel_h - strides_h, 0) + output_w = input_w * strides_w + max(kernel_w - strides_w, 0) + elif self.padding == 'SAME': + output_h = input_h * strides_h + output_w = input_w * strides_w + + if self.data_format == 'NCHW': + out_shape = (batch_size, output_channels, output_h, output_w) + else: + out_shape = (batch_size, output_h, output_w, output_channels) + + output_shape = tf.stack(out_shape) + + outputs = tf.nn.conv2d_transpose( + input=input, filters=filters, output_shape=output_shape, strides=self.strides, padding=self.padding, + data_format=self.data_format, dilations=self.dilations, name=self.name + ) + return outputs + + +def conv2d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NHWC', dilations=None, name=None +): + """ + The transpose of conv2d. + + Parameters + ---------- + input : tensor + A 4-D Tensor of type float and shape [batch, height, width, in_channels] + for NHWC data format or [batch, in_channels, height, width] for NCHW data format. + filters : tensor + A 4-D Tensor with the same type as input and shape [height, width, + output_channels, in_channels]. filter's in_channels dimension must match that of input. + output_shape : tensor + A 1-D Tensor representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1, 2 or 4. The stride of the sliding window for each dimension of input. + If a single value is given it is replicated in the H and W dimension. + By default the N and C dimensions are set to 0. + The dimension order is determined by the value of data_format, see below for details. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NHWC' and 'NCHW' are supported. + dilations : list + An int or list of ints that has length 1, 2 or 4, defaults to 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as input. + """ + + data_format, padding = preprocess_2d_format(data_format, padding) + outputs = tf.nn.conv2d_transpose( + input=input, + filters=filters, + output_shape=output_shape, + strides=strides, + padding=padding, + data_format=data_format, + dilations=dilations, + name=name, + ) + return outputs + + +class Conv3d_transpose(object): + + def __init__( + self, strides, padding, data_format='NDHWC', dilations=None, name=None, out_channel=None, k_size=None, + in_channels=None + ): + self.strides = strides + self.dilations = dilations + self.name = name + self.out_channel = out_channel + self.data_format, self.padding = preprocess_3d_format(data_format, padding) + + def __call__(self, input, filters): + if self.data_format == 'NDHWC': + d_axis, h_axis, w_axis = 1, 2, 3 + else: + d_axis, h_axis, w_axis = 2, 3, 4 + + input_shape = input.shape.as_list() + filters_shape = filters.shape.as_list() + batch_size = input_shape[0] + input_d, input_h, input_w = input_shape[d_axis], input_shape[h_axis], input_shape[w_axis] + kernel_d, kernel_h, kernel_w = filters_shape[0], filters_shape[1], filters_shape[2] + dilations_d, dilations_h, dilations_w = 1, 1, 1 + + if isinstance(self.strides, int): + strides_d, strides_h, strides_w = self.strides + else: + strides_list = list(self.strides) + if len(strides_list) != 5: + strides_d, strides_h, strides_w = \ + strides_list[0], \ + strides_list[1], \ + strides_list[2] + else: + strides_d, strides_h, strides_w = \ + strides_list[d_axis], \ + strides_list[h_axis], \ + strides_list[w_axis] + + if self.dilations is not None: + if isinstance(self.dilations, int): + dilations_d, dilations_h, dilations_w = self.dilations + else: + dilations_list = list(self.dilations) + if len(dilations_list) != 5: + dilations_d, dilations_h, dilations_w = \ + dilations_list[0], \ + dilations_list[1], \ + dilations_list[2] + else: + dilations_d, dilations_h, dilations_w = \ + dilations_list[d_axis],\ + dilations_list[h_axis], \ + dilations_list[w_axis] + + assert self.padding in {'VALID', 'SAME'} + + kernel_d = kernel_d + (kernel_d - 1) * (dilations_d - 1) + kernel_h = kernel_h + (kernel_h - 1) * (dilations_h - 1) + kernel_w = kernel_w + (kernel_w - 1) * (dilations_w - 1) + + if self.padding == 'VALID': + output_d = input_d * strides_d + max(kernel_d - strides_d, 0) + output_h = input_h * strides_h + max(kernel_h - strides_h, 0) + output_w = input_w * strides_w + max(kernel_w - strides_w, 0) + elif self.padding == 'SAME': + output_d = input_d * strides_d + output_h = input_h * strides_h + output_w = input_w * strides_w + + if self.data_format == 'NDHWC': + output_shape = (batch_size, output_d, output_h, output_w, self.out_channel) + else: + output_shape = (batch_size, self.out_channel, output_d, output_h, output_w) + + output_shape = tf.stack(output_shape) + outputs = tf.nn.conv3d_transpose( + input=input, filters=filters, output_shape=output_shape, strides=self.strides, padding=self.padding, + data_format=self.data_format, dilations=self.dilations, name=self.name + ) + + return outputs + + +def conv3d_transpose( + input, filters, output_shape, strides, padding='SAME', data_format='NDHWC', dilations=None, name=None +): + """ + The transpose of conv3d. + + Parameters + ---------- + input : tensor + A 5-D Tensor of type float and shape [batch, height, width, in_channels] for + NHWC data format or [batch, in_channels, height, width] for NCHW data format. + filters : tensor + A 5-D Tensor with the same type as value and shape [height, width, output_channels, in_channels]. + filter's in_channels dimension must match that of value. + output_shape : tensor + A 1-D Tensor representing the output shape of the deconvolution op. + strides : list + An int or list of ints that has length 1, 3 or 5. + padding : string + 'VALID' or 'SAME'. The padding algorithm. See the "returns" section of tf.ops.convolution for details. + data_format : string + 'NDHWC' and 'NCDHW' are supported. + dilations : list of ints + An int or list of ints that has length 1, 3 or 5, defaults to 1. + name : string + Optional name for the returned tensor. + + Returns + ------- + A Tensor with the same type as value. + """ + + data_format, padding = preprocess_3d_format(data_format, padding) + outputs = tf.nn.conv3d_transpose( + input=input, filters=filters, output_shape=output_shape, strides=strides, padding=padding, + data_format=data_format, dilations=dilations, name=name + ) + return outputs + + +def depthwise_conv2d(input, filters, strides, padding='SAME', data_format='NHWC', dilations=None, name=None): + """ + Depthwise 2-D convolution. + + Parameters + ---------- + input : tensor + 4-D with shape according to data_format. + filters : tensor + 4-D with shape [filter_height, filter_width, in_channels, channel_multiplier]. + strides : tuple + 1-D of size 4. The stride of the sliding window for each dimension of input. + padding : string + 'VALID' or 'SAME' + data_format : string + "NHWC" (default) or "NCHW". + dilations : tuple + The dilation rate in which we sample input values across the height and width dimensions in atrous convolution. + If it is greater than 1, then all values of strides must be 1. + name : string + A name for this operation (optional). + + Returns + ------- + A 4-D Tensor with shape according to data_format. + """ + + data_format, padding = preprocess_2d_format(data_format, padding) + outputs = tf.nn.depthwise_conv2d( + input=input, + filter=filters, + strides=strides, + padding=padding, + data_format=data_format, + dilations=dilations, + name=name, + ) + return outputs + + +def _to_channel_first_bias(b): + """Reshape [c] to [c, 1, 1].""" + channel_size = int(b.shape[0]) + new_shape = (channel_size, 1, 1) + return tf.reshape(b, new_shape) + + +def _bias_scale(x, b, data_format): + """The multiplication counter part of tf.nn.bias_add.""" + if data_format == 'NHWC': + return x * b + elif data_format == 'NCHW': + return x * _to_channel_first_bias(b) + else: + raise ValueError('invalid data_format: %s' % data_format) + + +def _bias_add(x, b, data_format): + """Alternative implementation of tf.nn.bias_add which is compatiable with tensorRT.""" + if data_format == 'NHWC': + return tf.add(x, b) + elif data_format == 'NCHW': + return tf.add(x, _to_channel_first_bias(b)) + else: + raise ValueError('invalid data_format: %s' % data_format) + + +def batch_normalization(x, mean, variance, offset, scale, variance_epsilon, data_format, name=None): + """Data Format aware version of tf.nn.batch_normalization.""" + if data_format == 'channels_last': + mean = tf.reshape(mean, [1] * (len(x.shape) - 1) + [-1]) + variance = tf.reshape(variance, [1] * (len(x.shape) - 1) + [-1]) + offset = tf.reshape(offset, [1] * (len(x.shape) - 1) + [-1]) + scale = tf.reshape(scale, [1] * (len(x.shape) - 1) + [-1]) + elif data_format == 'channels_first': + mean = tf.reshape(mean, [1] + [-1] + [1] * (len(x.shape) - 2)) + variance = tf.reshape(variance, [1] + [-1] + [1] * (len(x.shape) - 2)) + offset = tf.reshape(offset, [1] + [-1] + [1] * (len(x.shape) - 2)) + scale = tf.reshape(scale, [1] + [-1] + [1] * (len(x.shape) - 2)) + else: + raise ValueError('invalid data_format: %s' % data_format) + + with ops.name_scope(name, 'batchnorm', [x, mean, variance, scale, offset]): + inv = math_ops.rsqrt(variance + variance_epsilon) + if scale is not None: + inv *= scale + + a = math_ops.cast(inv, x.dtype) + b = math_ops.cast(offset - mean * inv if offset is not None else -mean * inv, x.dtype) + # Return a * x + b with customized data_format. + # Currently TF doesn't have bias_scale, and tensorRT has bug in converting tf.nn.bias_add + # So we reimplemted them to allow make the model work with tensorRT. + # See https://github.com/tensorlayer/openpose-plus/issues/75 for more details. + # df = {'channels_first': 'NCHW', 'channels_last': 'NHWC'} + # return _bias_add(_bias_scale(x, a, df[data_format]), b, df[data_format]) + return a * x + b + + +class BatchNorm(object): + """ + The :class:`BatchNorm` is a batch normalization layer for both fully-connected and convolution outputs. + See ``tf.nn.batch_normalization`` and ``tf.nn.moments``. + + Parameters + ---------- + decay : float + A decay factor for `ExponentialMovingAverage`. + Suggest to use a large value for large dataset. + epsilon : float + Eplison. + act : activation function + The activation function of this layer. + is_train : boolean + Is being used for training or inference. + beta_init : initializer or None + The initializer for initializing beta, if None, skip beta. + Usually you should not skip beta unless you know what happened. + gamma_init : initializer or None + The initializer for initializing gamma, if None, skip gamma. + When the batch normalization layer is use instead of 'biases', or the next layer is linear, this can be + disabled since the scaling can be done by the next layer. see `Inception-ResNet-v2 `__ + moving_mean_init : initializer or None + The initializer for initializing moving mean, if None, skip moving mean. + moving_var_init : initializer or None + The initializer for initializing moving var, if None, skip moving var. + num_features: int + Number of features for input tensor. Useful to build layer if using BatchNorm1d, BatchNorm2d or BatchNorm3d, + but should be left as None if using BatchNorm. Default None. + data_format : str + channels_last 'channel_last' (default) or channels_first. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 50, 50, 32], name='input') + >>> net = tl.layers.BatchNorm()(net) + + Notes + ----- + The :class:`BatchNorm` is universally suitable for 3D/4D/5D input in static model, but should not be used + in dynamic model where layer is built upon class initialization. So the argument 'num_features' should only be used + for subclasses :class:`BatchNorm1d`, :class:`BatchNorm2d` and :class:`BatchNorm3d`. All the three subclasses are + suitable under all kinds of conditions. + + References + ---------- + - `Source `__ + - `stackoverflow `__ + + """ + + def __init__( + self, decay=0.9, epsilon=0.00001, beta=None, gamma=None, moving_mean=None, moving_var=None, num_features=None, + data_format='channels_last', is_train=False + ): + self.decay = decay + self.epsilon = epsilon + self.data_format = data_format + self.beta = beta + self.gamma = gamma + self.moving_mean = moving_mean + self.moving_var = moving_var + self.num_features = num_features + self.is_train = is_train + self.axes = None + + if self.decay < 0.0 or 1.0 < self.decay: + raise ValueError("decay should be between 0 to 1") + + def _get_param_shape(self, inputs_shape): + if self.data_format == 'channels_last': + axis = -1 + elif self.data_format == 'channels_first': + axis = 1 + else: + raise ValueError('data_format should be either %s or %s' % ('channels_last', 'channels_first')) + + channels = inputs_shape[axis] + params_shape = [channels] + + return params_shape + + def _check_input_shape(self, inputs): + if inputs.ndim <= 1: + raise ValueError('expected input at least 2D, but got {}D input'.format(inputs.ndim)) + + def __call__(self, inputs): + self._check_input_shape(inputs) + self.channel_axis = len(inputs.shape) - 1 if self.data_format == 'channels_last' else 1 + if self.axes is None: + self.axes = [i for i in range(len(inputs.shape)) if i != self.channel_axis] + + mean, var = tf.nn.moments(inputs, self.axes, keepdims=False) + if self.is_train: + # update moving_mean and moving_var + self.moving_mean = moving_averages.assign_moving_average( + self.moving_mean, mean, self.decay, zero_debias=False + ) + self.moving_var = moving_averages.assign_moving_average(self.moving_var, var, self.decay, zero_debias=False) + outputs = batch_normalization(inputs, mean, var, self.beta, self.gamma, self.epsilon, self.data_format) + else: + outputs = batch_normalization( + inputs, self.moving_mean, self.moving_var, self.beta, self.gamma, self.epsilon, self.data_format + ) + + return outputs diff --git a/tensorlayer/cli/__init__.py b/tensorlayer/cli/__init__.py new file mode 100644 index 0000000..e7522d7 --- /dev/null +++ b/tensorlayer/cli/__init__.py @@ -0,0 +1,3 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +"""The tensorlayer.cli module provides a command-line tool for some common tasks.""" diff --git a/tensorlayer/cli/__main__.py b/tensorlayer/cli/__main__.py new file mode 100644 index 0000000..838038b --- /dev/null +++ b/tensorlayer/cli/__main__.py @@ -0,0 +1,17 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import argparse + +from tensorlayer.cli import train + +if __name__ == "__main__": + parser = argparse.ArgumentParser(prog='tl') + subparsers = parser.add_subparsers(dest='cmd') + train_parser = subparsers.add_parser('train', help='train a model using multiple local GPUs or CPUs.') + train.build_arg_parser(train_parser) + args = parser.parse_args() + if args.cmd == 'train': + train.main(args) + else: + parser.print_help() diff --git a/tensorlayer/cli/train.py b/tensorlayer/cli/train.py new file mode 100644 index 0000000..d63b7f5 --- /dev/null +++ b/tensorlayer/cli/train.py @@ -0,0 +1,171 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +tl train +======== + +(Alpha release - usage might change later) + +The tensorlayer.cli.train module provides the ``tl train`` subcommand. +It helps the user bootstrap a TensorFlow/TensorLayer program for distributed training +using multiple GPU cards or CPUs on a computer. + +You need to first setup the `CUDA_VISIBLE_DEVICES `_ +to tell ``tl train`` which GPUs are available. If the CUDA_VISIBLE_DEVICES is not given, +``tl train`` would try best to discover all available GPUs. + +In distribute training, each TensorFlow program needs a TF_CONFIG environment variable to describe +the cluster. It also needs a master daemon to +monitor all trainers. ``tl train`` is responsible +for automatically managing these two tasks. + +Usage +----- + +tl train [-h] [-p NUM_PSS] [-c CPU_TRAINERS] [args [args ...]] + +.. code-block:: bash + + # example of using GPU 0 and 1 for training mnist + CUDA_VISIBLE_DEVICES="0,1" + tl train example/tutorial_mnist_distributed.py + + # example of using CPU trainers for inception v3 + tl train -c 16 example/tutorial_imagenet_inceptionV3_distributed.py + + # example of using GPU trainers for inception v3 with customized arguments + # as CUDA_VISIBLE_DEVICES is not given, tl would try to discover all available GPUs + tl train example/tutorial_imagenet_inceptionV3_distributed.py -- --batch_size 16 + + +Command-line Arguments +---------------------- + +- ``file``: python file path. + +- ``NUM_PSS`` : The number of parameter servers. + +- ``CPU_TRAINERS``: The number of CPU trainers. + + It is recommended that ``NUM_PSS + CPU_TRAINERS <= cpu count`` + +- ``args``: Any parameter after ``--`` would be passed to the python program. + + +Notes +----- +A parallel training program would require multiple parameter servers +to help parallel trainers to exchange intermediate gradients. +The best number of parameter servers is often proportional to the +size of your model as well as the number of CPUs available. +You can control the number of parameter servers using the ``-p`` parameter. + +If you have a single computer with massive CPUs, you can use the ``-c`` parameter +to enable CPU-only parallel training. +The reason we are not supporting GPU-CPU co-training is because GPU and +CPU are running at different speeds. Using them together in training would +incur stragglers. + +""" + +import argparse +import json +import multiprocessing +import os +import platform +import re +import subprocess +import sys + +PORT_BASE = 10000 + + +def _get_gpu_ids(): + if 'CUDA_VISIBLE_DEVICES' in os.environ: + return [int(x) for x in os.environ.get('CUDA_VISIBLE_DEVICES', '').split(',')] + if platform.system() in ['Darwin', 'Linux']: + return [int(d.replace('nvidia', '')) for d in os.listdir('/dev') if re.match('^nvidia\d+$', d)] + else: + print('Please set CUDA_VISIBLE_DEVICES (see http://acceleware.com/blog/cudavisibledevices-masking-gpus)') + return [] + + +GPU_IDS = _get_gpu_ids() + + +def create_tf_config(cluster_spec, task_type, task_index): + return { + 'cluster': cluster_spec, + 'task': { + 'type': task_type, + 'index': task_index + }, + } + + +def create_tf_jobs(cluster_spec, prog, args): + gpu_assignment = dict((('worker', idx), gpu_idx) for (idx, gpu_idx) in enumerate(GPU_IDS)) + for job_type in cluster_spec: + for task_index in range(len(cluster_spec[job_type])): + new_env = os.environ.copy() + new_env.update( + { + 'CUDA_VISIBLE_DEVICES': str(gpu_assignment.get((job_type, task_index), '')), + 'TF_CONFIG': json.dumps(create_tf_config(cluster_spec, job_type, task_index)), + } + ) + yield subprocess.Popen(['python3', prog] + args, env=new_env) + + +def validate_arguments(args): + if args.num_pss < 1: + print('Value error: must have ore than one parameter servers.') + exit(1) + + if not GPU_IDS: + num_cpus = multiprocessing.cpu_count() + if args.cpu_trainers > num_cpus: + print('Value error: there are %s available CPUs but you are requiring %s.' % (num_cpus, args.cpu_trainers)) + exit(1) + + if not os.path.isfile(args.file): + print('Value error: model trainning file does not exist') + exit(1) + + +def main(args): + validate_arguments(args) + num_workers = len(GPU_IDS) if GPU_IDS else args.cpu_trainers + print('Using program %s with args %s' % (args.file, ' '.join(args.args))) + print('Using %d workers, %d parameter servers, %d GPUs.' % (num_workers, args.num_pss, len(GPU_IDS))) + cluster_spec = { + 'ps': ['localhost: %d' % (PORT_BASE + i) for i in range(args.num_pss)], + 'worker': ['localhost: %d' % (PORT_BASE + args.num_pss + i) for i in range(num_workers)] + } + processes = list(create_tf_jobs(cluster_spec, args.file, args.args)) + try: + print('Press ENTER to exit the training ...') + sys.stdin.readline() + except KeyboardInterrupt: # https://docs.python.org/3/library/exceptions.html#KeyboardInterrupt + print('Keyboard interrupt received') + finally: + print('stopping all subprocesses ...') + for p in processes: + p.kill() + for p in processes: + p.wait() + print('END') + + +def build_arg_parser(parser): + parser.add_argument('-p', '--pss', dest='num_pss', type=int, default=1, help='number of parameter servers') + parser.add_argument('-c', '--cpu_trainers', dest='cpu_trainers', type=int, default=1, help='number of CPU trainers') + parser.add_argument('file', help='model trainning file path') + parser.add_argument('args', nargs='*', type=str, help='arguments to ') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + build_arg_parser(parser) + args = parser.parse_args() + main(args) diff --git a/tensorlayer/cost/__init__.py b/tensorlayer/cost/__init__.py new file mode 100644 index 0000000..3ca7c2c --- /dev/null +++ b/tensorlayer/cost/__init__.py @@ -0,0 +1,15 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from tensorlayer.backend import BACKEND + +if BACKEND == 'tensorflow': + from .tensorflow_cost import * +elif BACKEND == 'mindspore': + from .mindspore_cost import * +elif BACKEND == 'dragon': + pass +elif BACKEND == 'paddle': + from .paddle_cost import * +else: + raise NotImplementedError("This backend is not supported") diff --git a/tensorlayer/cost/mindspore_cost.py b/tensorlayer/cost/mindspore_cost.py new file mode 100644 index 0000000..694c5fc --- /dev/null +++ b/tensorlayer/cost/mindspore_cost.py @@ -0,0 +1,763 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from mindspore import nn +from mindspore.nn import Cell +import mindspore.ops as P + +__all__ = [ + 'cross_entropy', + 'sigmoid_cross_entropy', + 'binary_cross_entropy', + 'mean_squared_error', + 'normalized_mean_square_error', + 'absolute_difference_error', + 'dice_coe', + 'dice_hard_coe', + 'iou_coe', + 'cross_entropy_seq', + 'cross_entropy_seq_with_mask', + 'cosine_similarity', + 'li_regularizer', + 'lo_regularizer', + 'maxnorm_regularizer', + 'maxnorm_o_regularizer', + 'maxnorm_i_regularizer', +] + +cross_entropy = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') + + +def sigmoid_cross_entropy(output, target, name=None): + """Sigmoid cross-entropy operation, see ``tf.ops.sigmoid_cross_entropy_with_logits``. + + Parameters + ---------- + output : Tensor + A batch of distribution with shape: [batch_size, num of classes]. + target : Tensor + A batch of index with shape: [batch_size, ]. + name : string + Name of this loss. + + """ + outputs = P.ReduceMean(cross_entropy(output, target)) + return outputs + + +def binary_cross_entropy(output, target, epsilon=1e-8, name='bce_loss'): + """Binary cross entropy operation. + + Parameters + ---------- + output : Tensor + Tensor with type of `float32` or `float64`. + target : Tensor + The target distribution, format the same with `output`. + epsilon : float + A small value to avoid output to be zero. + name : str + An optional name to attach to this function. + + References + ----------- + - `ericjang-DRAW `__ + + """ + + # return tf.reduce_mean( + # tf.reduce_sum( + # -(target * tf.math.log(output + epsilon) + (1. - target) * tf.math.log(1. - output + epsilon)), axis=1 + # ), name=name + # ) + raise NotImplementedError("Not Implemented.") + + +def mean_squared_error(output, target, is_mean=False, axis=-1, name="mean_squared_error"): + """Return the TensorFlow expression of mean-square-error (L2) of two batch of data. + + Parameters + ---------- + output : Tensor + 2D, 3D or 4D tensor i.e. [batch_size, n_feature], [batch_size, height, width] or [batch_size, height, width, channel]. + target : Tensor + The target distribution, format the same with `output`. + is_mean : boolean + Whether compute the mean or sum for each example. + - If True, use ``tf.reduce_mean`` to compute the loss between one target and predict data. + - If False, use ``tf.reduce_sum`` (default). + axis : int or list of int + The dimensions to reduce. + name : str + An optional name to attach to this function. + + References + ------------ + - `Wiki Mean Squared Error `__ + + """ + # with tf.name_scope(name): + # if len(output.shape) == 2: # [batch_size, n_feature] + # axis = 1 + # elif len(output.shape) == 3: # [batch_size, w, h] + # axis = [1, 2] + # elif len(output.shape) == 4: # [batch_size, w, h, c] + # axis = [1, 2, 3] + # else: + # raise Exception("Unknow dimension") + + return nn.MSELoss()(output, target) + + +def normalized_mean_square_error(output, target, axis=-1, name="normalized_mean_squared_error_loss"): + """Return the TensorFlow expression of normalized mean-square-error of two distributions. + + Parameters + ---------- + output : Tensor + 2D, 3D or 4D tensor i.e. [batch_size, n_feature], [batch_size, height, width] or [batch_size, height, width, channel]. + target : Tensor + The target distribution, format the same with `output`. + axis : int or list of int + The dimensions to reduce. + name : str + An optional name to attach to this function. + + """ + # with tf.name_scope("normalized_mean_squared_error_loss"): + # nmse_a = tf.sqrt(tf.reduce_sum(tf.math.squared_difference(output, target), axis=axis)) + # nmse_b = tf.sqrt(tf.reduce_sum(tf.square(target), axis=axis)) + # nmse = tf.reduce_mean(nmse_a / nmse_b, name=name) + raise NotImplementedError("Not Implemented.") + + +def absolute_difference_error(output, target, is_mean=False, axis=-1, name="absolute_difference_error_loss"): + """Return the TensorFlow expression of absolute difference error (L1) of two batch of data. + + Parameters + ---------- + output : Tensor + 2D, 3D or 4D tensor i.e. [batch_size, n_feature], [batch_size, height, width] or [batch_size, height, width, channel]. + target : Tensor + The target distribution, format the same with `output`. + is_mean : boolean + Whether compute the mean or sum for each example. + - If True, use ``tf.reduce_mean`` to compute the loss between one target and predict data. + - If False, use ``tf.reduce_sum`` (default). + axis : int or list of int + The dimensions to reduce. + name : str + An optional name to attach to this function. + + """ + + # if is_mean: + # loss = tf.reduce_mean(tf.reduce_mean(tf.abs(output - target), axis), name=name) + # else: + # loss = tf.reduce_mean(tf.reduce_sum(tf.abs(output - target), axis), name=name) + raise NotImplementedError("Not Implemented.") + + +def dice_coe(output, target, loss_type='jaccard', axis=(1, 2, 3), smooth=1e-5): + """Soft dice (Sørensen or Jaccard) coefficient for comparing the similarity + of two batch of data, usually be used for binary image segmentation + i.e. labels are binary. The coefficient between 0 to 1, 1 means totally match. + + Parameters + ----------- + output : Tensor + A distribution with shape: [batch_size, ....], (any dimensions). + target : Tensor + The target distribution, format the same with `output`. + loss_type : str + ``jaccard`` or ``sorensen``, default is ``jaccard``. + axis : tuple of int + All dimensions are reduced, default ``[1,2,3]``. + smooth : float + This small value will be added to the numerator and denominator. + - If both output and target are empty, it makes sure dice is 1. + - If either output or target are empty (all pixels are background), dice = ```smooth/(small_value + smooth)``, then if smooth is very small, dice close to 0 (even the image values lower than the threshold), so in this case, higher smooth can have a higher dice. + + Examples + --------- + >>> import tensorlayer as tl + >>> outputs = tl.act.pixel_wise_softmax(outputs) + >>> dice_loss = 1 - tl.cost.dice_coe(outputs, y_) + + References + ----------- + - `Wiki-Dice `__ + + """ + # inse = tf.reduce_sum(output * target, axis=axis) + # if loss_type == 'jaccard': + # l = tf.reduce_sum(output * output, axis=axis) + # r = tf.reduce_sum(target * target, axis=axis) + # elif loss_type == 'sorensen': + # l = tf.reduce_sum(output, axis=axis) + # r = tf.reduce_sum(target, axis=axis) + # else: + # raise Exception("Unknow loss_type") + # dice = (2. * inse + smooth) / (l + r + smooth) + # ## + # dice = tf.reduce_mean(dice, name='dice_coe') + raise NotImplementedError("Not Implemented.") + + +def dice_hard_coe(output, target, threshold=0.5, axis=(1, 2, 3), smooth=1e-5): + """Non-differentiable Sørensen–Dice coefficient for comparing the similarity + of two batch of data, usually be used for binary image segmentation i.e. labels are binary. + The coefficient between 0 to 1, 1 if totally match. + + Parameters + ----------- + output : tensor + A distribution with shape: [batch_size, ....], (any dimensions). + target : tensor + The target distribution, format the same with `output`. + threshold : float + The threshold value to be true. + axis : tuple of integer + All dimensions are reduced, default ``(1,2,3)``. + smooth : float + This small value will be added to the numerator and denominator, see ``dice_coe``. + + References + ----------- + - `Wiki-Dice `__ + + """ + # output = tf.cast(output > threshold, dtype=tf.float32) + # target = tf.cast(target > threshold, dtype=tf.float32) + # inse = tf.reduce_sum(tf.multiply(output, target), axis=axis) + # l = tf.reduce_sum(output, axis=axis) + # r = tf.reduce_sum(target, axis=axis) + # hard_dice = (2. * inse + smooth) / (l + r + smooth) + # ## + # hard_dice = tf.reduce_mean(hard_dice, name='hard_dice') + raise NotImplementedError("Not Implemented.") + + +def iou_coe(output, target, threshold=0.5, axis=(1, 2, 3), smooth=1e-5): + """Non-differentiable Intersection over Union (IoU) for comparing the + similarity of two batch of data, usually be used for evaluating binary image segmentation. + The coefficient between 0 to 1, and 1 means totally match. + + Parameters + ----------- + output : tensor + A batch of distribution with shape: [batch_size, ....], (any dimensions). + target : tensor + The target distribution, format the same with `output`. + threshold : float + The threshold value to be true. + axis : tuple of integer + All dimensions are reduced, default ``(1,2,3)``. + smooth : float + This small value will be added to the numerator and denominator, see ``dice_coe``. + + Notes + ------ + - IoU cannot be used as training loss, people usually use dice coefficient for training, IoU and hard-dice for evaluating. + + """ + # pre = tf.cast(output > threshold, dtype=tf.float32) + # truth = tf.cast(target > threshold, dtype=tf.float32) + # inse = tf.reduce_sum(tf.multiply(pre, truth), axis=axis) # AND + # union = tf.reduce_sum(tf.cast(tf.add(pre, truth) >= 1, dtype=tf.float32), axis=axis) # OR + # batch_iou = (inse + smooth) / (union + smooth) + # iou = tf.reduce_mean(batch_iou, name='iou_coe') + raise NotImplementedError("Not Implemented.") + + +def sequence_loss_by_example( + logits, targets, weights, average_across_timesteps=True, softmax_loss_function=None, name=None +): + """Weighted cross-entropy loss for a sequence of logits (per example). see original tensorflow code : + + + Parameters + ---------- + logits: List + List of 2D Tensors of shape [batch_size x num_decoder_symbols]. + targets: List + List of 1D batch-sized int32 Tensors of the same length as logits. + weights: List + List of 1D batch-sized float-Tensors of the same length as logits. + average_across_timesteps: Boolean + If set, divide the returned cost by the total label weight. + softmax_loss_function: None or Function + Function (labels, logits) -> loss-batch to be used instead of the standard softmax (the default if this is None). + **Note that to avoid confusion, it is required for the function to accept named arguments.** + name: None or str + Optional name for this operation, default: "sequence_loss_by_example". + + Returns + ------- + 1D batch-sized float Tensor: The log-perplexity for each sequence. + + Raises + ------ + ValueError: If len(logits) is different from len(targets) or len(weights). + + """ + # if len(targets) != len(logits) or len(weights) != len(logits): + # raise ValueError( + # "Lengths of logits, weights, and targets must be the same " + # "%d, %d, %d." % (len(logits), len(weights), len(targets)) + # ) + # with ops.name_scope(name, "sequence_loss_by_example", logits + targets + weights): + # log_perp_list = [] + # for logit, target, weight in zip(logits, targets, weights): + # if softmax_loss_function is None: + # # TODO(irving,ebrevdo): This reshape is needed because + # # sequence_loss_by_example is called with scalars sometimes, which + # # violates our general scalar strictness policy. + # target = array_ops.reshape(target, [-1]) + # crossent = nn_ops.sparse_softmax_cross_entropy_with_logits(labels=target, logits=logit) + # else: + # crossent = softmax_loss_function(labels=target, logits=logit) + # log_perp_list.append(crossent * weight) + # log_perps = math_ops.add_n(log_perp_list) + # if average_across_timesteps: + # total_size = math_ops.add_n(weights) + # total_size += 1e-12 # Just to avoid division by 0 for all-0 weights. + # log_perps /= total_size + raise NotImplementedError("Not Implemented.") + + +def cross_entropy_seq(logits, target_seqs, batch_size=None): + """Returns the expression of cross-entropy of two sequences, implement + softmax internally. Normally be used for fixed length RNN outputs, see `PTB example `__. + + Parameters + ---------- + logits : Tensor + 2D tensor with shape of `[batch_size * n_steps, n_classes]`. + target_seqs : Tensor + The target sequence, 2D tensor `[batch_size, n_steps]`, if the number of step is dynamic, please use ``tl.cost.cross_entropy_seq_with_mask`` instead. + batch_size : None or int. + Whether to divide the cost by batch size. + - If integer, the return cost will be divided by `batch_size`. + - If None (default), the return cost will not be divided by anything. + + Examples + -------- + >>> import tensorlayer as tl + >>> # see `PTB example `__.for more details + >>> # outputs shape : (batch_size * n_steps, n_classes) + >>> # targets shape : (batch_size, n_steps) + >>> cost = tl.cost.cross_entropy_seq(outputs, targets) + + """ + # sequence_loss_by_example_fn = sequence_loss_by_example + # + # loss = sequence_loss_by_example_fn( + # [logits], [tf.reshape(target_seqs, [-1])], [tf.ones_like(tf.reshape(target_seqs, [-1]), dtype=tf.float32)] + # ) + # # [tf.ones([batch_size * num_steps])]) + # cost = tf.reduce_sum(loss) # / batch_size + # if batch_size is not None: + # cost = cost / batch_size + raise NotImplementedError("Not Implemented.") + + +def cross_entropy_seq_with_mask(logits, target_seqs, input_mask, return_details=False, name=None): + """Returns the expression of cross-entropy of two sequences, implement + softmax internally. Normally be used for Dynamic RNN with Synced sequence input and output. + + Parameters + ----------- + logits : Tensor + 2D tensor with shape of [batch_size * ?, n_classes], `?` means dynamic IDs for each example. + - Can be get from `DynamicRNNLayer` by setting ``return_seq_2d`` to `True`. + target_seqs : Tensor + int of tensor, like word ID. [batch_size, ?], `?` means dynamic IDs for each example. + input_mask : Tensor + The mask to compute loss, it has the same size with `target_seqs`, normally 0 or 1. + return_details : boolean + Whether to return detailed losses. + - If False (default), only returns the loss. + - If True, returns the loss, losses, weights and targets (see source code). + + Examples + -------- + >>> import tensorlayer as tl + >>> import tensorflow as tf + >>> import numpy as np + >>> batch_size = 64 + >>> vocab_size = 10000 + >>> embedding_size = 256 + >>> ni = tl.layers.Input([batch_size, None], dtype=tf.int64) + >>> net = tl.layers.Embedding( + ... vocabulary_size = vocab_size, + ... embedding_size = embedding_size, + ... name = 'seq_embedding')(ni) + >>> net = tl.layers.RNN( + ... cell =tf.keras.layers.LSTMCell(units=embedding_size, dropout=0.1), + ... return_seq_2d = True, + ... name = 'dynamicrnn')(net) + >>> net = tl.layers.Dense(n_units=vocab_size, name="output")(net) + >>> model = tl.models.Model(inputs=ni, outputs=net) + >>> input_seqs = np.random.randint(0, 10, size=(batch_size, 10), dtype=np.int64) + >>> target_seqs = np.random.randint(0, 10, size=(batch_size, 10), dtype=np.int64) + >>> input_mask = np.random.randint(0, 2, size=(batch_size, 10), dtype=np.int64) + >>> outputs = model(input_seqs, is_train=True) + >>> loss = tl.cost.cross_entropy_seq_with_mask(outputs, target_seqs, input_mask) + + """ + # targets = tf.reshape(target_seqs, [-1]) # to one vector + # weights = tf.cast(tf.reshape(input_mask, [-1]), dtype=tf.float32) # to one vector like targets + # losses = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=targets, name=name) * weights + # # losses = tf.reduce_mean(tf.ops.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=targets, name=name)) # for TF1.0 and others + # + # loss = tf.divide( + # tf.reduce_sum(losses), # loss from mask. reduce_sum before element-wise mul with mask !! + # tf.reduce_sum(weights), + # name="seq_loss_with_mask" + # ) + # + # if return_details: + # return loss, losses, weights, targets + # else: + # return loss + raise NotImplementedError("Not Implemented.") + + +def cosine_similarity(v1, v2): + """Cosine similarity [-1, 1]. + + Parameters + ---------- + v1, v2 : Tensor + Tensor with the same shape [batch_size, n_feature]. + + References + ---------- + - `Wiki `__. + + """ + + # return tf.reduce_sum(tf.multiply(v1, v2), 1) / \ + # (tf.sqrt(tf.reduce_sum(tf.multiply(v1, v1), 1)) * + # tf.sqrt(tf.reduce_sum(tf.multiply(v2, v2), 1))) + raise NotImplementedError("Not Implemented.") + + +# Regularization Functions +def li_regularizer(scale, scope=None): + """Li regularization removes the neurons of previous layer. The `i` represents `inputs`. + Returns a function that can be used to apply group li regularization to weights. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + scope: str + An optional scope name for this function. + + Returns + -------- + A function with signature `li(weights, name=None)` that apply Li regularization. + + Raises + ------ + ValueError : if scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + # if isinstance(scale, numbers.Integral): + # raise ValueError('scale cannot be an integer: %s' % scale) + # if isinstance(scale, numbers.Real): + # if scale < 0.: + # raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + # if scale >= 1.: + # raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % scale) + # if scale == 0.: + # logging.info('Scale of 0 disables regularizer.') + # return lambda _, name=None: None + # + # def li(weights): + # """Applies li regularization to weights.""" + # with tf.name_scope('li_regularizer') as scope: + # my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + # # if tf.__version__ <= '0.12': + # # standard_ops_fn = standard_ops.mul + # # else: + # standard_ops_fn = standard_ops.multiply + # return standard_ops_fn( + # my_scale, standard_ops.reduce_sum(standard_ops.sqrt(standard_ops.reduce_sum(tf.square(weights), 1))), + # name=scope + # ) + + raise NotImplementedError("Not Implemented.") + + +def lo_regularizer(scale): + """Lo regularization removes the neurons of current layer. The `o` represents `outputs` + Returns a function that can be used to apply group lo regularization to weights. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + ------- + A function with signature `lo(weights, name=None)` that apply Lo regularization. + + Raises + ------ + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + # if isinstance(scale, numbers.Integral): + # raise ValueError('scale cannot be an integer: %s' % scale) + # + # if isinstance(scale, numbers.Real): + # if scale < 0.: + # raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + # if scale >= 1.: + # raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % scale) + # if scale == 0.: + # logging.info('Scale of 0 disables regularizer.') + # return lambda _, name=None: None + # + # def lo(weights, name='lo_regularizer'): + # """Applies group column regularization to weights.""" + # with tf.name_scope(name) as scope: + # my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + # # if tf.__version__ <= '0.12': + # # standard_ops_fn = standard_ops.mul + # # else: + # standard_ops_fn = standard_ops.multiply + # return standard_ops_fn( + # my_scale, standard_ops.reduce_sum(standard_ops.sqrt(standard_ops.reduce_sum(tf.square(weights), 0))), + # name=scope + # ) + + raise NotImplementedError("Not Implemented.") + + +def maxnorm_regularizer(scale=1.0): + """Max-norm regularization returns a function that can be used to apply max-norm regularization to weights. + + More about max-norm, see `wiki-max norm `_. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + --------- + A function with signature `mn(weights, name=None)` that apply Lo regularization. + + Raises + -------- + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + # if isinstance(scale, numbers.Integral): + # raise ValueError('scale cannot be an integer: %s' % scale) + # + # if isinstance(scale, numbers.Real): + # if scale < 0.: + # raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + # # if scale >= 1.: + # # raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % + # # scale) + # if scale == 0.: + # logging.info('Scale of 0 disables regularizer.') + # return lambda _, name=None: None + # + # def mn(weights, name='max_regularizer'): + # """Applies max-norm regularization to weights.""" + # with tf.name_scope(name) as scope: + # my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + # # if tf.__version__ <= '0.12': + # # standard_ops_fn = standard_ops.mul + # # else: + # standard_ops_fn = standard_ops.multiply + # return standard_ops_fn(my_scale, standard_ops.reduce_max(standard_ops.abs(weights)), name=scope) + # + # return mn + raise NotImplementedError("Not Implemented.") + + +def maxnorm_o_regularizer(scale): + """Max-norm output regularization removes the neurons of current layer. + Returns a function that can be used to apply max-norm regularization to each column of weight matrix. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + --------- + A function with signature `mn_o(weights, name=None)` that apply Lo regularization. + + Raises + --------- + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + # if isinstance(scale, numbers.Integral): + # raise ValueError('scale cannot be an integer: %s' % scale) + # + # if isinstance(scale, numbers.Real): + # if scale < 0.: + # raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + # # if scale >= 1.: + # # raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % + # # scale) + # if scale == 0.: + # logging.info('Scale of 0 disables regularizer.') + # return lambda _, name=None: None + # + # def mn_o(weights, name='maxnorm_o_regularizer'): + # """Applies max-norm regularization to weights.""" + # with tf.name_scope(name) as scope: + # my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + # if tf.__version__ <= '0.12': + # standard_ops_fn = standard_ops.mul + # else: + # standard_ops_fn = standard_ops.multiply + # return standard_ops_fn( + # my_scale, standard_ops.reduce_sum(standard_ops.reduce_max(standard_ops.abs(weights), 0)), name=scope + # ) + # + # return mn_o + raise NotImplementedError("Not Implemented.") + + +def maxnorm_i_regularizer(scale): + """Max-norm input regularization removes the neurons of previous layer. + Returns a function that can be used to apply max-norm regularization to each row of weight matrix. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + --------- + A function with signature `mn_i(weights, name=None)` that apply Lo regularization. + + Raises + --------- + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + # if isinstance(scale, numbers.Integral): + # raise ValueError('scale cannot be an integer: %s' % scale) + # + # if isinstance(scale, numbers.Real): + # if scale < 0.: + # raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + # # if scale >= 1.: + # # raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % + # # scale) + # if scale == 0.: + # logging.info('Scale of 0 disables regularizer.') + # return lambda _, name=None: None + # + # def mn_i(weights, name='maxnorm_i_regularizer'): + # """Applies max-norm regularization to weights.""" + # with tf.name_scope(name) as scope: + # my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + # if tf.__version__ <= '0.12': + # standard_ops_fn = standard_ops.mul + # else: + # standard_ops_fn = standard_ops.multiply + # return standard_ops_fn( + # my_scale, standard_ops.reduce_sum(standard_ops.reduce_max(standard_ops.abs(weights), 1)), name=scope + # ) + # + # return mn_i + raise NotImplementedError("Not Implemented.") + + +def huber_loss( + output, target, is_mean=True, delta=1.0, dynamichuber=False, reverse=False, axis=-1, epsilon=0.00001, name=None +): + """Huber Loss operation, see ``https://en.wikipedia.org/wiki/Huber_loss`` . + Reverse Huber Loss operation, see ''https://statweb.stanford.edu/~owen/reports/hhu.pdf''. + Dynamic Reverse Huber Loss operation, see ''https://arxiv.org/pdf/1606.00373.pdf''. + + Parameters + ---------- + output : Tensor + A distribution with shape: [batch_size, ....], (any dimensions). + target : Tensor + The target distribution, format the same with `output`. + is_mean : boolean + Whether compute the mean or sum for each example. + - If True, use ``tf.reduce_mean`` to compute the loss between one target and predict data (default). + - If False, use ``tf.reduce_sum``. + delta: float + The point where the huber loss function changes from a quadratic to linear. + dynamichuber: boolean + Whether compute the coefficient c for each batch. + - If True, c is 20% of the maximal per-batch error. + - If False, c is delta. + reverse: boolean + Whether compute the reverse huber loss. + axis : int or list of int + The dimensions to reduce. + epsilon: + Eplison. + name : string + Name of this loss. + + """ + # if reverse: + # if dynamichuber: + # huber_c = 0.2 * tf.reduce_max(tf.abs(output - target)) + # else: + # huber_c = delta + # if is_mean: + # loss = tf.reduce_mean( + # tf.where( + # tf.less_equal(tf.abs(output - target), huber_c), tf.abs(output - target), + # tf.multiply( + # tf.pow(output - target, 2.0) + tf.pow(huber_c, 2.0), + # tf.math.divide_no_nan(.5, huber_c + epsilon) + # ) + # ), name=name + # ) + # else: + # loss = tf.reduce_mean( + # tf.reduce_sum( + # tf.where( + # tf.less_equal(tf.abs(output - target), huber_c), tf.abs(output - target), + # tf.multiply( + # tf.pow(output - target, 2.0) + tf.pow(huber_c, 2.0), + # tf.math.divide_no_nan(.5, huber_c + epsilon) + # ) + # ), axis + # ), name=name + # ) + # elif is_mean: + # loss = tf.reduce_mean( + # tf.where( + # tf.less_equal(tf.abs(output - target), delta), 0.5 * tf.pow(output - target, 2), + # delta * (tf.abs(output - target) - 0.5 * delta) + # ), name=name + # ) + # else: + # loss = tf.reduce_mean( + # tf.reduce_sum( + # tf.where( + # tf.less_equal(tf.abs(output - target), delta), 0.5 * tf.pow(output - target, 2), + # delta * (tf.abs(output - target) - 0.5 * delta) + # ), axis + # ), name=name + # ) + # return loss + raise NotImplementedError("Not Implemented.") diff --git a/tensorlayer/cost/paddle_cost.py b/tensorlayer/cost/paddle_cost.py new file mode 100644 index 0000000..d8a79f0 --- /dev/null +++ b/tensorlayer/cost/paddle_cost.py @@ -0,0 +1,548 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import paddle.nn.functional as F +import paddle as pd + +__all__ = [ + 'cross_entropy', + 'sigmoid_cross_entropy', + 'binary_cross_entropy', + 'mean_squared_error', + 'normalized_mean_square_error', + 'absolute_difference_error', + 'dice_coe', + 'dice_hard_coe', + 'iou_coe', + 'cross_entropy_seq', + 'cross_entropy_seq_with_mask', + 'cosine_similarity', + 'li_regularizer', + 'lo_regularizer', + 'maxnorm_regularizer', + 'maxnorm_o_regularizer', + 'maxnorm_i_regularizer', +] + +def cross_entropy(output, target): + """Softmax cross-entropy operation, returns the TensorFlow expression of cross-entropy for two distributions, + it implements softmax internally. See ``tf.ops.sparse_softmax_cross_entropy_with_logits``. + + Parameters + ---------- + output : Tensor + A batch of distribution with shape: [batch_size, num of classes]. + target : Tensor + A batch of index with shape: [batch_size, ]. + name : string + Name of this loss. + + Examples + -------- + >>> import tensorlayer as tl + >>> ce = tl.cost.cross_entropy(y_logits, y_target_logits) + + References + ----------- + - About cross-entropy: ``__. + - The code is borrowed from: ``__. + + """ + + return F.cross_entropy(input=output, label=target) + + +def sigmoid_cross_entropy(output, target): + """Sigmoid cross-entropy operation, see ``tf.ops.sigmoid_cross_entropy_with_logits``. + + Parameters + ---------- + output : Tensor + A batch of distribution with shape: [batch_size, num of classes]. + target : Tensor + A batch of index with shape: [batch_size, ]. + name : string + Name of this loss. + + """ + # tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=target, logits=output), name=name) + depth = output.shape[-1] + label = pd.fluid.layers.one_hot(target, depth=depth) + out = pd.fluid.layers.sigmoid_cross_entropy_with_logits(x=output, label=label) + out = pd.fluid.layers.reduce_mean(out) + return out + + +def binary_cross_entropy(output, target, epsilon=1e-8): + """Binary cross entropy operation. + + Parameters + ---------- + output : Tensor + Tensor with type of `float32` or `float64`. + target : Tensor + The target distribution, format the same with `output`. + epsilon : float + A small value to avoid output to be zero. + name : str + An optional name to attach to this function. + + References + ----------- + - `ericjang-DRAW `__ + + """ + depth = output.shape[-1] + target = pd.fluid.layers.one_hot(target, depth=depth) + out = pd.fluid.layers.reduce_sum( + -(target * pd.log(output + epsilon) + (1. - target) * pd.log(1. - output + epsilon)) + ) + return out + + +def mean_squared_error(output, target, is_mean=False, axis=-1, name="mean_squared_error"): + """Return the TensorFlow expression of mean-square-error (L2) of two batch of data. + + Parameters + ---------- + output : Tensor + 2D, 3D or 4D tensor i.e. [batch_size, n_feature], [batch_size, height, width] or [batch_size, height, width, channel]. + target : Tensor + The target distribution, format the same with `output`. + is_mean : boolean + Whether compute the mean or sum for each example. + - If True, use ``tf.reduce_mean`` to compute the loss between one target and predict data. + - If False, use ``tf.reduce_sum`` (default). + axis : int or list of int + The dimensions to reduce. + name : str + An optional name to attach to this function. + + References + ------------ + - `Wiki Mean Squared Error `__ + + """ + depth = output.shape[-1] + target = pd.fluid.layers.one_hot(target, depth=depth) + + if is_mean: + mse = F.mse_loss(input=output, label=target, reduction='mean') + else: + mse = F.mse_loss(input=output, label=target, reduction='sum') + return mse + + +def normalized_mean_square_error(output, target, axis=-1, name="normalized_mean_squared_error_loss"): + """Return the TensorFlow expression of normalized mean-square-error of two distributions. + + Parameters + ---------- + output : Tensor + 2D, 3D or 4D tensor i.e. [batch_size, n_feature], [batch_size, height, width] or [batch_size, height, width, channel]. + target : Tensor + The target distribution, format the same with `output`. + axis : int or list of int + The dimensions to reduce. + name : str + An optional name to attach to this function. + + """ + + raise NotImplementedError("Not Implemented.") + + +def absolute_difference_error(output, target, is_mean=False, axis=-1, name="absolute_difference_error_loss"): + """Return the TensorFlow expression of absolute difference error (L1) of two batch of data. + + Parameters + ---------- + output : Tensor + 2D, 3D or 4D tensor i.e. [batch_size, n_feature], [batch_size, height, width] or [batch_size, height, width, channel]. + target : Tensor + The target distribution, format the same with `output`. + is_mean : boolean + Whether compute the mean or sum for each example. + - If True, use ``tf.reduce_mean`` to compute the loss between one target and predict data. + - If False, use ``tf.reduce_sum`` (default). + axis : int or list of int + The dimensions to reduce. + name : str + An optional name to attach to this function. + + """ + + raise NotImplementedError("Not Implemented.") + + +def dice_coe(output, target, loss_type='jaccard', axis=(1, 2, 3), smooth=1e-5): + """Soft dice (Sørensen or Jaccard) coefficient for comparing the similarity + of two batch of data, usually be used for binary image segmentation + i.e. labels are binary. The coefficient between 0 to 1, 1 means totally match. + + Parameters + ----------- + output : Tensor + A distribution with shape: [batch_size, ....], (any dimensions). + target : Tensor + The target distribution, format the same with `output`. + loss_type : str + ``jaccard`` or ``sorensen``, default is ``jaccard``. + axis : tuple of int + All dimensions are reduced, default ``[1,2,3]``. + smooth : float + This small value will be added to the numerator and denominator. + - If both output and target are empty, it makes sure dice is 1. + - If either output or target are empty (all pixels are background), dice = ```smooth/(small_value + smooth)``, then if smooth is very small, dice close to 0 (even the image values lower than the threshold), so in this case, higher smooth can have a higher dice. + + Examples + --------- + >>> import tensorlayer as tl + >>> outputs = tl.act.pixel_wise_softmax(outputs) + >>> dice_loss = 1 - tl.cost.dice_coe(outputs, y_) + + References + ----------- + - `Wiki-Dice `__ + + """ + + raise NotImplementedError("Not Implemented.") + + +def dice_hard_coe(output, target, threshold=0.5, axis=(1, 2, 3), smooth=1e-5): + """Non-differentiable Sørensen–Dice coefficient for comparing the similarity + of two batch of data, usually be used for binary image segmentation i.e. labels are binary. + The coefficient between 0 to 1, 1 if totally match. + + Parameters + ----------- + output : tensor + A distribution with shape: [batch_size, ....], (any dimensions). + target : tensor + The target distribution, format the same with `output`. + threshold : float + The threshold value to be true. + axis : tuple of integer + All dimensions are reduced, default ``(1,2,3)``. + smooth : float + This small value will be added to the numerator and denominator, see ``dice_coe``. + + References + ----------- + - `Wiki-Dice `__ + + """ + + raise NotImplementedError("Not Implemented.") + + +def iou_coe(output, target, threshold=0.5, axis=(1, 2, 3), smooth=1e-5): + """Non-differentiable Intersection over Union (IoU) for comparing the + similarity of two batch of data, usually be used for evaluating binary image segmentation. + The coefficient between 0 to 1, and 1 means totally match. + + Parameters + ----------- + output : tensor + A batch of distribution with shape: [batch_size, ....], (any dimensions). + target : tensor + The target distribution, format the same with `output`. + threshold : float + The threshold value to be true. + axis : tuple of integer + All dimensions are reduced, default ``(1,2,3)``. + smooth : float + This small value will be added to the numerator and denominator, see ``dice_coe``. + + Notes + ------ + - IoU cannot be used as training loss, people usually use dice coefficient for training, IoU and hard-dice for evaluating. + + """ + + raise NotImplementedError("Not Implemented.") + + +def sequence_loss_by_example( + logits, targets, weights, average_across_timesteps=True, softmax_loss_function=None, name=None +): + """Weighted cross-entropy loss for a sequence of logits (per example). see original tensorflow code : + + + Parameters + ---------- + logits: List + List of 2D Tensors of shape [batch_size x num_decoder_symbols]. + targets: List + List of 1D batch-sized int32 Tensors of the same length as logits. + weights: List + List of 1D batch-sized float-Tensors of the same length as logits. + average_across_timesteps: Boolean + If set, divide the returned cost by the total label weight. + softmax_loss_function: None or Function + Function (labels, logits) -> loss-batch to be used instead of the standard softmax (the default if this is None). + **Note that to avoid confusion, it is required for the function to accept named arguments.** + name: None or str + Optional name for this operation, default: "sequence_loss_by_example". + + Returns + ------- + 1D batch-sized float Tensor: The log-perplexity for each sequence. + + Raises + ------ + ValueError: If len(logits) is different from len(targets) or len(weights). + + """ + + raise NotImplementedError("Not Implemented.") + + +def cross_entropy_seq(logits, target_seqs, batch_size=None): + """Returns the expression of cross-entropy of two sequences, implement + softmax internally. Normally be used for fixed length RNN outputs, see `PTB example `__. + + Parameters + ---------- + logits : Tensor + 2D tensor with shape of `[batch_size * n_steps, n_classes]`. + target_seqs : Tensor + The target sequence, 2D tensor `[batch_size, n_steps]`, if the number of step is dynamic, please use ``tl.cost.cross_entropy_seq_with_mask`` instead. + batch_size : None or int. + Whether to divide the cost by batch size. + - If integer, the return cost will be divided by `batch_size`. + - If None (default), the return cost will not be divided by anything. + + Examples + -------- + >>> import tensorlayer as tl + >>> # see `PTB example `__.for more details + >>> # outputs shape : (batch_size * n_steps, n_classes) + >>> # targets shape : (batch_size, n_steps) + >>> cost = tl.cost.cross_entropy_seq(outputs, targets) + + """ + + raise NotImplementedError("Not Implemented.") + + +def cross_entropy_seq_with_mask(logits, target_seqs, input_mask, return_details=False, name=None): + """Returns the expression of cross-entropy of two sequences, implement + softmax internally. Normally be used for Dynamic RNN with Synced sequence input and output. + + Parameters + ----------- + logits : Tensor + 2D tensor with shape of [batch_size * ?, n_classes], `?` means dynamic IDs for each example. + - Can be get from `DynamicRNNLayer` by setting ``return_seq_2d`` to `True`. + target_seqs : Tensor + int of tensor, like word ID. [batch_size, ?], `?` means dynamic IDs for each example. + input_mask : Tensor + The mask to compute loss, it has the same size with `target_seqs`, normally 0 or 1. + return_details : boolean + Whether to return detailed losses. + - If False (default), only returns the loss. + - If True, returns the loss, losses, weights and targets (see source code). + + Examples + -------- + >>> import tensorlayer as tl + >>> import tensorflow as tf + >>> import numpy as np + >>> batch_size = 64 + >>> vocab_size = 10000 + >>> embedding_size = 256 + >>> ni = tl.layers.Input([batch_size, None], dtype=tf.int64) + >>> net = tl.layers.Embedding( + ... vocabulary_size = vocab_size, + ... embedding_size = embedding_size, + ... name = 'seq_embedding')(ni) + >>> net = tl.layers.RNN( + ... cell =tf.keras.layers.LSTMCell(units=embedding_size, dropout=0.1), + ... return_seq_2d = True, + ... name = 'dynamicrnn')(net) + >>> net = tl.layers.Dense(n_units=vocab_size, name="output")(net) + >>> model = tl.models.Model(inputs=ni, outputs=net) + >>> input_seqs = np.random.randint(0, 10, size=(batch_size, 10), dtype=np.int64) + >>> target_seqs = np.random.randint(0, 10, size=(batch_size, 10), dtype=np.int64) + >>> input_mask = np.random.randint(0, 2, size=(batch_size, 10), dtype=np.int64) + >>> outputs = model(input_seqs, is_train=True) + >>> loss = tl.cost.cross_entropy_seq_with_mask(outputs, target_seqs, input_mask) + + """ + + raise NotImplementedError("Not Implemented.") + + +def cosine_similarity(v1, v2): + """Cosine similarity [-1, 1]. + + Parameters + ---------- + v1, v2 : Tensor + Tensor with the same shape [batch_size, n_feature]. + + References + ---------- + - `Wiki `__. + + """ + + raise NotImplementedError("Not Implemented.") + + +# Regularization Functions +def li_regularizer(scale, scope=None): + """Li regularization removes the neurons of previous layer. The `i` represents `inputs`. + Returns a function that can be used to apply group li regularization to weights. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + scope: str + An optional scope name for this function. + + Returns + -------- + A function with signature `li(weights, name=None)` that apply Li regularization. + + Raises + ------ + ValueError : if scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + + raise NotImplementedError("Not Implemented.") + + +def lo_regularizer(scale): + """Lo regularization removes the neurons of current layer. The `o` represents `outputs` + Returns a function that can be used to apply group lo regularization to weights. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + ------- + A function with signature `lo(weights, name=None)` that apply Lo regularization. + + Raises + ------ + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + + raise NotImplementedError("Not Implemented.") + + +def maxnorm_regularizer(scale=1.0): + """Max-norm regularization returns a function that can be used to apply max-norm regularization to weights. + + More about max-norm, see `wiki-max norm `_. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + --------- + A function with signature `mn(weights, name=None)` that apply Lo regularization. + + Raises + -------- + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + + raise NotImplementedError("Not Implemented.") + + +def maxnorm_o_regularizer(scale): + """Max-norm output regularization removes the neurons of current layer. + Returns a function that can be used to apply max-norm regularization to each column of weight matrix. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + --------- + A function with signature `mn_o(weights, name=None)` that apply Lo regularization. + + Raises + --------- + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + + raise NotImplementedError("Not Implemented.") + + +def maxnorm_i_regularizer(scale): + """Max-norm input regularization removes the neurons of previous layer. + Returns a function that can be used to apply max-norm regularization to each row of weight matrix. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + --------- + A function with signature `mn_i(weights, name=None)` that apply Lo regularization. + + Raises + --------- + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + + raise NotImplementedError("Not Implemented.") + + +def huber_loss( + output, target, is_mean=True, delta=1.0, dynamichuber=False, reverse=False, axis=-1, epsilon=0.00001, name=None +): + """Huber Loss operation, see ``https://en.wikipedia.org/wiki/Huber_loss`` . + Reverse Huber Loss operation, see ''https://statweb.stanford.edu/~owen/reports/hhu.pdf''. + Dynamic Reverse Huber Loss operation, see ''https://arxiv.org/pdf/1606.00373.pdf''. + + Parameters + ---------- + output : Tensor + A distribution with shape: [batch_size, ....], (any dimensions). + target : Tensor + The target distribution, format the same with `output`. + is_mean : boolean + Whether compute the mean or sum for each example. + - If True, use ``tf.reduce_mean`` to compute the loss between one target and predict data (default). + - If False, use ``tf.reduce_sum``. + delta: float + The point where the huber loss function changes from a quadratic to linear. + dynamichuber: boolean + Whether compute the coefficient c for each batch. + - If True, c is 20% of the maximal per-batch error. + - If False, c is delta. + reverse: boolean + Whether compute the reverse huber loss. + axis : int or list of int + The dimensions to reduce. + epsilon: + Eplison. + name : string + Name of this loss. + + """ + + raise NotImplementedError("Not Implemented.") diff --git a/tensorlayer/cost/tensorflow_cost.py b/tensorlayer/cost/tensorflow_cost.py new file mode 100644 index 0000000..b07acad --- /dev/null +++ b/tensorlayer/cost/tensorflow_cost.py @@ -0,0 +1,860 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import numbers + +import tensorflow as tf +from tensorflow.python.framework import ops +from tensorflow.python.ops import array_ops, math_ops, nn_ops, standard_ops + +from tensorlayer import logging + +__all__ = [ + 'cross_entropy', + 'sigmoid_cross_entropy', + 'binary_cross_entropy', + 'mean_squared_error', + 'normalized_mean_square_error', + 'absolute_difference_error', + 'dice_coe', + 'dice_hard_coe', + 'iou_coe', + 'cross_entropy_seq', + 'cross_entropy_seq_with_mask', + 'cosine_similarity', + 'li_regularizer', + 'lo_regularizer', + 'maxnorm_regularizer', + 'maxnorm_o_regularizer', + 'maxnorm_i_regularizer', +] + + +def cross_entropy(output, target, name=None): + """Softmax cross-entropy operation, returns the TensorFlow expression of cross-entropy for two distributions, + it implements softmax internally. See ``tf.ops.sparse_softmax_cross_entropy_with_logits``. + + Parameters + ---------- + output : Tensor + A batch of distribution with shape: [batch_size, num of classes]. + target : Tensor + A batch of index with shape: [batch_size, ]. + name : string + Name of this loss. + + Examples + -------- + >>> import tensorlayer as tl + >>> ce = tl.cost.cross_entropy(y_logits, y_target_logits, 'my_loss') + + References + ----------- + - About cross-entropy: ``__. + - The code is borrowed from: ``__. + + """ + # if name is None: + # raise Exception("Please give a unique name to tl.cost.cross_entropy for TF1.0+") + return tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=target, logits=output), name=name) + + +def sigmoid_cross_entropy(output, target, name=None): + """Sigmoid cross-entropy operation, see ``tf.ops.sigmoid_cross_entropy_with_logits``. + + Parameters + ---------- + output : Tensor + A batch of distribution with shape: [batch_size, num of classes]. + target : Tensor + A batch of index with shape: [batch_size, ]. + name : string + Name of this loss. + + """ + return tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=target, logits=output), name=name) + + +def binary_cross_entropy(output, target, epsilon=1e-8, name='bce_loss'): + """Binary cross entropy operation. + + Parameters + ---------- + output : Tensor + Tensor with type of `float32` or `float64`. + target : Tensor + The target distribution, format the same with `output`. + epsilon : float + A small value to avoid output to be zero. + name : str + An optional name to attach to this function. + + References + ----------- + - `ericjang-DRAW `__ + + """ + # with ops.op_scope([output, target], name, "bce_loss") as name: + # output = ops.convert_to_tensor(output, name="preds") + # target = ops.convert_to_tensor(targets, name="target") + + # with tf.name_scope(name): + return tf.reduce_mean( + tf.reduce_sum( + -(target * tf.math.log(output + epsilon) + (1. - target) * tf.math.log(1. - output + epsilon)), axis=1 + ), name=name + ) + + # For brevity, let `x = output`, `z = target`. The binary cross entropy loss is + # + # loss(x, z) = - sum_i (x[i] * log(z[i]) + (1 - x[i]) * log(1 - z[i])) + + +def mean_squared_error(output, target, is_mean=False, axis=-1, name="mean_squared_error"): + """Return the TensorFlow expression of mean-square-error (L2) of two batch of data. + + Parameters + ---------- + output : Tensor + 2D, 3D or 4D tensor i.e. [batch_size, n_feature], [batch_size, height, width] or [batch_size, height, width, channel]. + target : Tensor + The target distribution, format the same with `output`. + is_mean : boolean + Whether compute the mean or sum for each example. + - If True, use ``tf.reduce_mean`` to compute the loss between one target and predict data. + - If False, use ``tf.reduce_sum`` (default). + axis : int or list of int + The dimensions to reduce. + name : str + An optional name to attach to this function. + + References + ------------ + - `Wiki Mean Squared Error `__ + + """ + # with tf.name_scope(name): + # if len(output.shape) == 2: # [batch_size, n_feature] + # axis = 1 + # elif len(output.shape) == 3: # [batch_size, w, h] + # axis = [1, 2] + # elif len(output.shape) == 4: # [batch_size, w, h, c] + # axis = [1, 2, 3] + # else: + # raise Exception("Unknow dimension") + + if is_mean: + mse = tf.reduce_mean(tf.reduce_mean(tf.math.squared_difference(output, target), axis), name=name) + else: + mse = tf.reduce_mean(tf.reduce_sum(tf.math.squared_difference(output, target), axis), name=name) + return mse + + +def normalized_mean_square_error(output, target, axis=-1, name="normalized_mean_squared_error_loss"): + """Return the TensorFlow expression of normalized mean-square-error of two distributions. + + Parameters + ---------- + output : Tensor + 2D, 3D or 4D tensor i.e. [batch_size, n_feature], [batch_size, height, width] or [batch_size, height, width, channel]. + target : Tensor + The target distribution, format the same with `output`. + axis : int or list of int + The dimensions to reduce. + name : str + An optional name to attach to this function. + + """ + with tf.name_scope("normalized_mean_squared_error_loss"): + # if len(output.shape) == 2: # [batch_size, n_feature] + # axis = 1 + # elif len(output.shape) == 3: # [batch_size, w, h] + # axis = [1, 2] + # elif len(output.shape) == 4: # [batch_size, w, h, c] + # axis = [1, 2, 3] + nmse_a = tf.sqrt(tf.reduce_sum(tf.math.squared_difference(output, target), axis=axis)) + nmse_b = tf.sqrt(tf.reduce_sum(tf.square(target), axis=axis)) + nmse = tf.reduce_mean(nmse_a / nmse_b, name=name) + return nmse + + +def absolute_difference_error(output, target, is_mean=False, axis=-1, name="absolute_difference_error_loss"): + """Return the TensorFlow expression of absolute difference error (L1) of two batch of data. + + Parameters + ---------- + output : Tensor + 2D, 3D or 4D tensor i.e. [batch_size, n_feature], [batch_size, height, width] or [batch_size, height, width, channel]. + target : Tensor + The target distribution, format the same with `output`. + is_mean : boolean + Whether compute the mean or sum for each example. + - If True, use ``tf.reduce_mean`` to compute the loss between one target and predict data. + - If False, use ``tf.reduce_sum`` (default). + axis : int or list of int + The dimensions to reduce. + name : str + An optional name to attach to this function. + + """ + # # with tf.name_scope("absolute_difference_error_loss"): + # if len(output.shape) == 2: # [batch_size, n_feature] + # axis = 1 + # elif len(output.shape) == 3: # [batch_size, w, h] + # axis = [1, 2] + # elif len(output.shape) == 4: # [batch_size, w, h, c] + # axis = [1, 2, 3] + # else: + # raise Exception("Unknow dimension") + if is_mean: + loss = tf.reduce_mean(tf.reduce_mean(tf.abs(output - target), axis), name=name) + else: + loss = tf.reduce_mean(tf.reduce_sum(tf.abs(output - target), axis), name=name) + return loss + + +def dice_coe(output, target, loss_type='jaccard', axis=(1, 2, 3), smooth=1e-5): + """Soft dice (Sørensen or Jaccard) coefficient for comparing the similarity + of two batch of data, usually be used for binary image segmentation + i.e. labels are binary. The coefficient between 0 to 1, 1 means totally match. + + Parameters + ----------- + output : Tensor + A distribution with shape: [batch_size, ....], (any dimensions). + target : Tensor + The target distribution, format the same with `output`. + loss_type : str + ``jaccard`` or ``sorensen``, default is ``jaccard``. + axis : tuple of int + All dimensions are reduced, default ``[1,2,3]``. + smooth : float + This small value will be added to the numerator and denominator. + - If both output and target are empty, it makes sure dice is 1. + - If either output or target are empty (all pixels are background), dice = ```smooth/(small_value + smooth)``, then if smooth is very small, dice close to 0 (even the image values lower than the threshold), so in this case, higher smooth can have a higher dice. + + Examples + --------- + >>> import tensorlayer as tl + >>> outputs = tl.act.pixel_wise_softmax(outputs) + >>> dice_loss = 1 - tl.cost.dice_coe(outputs, y_) + + References + ----------- + - `Wiki-Dice `__ + + """ + inse = tf.reduce_sum(output * target, axis=axis) + if loss_type == 'jaccard': + l = tf.reduce_sum(output * output, axis=axis) + r = tf.reduce_sum(target * target, axis=axis) + elif loss_type == 'sorensen': + l = tf.reduce_sum(output, axis=axis) + r = tf.reduce_sum(target, axis=axis) + else: + raise Exception("Unknow loss_type") + # old axis=[0,1,2,3] + # dice = 2 * (inse) / (l + r) + # epsilon = 1e-5 + # dice = tf.clip_by_value(dice, 0, 1.0-epsilon) # if all empty, dice = 1 + # new haodong + dice = (2. * inse + smooth) / (l + r + smooth) + ## + dice = tf.reduce_mean(dice, name='dice_coe') + return dice + + +def dice_hard_coe(output, target, threshold=0.5, axis=(1, 2, 3), smooth=1e-5): + """Non-differentiable Sørensen–Dice coefficient for comparing the similarity + of two batch of data, usually be used for binary image segmentation i.e. labels are binary. + The coefficient between 0 to 1, 1 if totally match. + + Parameters + ----------- + output : tensor + A distribution with shape: [batch_size, ....], (any dimensions). + target : tensor + The target distribution, format the same with `output`. + threshold : float + The threshold value to be true. + axis : tuple of integer + All dimensions are reduced, default ``(1,2,3)``. + smooth : float + This small value will be added to the numerator and denominator, see ``dice_coe``. + + References + ----------- + - `Wiki-Dice `__ + + """ + output = tf.cast(output > threshold, dtype=tf.float32) + target = tf.cast(target > threshold, dtype=tf.float32) + inse = tf.reduce_sum(tf.multiply(output, target), axis=axis) + l = tf.reduce_sum(output, axis=axis) + r = tf.reduce_sum(target, axis=axis) + # old axis=[0,1,2,3] + # hard_dice = 2 * (inse) / (l + r) + # epsilon = 1e-5 + # hard_dice = tf.clip_by_value(hard_dice, 0, 1.0-epsilon) + # new haodong + hard_dice = (2. * inse + smooth) / (l + r + smooth) + ## + hard_dice = tf.reduce_mean(hard_dice, name='hard_dice') + return hard_dice + + +def iou_coe(output, target, threshold=0.5, axis=(1, 2, 3), smooth=1e-5): + """Non-differentiable Intersection over Union (IoU) for comparing the + similarity of two batch of data, usually be used for evaluating binary image segmentation. + The coefficient between 0 to 1, and 1 means totally match. + + Parameters + ----------- + output : tensor + A batch of distribution with shape: [batch_size, ....], (any dimensions). + target : tensor + The target distribution, format the same with `output`. + threshold : float + The threshold value to be true. + axis : tuple of integer + All dimensions are reduced, default ``(1,2,3)``. + smooth : float + This small value will be added to the numerator and denominator, see ``dice_coe``. + + Notes + ------ + - IoU cannot be used as training loss, people usually use dice coefficient for training, IoU and hard-dice for evaluating. + + """ + pre = tf.cast(output > threshold, dtype=tf.float32) + truth = tf.cast(target > threshold, dtype=tf.float32) + inse = tf.reduce_sum(tf.multiply(pre, truth), axis=axis) # AND + union = tf.reduce_sum(tf.cast(tf.add(pre, truth) >= 1, dtype=tf.float32), axis=axis) # OR + # old axis=[0,1,2,3] + # epsilon = 1e-5 + # batch_iou = inse / (union + epsilon) + # new haodong + batch_iou = (inse + smooth) / (union + smooth) + iou = tf.reduce_mean(batch_iou, name='iou_coe') + return iou # , pre, truth, inse, union + + +# ## test soft/hard dice and iou +# import numpy as np +# y = np.zeros((1,10,10,1)) +# # y[0,0:5,0:5]=1.0 +# o = np.zeros((1,10,10,1)) +# # o[:,:,:,:] = 0 # what we want: dice=0 iou=0 OK +# # o[0,0:2,0:2]=0.3 # what we want: dice larger iou=0 OK +# # o[0,0:2,0:2]=0.6 # what we want: dice larger iou small OK +# # o[0,0:3,0:3]=0.6 # what we want: dice larger iou larger OK +# # o[0,0:3,0:3]=1 # what we want: dice larger iou same OK +# # o[0,0:5,0:5]=1 # what we want: dice=1 iou=1 OK +# # o[0,0:5,0:5]=0.3 # what we want: dice smaller iou=0 OK +# # o[0,0:5,0:5]=1e-2 # what we want: dice≈0 iou=0 OK +# # o[0,8:10,8:10]=1.0 # what we want: dice=0 iou=0 OK +# # o[0,8:10,8:10]=1e-10 # what we want: dice=0 iou=0 OK +# # y[:,:,:,:] = o[:,:,:,:] = 0 # what we want: dice=1 iou=1 OK +# ## why in u-net, dice=1 hard-dice=1 iou=1 exist?? print bug? +# +# d = dice_coe(o, y, 'jaccard', smooth=1.) +# hd = dice_hard_coe(o, y, smooth=1e-5) +# i = iou_coe(o, y, smooth=1e-5) +# sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True)) +# # sess.run(tf.local_variables_initializer()) +# print(sess.run([d,hd,i])) +# # p, t, i, u = sess.run([pre, truth, inse, union]) +# # import pprint +# # pprint.pprint(((y>0.5)*(o>0.5)).astype(int).tolist()) +# # pprint.pprint(p.tolist()) +# # pprint.pprint(t.tolist()) +# # pprint.pprint(i) +# # pprint.pprint(u) +# exit() + + +def sequence_loss_by_example( + logits, targets, weights, average_across_timesteps=True, softmax_loss_function=None, name=None +): + """Weighted cross-entropy loss for a sequence of logits (per example). see original tensorflow code : + + + Parameters + ---------- + logits: List + List of 2D Tensors of shape [batch_size x num_decoder_symbols]. + targets: List + List of 1D batch-sized int32 Tensors of the same length as logits. + weights: List + List of 1D batch-sized float-Tensors of the same length as logits. + average_across_timesteps: Boolean + If set, divide the returned cost by the total label weight. + softmax_loss_function: None or Function + Function (labels, logits) -> loss-batch to be used instead of the standard softmax (the default if this is None). + **Note that to avoid confusion, it is required for the function to accept named arguments.** + name: None or str + Optional name for this operation, default: "sequence_loss_by_example". + + Returns + ------- + 1D batch-sized float Tensor: The log-perplexity for each sequence. + + Raises + ------ + ValueError: If len(logits) is different from len(targets) or len(weights). + + """ + if len(targets) != len(logits) or len(weights) != len(logits): + raise ValueError( + "Lengths of logits, weights, and targets must be the same " + "%d, %d, %d." % (len(logits), len(weights), len(targets)) + ) + with ops.name_scope(name, "sequence_loss_by_example", logits + targets + weights): + log_perp_list = [] + for logit, target, weight in zip(logits, targets, weights): + if softmax_loss_function is None: + # TODO(irving,ebrevdo): This reshape is needed because + # sequence_loss_by_example is called with scalars sometimes, which + # violates our general scalar strictness policy. + target = array_ops.reshape(target, [-1]) + crossent = nn_ops.sparse_softmax_cross_entropy_with_logits(labels=target, logits=logit) + else: + crossent = softmax_loss_function(labels=target, logits=logit) + log_perp_list.append(crossent * weight) + log_perps = math_ops.add_n(log_perp_list) + if average_across_timesteps: + total_size = math_ops.add_n(weights) + total_size += 1e-12 # Just to avoid division by 0 for all-0 weights. + log_perps /= total_size + return log_perps + + +def cross_entropy_seq(logits, target_seqs, batch_size=None): + """Returns the expression of cross-entropy of two sequences, implement + softmax internally. Normally be used for fixed length RNN outputs, see `PTB example `__. + + Parameters + ---------- + logits : Tensor + 2D tensor with shape of `[batch_size * n_steps, n_classes]`. + target_seqs : Tensor + The target sequence, 2D tensor `[batch_size, n_steps]`, if the number of step is dynamic, please use ``tl.cost.cross_entropy_seq_with_mask`` instead. + batch_size : None or int. + Whether to divide the cost by batch size. + - If integer, the return cost will be divided by `batch_size`. + - If None (default), the return cost will not be divided by anything. + + Examples + -------- + >>> import tensorlayer as tl + >>> # see `PTB example `__.for more details + >>> # outputs shape : (batch_size * n_steps, n_classes) + >>> # targets shape : (batch_size, n_steps) + >>> cost = tl.cost.cross_entropy_seq(outputs, targets) + + """ + sequence_loss_by_example_fn = sequence_loss_by_example + + loss = sequence_loss_by_example_fn( + [logits], [tf.reshape(target_seqs, [-1])], [tf.ones_like(tf.reshape(target_seqs, [-1]), dtype=tf.float32)] + ) + # [tf.ones([batch_size * num_steps])]) + cost = tf.reduce_sum(loss) # / batch_size + if batch_size is not None: + cost = cost / batch_size + return cost + + +def cross_entropy_seq_with_mask(logits, target_seqs, input_mask, return_details=False, name=None): + """Returns the expression of cross-entropy of two sequences, implement + softmax internally. Normally be used for Dynamic RNN with Synced sequence input and output. + + Parameters + ----------- + logits : Tensor + 2D tensor with shape of [batch_size * ?, n_classes], `?` means dynamic IDs for each example. + - Can be get from `DynamicRNNLayer` by setting ``return_seq_2d`` to `True`. + target_seqs : Tensor + int of tensor, like word ID. [batch_size, ?], `?` means dynamic IDs for each example. + input_mask : Tensor + The mask to compute loss, it has the same size with `target_seqs`, normally 0 or 1. + return_details : boolean + Whether to return detailed losses. + - If False (default), only returns the loss. + - If True, returns the loss, losses, weights and targets (see source code). + + Examples + -------- + >>> import tensorlayer as tl + >>> import tensorflow as tf + >>> import numpy as np + >>> batch_size = 64 + >>> vocab_size = 10000 + >>> embedding_size = 256 + >>> ni = tl.layers.Input([batch_size, None], dtype=tf.int64) + >>> net = tl.layers.Embedding( + ... vocabulary_size = vocab_size, + ... embedding_size = embedding_size, + ... name = 'seq_embedding')(ni) + >>> net = tl.layers.RNN( + ... cell =tf.keras.layers.LSTMCell(units=embedding_size, dropout=0.1), + ... return_seq_2d = True, + ... name = 'dynamicrnn')(net) + >>> net = tl.layers.Dense(n_units=vocab_size, name="output")(net) + >>> model = tl.models.Model(inputs=ni, outputs=net) + >>> input_seqs = np.random.randint(0, 10, size=(batch_size, 10), dtype=np.int64) + >>> target_seqs = np.random.randint(0, 10, size=(batch_size, 10), dtype=np.int64) + >>> input_mask = np.random.randint(0, 2, size=(batch_size, 10), dtype=np.int64) + >>> outputs = model(input_seqs, is_train=True) + >>> loss = tl.cost.cross_entropy_seq_with_mask(outputs, target_seqs, input_mask) + + """ + targets = tf.reshape(target_seqs, [-1]) # to one vector + weights = tf.cast(tf.reshape(input_mask, [-1]), dtype=tf.float32) # to one vector like targets + losses = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=targets, name=name) * weights + # losses = tf.reduce_mean(tf.ops.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=targets, name=name)) # for TF1.0 and others + + loss = tf.divide( + tf.reduce_sum(losses), # loss from mask. reduce_sum before element-wise mul with mask !! + tf.reduce_sum(weights), + name="seq_loss_with_mask" + ) + + if return_details: + return loss, losses, weights, targets + else: + return loss + + +def cosine_similarity(v1, v2): + """Cosine similarity [-1, 1]. + + Parameters + ---------- + v1, v2 : Tensor + Tensor with the same shape [batch_size, n_feature]. + + References + ---------- + - `Wiki `__. + + """ + + return tf.reduce_sum(tf.multiply(v1, v2), 1) / \ + (tf.sqrt(tf.reduce_sum(tf.multiply(v1, v1), 1)) * + tf.sqrt(tf.reduce_sum(tf.multiply(v2, v2), 1))) + + +# Regularization Functions +def li_regularizer(scale, scope=None): + """Li regularization removes the neurons of previous layer. The `i` represents `inputs`. + Returns a function that can be used to apply group li regularization to weights. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + scope: str + An optional scope name for this function. + + Returns + -------- + A function with signature `li(weights, name=None)` that apply Li regularization. + + Raises + ------ + ValueError : if scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + if isinstance(scale, numbers.Integral): + raise ValueError('scale cannot be an integer: %s' % scale) + if isinstance(scale, numbers.Real): + if scale < 0.: + raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + if scale >= 1.: + raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % scale) + if scale == 0.: + logging.info('Scale of 0 disables regularizer.') + return lambda _, name=None: None + + def li(weights): + """Applies li regularization to weights.""" + with tf.name_scope('li_regularizer') as scope: + my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + # if tf.__version__ <= '0.12': + # standard_ops_fn = standard_ops.mul + # else: + standard_ops_fn = standard_ops.multiply + return standard_ops_fn( + my_scale, standard_ops.reduce_sum(standard_ops.sqrt(standard_ops.reduce_sum(tf.square(weights), 1))), + name=scope + ) + + return li + + +def lo_regularizer(scale): + """Lo regularization removes the neurons of current layer. The `o` represents `outputs` + Returns a function that can be used to apply group lo regularization to weights. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + ------- + A function with signature `lo(weights, name=None)` that apply Lo regularization. + + Raises + ------ + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + if isinstance(scale, numbers.Integral): + raise ValueError('scale cannot be an integer: %s' % scale) + + if isinstance(scale, numbers.Real): + if scale < 0.: + raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + if scale >= 1.: + raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % scale) + if scale == 0.: + logging.info('Scale of 0 disables regularizer.') + return lambda _, name=None: None + + def lo(weights, name='lo_regularizer'): + """Applies group column regularization to weights.""" + with tf.name_scope(name) as scope: + my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + # if tf.__version__ <= '0.12': + # standard_ops_fn = standard_ops.mul + # else: + standard_ops_fn = standard_ops.multiply + return standard_ops_fn( + my_scale, standard_ops.reduce_sum(standard_ops.sqrt(standard_ops.reduce_sum(tf.square(weights), 0))), + name=scope + ) + + return lo + + +def maxnorm_regularizer(scale=1.0): + """Max-norm regularization returns a function that can be used to apply max-norm regularization to weights. + + More about max-norm, see `wiki-max norm `_. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + --------- + A function with signature `mn(weights, name=None)` that apply Lo regularization. + + Raises + -------- + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + if isinstance(scale, numbers.Integral): + raise ValueError('scale cannot be an integer: %s' % scale) + + if isinstance(scale, numbers.Real): + if scale < 0.: + raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + # if scale >= 1.: + # raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % + # scale) + if scale == 0.: + logging.info('Scale of 0 disables regularizer.') + return lambda _, name=None: None + + def mn(weights, name='max_regularizer'): + """Applies max-norm regularization to weights.""" + with tf.name_scope(name) as scope: + my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + # if tf.__version__ <= '0.12': + # standard_ops_fn = standard_ops.mul + # else: + standard_ops_fn = standard_ops.multiply + return standard_ops_fn(my_scale, standard_ops.reduce_max(standard_ops.abs(weights)), name=scope) + + return mn + + +def maxnorm_o_regularizer(scale): + """Max-norm output regularization removes the neurons of current layer. + Returns a function that can be used to apply max-norm regularization to each column of weight matrix. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + --------- + A function with signature `mn_o(weights, name=None)` that apply Lo regularization. + + Raises + --------- + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + if isinstance(scale, numbers.Integral): + raise ValueError('scale cannot be an integer: %s' % scale) + + if isinstance(scale, numbers.Real): + if scale < 0.: + raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + # if scale >= 1.: + # raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % + # scale) + if scale == 0.: + logging.info('Scale of 0 disables regularizer.') + return lambda _, name=None: None + + def mn_o(weights, name='maxnorm_o_regularizer'): + """Applies max-norm regularization to weights.""" + with tf.name_scope(name) as scope: + my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + if tf.__version__ <= '0.12': + standard_ops_fn = standard_ops.mul + else: + standard_ops_fn = standard_ops.multiply + return standard_ops_fn( + my_scale, standard_ops.reduce_sum(standard_ops.reduce_max(standard_ops.abs(weights), 0)), name=scope + ) + + return mn_o + + +def maxnorm_i_regularizer(scale): + """Max-norm input regularization removes the neurons of previous layer. + Returns a function that can be used to apply max-norm regularization to each row of weight matrix. + The implementation follows `TensorFlow contrib `__. + + Parameters + ---------- + scale : float + A scalar multiplier `Tensor`. 0.0 disables the regularizer. + + Returns + --------- + A function with signature `mn_i(weights, name=None)` that apply Lo regularization. + + Raises + --------- + ValueError : If scale is outside of the range [0.0, 1.0] or if scale is not a float. + + """ + if isinstance(scale, numbers.Integral): + raise ValueError('scale cannot be an integer: %s' % scale) + + if isinstance(scale, numbers.Real): + if scale < 0.: + raise ValueError('Setting a scale less than 0 on a regularizer: %g' % scale) + # if scale >= 1.: + # raise ValueError('Setting a scale greater than 1 on a regularizer: %g' % + # scale) + if scale == 0.: + logging.info('Scale of 0 disables regularizer.') + return lambda _, name=None: None + + def mn_i(weights, name='maxnorm_i_regularizer'): + """Applies max-norm regularization to weights.""" + with tf.name_scope(name) as scope: + my_scale = ops.convert_to_tensor(scale, dtype=weights.dtype.base_dtype, name='scale') + if tf.__version__ <= '0.12': + standard_ops_fn = standard_ops.mul + else: + standard_ops_fn = standard_ops.multiply + return standard_ops_fn( + my_scale, standard_ops.reduce_sum(standard_ops.reduce_max(standard_ops.abs(weights), 1)), name=scope + ) + + return mn_i + + +def huber_loss( + output, target, is_mean=True, delta=1.0, dynamichuber=False, reverse=False, axis=-1, epsilon=0.00001, name=None +): + """Huber Loss operation, see ``https://en.wikipedia.org/wiki/Huber_loss`` . + Reverse Huber Loss operation, see ''https://statweb.stanford.edu/~owen/reports/hhu.pdf''. + Dynamic Reverse Huber Loss operation, see ''https://arxiv.org/pdf/1606.00373.pdf''. + + Parameters + ---------- + output : Tensor + A distribution with shape: [batch_size, ....], (any dimensions). + target : Tensor + The target distribution, format the same with `output`. + is_mean : boolean + Whether compute the mean or sum for each example. + - If True, use ``tf.reduce_mean`` to compute the loss between one target and predict data (default). + - If False, use ``tf.reduce_sum``. + delta: float + The point where the huber loss function changes from a quadratic to linear. + dynamichuber: boolean + Whether compute the coefficient c for each batch. + - If True, c is 20% of the maximal per-batch error. + - If False, c is delta. + reverse: boolean + Whether compute the reverse huber loss. + axis : int or list of int + The dimensions to reduce. + epsilon: + Eplison. + name : string + Name of this loss. + + """ + if reverse: + if dynamichuber: + huber_c = 0.2 * tf.reduce_max(tf.abs(output - target)) + else: + huber_c = delta + if is_mean: + loss = tf.reduce_mean( + tf.where( + tf.less_equal(tf.abs(output - target), huber_c), tf.abs(output - target), + tf.multiply( + tf.pow(output - target, 2.0) + tf.pow(huber_c, 2.0), + tf.math.divide_no_nan(.5, huber_c + epsilon) + ) + ), name=name + ) + else: + loss = tf.reduce_mean( + tf.reduce_sum( + tf.where( + tf.less_equal(tf.abs(output - target), huber_c), tf.abs(output - target), + tf.multiply( + tf.pow(output - target, 2.0) + tf.pow(huber_c, 2.0), + tf.math.divide_no_nan(.5, huber_c + epsilon) + ) + ), axis + ), name=name + ) + elif is_mean: + loss = tf.reduce_mean( + tf.where( + tf.less_equal(tf.abs(output - target), delta), 0.5 * tf.pow(output - target, 2), + delta * (tf.abs(output - target) - 0.5 * delta) + ), name=name + ) + else: + loss = tf.reduce_mean( + tf.reduce_sum( + tf.where( + tf.less_equal(tf.abs(output - target), delta), 0.5 * tf.pow(output - target, 2), + delta * (tf.abs(output - target) - 0.5 * delta) + ), axis + ), name=name + ) + return loss diff --git a/tensorlayer/dataflow/__init__.py b/tensorlayer/dataflow/__init__.py new file mode 100644 index 0000000..d26b322 --- /dev/null +++ b/tensorlayer/dataflow/__init__.py @@ -0,0 +1,23 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, division, print_function + +from tensorlayer.backend.ops.load_backend import BACKEND + +if BACKEND == 'tensorflow': + from .tensorflow_data import * + from .tensorflow_image import * + +elif BACKEND == 'mindspore': + from .mindspore_data import * + from .mindspore_image import * + +elif BACKEND == 'dragon': + pass + +elif BACKEND == 'paddle': + pass + +else: + raise NotImplementedError("This backend is not supported") + diff --git a/tensorlayer/dataflow/dataflow_examples.py b/tensorlayer/dataflow/dataflow_examples.py new file mode 100644 index 0000000..2bee246 --- /dev/null +++ b/tensorlayer/dataflow/dataflow_examples.py @@ -0,0 +1,56 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer.dataflow import Dataset +import numpy as np + +X_train, y_train, X_test, y_test = tl.files.load_cifar10_dataset(shape=(-1, 32, 32, 3), plotable=False) + + +def generator_train(): + inputs = X_train + targets = y_train + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + for _input, _target in zip(inputs, targets): + # yield _input.encode('utf-8'), _target.encode('utf-8') + yield (_input, np.array(_target)) + + +batch_size = 128 +shuffle_buffer_size = 128 +n_epoch = 10 + +import tensorflow as tf + + +def _map_fn_train(img, target): + # 1. Randomly crop a [height, width] section of the image. + img = tf.image.random_crop(img, [24, 24, 3]) + # 2. Randomly flip the image horizontally. + img = tf.image.random_flip_left_right(img) + # 3. Randomly change brightness. + img = tf.image.random_brightness(img, max_delta=63) + # 4. Randomly change contrast. + img = tf.image.random_contrast(img, lower=0.2, upper=1.8) + # 5. Subtract off the mean and divide by the variance of the pixels. + img = tf.image.per_image_standardization(img) + target = tf.reshape(target, ()) + return img, target + + +import multiprocessing +train_ds = Dataset.from_generator( + generator=generator_train, output_types=(tl.float32, tl.int32) +) # , output_shapes=((24, 24, 3), (1))) + +train_ds = train_ds.map(_map_fn_train, num_parallel_calls=multiprocessing.cpu_count()) + +train_ds = train_ds.repeat(n_epoch) +train_ds = train_ds.shuffle(shuffle_buffer_size) +train_ds = train_ds.prefetch(buffer_size=4096) +train_ds = train_ds.batch(batch_size) + +for X_batch, y_batch in train_ds: + print(X_batch.shape, y_batch.shape) diff --git a/tensorlayer/dataflow/image/__init__.py b/tensorlayer/dataflow/image/__init__.py new file mode 100644 index 0000000..df05229 --- /dev/null +++ b/tensorlayer/dataflow/image/__init__.py @@ -0,0 +1,2 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- diff --git a/tensorlayer/dataflow/mindspore_data.py b/tensorlayer/dataflow/mindspore_data.py new file mode 100644 index 0000000..fab1261 --- /dev/null +++ b/tensorlayer/dataflow/mindspore_data.py @@ -0,0 +1,277 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import mindspore.dataset as ds +import mindspore as ms +from enum import Enum +__all__ = [ + 'Apply', + 'Batch', + 'Concat', + 'CsvDataset', + 'Filter', + 'Flat_map', + 'FromGenerator', + 'FromSlices', + 'Map', + 'Prefetch', + 'Repeat', + 'Shuffle', + 'Skip', + 'Take', + 'TextFlieDataset', + 'TFRecordDataset', +] + + +class Shuffle(str, Enum): + GLOBAL: str = "global" + FILES: str = "file" + + +def Apply(dataset, transformation_func): + + return dataset.apply(transformation_func) + + +def Batch( + dataset, batch_size, drop_remainder=False, num_parallel_workers=None, per_batch_map=None, inut_columns=None, + output_columns=None, column_order=None, pad_info=None +): + ''' + Combine batch_size number of consecutive rows into batches. + Parameters + ---------- + dataset + batch_size + drop_remainder + num_parallel_workers + per_batch_map + inut_columns + output_columns + column_order + pad_info + + Returns + ------- + + ''' + return dataset.batch( + batch_size=batch_size, drop_remainder=drop_remainder, num_parallel_workers=num_parallel_workers, + per_batch_map=per_batch_map, input_columns=inut_columns, output_columns=output_columns, + column_order=column_order, pad_info=pad_info + ) + + +def Concat(dataset_1, dataset_2): + + return dataset_1.concat(dataset_2) + + +def CsvDataset( + file_pattern, batch_size=1, column_names=None, column_defaults=None, label_name=None, select_columns=None, + field_delim=',', use_quote_delim=True, na_value='', header=True, num_epochs=None, shuffle=Shuffle.GLOBAL, + shuffle_buffer_size=10000, shuffle_seed=None, prefetch_buffer_size=None, num_parallel_reads=None, sloppy=False, + num_rows_for_inference=100, compression_type=None, ignore_errors=False, numples_samples=None, num_shards=None, + shard_id=None, cache=None +): + """ + A source dataset that reads and parses comma-separated values (CSV) datasets. + + Examples: + >>> import mindspore.dataset as dataset + >>> + >>> dataset_files = ["/path/to/1", "/path/to/2"] # contains 1 or multiple text files + >>> dataset = dataset.CSVDataset(dataset_files=dataset_files, column_names=['col1', 'col2', 'col3', 'col4']) + """ + return ds.CSVDataset( + dataset_files=file_pattern, field_delim=field_delim, column_defaults=column_defaults, column_names=column_names, + num_samples=numples_samples, num_parallel_workers=num_parallel_reads, shuffle=shuffle, num_shards=num_shards, + shard_id=shard_id, cache=cache + ) + + +def Filter(dataset, predicate): + + return dataset.filter(predicate) + + +def Flat_map(dataset, map_func): + + return dataset.flat_map(map_func) + + +def FromGenerator( + generator, output_types, output_shapes=None, args=None, column_names=None, column_types=None, schema=None, + num_samples=None, num_parallel_workers=1, shuffle=None, sampler=None, num_shards=None, shard_id=None, + python_multiprocessing=True +): + + return ds.GeneratorDataset( + source=generator, column_names=column_names, column_types=column_types, schema=schema, num_samples=num_samples, + num_parallel_workers=num_parallel_workers, shuffle=shuffle, sampler=sampler, num_shards=num_shards, + shard_id=shard_id, python_multiprocessing=python_multiprocessing + ) + + +def FromSlices( + tensor, column_names=None, num_samples=None, num_parallel_workers=1, shuffle=None, sampler=None, num_shards=None, + shard_id=None +): + + return ds.NumpySlicesDataset( + data=tensor, column_names=column_names, num_samples=num_samples, num_parallel_workers=num_parallel_workers, + shuffle=shuffle, sampler=sampler, num_shards=num_shards, shard_id=shard_id + ) + + +def Map( + dataset, map_func, num_parallel_calls=None, input_columns=None, output_columns=None, column_order=None, + num_parallel_workers=None, python_multiprocessing=False, cache=None, callbacks=None +): + """ Maps map_func across the elements of this dataset. + + Parameters + ---------- + dataset : DataFlow + input DataFlow + map_func : function + A function mapping a dataset element to another dataset element. + num_parallel_calls + + Returns + ------- + + """ + return dataset.map( + operations=map_func, input_columns=input_columns, output_columns=output_columns, column_order=column_order, + num_parallel_workers=num_parallel_workers, python_multiprocessing=python_multiprocessing, cache=cache, + callbacks=callbacks + ) + + +def Prefetch(dataset, buffer_size): + + batch_size = dataset.get_batch_size() + prefetch_size = batch_size * buffer_size + + return dataset.config.set_prefetch_size(prefetch_size) + + + +def Repeat(dataset, count=None): + + + return dataset.repeat(count) + + +def Shuffle(dataset, buffer_size, seed=None, reshuffle_each_iteration=None): + + #dataset.config.set_seed(seed) + + return dataset.shuffle(buffer_size) + + +def Skip(dataset, count): + ''' + Creates a Dataset that skips count elements from this dataset. + Parameters + ---------- + dataset: + A dataset + count: + A tf.int64 scalar tf.Tensor, representing the number of elements of this dataset that should be skipped to form the new dataset. + + + Returns + ------- + + ''' + return dataset.skip(count) + + +def Take(dataset, count): + ''' + Creates a Dataset with at most count elements from this dataset. + Parameters + ---------- + dataset: + A dataset + count: + A tf.int64 scalar tf.Tensor, representing the number of elements of this dataset that should be taken to form the new dataset. + If count is -1, or if count is greater than the size of this dataset, the new dataset will contain all elements of this dataset. + Returns + ------- + + ''' + return dataset.take(count) + + +def TextFlieDataset( + filenames, compression_type=None, buffer_size=None, num_parallel_reads=None, num_samples=None, shuffle=None, + num_shards=None, shard_id=None, cache=None +): + """ + A source dataset that reads and parses datasets stored on disk in text format. + The generated dataset has one column ['text']. + + Examples: + >>> import mindspore.dataset as dataset + >>> + >>> dataset_files = ["/path/to/1", "/path/to/2"] # contains 1 or multiple text files + >>> dataset = dataset.TextFileDataset(dataset_files=dataset_files) + """ + if shuffle is None: + shuffle = Shuffle.GLOBAL + return ds.TextFileDataset( + dataset_files=filenames, num_samples=num_samples, num_parallel_workers=num_parallel_reads, shuffle=shuffle, + num_shards=num_shards, shard_id=shard_id, cache=cache + ) + + +def TFRecordDataset( + filenames, compression_type=None, buffer_size=None, num_parallel_reads=None, schema=None, columns_list=None, + num_samples=None, shuffle=None, num_shards=None, shard_id=None, shard_equal_rows=False, cache=None +): + """ + A source dataset that reads and parses datasets stored on disk in TFData format. + + Examples: + >>> import mindspore.dataset as dataset + >>> import mindspore.common.dtype as mstype + >>> + >>> dataset_files = ["/path/to/1", "/path/to/2"] # contains 1 or multiple tf data files + >>> + >>> # 1) Get all rows from dataset_files with no explicit schema + >>> # The meta-data in the first row will be used as a schema. + >>> tfdataset = dataset.TFRecordDataset(dataset_files=dataset_files) + >>> + >>> # 2) Get all rows from dataset_files with user-defined schema + >>> schema = dataset.Schema() + >>> schema.add_column('col_1d', de_type=mindspore.int64, shape=[2]) + >>> tfdataset = dataset.TFRecordDataset(dataset_files=dataset_files, schema=schema) + >>> + >>> # 3) Get all rows from dataset_files with schema file "./schema.json" + >>> tfdataset = dataset.TFRecordDataset(dataset_files=dataset_files, schema="./schema.json") + """ + if shuffle is None: + shuffle = Shuffle.GLOBAL + return ds.TFRecordDataset( + dataset_files=filenames, schema=schema, columns_list=columns_list, num_samples=num_samples, + num_parallel_workers=num_parallel_reads, shuffle=shuffle, num_shards=num_shards, shard_id=shard_id, + shard_equal_rows=shard_equal_rows, cache=cache + ) + + +def Zip(datasets): + ''' + Creates a Dataset by zipping together the given datasets. + Parameters + ---------- + datasets: + A tuple of datasets to be zipped together. + Returns + ------- + + ''' + return ds.zip(datasets) diff --git a/tensorlayer/dataflow/mindspore_image.py b/tensorlayer/dataflow/mindspore_image.py new file mode 100644 index 0000000..e4c1fd9 --- /dev/null +++ b/tensorlayer/dataflow/mindspore_image.py @@ -0,0 +1,305 @@ +import mindspore.dataset as ms +import mindspore.dataset.vision.c_transforms as c_vision +import mindspore.dataset.vision.py_transforms as py_vision +import mindspore.dataset.vision.py_transforms_util as py_util +import numpy as np +from PIL import Image, ImageOps, ImageEnhance, __version__ + +__all__ = [ + 'CentralCrop', 'HsvToRgb', 'AdjustBrightness', 'AdjustContrast', 'AdjustHue', 'Crop', 'FlipHorizontal', + 'FlipVertical', 'GrayToRgb', 'RgbToGray', 'PadToBoundingBox' +] + +augment_error_message = 'img should be PIL image. Got {}. Use Decode() for encoded data or ToPIL() for decoded data.' + + +def CentralCrop(image, central_fraction=None, size=None): + ''' + + Parameters + ---------- + image : + input Either a 3-D float Tensor of shape [height, width, depth], + or a 4-D Tensor of shape [batch_size, height, width, depth]. + central_fraction : + float (0, 1], fraction of size to crop + size: + size (Union[int, sequence]) – The output size of the cropped image. If size is an integer, a square crop of size (size, size) is returned. + If size is a sequence of length 2, it should be (height, width). + Returns : + 3-D / 4-D float Tensor, as per the input. + ------- + ''' + if size is None and central_fraction is None: + raise ValueError('central_fraction and size can not be both None') + + if size is None: + outshape = np.shape(image) + if len(outshape) == 3: + h_axis = 0 + w_axis = 1 + elif len(outshape) == 4: + h_axis = 1 + w_axis = 2 + + height = outshape[h_axis] + width = outshape[w_axis] + + target_height = height * central_fraction + target_width = width * central_fraction + + size = (target_height, target_width) + + return py_util.center_crop(image, size) + + +def HsvToRgb(image, is_hwc=True): + + image = np.asarray(image) + + return py_util.hsv_to_rgbs(image, is_hwc=is_hwc) + + +def AdjustBrightness(image, factor): + ''' + + Parameters + ---------- + image: + input NumPy image array or PIL image + factor: + factor should be in the range (-1,1) + Returns: + ------- + np darray image + ''' + + image = np.asarray(image) + image = image / 255 + image = image + factor + index = np.where(image > 1) + image[index] = 1 + index = np.where(image < 0) + image[index] = 0 + image = image * 255 + + return image + + +def AdjustContrast(image, factor): + + if isinstance(image, np.ndarray): + image = Image.fromarray(image) + if not isinstance(image, Image.Image): + raise TypeError(augment_error_message.format(type(image))) + + image = ImageEnhance.Contrast(image).enhance(factor) + + image = np.array(image) + + return image + + +def AdjustHue(image, factor): + + if isinstance(image, np.ndarray): + image = Image.fromarray(image) + if not isinstance(image, Image.Image): + raise TypeError(augment_error_message.format(type(image))) + + image_hue_factor = factor + if not -1 <= image_hue_factor <= 1: + raise ValueError('image_hue_factor {} is not in [-1, 1].'.format(image_hue_factor)) + + if not isinstance(image, Image.Image): + raise TypeError(augment_error_message.format(type(image))) + + mode = image.mode + if mode in {'L', '1', 'I', 'F'}: + return image + + hue, saturation, value = image.convert('HSV').split() + + np_hue = np.array(hue, dtype=np.uint8) + + with np.errstate(over='ignore'): + np_hue += np.uint8(image_hue_factor * 255) + hue = Image.fromarray(np_hue, 'L') + + image = Image.merge('HSV', (hue, saturation, value)).convert(mode) + return image + + +def AdjustSaturation(image, factor): + + if isinstance(image, np.ndarray): + image = Image.fromarray(image) + if not isinstance(image, Image.Image): + raise TypeError(augment_error_message.format(type(image))) + + enhancer = ImageEnhance.Color(image) + image = enhancer.enhance(factor) + return image + + +def Crop(image, offset_height, offset_width, target_height, target_width): + + if isinstance(image, np.ndarray): + image = Image.fromarray(image) + if not isinstance(image, Image.Image): + raise TypeError(augment_error_message.format(type(image))) + image = np.array( + image.crop((offset_width, offset_height, offset_width + target_width, offset_width + target_height)) + ) + return image + + +def FlipHorizontal(image): + + if isinstance(image, np.ndarray): + image = Image.fromarray(image) + if not isinstance(image, Image.Image): + raise TypeError(augment_error_message.format(type(image))) + + image = np.array(image.transpose(Image.FLIP_LEFT_RIGHT)) + + return image + + +def FlipVertical(image): + + if isinstance(image, np.ndarray): + image = Image.fromarray(image) + if not isinstance(image, Image.Image): + raise TypeError(augment_error_message.format(type(image))) + + image = np.array(image.transpose(Image.FLIP_TOP_BOTTOM)) + + return image + + +def GrayToRgb(image): + + image = np.asarray(image) + shape = image.shape + output_image = np.zeros((shape[0], shape[1], 3), dtype=np.uint8) + if len(shape) == 3: + for i in range(3): + output_image[:, :, i] = image[:, :, 1] + elif len(shape) == 2: + for i in range(3): + output_image[:, :, i] = image + + return output_image + + +def RgbToGray(image): + + if isinstance(image, np.ndarray): + image = Image.fromarray(image) + if not isinstance(image, Image.Image): + raise TypeError(augment_error_message.format(type(image))) + ''' + 将彩色图像转换为灰度(模式“L”)时,库使用ITU-R 601-2 Luma转换: + L = R * 299/1000 + G * 587/1000 + B * 114/1000 + ''' + image = image.convert('L') + image = np.asarray(image) + + return image + + +def PadToBoundingBox(image, offset_height, offset_width, target_height, target_width): + ''' + + Parameters + ---------- + image: + A PIL image + offset_height: + Number of rows of zeros to add on top. + offset_width: + Number of columns of zeros to add on the left. + target_height: + Height of output image. + target_width + Width of output image. + Returns + A numpy ndarray image + ------- + ''' + + if offset_height < 0: + raise ValueError("offset_height must be >= 0") + if offset_width < 0: + raise ValueError("offset_width must be >= 0") + image = np.array(image) + shape = image.shape + top = offset_height + bottom = target_height - shape[0] - top + left = offset_width + right = target_width - shape[1] - left + + if bottom < 0: + raise ValueError("target_height must be >= offset_height + height") + + if right < 0: + raise ValueError("target_width must be >= offset_width + width") + + return np.pad(image, ((top, bottom), (left, right), (0, 0)), mode='constant') + + +def Standardization(image, mean=None, std=None, channel_mode=False): + ''' + + Parameters + ---------- + image: + An n-D Tensor with at least 3 dimensions, the last 3 of which are the dimensions of each image. + mean: + List or tuple of mean values for each channel, with respect to channel order. + std: + List or tuple of standard deviations for each channel. + channel_mode: + Decide to implement standardization on whole image or each channel of image. + Returns: + A Tensor with the same shape and dtype as image. + ------- + ''' + image = np.array(image, dtype=np.float32) + num_shape = image.shape + if mean is not None and std is not None: + if len(mean) != len(std): + raise ValueError("Length of mean and std must be equal") + if len(mean) == 1: + mean = [mean[0]] * num_shape[2] + std = [std[0]] * num_shape[2] + mean = np.array(mean, dtype=image.dtype) + std = np.array(std, dtype=image.dtype) + return (image - mean[:, None, None]) / std[:, None, None] + elif mean is None and std is None: + if channel_mode: + num_pixels = num_shape[0] * num_shape[1] + image_mean = np.mean(image, axis=(0, 1)) + stddev = np.std(image, axis=(0, 1)) + min_sttdev = 1 / np.sqrt(num_pixels) + min_sttdev = [min_sttdev] * num_shape[2] + adjusted_sttdev = np.maximum(stddev, min_sttdev) + + image -= image_mean + image = np.divide(image, adjusted_sttdev) + return image + else: + num_pixels = num_shape[0] * num_shape[1] * num_shape[2] + image_mean = np.mean(image, axis=(0, 1, 2)) + image_mean = [image_mean] * 3 + stddev = np.std(image, axis=(0, 1, 2)) + min_sttdev = 1 / np.sqrt(num_pixels) + adjusted_sttdev = np.maximum(stddev, min_sttdev) + adjusted_sttdev = [adjusted_sttdev] * 3 + + image -= image_mean + image = np.divide(image, adjusted_sttdev) + return image + else: + raise ValueError('std and mean must both be None or not None') diff --git a/tensorlayer/dataflow/tensorflow_data.py b/tensorlayer/dataflow/tensorflow_data.py new file mode 100644 index 0000000..ce50c77 --- /dev/null +++ b/tensorlayer/dataflow/tensorflow_data.py @@ -0,0 +1,254 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorflow as tf + +__all__ = [ + 'Apply', + 'Batch', + 'Concat', + 'CsvDataset', + 'Filter', + 'Flat_map', + 'FromGenerator', + 'FromSlices', + 'Map', + 'Prefetch', + 'Repeat', + 'Shuffle', + 'Skip', + 'Take', + 'TextFlieDataset', + 'TFRecordDataset', + 'Zip', +] + + +def Apply(dataset, transformation_func): + """Applies a transformation function to this dataset. + `apply` enables chaining of custom `Dataset` transformations, which are + represented as functions that take one `Dataset` argument and return a + transformed `Dataset`. + >>> dataset = tf.data.Dataset.range(100) + >>> def dataset_fn(dataset): + ... return dataset.filter(lambda x: x < 5) + >>> dataset = dataset.apply(dataset_fn) + >>> list(dataset.as_numpy_iterator()) + [0, 1, 2, 3, 4] + Args: + transformation_func: A function that takes one `Dataset` argument and + returns a `Dataset`. + Returns: + Dataset: The `Dataset` returned by applying `transformation_func` to this + dataset. + """ + return dataset.apply(transformation_func) + + +def Batch(dataset, batch_size, drop_remainder=False): + ''' + + Parameters + ---------- + dataset + batch_size + drop_remainder + + Returns + ------- + + ''' + return dataset.batch(batch_size=batch_size, drop_remainder=drop_remainder) + + +def Concat(dataset_1, dataset_2): + + return dataset_1.concatenate(dataset_2) + + +def CsvDataset( + file_pattern, batch_size=1, column_names=None, column_defaults=None, label_name=None, select_columns=None, + field_delim=',', use_quote_delim=True, na_value='', header=True, num_epochs=None, shuffle=True, + shuffle_buffer_size=10000, shuffle_seed=None, prefetch_buffer_size=None, num_parallel_reads=None, sloppy=False, + num_rows_for_inference=100, compression_type=None, ignore_errors=False, numples_samples=None, num_shards=None, + shard_id=None, cache=None +): + """Reads CSV files into a dataset. + Reads CSV files into a dataset, where each element is a (features, labels) + tuple that corresponds to a batch of CSV rows. The features dictionary + maps feature column names to `Tensor`s containing the corresponding + feature data, and labels is a `Tensor` containing the batch's label data. + """ + return tf.data.experimental.make_csv_dataset( + file_pattern, batch_size, column_names=None, column_defaults=None, label_name=None, select_columns=None, + field_delim=',', use_quote_delim=True, na_value='', header=True, num_epochs=None, shuffle=True, + shuffle_buffer_size=10000, shuffle_seed=None, prefetch_buffer_size=None, num_parallel_reads=None, sloppy=False, + num_rows_for_inference=100, compression_type=None, ignore_errors=False + ) + + +def Filter(dataset, predicate): + ''' + Filters this dataset according to predicate. + Parameters + ---------- + dataset : + A dataset + predicate : + A function mapping a dataset element to a boolean. + Returns : + The Dataset containing the elements of this dataset for which predicate is True. + ------- + + ''' + return dataset.filter(predicate) + + +def Flat_map(dataset, map_func): + ''' + Maps map_func across this dataset and flattens the result. + Parameters + ---------- + dataset: + A dataset + map_func + A function mapping a dataset element to a dataset. + Returns + A Dataset. + ------- + + ''' + return dataset.flat_map(map_func) + + +def FromGenerator( + generator, output_types, output_shapes=None, args=None, column_names=None, column_types=None, schema=None, + num_samples=None, num_parallel_workers=1, shuffle=None, sampler=None, num_shards=None, shard_id=None, + python_multiprocessing=True +): + """Creates a `Dataset` whose elements are generated by `generator`. + + generator: + A callable object + """ + return tf.data.Dataset.from_generator(generator, output_types, output_shapes=output_shapes, args=args) + + +def FromSlices( + tensor, column_names=None, num_samples=None, num_parallel_workers=1, shuffle=None, sampler=None, num_shards=None, + shard_id=None +): + + return tf.data.Dataset.from_tensor_slices(tensor) + + +def Map( + dataset, map_func, num_parallel_calls=None, input_columns=None, output_columns=None, column_order=None, + num_parallel_workers=None, python_multiprocessing=False, cache=None, callbacks=None +): + """ Maps map_func across the elements of this dataset. + + Parameters + ---------- + dataset : DataFlow + input DataFlow + map_func : function + A function mapping a dataset element to another dataset element. + num_parallel_calls + + Returns + ------- + + """ + return dataset.map(map_func, num_parallel_calls=num_parallel_calls) + + +def Prefetch(dataset, buffer_size): + ''' + Creates a Dataset that prefetches elements from this dataset. + Parameters + ---------- + dataset: Dataflow + A dataset + buffer_size : + A tf.int64 scalar tf.Tensor, representing the maximum number of elements that will be buffered when prefetching. + Returns + A Dataset + ------- + + ''' + return dataset.prefetch(buffer_size=buffer_size) + + +def Repeat(dataset, count=None): + return dataset.repeat(count=count) + + +def Shuffle(dataset, buffer_size, seed=None, reshuffle_each_iteration=None): + return dataset.shuffle(buffer_size, seed=seed, reshuffle_each_iteration=reshuffle_each_iteration) + + +def Skip(dataset, count): + ''' + Creates a Dataset that skips count elements from this dataset. + Parameters + ---------- + dataset: + A dataset + count: + A tf.int64 scalar tf.Tensor, representing the number of elements of this dataset that should be skipped to form the new dataset. + If count is greater than the size of this dataset, the new dataset will contain no elements. + If count is -1, skips the entire dataset. + + Returns + ------- + + ''' + return dataset.skip(count) + + +def Take(dataset, count): + ''' + Creates a Dataset with at most count elements from this dataset. + Parameters + ---------- + dataset: + A dataset + count: + A tf.int64 scalar tf.Tensor, representing the number of elements of this dataset that should be taken to form the new dataset. + If count is -1, or if count is greater than the size of this dataset, the new dataset will contain all elements of this dataset. + Returns + ------- + + ''' + return dataset.take(count) + + +def TextFlieDataset( + filenames, compression_type=None, buffer_size=None, num_parallel_reads=None, num_samples=None, shuffle=None, + num_shards=None, shard_id=None, cache=None +): + + return tf.data.TextLineDataset(filenames, compression_type, buffer_size, num_parallel_reads) + + +def TFRecordDataset( + filenames, compression_type=None, buffer_size=None, num_parallel_reads=None, schema=None, columns_list=None, + num_samples=None, shuffle=None, num_shards=None, shard_id=None, shard_equal_rows=False, cache=None +): + + return tf.data.TFRecordDataset(filenames, compression_type, buffer_size, num_parallel_reads) + + +def Zip(datasets): + ''' + Creates a Dataset by zipping together the given datasets. + Parameters + ---------- + datasets: + A tuple of datasets to be zipped together. + Returns + ------- + + ''' + return tf.data.Dataset.zip(datasets) diff --git a/tensorlayer/dataflow/tensorflow_image.py b/tensorlayer/dataflow/tensorflow_image.py new file mode 100644 index 0000000..39419b9 --- /dev/null +++ b/tensorlayer/dataflow/tensorflow_image.py @@ -0,0 +1,200 @@ +import tensorflow as tf +import numpy as np +from tensorflow.python.ops import math_ops +from tensorflow.python.ops import array_ops +from tensorflow.python.framework import ops +from tensorflow.python.ops.image_ops_impl import _AssertAtLeast3DImage +from tensorflow.python.framework import dtypes +from tensorflow.python.ops.image_ops_impl import convert_image_dtype +__all__ = [ + 'CentralCrop', + 'HsvToRgb', + 'AdjustBrightness', + 'AdjustContrast', + 'AdjustHue', + 'AdjustSaturation', + 'Crop', + 'FlipHorizontal', + 'FlipVertical', + 'GrayToRgb', + 'Standardization', +] + + +def CentralCrop(image, central_fraction=None, size=None): + ''' + + Parameters + ---------- + image : + input Either a 3-D float Tensor of shape [height, width, depth], + or a 4-D Tensor of shape [batch_size, height, width, depth]. + central_fraction : + float (0, 1], fraction of size to crop + size: + size (Union[int, sequence]) – The output size of the cropped image. If size is an integer, a square crop of size (size, size) is returned. + If size is a sequence of length 2, it should be (height, width). + Returns : + 3-D / 4-D float Tensor, as per the input. + ------- + ''' + if size is None and central_fraction is None: + raise ValueError('central_fraction and size can not be both None') + + if central_fraction is None: + outshape = np.shape(image) + if len(outshape) == 3: + h_axis = 0 + w_axis = 1 + elif len(outshape) == 4: + h_axis = 1 + w_axis = 2 + + if isinstance(size, int): + target_height = size + target_width = size + elif isinstance(size, tuple): + target_height = size[0] + target_width = size[1] + + central_fraction = max(target_height // outshape[h_axis], target_width // outshape[w_axis]) + + return tf.image.central_crop(image, central_fraction) + + +def HsvToRgb(image): + + return tf.image.hsv_to_rgb(image) + + +def AdjustBrightness(image, factor): + + return tf.image.adjust_brightness(image, delta=factor) + + +def AdjustContrast(image, factor): + + return tf.image.adjust_contrast(image, contrast_factor=factor) + + +def AdjustHue(image, factor): + + return tf.image.adjust_hue(image, delta=factor) + + +def AdjustSaturation(image, factor): + + return tf.image.adjust_saturation(image, saturation_factor=factor) + + +def Crop(image, offset_height, offset_width, target_height, target_width): + ''' + + Parameters + ---------- + image: + A image or a batch of images + offset_height: + Vertical coordinate of the top-left corner of the result in the input. + offset_width: + Horizontal coordinate of the top-left corner of the result in the input. + target_height: + Height of the result. + target_width: + Width of the result. + + Returns: + Output [batch, target_height, target_width, channels] or [target_height, target_width, channels] + ------- + ''' + + return tf.image.crop_to_bounding_box(image, offset_height, offset_width, target_height, target_width) + + +def FlipHorizontal(image): + + return tf.image.flip_left_right(image) + + +def FlipVertical(image): + + return tf.image.flip_up_down(image) + + +def GrayToRgb(image): + + return tf.image.grayscale_to_rgb(image) + + +def RgbToGray(image): + + return tf.image.rgb_to_grayscale(image) + + +def PadToBoundingBox(image, offset_height, offset_width, target_height, target_width): + + return tf.image.pad_to_bounding_box(image, offset_height, offset_width, target_height, target_width) + + +def Standardization(image, mean=None, std=None, channel_mode=False): + ''' + + Parameters + ---------- + image: + An n-D Tensor with at least 3 dimensions, the last 3 of which are the dimensions of each image. + mean: + List or tuple of mean values for each channel, with respect to channel order. + std: + List or tuple of standard deviations for each channel. + channel_mode: + Decide to implement standardization on whole image or each channel of image. + Returns: + A Tensor with the same shape and dtype as image. + ------- + ''' + with ops.name_scope(None, 'Standardization', [image]) as scope: + image = ops.convert_to_tensor(image, name='image') + image = _AssertAtLeast3DImage(image) + + orig_dtype = image.dtype + if orig_dtype not in [dtypes.float16, dtypes.float32]: + image = convert_image_dtype(image, dtypes.float32) + + if mean is not None and std is not None: + mean = np.array(mean, dtype=np.float32) + std = np.array(std, dtype=np.float32) + image -= mean + image = math_ops.divide(image, std, name=scope) + return convert_image_dtype(image, orig_dtype, saturate=True) + + elif mean is None and std is None: + if channel_mode: + num_pixels = math_ops.reduce_prod(array_ops.shape(image)[-3:-1]) + #`num_pixels` is the number of elements in each channels of 'image' + image_mean = math_ops.reduce_mean(image, axis=[-2, -3], keepdims=True) + # `image_mean` is the mean of elements in each channels of 'image' + + stddev = math_ops.reduce_std(image, axis=[-2, -3], keepdims=True) + min_stddev = math_ops.rsqrt(math_ops.cast(num_pixels, image.dtype)) + adjusted_sttdev = math_ops.maximum(stddev, min_stddev) + + image -= image_mean + image = math_ops.divide(image, adjusted_sttdev, name=scope) + return convert_image_dtype(image, orig_dtype, saturate=True) + + else: + num_pixels = math_ops.reduce_prod(array_ops.shape(image)[-3:]) + #`num_pixels` is the number of elements in `image` + image_mean = math_ops.reduce_mean(image, axis=[-1, -2, -3], keepdims=True) + + # Apply a minimum normalization that protects us against uniform images. + stddev = math_ops.reduce_std(image, axis=[-1, -2, -3], keepdims=True) + min_stddev = math_ops.rsqrt(math_ops.cast(num_pixels, image.dtype)) + adjusted_stddev = math_ops.maximum(stddev, min_stddev) + + image -= image_mean + image = math_ops.divide(image, adjusted_stddev, name=scope) + return convert_image_dtype(image, orig_dtype, saturate=True) + else: + raise ValueError('std and mean must both be None or not None') diff --git a/tensorlayer/db.py b/tensorlayer/db.py new file mode 100644 index 0000000..129e251 --- /dev/null +++ b/tensorlayer/db.py @@ -0,0 +1,746 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os +import pickle +import sys +import time +from datetime import datetime + +import numpy as np +import tensorflow as tf + +import gridfs +import pymongo +from tensorlayer import logging +from tensorlayer.files import ( + assign_weights, del_folder, exists_or_mkdir, load_hdf5_to_weights, save_weights_to_hdf5, static_graph2net +) + + +class TensorHub(object): + """It is a MongoDB based manager that help you to manage data, network architecture, parameters and logging. + + Parameters + ------------- + ip : str + Localhost or IP address. + port : int + Port number. + dbname : str + Database name. + username : str or None + User name, set to None if you do not need authentication. + password : str + Password. + project_name : str or None + Experiment key for this entire project, similar with the repository name of Github. + + Attributes + ------------ + ip, port, dbname and other input parameters : see above + See above. + project_name : str + The given project name, if no given, set to the script name. + db : mongodb client + See ``pymongo.MongoClient``. + """ + + # @deprecated_alias(db_name='dbname', user_name='username', end_support_version=2.1) + def __init__( + self, ip='localhost', port=27017, dbname='dbname', username='None', password='password', project_name=None + ): + self.ip = ip + self.port = port + self.dbname = dbname + self.username = username + + print("[Database] Initializing ...") + # connect mongodb + client = pymongo.MongoClient(ip, port) + self.db = client[dbname] + if username is None: + print(username, password) + self.db.authenticate(username, password) + else: + print("[Database] No username given, it works if authentication is not required") + if project_name is None: + self.project_name = sys.argv[0].split('.')[0] + print("[Database] No project_name given, use {}".format(self.project_name)) + else: + self.project_name = project_name + + # define file system (Buckets) + self.dataset_fs = gridfs.GridFS(self.db, collection="datasetFilesystem") + self.model_fs = gridfs.GridFS(self.db, collection="modelfs") + # self.params_fs = gridfs.GridFS(self.db, collection="parametersFilesystem") + # self.architecture_fs = gridfs.GridFS(self.db, collection="architectureFilesystem") + + print("[Database] Connected ") + _s = "[Database] Info:\n" + _s += " ip : {}\n".format(self.ip) + _s += " port : {}\n".format(self.port) + _s += " dbname : {}\n".format(self.dbname) + _s += " username : {}\n".format(self.username) + _s += " password : {}\n".format("*******") + _s += " project_name : {}\n".format(self.project_name) + self._s = _s + print(self._s) + + def __str__(self): + """Print information of databset.""" + return self._s + + def _fill_project_info(self, args): + """Fill in project_name for all studies, architectures and parameters.""" + return args.update({'project_name': self.project_name}) + + @staticmethod + def _serialization(ps): + """Serialize data.""" + return pickle.dumps(ps, protocol=pickle.HIGHEST_PROTOCOL) # protocol=2) + # with open('_temp.pkl', 'wb') as file: + # return pickle.dump(ps, file, protocol=pickle.HIGHEST_PROTOCOL) + + @staticmethod + def _deserialization(ps): + """Deseralize data.""" + return pickle.loads(ps) + + # =========================== MODELS ================================ + def save_model(self, network=None, model_name='model', **kwargs): + """Save model architecture and parameters into database, timestamp will be added automatically. + + Parameters + ---------- + network : TensorLayer Model + TensorLayer Model instance. + model_name : str + The name/key of model. + kwargs : other events + Other events, such as name, accuracy, loss, step number and etc (optinal). + + Examples + --------- + Save model architecture and parameters into database. + >>> db.save_model(net, accuracy=0.8, loss=2.3, name='second_model') + + Load one model with parameters from database (run this in other script) + >>> net = db.find_top_model(accuracy=0.8, loss=2.3) + + Find and load the latest model. + >>> net = db.find_top_model(sort=[("time", pymongo.DESCENDING)]) + >>> net = db.find_top_model(sort=[("time", -1)]) + + Find and load the oldest model. + >>> net = db.find_top_model(sort=[("time", pymongo.ASCENDING)]) + >>> net = db.find_top_model(sort=[("time", 1)]) + + Get model information + >>> net._accuracy + ... 0.8 + + Returns + --------- + boolean : True for success, False for fail. + """ + kwargs.update({'model_name': model_name}) + self._fill_project_info(kwargs) # put project_name into kwargs + + # params = network.get_all_params() + params = network.all_weights + + s = time.time() + + # kwargs.update({'architecture': network.all_graphs, 'time': datetime.utcnow()}) + kwargs.update({'architecture': network.config, 'time': datetime.utcnow()}) + + try: + params_id = self.model_fs.put(self._serialization(params)) + kwargs.update({'params_id': params_id, 'time': datetime.utcnow()}) + self.db.Model.insert_one(kwargs) + print("[Database] Save model: SUCCESS, took: {}s".format(round(time.time() - s, 2))) + return True + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] + logging.info("{} {} {} {} {}".format(exc_type, exc_obj, fname, exc_tb.tb_lineno, e)) + print("[Database] Save model: FAIL") + return False + + def find_top_model(self, sort=None, model_name='model', **kwargs): + """Finds and returns a model architecture and its parameters from the database which matches the requirement. + + Parameters + ---------- + sort : List of tuple + PyMongo sort comment, search "PyMongo find one sorting" and `collection level operations `__ for more details. + model_name : str or None + The name/key of model. + kwargs : other events + Other events, such as name, accuracy, loss, step number and etc (optinal). + + Examples + --------- + - see ``save_model``. + + Returns + --------- + network : TensorLayer Model + Note that, the returned network contains all information of the document (record), e.g. if you saved accuracy in the document, you can get the accuracy by using ``net._accuracy``. + """ + # print(kwargs) # {} + kwargs.update({'model_name': model_name}) + self._fill_project_info(kwargs) + + s = time.time() + + d = self.db.Model.find_one(filter=kwargs, sort=sort) + + # _temp_file_name = '_find_one_model_ztemp_file' + if d is not None: + params_id = d['params_id'] + graphs = d['architecture'] + _datetime = d['time'] + # exists_or_mkdir(_temp_file_name, False) + # with open(os.path.join(_temp_file_name, 'graph.pkl'), 'wb') as file: + # pickle.dump(graphs, file, protocol=pickle.HIGHEST_PROTOCOL) + else: + print("[Database] FAIL! Cannot find model: {}".format(kwargs)) + return False + try: + params = self._deserialization(self.model_fs.get(params_id).read()) + # TODO : restore model and load weights + network = static_graph2net(graphs) + assign_weights(weights=params, network=network) + # np.savez(os.path.join(_temp_file_name, 'params.npz'), params=params) + # + # network = load_graph_and_params(name=_temp_file_name, sess=sess) + # del_folder(_temp_file_name) + + pc = self.db.Model.find(kwargs) + print( + "[Database] Find one model SUCCESS. kwargs:{} sort:{} save time:{} took: {}s".format( + kwargs, sort, _datetime, round(time.time() - s, 2) + ) + ) + + # FIXME : not sure what's this for + # put all informations of model into the TL layer + # for key in d: + # network.__dict__.update({"_%s" % key: d[key]}) + + # check whether more parameters match the requirement + params_id_list = pc.distinct('params_id') + n_params = len(params_id_list) + if n_params != 1: + print(" Note that there are {} models match the kwargs".format(n_params)) + return network + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] + logging.info("{} {} {} {} {}".format(exc_type, exc_obj, fname, exc_tb.tb_lineno, e)) + return False + + def delete_model(self, **kwargs): + """Delete model. + + Parameters + ----------- + kwargs : logging information + Find items to delete, leave it empty to delete all log. + """ + self._fill_project_info(kwargs) + self.db.Model.delete_many(kwargs) + logging.info("[Database] Delete Model SUCCESS") + + # =========================== DATASET =============================== + def save_dataset(self, dataset=None, dataset_name=None, **kwargs): + """Saves one dataset into database, timestamp will be added automatically. + + Parameters + ---------- + dataset : any type + The dataset you want to store. + dataset_name : str + The name of dataset. + kwargs : other events + Other events, such as description, author and etc (optinal). + + Examples + ---------- + Save dataset + >>> db.save_dataset([X_train, y_train, X_test, y_test], 'mnist', description='this is a tutorial') + + Get dataset + >>> dataset = db.find_top_dataset('mnist') + + Returns + --------- + boolean : Return True if save success, otherwise, return False. + """ + self._fill_project_info(kwargs) + if dataset_name is None: + raise Exception("dataset_name is None, please give a dataset name") + kwargs.update({'dataset_name': dataset_name}) + + s = time.time() + try: + dataset_id = self.dataset_fs.put(self._serialization(dataset)) + kwargs.update({'dataset_id': dataset_id, 'time': datetime.utcnow()}) + self.db.Dataset.insert_one(kwargs) + # print("[Database] Save params: {} SUCCESS, took: {}s".format(file_name, round(time.time()-s, 2))) + print("[Database] Save dataset: SUCCESS, took: {}s".format(round(time.time() - s, 2))) + return True + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] + logging.info("{} {} {} {} {}".format(exc_type, exc_obj, fname, exc_tb.tb_lineno, e)) + print("[Database] Save dataset: FAIL") + return False + + def find_top_dataset(self, dataset_name=None, sort=None, **kwargs): + """Finds and returns a dataset from the database which matches the requirement. + + Parameters + ---------- + dataset_name : str + The name of dataset. + sort : List of tuple + PyMongo sort comment, search "PyMongo find one sorting" and `collection level operations `__ for more details. + kwargs : other events + Other events, such as description, author and etc (optinal). + + Examples + --------- + Save dataset + >>> db.save_dataset([X_train, y_train, X_test, y_test], 'mnist', description='this is a tutorial') + + Get dataset + >>> dataset = db.find_top_dataset('mnist') + >>> datasets = db.find_datasets('mnist') + + Returns + -------- + dataset : the dataset or False + Return False if nothing found. + + """ + + self._fill_project_info(kwargs) + if dataset_name is None: + raise Exception("dataset_name is None, please give a dataset name") + kwargs.update({'dataset_name': dataset_name}) + + s = time.time() + + d = self.db.Dataset.find_one(filter=kwargs, sort=sort) + + if d is not None: + dataset_id = d['dataset_id'] + else: + print("[Database] FAIL! Cannot find dataset: {}".format(kwargs)) + return False + try: + dataset = self._deserialization(self.dataset_fs.get(dataset_id).read()) + pc = self.db.Dataset.find(kwargs) + print("[Database] Find one dataset SUCCESS, {} took: {}s".format(kwargs, round(time.time() - s, 2))) + + # check whether more datasets match the requirement + dataset_id_list = pc.distinct('dataset_id') + n_dataset = len(dataset_id_list) + if n_dataset != 1: + print(" Note that there are {} datasets match the requirement".format(n_dataset)) + return dataset + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] + logging.info("{} {} {} {} {}".format(exc_type, exc_obj, fname, exc_tb.tb_lineno, e)) + return False + + def find_datasets(self, dataset_name=None, **kwargs): + """Finds and returns all datasets from the database which matches the requirement. + In some case, the data in a dataset can be stored separately for better management. + + Parameters + ---------- + dataset_name : str + The name/key of dataset. + kwargs : other events + Other events, such as description, author and etc (optional). + + Returns + -------- + params : the parameters, return False if nothing found. + + """ + + self._fill_project_info(kwargs) + if dataset_name is None: + raise Exception("dataset_name is None, please give a dataset name") + kwargs.update({'dataset_name': dataset_name}) + + s = time.time() + pc = self.db.Dataset.find(kwargs) + + if pc is not None: + dataset_id_list = pc.distinct('dataset_id') + dataset_list = [] + for dataset_id in dataset_id_list: # you may have multiple Buckets files + tmp = self.dataset_fs.get(dataset_id).read() + dataset_list.append(self._deserialization(tmp)) + else: + print("[Database] FAIL! Cannot find any dataset: {}".format(kwargs)) + return False + + print("[Database] Find {} datasets SUCCESS, took: {}s".format(len(dataset_list), round(time.time() - s, 2))) + return dataset_list + + def delete_datasets(self, **kwargs): + """Delete datasets. + + Parameters + ----------- + kwargs : logging information + Find items to delete, leave it empty to delete all log. + + """ + + self._fill_project_info(kwargs) + self.db.Dataset.delete_many(kwargs) + logging.info("[Database] Delete Dataset SUCCESS") + + # =========================== LOGGING =============================== + def save_training_log(self, **kwargs): + """Saves the training log, timestamp will be added automatically. + + Parameters + ----------- + kwargs : logging information + Events, such as accuracy, loss, step number and etc. + + Examples + --------- + >>> db.save_training_log(accuracy=0.33, loss=0.98) + + """ + + self._fill_project_info(kwargs) + kwargs.update({'time': datetime.utcnow()}) + _result = self.db.TrainLog.insert_one(kwargs) + _log = self._print_dict(kwargs) + logging.info("[Database] train log: " + _log) + + def save_validation_log(self, **kwargs): + """Saves the validation log, timestamp will be added automatically. + + Parameters + ----------- + kwargs : logging information + Events, such as accuracy, loss, step number and etc. + + Examples + --------- + >>> db.save_validation_log(accuracy=0.33, loss=0.98) + + """ + + self._fill_project_info(kwargs) + kwargs.update({'time': datetime.utcnow()}) + _result = self.db.ValidLog.insert_one(kwargs) + _log = self._print_dict(kwargs) + logging.info("[Database] valid log: " + _log) + + def save_testing_log(self, **kwargs): + """Saves the testing log, timestamp will be added automatically. + + Parameters + ----------- + kwargs : logging information + Events, such as accuracy, loss, step number and etc. + + Examples + --------- + >>> db.save_testing_log(accuracy=0.33, loss=0.98) + + """ + + self._fill_project_info(kwargs) + kwargs.update({'time': datetime.utcnow()}) + _result = self.db.TestLog.insert_one(kwargs) + _log = self._print_dict(kwargs) + logging.info("[Database] test log: " + _log) + + def delete_training_log(self, **kwargs): + """Deletes training log. + + Parameters + ----------- + kwargs : logging information + Find items to delete, leave it empty to delete all log. + + Examples + --------- + Save training log + >>> db.save_training_log(accuracy=0.33) + >>> db.save_training_log(accuracy=0.44) + + Delete logs that match the requirement + >>> db.delete_training_log(accuracy=0.33) + + Delete all logs + >>> db.delete_training_log() + """ + self._fill_project_info(kwargs) + self.db.TrainLog.delete_many(kwargs) + logging.info("[Database] Delete TrainLog SUCCESS") + + def delete_validation_log(self, **kwargs): + """Deletes validation log. + + Parameters + ----------- + kwargs : logging information + Find items to delete, leave it empty to delete all log. + + Examples + --------- + - see ``save_training_log``. + """ + self._fill_project_info(kwargs) + self.db.ValidLog.delete_many(kwargs) + logging.info("[Database] Delete ValidLog SUCCESS") + + def delete_testing_log(self, **kwargs): + """Deletes testing log. + + Parameters + ----------- + kwargs : logging information + Find items to delete, leave it empty to delete all log. + + Examples + --------- + - see ``save_training_log``. + """ + self._fill_project_info(kwargs) + self.db.TestLog.delete_many(kwargs) + logging.info("[Database] Delete TestLog SUCCESS") + + # def find_training_logs(self, **kwargs): + # pass + # + # def find_validation_logs(self, **kwargs): + # pass + # + # def find_testing_logs(self, **kwargs): + # pass + + # =========================== Task =================================== + def create_task(self, task_name=None, script=None, hyper_parameters=None, saved_result_keys=None, **kwargs): + """Uploads a task to the database, timestamp will be added automatically. + + Parameters + ----------- + task_name : str + The task name. + script : str + File name of the python script. + hyper_parameters : dictionary + The hyper parameters pass into the script. + saved_result_keys : list of str + The keys of the task results to keep in the database when the task finishes. + kwargs : other parameters + Users customized parameters such as description, version number. + + Examples + ----------- + Uploads a task + >>> db.create_task(task_name='mnist', script='example/tutorial_mnist_simple.py', description='simple tutorial') + + Finds and runs the latest task + >>> db.run_top_task(sort=[("time", pymongo.DESCENDING)]) + >>> db.run_top_task(sort=[("time", -1)]) + + Finds and runs the oldest task + >>> db.run_top_task(sort=[("time", pymongo.ASCENDING)]) + >>> db.run_top_task(sort=[("time", 1)]) + + """ + if not isinstance(task_name, str): # is None: + raise Exception("task_name should be string") + if not isinstance(script, str): # is None: + raise Exception("script should be string") + if hyper_parameters is None: + hyper_parameters = {} + if saved_result_keys is None: + saved_result_keys = [] + + self._fill_project_info(kwargs) + kwargs.update({'time': datetime.utcnow()}) + kwargs.update({'hyper_parameters': hyper_parameters}) + kwargs.update({'saved_result_keys': saved_result_keys}) + + _script = open(script, 'rb').read() + + kwargs.update({'status': 'pending', 'script': _script, 'result': {}}) + self.db.Task.insert_one(kwargs) + logging.info("[Database] Saved Task - task_name: {} script: {}".format(task_name, script)) + + def run_top_task(self, task_name=None, sort=None, **kwargs): + """Finds and runs a pending task that in the first of the sorting list. + + Parameters + ----------- + task_name : str + The task name. + sort : List of tuple + PyMongo sort comment, search "PyMongo find one sorting" and `collection level operations `__ for more details. + kwargs : other parameters + Users customized parameters such as description, version number. + + Examples + --------- + Monitors the database and pull tasks to run + >>> while True: + >>> print("waiting task from distributor") + >>> db.run_top_task(task_name='mnist', sort=[("time", -1)]) + >>> time.sleep(1) + + Returns + -------- + boolean : True for success, False for fail. + """ + if not isinstance(task_name, str): # is None: + raise Exception("task_name should be string") + self._fill_project_info(kwargs) + kwargs.update({'status': 'pending'}) + + # find task and set status to running + task = self.db.Task.find_one_and_update(kwargs, {'$set': {'status': 'running'}}, sort=sort) + + # try: + # get task info e.g. hyper parameters, python script + if task is None: + logging.info("[Database] Find Task FAIL: key: {} sort: {}".format(task_name, sort)) + return False + else: + logging.info("[Database] Find Task SUCCESS: key: {} sort: {}".format(task_name, sort)) + _datetime = task['time'] + _script = task['script'] + _id = task['_id'] + _hyper_parameters = task['hyper_parameters'] + _saved_result_keys = task['saved_result_keys'] + logging.info(" hyper parameters:") + for key in _hyper_parameters: + globals()[key] = _hyper_parameters[key] + logging.info(" {}: {}".format(key, _hyper_parameters[key])) + # run task + s = time.time() + logging.info("[Database] Start Task: key: {} sort: {} push time: {}".format(task_name, sort, _datetime)) + _script = _script.decode('utf-8') + with tf.Graph().as_default(): # # as graph: # clear all TF graphs + exec(_script, globals()) + + # set status to finished + _ = self.db.Task.find_one_and_update({'_id': _id}, {'$set': {'status': 'finished'}}) + + # return results + __result = {} + for _key in _saved_result_keys: + logging.info(" result: {}={} {}".format(_key, globals()[_key], type(globals()[_key]))) + __result.update({"%s" % _key: globals()[_key]}) + _ = self.db.Task.find_one_and_update( + {'_id': _id}, {'$set': { + 'result': __result + }}, return_document=pymongo.ReturnDocument.AFTER + ) + logging.info( + "[Database] Finished Task: task_name - {} sort: {} push time: {} took: {}s".format( + task_name, sort, _datetime, + time.time() - s + ) + ) + return True + # except Exception as e: + # exc_type, exc_obj, exc_tb = sys.exc_info() + # fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] + # logging.info("{} {} {} {} {}".format(exc_type, exc_obj, fname, exc_tb.tb_lineno, e)) + # logging.info("[Database] Fail to run task") + # # if fail, set status back to pending + # _ = self.db.Task.find_one_and_update({'_id': _id}, {'$set': {'status': 'pending'}}) + # return False + + def delete_tasks(self, **kwargs): + """Delete tasks. + + Parameters + ----------- + kwargs : logging information + Find items to delete, leave it empty to delete all log. + + Examples + --------- + >>> db.delete_tasks() + + """ + + self._fill_project_info(kwargs) + self.db.Task.delete_many(kwargs) + logging.info("[Database] Delete Task SUCCESS") + + def check_unfinished_task(self, task_name=None, **kwargs): + """Finds and runs a pending task. + + Parameters + ----------- + task_name : str + The task name. + kwargs : other parameters + Users customized parameters such as description, version number. + + Examples + --------- + Wait until all tasks finish in user's local console + + >>> while not db.check_unfinished_task(): + >>> time.sleep(1) + >>> print("all tasks finished") + >>> sess = tf.InteractiveSession() + >>> net = db.find_top_model(sess=sess, sort=[("test_accuracy", -1)]) + >>> print("the best accuracy {} is from model {}".format(net._test_accuracy, net._name)) + + Returns + -------- + boolean : True for success, False for fail. + + """ + + if not isinstance(task_name, str): # is None: + raise Exception("task_name should be string") + self._fill_project_info(kwargs) + + kwargs.update({'$or': [{'status': 'pending'}, {'status': 'running'}]}) + + # ## find task + # task = self.db.Task.find_one(kwargs) + task = self.db.Task.find(kwargs) + + task_id_list = task.distinct('_id') + n_task = len(task_id_list) + + if n_task == 0: + logging.info("[Database] No unfinished task - task_name: {}".format(task_name)) + return False + else: + + logging.info("[Database] Find {} unfinished task - task_name: {}".format(n_task, task_name)) + return True + + @staticmethod + def _print_dict(args): + string = '' + for key, value in args.items(): + if key is not '_id': + string += str(key) + ": " + str(value) + " / " + return string diff --git a/tensorlayer/decorators/__init__.py b/tensorlayer/decorators/__init__.py new file mode 100644 index 0000000..ba8d5eb --- /dev/null +++ b/tensorlayer/decorators/__init__.py @@ -0,0 +1,16 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +TensorLayer provides rich layer implementations trailed for +various benchmarks and domain-specific problems. In addition, we also +support transparent access to native TensorFlow parameters. +For example, we provide not only layers for local response normalization, but also +layers that allow user to apply ``tf.ops.lrn`` on ``network.outputs``. +More functions can be found in `TensorFlow API `__. +""" + +from .deprecated import deprecated +from .deprecated_alias import deprecated_alias +from .method_decorator import private_method, protected_method + +__all__ = ['deprecated', 'deprecated_alias', 'private_method', 'protected_method'] diff --git a/tensorlayer/decorators/deprecated.py b/tensorlayer/decorators/deprecated.py new file mode 100644 index 0000000..ba5154d --- /dev/null +++ b/tensorlayer/decorators/deprecated.py @@ -0,0 +1,61 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import functools +import inspect +import sys + +import wrapt + +from tensorlayer.decorators.utils import ( + add_deprecation_notice_to_docstring, get_qualified_name, validate_deprecation_args +) + +__all__ = ['deprecated'] + +# Allow deprecation warnings to be silenced temporarily with a context manager. +_PRINT_DEPRECATION_WARNINGS = True + +# Remember which deprecation warnings have been printed already. +_PRINTED_WARNING = {} + + +def deprecated(wrapped=None, date='', instructions='', warn_once=True): + + if wrapped is None: + return functools.partial(deprecated, date=date, instructions=instructions, warn_once=warn_once) + + @wrapt.decorator + def wrapper(wrapped, instance=None, args=None, kwargs=None): + + validate_deprecation_args(date, instructions) + + if _PRINT_DEPRECATION_WARNINGS: + + class_or_func_name = get_qualified_name(wrapped) + + if class_or_func_name not in _PRINTED_WARNING: + if warn_once: + _PRINTED_WARNING[class_or_func_name] = True + + from tensorlayer import logging + + logging.warning( + '%s: `%s.%s` (in file: %s) is deprecated and will be removed %s.\n' + 'Instructions for updating: %s\n' % ( + "Class" if inspect.isclass(wrapped) else "Function", wrapped.__module__, class_or_func_name, + wrapped.__code__.co_filename, 'in a future version' if date is None else + ('after %s' % date), instructions + ) + ) + + return wrapped(*args, **kwargs) + + decorated = wrapper(wrapped) + + if sys.version_info > (3, 0): # docstring can only be edited with Python 3 + wrapt.FunctionWrapper.__setattr__( + decorated, "__doc__", add_deprecation_notice_to_docstring(wrapped.__doc__, date, instructions) + ) + + return decorated diff --git a/tensorlayer/decorators/deprecated_alias.py b/tensorlayer/decorators/deprecated_alias.py new file mode 100644 index 0000000..acd2c0f --- /dev/null +++ b/tensorlayer/decorators/deprecated_alias.py @@ -0,0 +1,46 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import functools +import warnings + +from tensorlayer import logging + + +def deprecated_alias(end_support_version, **aliases): + + def deco(f): + + @functools.wraps(f) + def wrapper(*args, **kwargs): + + try: + func_name = "{}.{}".format(args[0].__class__.__name__, f.__name__) + except (NameError, IndexError): + func_name = f.__name__ + + rename_kwargs(kwargs, aliases, end_support_version, func_name) + + return f(*args, **kwargs) + + return wrapper + + return deco + + +def rename_kwargs(kwargs, aliases, end_support_version, func_name): + + for alias, new in aliases.items(): + + if alias in kwargs: + + if new in kwargs: + raise TypeError('{}() received both {} and {}'.format(func_name, alias, new)) + + warnings.warn('{}() - {} is deprecated; use {}'.format(func_name, alias, new), DeprecationWarning) + logging.warning( + "DeprecationWarning: {}(): " + "`{}` argument is deprecated and will be removed in version {}, " + "please change for `{}.`".format(func_name, alias, end_support_version, new) + ) + kwargs[new] = kwargs.pop(alias) diff --git a/tensorlayer/decorators/method_decorator.py b/tensorlayer/decorators/method_decorator.py new file mode 100644 index 0000000..5d26220 --- /dev/null +++ b/tensorlayer/decorators/method_decorator.py @@ -0,0 +1,44 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import inspect + + +def private_method(func): + """Decorator for making an instance method private.""" + + def func_wrapper(*args, **kwargs): + """Decorator wrapper function.""" + outer_frame = inspect.stack()[1][0] + if 'self' not in outer_frame.f_locals or outer_frame.f_locals['self'] is not args[0]: + raise RuntimeError('%s.%s is a private method' % (args[0].__class__.__name__, func.__name__)) + + return func(*args, **kwargs) + + return func_wrapper + + +def protected_method(func): + """Decorator for making an instance method private.""" + + def func_wrapper(*args, **kwargs): + """Decorator wrapper function.""" + outer_frame = inspect.stack()[1][0] + + caller = inspect.getmro(outer_frame.f_locals['self'].__class__)[:-1] + target = inspect.getmro(args[0].__class__)[:-1] + + share_subsclass = False + + for cls_ in target: + if issubclass(caller[0], cls_) or caller[0] is cls_: + share_subsclass = True + break + + if ('self' not in outer_frame.f_locals or + outer_frame.f_locals['self'] is not args[0]) and (not share_subsclass): + raise RuntimeError('%s.%s is a protected method' % (args[0].__class__.__name__, func.__name__)) + + return func(*args, **kwargs) + + return func_wrapper diff --git a/tensorlayer/decorators/utils.py b/tensorlayer/decorators/utils.py new file mode 100644 index 0000000..c0d294e --- /dev/null +++ b/tensorlayer/decorators/utils.py @@ -0,0 +1,122 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +NOTE: DO NOT REMOVE THESE FILES. They are copied from Tensorflow repository and are necessary to build the library without installing TF. + +Source: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/python/util + +They replace the following imports: +>>> from tensorflow.python.util import decorator_utils +>>> from tensorflow.python.util.deprecation import _validate_deprecation_args +""" + +import re +import sys + +__all__ = ["add_deprecation_notice_to_docstring", "get_qualified_name", "validate_deprecation_args"] + + +def add_deprecation_notice_to_docstring(doc, date, instructions): + return _add_deprecated_function_notice_to_docstring(doc, date, instructions) + + +def get_qualified_name(function): + # Python 3 + if hasattr(function, '__qualname__'): + return function.__qualname__ + + # Python 2 + if hasattr(function, 'im_class'): + return function.im_class.__name__ + '.' + function.__name__ + return function.__name__ + + +def validate_deprecation_args(date, instructions): + if date is not None and not re.match(r'20\d\d-[01]\d-[0123]\d', date): + raise ValueError('Date must be YYYY-MM-DD.') + if not instructions: + raise ValueError('Don\'t deprecate things without conversion instructions!') + + +def _add_deprecated_function_notice_to_docstring(doc, date, instructions): + """Adds a deprecation notice to a docstring for deprecated functions.""" + + if instructions: + deprecation_message = """ + .. warning:: + **THIS FUNCTION IS DEPRECATED:** It will be removed after %s. + *Instructions for updating:* %s. + """ % (('in a future version' if date is None else ('after %s' % date)), instructions) + + else: + deprecation_message = """ + .. warning:: + **THIS FUNCTION IS DEPRECATED:** It will be removed after %s. + """ % (('in a future version' if date is None else ('after %s' % date))) + + main_text = [deprecation_message] + + return _add_notice_to_docstring(doc, 'DEPRECATED FUNCTION', main_text) + + +def _add_notice_to_docstring(doc, no_doc_str, notice): + """Adds a deprecation notice to a docstring.""" + if not doc: + lines = [no_doc_str] + + else: + lines = _normalize_docstring(doc).splitlines() + + notice = [''] + notice + + if len(lines) > 1: + # Make sure that we keep our distance from the main body + if lines[1].strip(): + notice.append('') + + lines[1:1] = notice + else: + lines += notice + + return '\n'.join(lines) + + +def _normalize_docstring(docstring): + """Normalizes the docstring. + + Replaces tabs with spaces, removes leading and trailing blanks lines, and + removes any indentation. + + Copied from PEP-257: + https://www.python.org/dev/peps/pep-0257/#handling-docstring-indentation + + Args: + docstring: the docstring to normalize + + Returns: + The normalized docstring + """ + if not docstring: + return '' + # Convert tabs to spaces (following the normal Python rules) + # and split into a list of lines: + lines = docstring.expandtabs().splitlines() + # Determine minimum indentation (first line doesn't count): + # (we use sys.maxsize because sys.maxint doesn't exist in Python 3) + indent = sys.maxsize + for line in lines[1:]: + stripped = line.lstrip() + if stripped: + indent = min(indent, len(line) - len(stripped)) + # Remove indentation (first line is special): + trimmed = [lines[0].strip()] + if indent < sys.maxsize: + for line in lines[1:]: + trimmed.append(line[indent:].rstrip()) + # Strip off trailing and leading blank lines: + while trimmed and not trimmed[-1]: + trimmed.pop() + while trimmed and not trimmed[0]: + trimmed.pop(0) + # Return a single string: + return '\n'.join(trimmed) diff --git a/tensorlayer/distributed.py b/tensorlayer/distributed.py new file mode 100644 index 0000000..3b426f8 --- /dev/null +++ b/tensorlayer/distributed.py @@ -0,0 +1,545 @@ +# -*- coding: utf-8 -*- + +import json +import os +import time + +import tensorflow as tf +from tensorflow.python.training import session_run_hook + +from tensorlayer import logging +from tensorlayer.decorators import deprecated +from tensorlayer.lazy_imports import LazyImport + +hvd = LazyImport('horovod.tensorflow') + +__all__ = ['TaskSpecDef', 'TaskSpec', 'DistributedSession', 'StopAtTimeHook', 'LoadCheckpoint', 'Trainer'] + + +class Trainer(object): + """Trainer for neural networks in a distributed environment. + + TensorLayer Trainer is a high-level training interface built on top of TensorFlow MonitoredSession and + `Horovod `__. It transparently scales the training of a TensorLayer model + from a single GPU to multiple GPUs that be placed on different machines in a single cluster. + + To run the trainer, you will need to install Horovod on your machine. Check the installation script at + `tensorlayer/scripts/download_and_install_openmpi3_ubuntu.sh` + + The minimal inputs to the Trainer include (1) a training dataset defined using the TensorFlow DataSet API, + and (2) a model build function given the inputs of the training dataset, and returns the neural network + to train, the loss function to minimize, and the names of the tensor to log during training, and (3) + an optimizer and its arguments. + + The default parameter choices of Trainer is inspired by the Facebook paper: + `Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour `__ + + Parameters + ---------- + training_dataset : class TensorFlow ``DataSet`` + The training dataset which zips samples and labels. The trainer automatically + shards the training dataset based on the number of GPUs. + build_training_func : function + A function that builds the training operator. It takes the training dataset as an input, + and returns the neural network, the loss function and a dictionary that maps + string tags to tensors to log during training. + optimizer : class TensorFlow ``Optimizer`` + The loss function optimizer. The trainer automatically linearly scale the learning rate based on + the number of GPUs. + optimizer_args : dict + The optimizer argument dictionary. It must contain a `learning_rate` field in type of float. + Note that the learning rate is linearly scaled according to the number of GPU by default. + You can disable it using the option `scaling_learning_rate` + batch_size : int + The training mini-batch size (i.e., number of samples per batch). + prefetch_size: int or None + The dataset prefetch buffer size. Set this parameter to overlap the GPU training and data preparation + if the data preparation is heavy. + checkpoint_dir : None or str + The path to the TensorFlow model checkpoint. Note that only one trainer master would checkpoints its model. + If None, checkpoint is disabled. + log_step_size : int + The trainer logs training information every N mini-batches (i.e., step size). + validation_dataset: None or class TensorFlow ``DataSet`` + The optional validation dataset that zips samples and labels. Note that + only the trainer master needs to the validation often. + build_validation_func: None or function + The function that builds the validation operator. It returns the validation neural network (which + share the weights of the training network) and a custom number of validation metrics. + scaling_learning_rate: Boolean + Linearly scale the learning rate by the number of GPUs. Default is True. + This `linear scaling rule` is generally effective and is highly recommended by the practioners. + Check `Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour `__ + max_iteration: int + The maximum iteration (i.e., mini-batch) to train. + The default is `math.inf`. You can set it to a small number to end the training earlier. This is + usually set for testing purpose. + + Attributes + ---------- + training_network : class TensorLayer ``Layer`` + The training model. + session : class TensorFlow ``MonitoredTrainingSession`` + The training session tha the Trainer wraps. + global_step : int + The number of training mini-batch by far. + validation_metrics : list of tuples + The validation metrics that zips the validation metric property and the average value. + + Examples + -------- + See `tutorial_mnist_distributed_trainer.py + `__. + + """ + + def __init__( + self, training_dataset, build_training_func, optimizer, optimizer_args, batch_size=32, prefetch_size=None, + checkpoint_dir=None, scaling_learning_rate=True, log_step_size=1, validation_dataset=None, + build_validation_func=None, max_iteration=float('inf') + ): + # Initialize Horovod. + hvd.init() + self.is_master = hvd.rank() == 0 + self._last_global_step = 0 + + if prefetch_size is None: + prefetch_size = batch_size + + # Define the loss for validation dataset + if validation_dataset: + validation_dataset = validation_dataset.shard(num_shards=hvd.size(), index=hvd.rank()).batch(batch_size) + validation_dataset.prefetch(buffer_size=prefetch_size) + self._validation_iterator = validation_dataset.make_initializable_iterator() + next_example, next_label = self._validation_iterator.get_next() + _, self._validation_metrics = build_validation_func(next_example, next_label) + if not isinstance(self._validation_metrics, list): + self._validation_metrics = list(self._validation_metrics) + else: + self._validation_iterator = None + self._validation_metrics = None + + # Get the shard of the dataset based on my local rank + training_dataset = training_dataset.shard(num_shards=hvd.size(), index=hvd.rank()).batch(batch_size) + + training_dataset.prefetch(buffer_size=prefetch_size) + training_iterator = training_dataset.make_one_shot_iterator() + self._training_network, loss, log_tensors = build_training_func(*training_iterator.get_next()) + + # Adjust learning rate based on number of GPUs. + lr = optimizer_args['learning_rate'] + optimizer_args['learning_rate'] = lr * hvd.size() if scaling_learning_rate else lr + opt = optimizer(**optimizer_args) + + # Add Horovod Distributed Optimizer. + opt = hvd.DistributedOptimizer(opt) + + self._global_step = tf.train.get_or_create_global_step() + if isinstance(log_tensors, list): + log_tensors.append(self._global_step) + else: + log_tensors['global_step'] = self._global_step + self._train_op = opt.minimize(loss, global_step=self._global_step) + + hooks = [ + # Horovod: BroadcastGlobalVariablesHook broadcasts initial variable states + # from rank 0 to all other processes. This is necessary to ensure consistent + # initialization of all workers when training is started with random weights + # or restored from a checkpoint. + hvd.BroadcastGlobalVariablesHook(0), + + # Horovod: adjust number of steps based on number of GPUs. + tf.train.StopAtStepHook(last_step=max_iteration // hvd.size()), + tf.train.LoggingTensorHook(tensors=log_tensors, every_n_iter=log_step_size), + ] + + # Pin GPU to be used to process local rank (one GPU per process) + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + config.gpu_options.visible_device_list = str(hvd.local_rank()) + + # Save checkpoints only on worker 0 to prevent other workers from + # corrupting them. + checkpoint_dir = checkpoint_dir if self.is_master else None + + # The MonitoredTrainingSession takes care of session initialization, + # restoring from a checkpoint, saving to a checkpoint, and closing when done + # or an error occurs. + self._sess = tf.train.MonitoredTrainingSession(checkpoint_dir=checkpoint_dir, hooks=hooks, config=config) + + @property + def global_step(self): + if self._sess.should_stop(): + return self._last_global_step + self._last_global_step = self._sess.run(self._global_step) + return self._last_global_step + + @property + def session(self): + return self._sess + + @property + def training_network(self): + return self._training_network + + @property + def validation_metrics(self): + """A helper function to compute validation related metrics""" + + if (self._validation_iterator is None) or (self._validation_metrics is None): + raise AttributeError('Validation is not setup.') + + n = 0.0 + metric_sums = [0.0] * len(self._validation_metrics) + self._sess.run(self._validation_iterator.initializer) + while True: + try: + metrics = self._sess.run(self._validation_metrics) + for i, m in enumerate(metrics): + metric_sums[i] += m + n += 1.0 + except tf.errors.OutOfRangeError: + break + for i, m in enumerate(metric_sums): + metric_sums[i] = metric_sums[i] / n + return zip(self._validation_metrics, metric_sums) + + def train_on_batch(self): + """Train a mini-batch.""" + self._sess.run(self._train_op) + + def train_and_validate_to_end(self, validate_step_size=50): + """A helper function that shows how to train and validate a model at the same time. + + Parameters + ---------- + validate_step_size : int + Validate the training network every N steps. + + """ + while not self._sess.should_stop(): + self.train_on_batch() # Run a training step synchronously. + if self.global_step % validate_step_size == 0: + # logging.info("Average loss for validation dataset: %s" % self.get_validation_metrics()) + log_str = 'step: %d, ' % self.global_step + for n, m in self.validation_metrics: + log_str += '%s: %f, ' % (n.name, m) + logging.info(log_str) + + +@deprecated(date="2018-10-30", instructions="Using the TensorLayer distributed trainer.") +class TaskSpecDef(object): + """Specification for a distributed task. + + It contains the job name, index of the task, + the parameter servers and the worker servers. If you want to use the last worker + for continuous evaluation you can call the method `use_last_worker_as_evaluator` + which returns a new :class:`TaskSpecDef` object without the last worker in the + cluster specification. + + Parameters + ---------- + task_type : str + Task type. One of `master`, `worker` or `ps`. + index : int + The zero-based index of the task. Distributed training jobs will have a single + master task, one or more parameter servers, and one or more workers. + trial : int + The identifier of the trial being run. + ps_hosts : str OR list of str + A string with a coma separate list of hosts for the parameter servers + or a list of hosts. + worker_hosts : str OR list of str + A string with a coma separate list of hosts for the worker servers + or a list of hosts. + master : str + A string with the master hosts + + Notes + ---------- + master might not be included in TF_CONFIG and can be None. The shard_index is adjusted + in any case to assign 0 to master and >= 1 to workers. + This implementation doesn't support sparse arrays in the `TF_CONFIG` variable as the + official TensorFlow documentation shows, as it is not a supported by the json + definition. + + References + ---------- + - `ML-engine trainer considerations `__ + + """ + + def __init__(self, task_type='master', index=0, trial=None, ps_hosts=None, worker_hosts=None, master=None): + self.type = task_type + self._index = int(index) + self._cluster_spec = None + self.num_workers = 1 + self.num_ps = 0 + self.shard_index = int(index) + self._master = True + self.trial = trial + self.ps_hosts = ps_hosts + self.worker_hosts = worker_hosts + self.master = master + self._server = None + + if ps_hosts and worker_hosts: + self.ps_hosts = ps_hosts if isinstance(ps_hosts, list) else ps_hosts.split(',') + self.num_ps = len(self.ps_hosts) + self.worker_hosts = worker_hosts if isinstance(worker_hosts, list) else worker_hosts.split(',') + if master is not None and len(master) > 0: + self._cluster_spec = tf.train.ClusterSpec( + { + 'ps': self.ps_hosts, + 'worker': self.worker_hosts, + 'master': master + } + ) + # master is a worker too + self.num_workers = len(self.worker_hosts) + 1 + if self.type == 'worker': + self.shard_index = self._index + 1 + self._master = self.type == 'master' + else: + self._cluster_spec = tf.train.ClusterSpec({'ps': self.ps_hosts, 'worker': self.worker_hosts}) + self.num_workers = len(self.worker_hosts) + if self.type == 'worker': + self.shard_index = self._index + self._master = self.type == 'worker' and self._index == 0 + + def is_ps(self): + """Returns true if this server is a parameter server""" + return self.type == 'ps' + + def is_worker(self): + """Returns true if this server is a worker server""" + return self.type == 'worker' + + def is_master(self): + """Returns true if this server is the master server""" + return self._master + + def is_evaluator(self): + """Returns true if this server is the evaluator server""" + return self.type == 'worker' and self.num_workers == self._index + + def device_fn(self): + """Returns the function with the specification to create the graph in this server""" + current_device = '/job:{}/task:{}'.format(self.type, self._index) + ps_devices = '/job:ps' + return tf.train.replica_device_setter( + ps_device=ps_devices, worker_device=current_device, cluster=self._cluster_spec + ) + + def create_server(self): + if self._server is None and self.ps_hosts and self.worker_hosts and not self.is_evaluator(): + # create server and join if it is a parameter server + self._server = tf.train.Server(self._cluster_spec, job_name=self.type, task_index=self._index) + if self.is_ps(): + self._server.join() + + def target(self): + if self._server is None: + self.create_server() + if self._server is not None: + return self._server.target + else: + return None + + def use_last_worker_as_evaluator(self): + """Returns a new :class:`TaskSpecDef` where the last worker has been removed from + the list of worker_hosts, so it is not used for training anymore. You can call + is_evaluator to know whether this server is the evaluator one or not. + In case there is only one server for training this method raises an exception, as + you cannot use any server for evaluation. + + """ + if self.num_workers <= 1: + raise Exception('You need more than one worker instance to use one as evaluator') + + return TaskSpecDef( + task_type=self.type, index=self._index, trial=self.trial, ps_hosts=self.ps_hosts, + worker_hosts=self.worker_hosts[:-1], master=self.master + ) + + +@deprecated(date="2018-10-30", instructions="Using the TensorLayer distributed trainer.") +def create_task_spec_def(): + """Returns the a :class:`TaskSpecDef` based on the environment variables for distributed training. + + References + ---------- + - `ML-engine trainer considerations `__ + - `TensorPort Distributed Computing `__ + + """ + if 'TF_CONFIG' in os.environ: + # TF_CONFIG is used in ML-engine + env = json.loads(os.environ.get('TF_CONFIG', '{}')) + task_data = env.get('task', None) or {'type': 'master', 'index': 0} + cluster_data = env.get('cluster', None) or {'ps': None, 'worker': None, 'master': None} + return TaskSpecDef( + task_type=task_data['type'], index=task_data['index'], + trial=task_data['trial'] if 'trial' in task_data else None, ps_hosts=cluster_data['ps'], + worker_hosts=cluster_data['worker'], master=cluster_data['master'] if 'master' in cluster_data else None + ) + elif 'JOB_NAME' in os.environ: + # JOB_NAME, TASK_INDEX, PS_HOSTS, WORKER_HOSTS and MASTER_HOST are used in TensorPort + return TaskSpecDef( + task_type=os.environ['JOB_NAME'], index=os.environ['TASK_INDEX'], ps_hosts=os.environ.get('PS_HOSTS', None), + worker_hosts=os.environ.get('WORKER_HOSTS', None), master=os.environ.get('MASTER_HOST', None) + ) + else: + raise Exception('You need to setup TF_CONFIG or JOB_NAME to define the task.') + + +@deprecated(date="2018-10-30", instructions="Using the TensorLayer distributed trainer.") +def create_distributed_session( + task_spec=None, checkpoint_dir=None, scaffold=None, hooks=None, chief_only_hooks=None, save_checkpoint_secs=600, + save_summaries_steps=object(), save_summaries_secs=object(), config=None, stop_grace_period_secs=120, + log_step_count_steps=100 +): + """Creates a distributed session. + + It calls `MonitoredTrainingSession` to create a :class:`MonitoredSession` for distributed training. + + Parameters + ---------- + task_spec : :class:`TaskSpecDef`. + The task spec definition from create_task_spec_def() + checkpoint_dir : str. + Optional path to a directory where to restore variables. + scaffold : ``Scaffold`` + A `Scaffold` used for gathering or building supportive ops. + If not specified, a default one is created. It's used to finalize the graph. + hooks : list of ``SessionRunHook`` objects. + Optional + chief_only_hooks : list of ``SessionRunHook`` objects. + Activate these hooks if `is_chief==True`, ignore otherwise. + save_checkpoint_secs : int + The frequency, in seconds, that a checkpoint is saved + using a default checkpoint saver. If `save_checkpoint_secs` is set to + `None`, then the default checkpoint saver isn't used. + save_summaries_steps : int + The frequency, in number of global steps, that the + summaries are written to disk using a default summary saver. If both + `save_summaries_steps` and `save_summaries_secs` are set to `None`, then + the default summary saver isn't used. Default 100. + save_summaries_secs : int + The frequency, in secs, that the summaries are written + to disk using a default summary saver. If both `save_summaries_steps` and + `save_summaries_secs` are set to `None`, then the default summary saver + isn't used. Default not enabled. + config : ``tf.ConfigProto`` + an instance of `tf.ConfigProto` proto used to configure the session. + It's the `config` argument of constructor of `tf.Session`. + stop_grace_period_secs : int + Number of seconds given to threads to stop after + `close()` has been called. + log_step_count_steps : int + The frequency, in number of global steps, that the + global step/sec is logged. + + Examples + -------- + A simple example for distributed training where all the workers use the same dataset: + + >>> task_spec = TaskSpec() + >>> with tf.device(task_spec.device_fn()): + >>> tensors = create_graph() + >>> with tl.DistributedSession(task_spec=task_spec, + ... checkpoint_dir='/tmp/ckpt') as session: + >>> while not session.should_stop(): + >>> session.run(tensors) + + An example where the dataset is shared among the workers + (see https://www.tensorflow.org/programmers_guide/datasets): + + >>> task_spec = TaskSpec() + >>> # dataset is a :class:`tf.data.Dataset` with the raw data + >>> dataset = create_dataset() + >>> if task_spec is not None: + >>> dataset = dataset.shard(task_spec.num_workers, task_spec.shard_index) + >>> # shuffle or apply a map function to the new sharded dataset, for example: + >>> dataset = dataset.shuffle(buffer_size=10000) + >>> dataset = dataset.batch(batch_size) + >>> dataset = dataset.repeat(num_epochs) + >>> # create the iterator for the dataset and the input tensor + >>> iterator = dataset.make_one_shot_iterator() + >>> next_element = iterator.get_next() + >>> with tf.device(task_spec.device_fn()): + >>> # next_element is the input for the graph + >>> tensors = create_graph(next_element) + >>> with tl.DistributedSession(task_spec=task_spec, + ... checkpoint_dir='/tmp/ckpt') as session: + >>> while not session.should_stop(): + >>> session.run(tensors) + + References + ---------- + - `MonitoredTrainingSession `__ + + """ + target = task_spec.target() if task_spec is not None else None + is_chief = task_spec.is_master() if task_spec is not None else True + return tf.train.MonitoredTrainingSession( + master=target, is_chief=is_chief, checkpoint_dir=checkpoint_dir, scaffold=scaffold, + save_checkpoint_secs=save_checkpoint_secs, save_summaries_steps=save_summaries_steps, + save_summaries_secs=save_summaries_secs, log_step_count_steps=log_step_count_steps, + stop_grace_period_secs=stop_grace_period_secs, config=config, hooks=hooks, chief_only_hooks=chief_only_hooks + ) + + +@deprecated(date="2018-10-30", instructions="Using the TensorLayer distributed trainer.") +class StopAtTimeHook(session_run_hook.SessionRunHook): + """Hook that requests stop after a specified time. + + Parameters + ---------- + time_running: int + Maximum time running in seconds + + """ + + def __init__(self, time_running): + self._time_running = time_running + self._end_time = 0 + + def begin(self): + self._end_time = time.time() + self._time_running + + def after_run(self, run_context, run_values): + if time.time() > self._end_time: + run_context.request_stop() + + +@deprecated(date="2018-10-30", instructions="Using the TensorLayer distributed trainer.") +class LoadCheckpoint(session_run_hook.SessionRunHook): + """Hook that loads a checkpoint after the session is created. + + >>> from tensorflow.python.ops import variables as tf_variables + >>> from tensorflow.python.training.monitored_session import SingularMonitoredSession + >>> + >>> tensors = create_graph() + >>> saver = tf.train.Saver(var_list=tf_variables.trainable_variables()) + >>> checkpoint_hook = LoadCheckpoint(saver, my_checkpoint_file) + >>> with tf.SingularMonitoredSession(hooks=[checkpoint_hook]) as session: + >>> while not session.should_stop(): + >>> session.run(tensors) + + """ + + def __init__(self, saver, checkpoint): + self._saver = saver + self._checkpoint = checkpoint + self._loaded = False + + def after_create_session(self, session, coord): + if not self._loaded: + self._loaded = True + self._saver.restore(self._checkpoint) + + +# Alias +TaskSpec = create_task_spec_def +DistributedSession = create_distributed_session diff --git a/tensorlayer/files/__init__.py b/tensorlayer/files/__init__.py new file mode 100644 index 0000000..8d985af --- /dev/null +++ b/tensorlayer/files/__init__.py @@ -0,0 +1,77 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +TensorLayer provides rich layer implementations trailed for +various benchmarks and domain-specific problems. In addition, we also +support transparent access to native TensorFlow parameters. +For example, we provide not only layers for local response normalization, but also +layers that allow user to apply ``tf.ops.lrn`` on ``network.outputs``. +More functions can be found in `TensorFlow API `__. +""" + +from tensorlayer.lazy_imports import LazyImport + +from .dataset_loaders.celebA_dataset import * +from .dataset_loaders.cifar10_dataset import * +from .dataset_loaders.cyclegan_dataset import * +from .dataset_loaders.flickr_1M_dataset import * +from .dataset_loaders.flickr_25k_dataset import * +from .dataset_loaders.imdb_dataset import * +from .dataset_loaders.matt_mahoney_dataset import * +from .dataset_loaders.mnist_dataset import * +from .dataset_loaders.mnist_fashion_dataset import * +from .dataset_loaders.mpii_dataset import * +from .dataset_loaders.nietzsche_dataset import * +from .dataset_loaders.ptb_dataset import * +from .dataset_loaders.voc_dataset import * +from .dataset_loaders.wmt_en_fr_dataset import * +from .utils import * + +__all__ = [ + # Dataset Loaders + 'load_celebA_dataset', + 'load_cifar10_dataset', + 'load_cyclegan_dataset', + 'load_fashion_mnist_dataset', + 'load_flickr1M_dataset', + 'load_flickr25k_dataset', + 'load_imdb_dataset', + 'load_matt_mahoney_text8_dataset', + 'load_mnist_dataset', + 'load_mpii_pose_dataset', + 'load_nietzsche_dataset', + 'load_ptb_dataset', + 'load_voc_dataset', + 'load_wmt_en_fr_dataset', + + # Util Functions + 'assign_params', + 'del_file', + 'del_folder', + 'download_file_from_google_drive', + 'exists_or_mkdir', + 'file_exists', + 'folder_exists', + 'load_and_assign_npz', + 'load_and_assign_npz_dict', + 'load_ckpt', + 'load_cropped_svhn', + 'load_file_list', + 'load_folder_list', + 'load_npy_to_any', + 'load_npz', + 'maybe_download_and_extract', + 'natural_keys', + 'npz_to_W_pdf', + 'read_file', + 'save_any_to_npy', + 'save_ckpt', + 'save_npz', + 'save_npz_dict', + 'load_and_assign_ckpt', + 'ckpt_to_npz_dict' + #'save_graph', + #'load_graph', + #'save_graph_and_params', + #'load_graph_and_params', +] diff --git a/tensorlayer/files/dataset_loaders/__init__.py b/tensorlayer/files/dataset_loaders/__init__.py new file mode 100644 index 0000000..59a5551 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/__init__.py @@ -0,0 +1,34 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from .celebA_dataset import * +from .cifar10_dataset import * +from .cyclegan_dataset import * +from .flickr_1M_dataset import * +from .flickr_25k_dataset import * +from .imdb_dataset import * +from .matt_mahoney_dataset import * +from .mnist_dataset import * +from .mnist_fashion_dataset import * +from .mpii_dataset import * +from .nietzsche_dataset import * +from .ptb_dataset import * +from .voc_dataset import * +from .wmt_en_fr_dataset import * + +__all__ = [ + 'load_celebA_dataset', + 'load_cifar10_dataset', + 'load_cyclegan_dataset', + 'load_fashion_mnist_dataset', + 'load_flickr1M_dataset', + 'load_flickr25k_dataset', + 'load_imdb_dataset', + 'load_matt_mahoney_text8_dataset', + 'load_mnist_dataset', + 'load_mpii_pose_dataset', + 'load_nietzsche_dataset', + 'load_ptb_dataset', + 'load_voc_dataset', + 'load_wmt_en_fr_dataset', +] diff --git a/tensorlayer/files/dataset_loaders/celebA_dataset.py b/tensorlayer/files/dataset_loaders/celebA_dataset.py new file mode 100644 index 0000000..d5dc575 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/celebA_dataset.py @@ -0,0 +1,43 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os +import zipfile + +from tensorlayer import logging +from tensorlayer.files.utils import (download_file_from_google_drive, exists_or_mkdir, load_file_list) + +__all__ = ['load_celebA_dataset'] + + +def load_celebA_dataset(path='data'): + """Load CelebA dataset + + Return a list of image path. + + Parameters + ----------- + path : str + The path that the data is downloaded to, defaults is ``data/celebA/``. + + """ + data_dir = 'celebA' + filename, drive_id = "img_align_celeba.zip", "0B7EVK8r0v71pZjFTYXZWM3FlRnM" + save_path = os.path.join(path, filename) + image_path = os.path.join(path, data_dir) + if os.path.exists(image_path): + logging.info('[*] {} already exists'.format(save_path)) + else: + exists_or_mkdir(path) + download_file_from_google_drive(drive_id, save_path) + zip_dir = '' + with zipfile.ZipFile(save_path) as zf: + zip_dir = zf.namelist()[0] + zf.extractall(path) + os.remove(save_path) + os.rename(os.path.join(path, zip_dir), image_path) + + data_files = load_file_list(path=image_path, regx='\\.jpg', printable=False) + for i, _v in enumerate(data_files): + data_files[i] = os.path.join(image_path, data_files[i]) + return data_files diff --git a/tensorlayer/files/dataset_loaders/cifar10_dataset.py b/tensorlayer/files/dataset_loaders/cifar10_dataset.py new file mode 100644 index 0000000..9af3f61 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/cifar10_dataset.py @@ -0,0 +1,134 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os +import pickle +import sys + +import numpy as np + +from tensorlayer import logging +from tensorlayer.files.utils import maybe_download_and_extract + +__all__ = ['load_cifar10_dataset'] + + +def load_cifar10_dataset(shape=(-1, 32, 32, 3), path='data', plotable=False): + """Load CIFAR-10 dataset. + + It consists of 60000 32x32 colour images in 10 classes, with + 6000 images per class. There are 50000 training images and 10000 test images. + + The dataset is divided into five training batches and one test batch, each with + 10000 images. The test batch contains exactly 1000 randomly-selected images from + each class. The training batches contain the remaining images in random order, + but some training batches may contain more images from one class than another. + Between them, the training batches contain exactly 5000 images from each class. + + Parameters + ---------- + shape : tupe + The shape of digit images e.g. (-1, 3, 32, 32) and (-1, 32, 32, 3). + path : str + The path that the data is downloaded to, defaults is ``data/cifar10/``. + plotable : boolean + Whether to plot some image examples, False as default. + + Examples + -------- + >>> X_train, y_train, X_test, y_test = tl.files.load_cifar10_dataset(shape=(-1, 32, 32, 3)) + + References + ---------- + - `CIFAR website `__ + - `Data download link `__ + - ``__ + + """ + path = os.path.join(path, 'cifar10') + logging.info("Load or Download cifar10 > {}".format(path)) + + #Helper function to unpickle the data + def unpickle(file): + fp = open(file, 'rb') + if sys.version_info.major == 2: + data = pickle.load(fp) + elif sys.version_info.major == 3: + data = pickle.load(fp, encoding='latin-1') + else: + raise RuntimeError("Sys Version Unsupported") + fp.close() + return data + + filename = 'cifar-10-python.tar.gz' + url = 'https://www.cs.toronto.edu/~kriz/' + #Download and uncompress file + maybe_download_and_extract(filename, path, url, extract=True) + + #Unpickle file and fill in data + X_train = None + y_train = [] + for i in range(1, 6): + data_dic = unpickle(os.path.join(path, 'cifar-10-batches-py/', "data_batch_{}".format(i))) + if i == 1: + X_train = data_dic['data'] + else: + X_train = np.vstack((X_train, data_dic['data'])) + y_train += data_dic['labels'] + + test_data_dic = unpickle(os.path.join(path, 'cifar-10-batches-py/', "test_batch")) + X_test = test_data_dic['data'] + y_test = np.array(test_data_dic['labels']) + + if shape == (-1, 3, 32, 32): + X_test = X_test.reshape(shape) + X_train = X_train.reshape(shape) + elif shape == (-1, 32, 32, 3): + X_test = X_test.reshape(shape, order='F') + X_train = X_train.reshape(shape, order='F') + X_test = np.transpose(X_test, (0, 2, 1, 3)) + X_train = np.transpose(X_train, (0, 2, 1, 3)) + else: + X_test = X_test.reshape(shape) + X_train = X_train.reshape(shape) + + y_train = np.array(y_train) + + if plotable: + logging.info('\nCIFAR-10') + import matplotlib.pyplot as plt + fig = plt.figure(1) + + logging.info('Shape of a training image: X_train[0] %s' % X_train[0].shape) + + plt.ion() # interactive mode + count = 1 + for _ in range(10): # each row + for _ in range(10): # each column + _ = fig.add_subplot(10, 10, count) + if shape == (-1, 3, 32, 32): + # plt.imshow(X_train[count-1], interpolation='nearest') + plt.imshow(np.transpose(X_train[count - 1], (1, 2, 0)), interpolation='nearest') + # plt.imshow(np.transpose(X_train[count-1], (2, 1, 0)), interpolation='nearest') + elif shape == (-1, 32, 32, 3): + plt.imshow(X_train[count - 1], interpolation='nearest') + # plt.imshow(np.transpose(X_train[count-1], (1, 0, 2)), interpolation='nearest') + else: + raise Exception("Do not support the given 'shape' to plot the image examples") + plt.gca().xaxis.set_major_locator(plt.NullLocator()) + plt.gca().yaxis.set_major_locator(plt.NullLocator()) + count = count + 1 + plt.draw() # interactive mode + plt.pause(3) # interactive mode + + logging.info("X_train: %s" % X_train.shape) + logging.info("y_train: %s" % y_train.shape) + logging.info("X_test: %s" % X_test.shape) + logging.info("y_test: %s" % y_test.shape) + + X_train = np.asarray(X_train, dtype=np.float32) + X_test = np.asarray(X_test, dtype=np.float32) + y_train = np.asarray(y_train, dtype=np.int32) + y_test = np.asarray(y_test, dtype=np.int32) + + return X_train, y_train, X_test, y_test diff --git a/tensorlayer/files/dataset_loaders/cyclegan_dataset.py b/tensorlayer/files/dataset_loaders/cyclegan_dataset.py new file mode 100644 index 0000000..e327b3b --- /dev/null +++ b/tensorlayer/files/dataset_loaders/cyclegan_dataset.py @@ -0,0 +1,58 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os + +import numpy as np + +from tensorlayer import logging, visualize +from tensorlayer.files.utils import (del_file, folder_exists, load_file_list, maybe_download_and_extract) + +__all__ = ['load_cyclegan_dataset'] + + +def load_cyclegan_dataset(filename='summer2winter_yosemite', path='data'): + """Load images from CycleGAN's database, see `this link `__. + + Parameters + ------------ + filename : str + The dataset you want, see `this link `__. + path : str + The path that the data is downloaded to, defaults is `data/cyclegan` + + Examples + --------- + >>> im_train_A, im_train_B, im_test_A, im_test_B = load_cyclegan_dataset(filename='summer2winter_yosemite') + + """ + path = os.path.join(path, 'cyclegan') + url = 'https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/' + + if folder_exists(os.path.join(path, filename)) is False: + logging.info("[*] {} is nonexistent in {}".format(filename, path)) + maybe_download_and_extract(filename + '.zip', path, url, extract=True) + del_file(os.path.join(path, filename + '.zip')) + + def load_image_from_folder(path): + path_imgs = load_file_list(path=path, regx='\\.jpg', printable=False) + return visualize.read_images(path_imgs, path=path, n_threads=10, printable=False) + + im_train_A = load_image_from_folder(os.path.join(path, filename, "trainA")) + im_train_B = load_image_from_folder(os.path.join(path, filename, "trainB")) + im_test_A = load_image_from_folder(os.path.join(path, filename, "testA")) + im_test_B = load_image_from_folder(os.path.join(path, filename, "testB")) + + def if_2d_to_3d(images): # [h, w] --> [h, w, 3] + for i, _v in enumerate(images): + if len(images[i].shape) == 2: + images[i] = images[i][:, :, np.newaxis] + images[i] = np.tile(images[i], (1, 1, 3)) + return images + + im_train_A = if_2d_to_3d(im_train_A) + im_train_B = if_2d_to_3d(im_train_B) + im_test_A = if_2d_to_3d(im_test_A) + im_test_B = if_2d_to_3d(im_test_B) + + return im_train_A, im_train_B, im_test_A, im_test_B diff --git a/tensorlayer/files/dataset_loaders/flickr_1M_dataset.py b/tensorlayer/files/dataset_loaders/flickr_1M_dataset.py new file mode 100644 index 0000000..f2e582a --- /dev/null +++ b/tensorlayer/files/dataset_loaders/flickr_1M_dataset.py @@ -0,0 +1,116 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os + +from tensorlayer import logging, visualize +from tensorlayer.files.utils import ( + del_file, folder_exists, load_file_list, load_folder_list, maybe_download_and_extract, read_file +) + +__all__ = ['load_flickr1M_dataset'] + + +def load_flickr1M_dataset(tag='sky', size=10, path="data", n_threads=50, printable=False): + """Load Flick1M dataset. + + Returns a list of images by a given tag from Flickr1M dataset, + it will download Flickr1M from `the official website `__ + at the first time you use it. + + Parameters + ------------ + tag : str or None + What images to return. + - If you want to get images with tag, use string like 'dog', 'red', see `Flickr Search `__. + - If you want to get all images, set to ``None``. + + size : int + integer between 1 to 10. 1 means 100k images ... 5 means 500k images, 10 means all 1 million images. Default is 10. + path : str + The path that the data is downloaded to, defaults is ``data/flickr25k/``. + n_threads : int + The number of thread to read image. + printable : boolean + Whether to print infomation when reading images, default is ``False``. + + Examples + ---------- + Use 200k images + + >>> images = tl.files.load_flickr1M_dataset(tag='zebra', size=2) + + Use 1 Million images + + >>> images = tl.files.load_flickr1M_dataset(tag='zebra') + + """ + import shutil + + path = os.path.join(path, 'flickr1M') + logging.info("[Flickr1M] using {}% of images = {}".format(size * 10, size * 100000)) + images_zip = [ + 'images0.zip', 'images1.zip', 'images2.zip', 'images3.zip', 'images4.zip', 'images5.zip', 'images6.zip', + 'images7.zip', 'images8.zip', 'images9.zip' + ] + tag_zip = 'tags.zip' + url = 'http://press.liacs.nl/mirflickr/mirflickr1m/' + + # download dataset + for image_zip in images_zip[0:size]: + image_folder = image_zip.split(".")[0] + # logging.info(path+"/"+image_folder) + if folder_exists(os.path.join(path, image_folder)) is False: + # logging.info(image_zip) + logging.info("[Flickr1M] {} is missing in {}".format(image_folder, path)) + maybe_download_and_extract(image_zip, path, url, extract=True) + del_file(os.path.join(path, image_zip)) + # os.system("mv {} {}".format(os.path.join(path, 'images'), os.path.join(path, image_folder))) + shutil.move(os.path.join(path, 'images'), os.path.join(path, image_folder)) + else: + logging.info("[Flickr1M] {} exists in {}".format(image_folder, path)) + + # download tag + if folder_exists(os.path.join(path, "tags")) is False: + logging.info("[Flickr1M] tag files is nonexistent in {}".format(path)) + maybe_download_and_extract(tag_zip, path, url, extract=True) + del_file(os.path.join(path, tag_zip)) + else: + logging.info("[Flickr1M] tags exists in {}".format(path)) + + # 1. image path list + images_list = [] + images_folder_list = [] + for i in range(0, size): + images_folder_list += load_folder_list(path=os.path.join(path, 'images%d' % i)) + images_folder_list.sort(key=lambda s: int(s.split('/')[-1])) # folder/images/ddd + + for folder in images_folder_list[0:size * 10]: + tmp = load_file_list(path=folder, regx='\\.jpg', printable=False) + tmp.sort(key=lambda s: int(s.split('.')[-2])) # ddd.jpg + images_list.extend([os.path.join(folder, x) for x in tmp]) + + # 2. tag path list + tag_list = [] + tag_folder_list = load_folder_list(os.path.join(path, "tags")) + + # tag_folder_list.sort(key=lambda s: int(s.split("/")[-1])) # folder/images/ddd + tag_folder_list.sort(key=lambda s: int(os.path.basename(s))) + + for folder in tag_folder_list[0:size * 10]: + tmp = load_file_list(path=folder, regx='\\.txt', printable=False) + tmp.sort(key=lambda s: int(s.split('.')[-2])) # ddd.txt + tmp = [os.path.join(folder, s) for s in tmp] + tag_list += tmp + + # 3. select images + logging.info("[Flickr1M] searching tag: {}".format(tag)) + select_images_list = [] + for idx, _val in enumerate(tag_list): + tags = read_file(tag_list[idx]).split('\n') + if tag in tags: + select_images_list.append(images_list[idx]) + + logging.info("[Flickr1M] reading images with tag: {}".format(tag)) + images = visualize.read_images(select_images_list, '', n_threads=n_threads, printable=printable) + return images diff --git a/tensorlayer/files/dataset_loaders/flickr_25k_dataset.py b/tensorlayer/files/dataset_loaders/flickr_25k_dataset.py new file mode 100644 index 0000000..8049a06 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/flickr_25k_dataset.py @@ -0,0 +1,81 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os + +from tensorlayer import logging, visualize +from tensorlayer.files.utils import ( + del_file, folder_exists, load_file_list, maybe_download_and_extract, natural_keys, read_file +) + +__all__ = ['load_flickr25k_dataset'] + + +def load_flickr25k_dataset(tag='sky', path="data", n_threads=50, printable=False): + """Load Flickr25K dataset. + + Returns a list of images by a given tag from Flick25k dataset, + it will download Flickr25k from `the official website `__ + at the first time you use it. + + Parameters + ------------ + tag : str or None + What images to return. + - If you want to get images with tag, use string like 'dog', 'red', see `Flickr Search `__. + - If you want to get all images, set to ``None``. + + path : str + The path that the data is downloaded to, defaults is ``data/flickr25k/``. + n_threads : int + The number of thread to read image. + printable : boolean + Whether to print infomation when reading images, default is ``False``. + + Examples + ----------- + Get images with tag of sky + + >>> images = tl.files.load_flickr25k_dataset(tag='sky') + + Get all images + + >>> images = tl.files.load_flickr25k_dataset(tag=None, n_threads=100, printable=True) + + """ + path = os.path.join(path, 'flickr25k') + + filename = 'mirflickr25k.zip' + url = 'http://press.liacs.nl/mirflickr/mirflickr25k/' + + # download dataset + if folder_exists(os.path.join(path, "mirflickr")) is False: + logging.info("[*] Flickr25k is nonexistent in {}".format(path)) + maybe_download_and_extract(filename, path, url, extract=True) + del_file(os.path.join(path, filename)) + + # return images by the given tag. + # 1. image path list + folder_imgs = os.path.join(path, "mirflickr") + path_imgs = load_file_list(path=folder_imgs, regx='\\.jpg', printable=False) + path_imgs.sort(key=natural_keys) + + # 2. tag path list + folder_tags = os.path.join(path, "mirflickr", "meta", "tags") + path_tags = load_file_list(path=folder_tags, regx='\\.txt', printable=False) + path_tags.sort(key=natural_keys) + + # 3. select images + if tag is None: + logging.info("[Flickr25k] reading all images") + else: + logging.info("[Flickr25k] reading images with tag: {}".format(tag)) + images_list = [] + for idx, _v in enumerate(path_tags): + tags = read_file(os.path.join(folder_tags, path_tags[idx])).split('\n') + # logging.info(idx+1, tags) + if tag is None or tag in tags: + images_list.append(path_imgs[idx]) + + images = visualize.read_images(images_list, folder_imgs, n_threads=n_threads, printable=printable) + return images diff --git a/tensorlayer/files/dataset_loaders/imdb_dataset.py b/tensorlayer/files/dataset_loaders/imdb_dataset.py new file mode 100644 index 0000000..2967e7e --- /dev/null +++ b/tensorlayer/files/dataset_loaders/imdb_dataset.py @@ -0,0 +1,115 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import gzip +import os + +import numpy as np +import six.moves.cPickle as pickle + +from tensorlayer.files.utils import maybe_download_and_extract + +__all__ = ['load_imdb_dataset'] + + +def load_imdb_dataset( + path='data', nb_words=None, skip_top=0, maxlen=None, test_split=0.2, seed=113, start_char=1, oov_char=2, + index_from=3 +): + """Load IMDB dataset. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/imdb/``. + nb_words : int + Number of words to get. + skip_top : int + Top most frequent words to ignore (they will appear as oov_char value in the sequence data). + maxlen : int + Maximum sequence length. Any longer sequence will be truncated. + seed : int + Seed for reproducible data shuffling. + start_char : int + The start of a sequence will be marked with this character. Set to 1 because 0 is usually the padding character. + oov_char : int + Words that were cut out because of the num_words or skip_top limit will be replaced with this character. + index_from : int + Index actual words with this index and higher. + + Examples + -------- + >>> X_train, y_train, X_test, y_test = tl.files.load_imdb_dataset( + ... nb_words=20000, test_split=0.2) + >>> print('X_train.shape', X_train.shape) + (20000,) [[1, 62, 74, ... 1033, 507, 27],[1, 60, 33, ... 13, 1053, 7]..] + >>> print('y_train.shape', y_train.shape) + (20000,) [1 0 0 ..., 1 0 1] + + References + ----------- + - `Modified from keras. `__ + + """ + path = os.path.join(path, 'imdb') + + filename = "imdb.pkl" + url = 'https://s3.amazonaws.com/text-datasets/' + maybe_download_and_extract(filename, path, url) + + if filename.endswith(".gz"): + f = gzip.open(os.path.join(path, filename), 'rb') + else: + f = open(os.path.join(path, filename), 'rb') + + X, labels = pickle.load(f) + f.close() + + np.random.seed(seed) + np.random.shuffle(X) + np.random.seed(seed) + np.random.shuffle(labels) + + if start_char is not None: + X = [[start_char] + [w + index_from for w in x] for x in X] + elif index_from: + X = [[w + index_from for w in x] for x in X] + + if maxlen: + new_X = [] + new_labels = [] + for x, y in zip(X, labels): + if len(x) < maxlen: + new_X.append(x) + new_labels.append(y) + X = new_X + labels = new_labels + if not X: + raise Exception( + 'After filtering for sequences shorter than maxlen=' + str(maxlen) + ', no sequence was kept. ' + 'Increase maxlen.' + ) + if not nb_words: + nb_words = max([max(x) for x in X]) + + # by convention, use 2 as OOV word + # reserve 'index_from' (=3 by default) characters: 0 (padding), 1 (start), 2 (OOV) + if oov_char is not None: + X = [[oov_char if (w >= nb_words or w < skip_top) else w for w in x] for x in X] + else: + nX = [] + for x in X: + nx = [] + for w in x: + if (w >= nb_words or w < skip_top): + nx.append(w) + nX.append(nx) + X = nX + + X_train = np.array(X[:int(len(X) * (1 - test_split))]) + y_train = np.array(labels[:int(len(X) * (1 - test_split))]) + + X_test = np.array(X[int(len(X) * (1 - test_split)):]) + y_test = np.array(labels[int(len(X) * (1 - test_split)):]) + + return X_train, y_train, X_test, y_test diff --git a/tensorlayer/files/dataset_loaders/matt_mahoney_dataset.py b/tensorlayer/files/dataset_loaders/matt_mahoney_dataset.py new file mode 100644 index 0000000..17a3e08 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/matt_mahoney_dataset.py @@ -0,0 +1,48 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os +import zipfile + +from tensorlayer import logging +from tensorlayer.files.utils import maybe_download_and_extract + +__all__ = ['load_matt_mahoney_text8_dataset'] + + +def load_matt_mahoney_text8_dataset(path='data'): + """Load Matt Mahoney's dataset. + + Download a text file from Matt Mahoney's website + if not present, and make sure it's the right size. + Extract the first file enclosed in a zip file as a list of words. + This dataset can be used for Word Embedding. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/mm_test8/``. + + Returns + -------- + list of str + The raw text data e.g. [.... 'their', 'families', 'who', 'were', 'expelled', 'from', 'jerusalem', ...] + + Examples + -------- + >>> words = tl.files.load_matt_mahoney_text8_dataset() + >>> print('Data size', len(words)) + + """ + path = os.path.join(path, 'mm_test8') + logging.info("Load or Download matt_mahoney_text8 Dataset> {}".format(path)) + + filename = 'text8.zip' + url = 'http://mattmahoney.net/dc/' + maybe_download_and_extract(filename, path, url, expected_bytes=31344016) + + with zipfile.ZipFile(os.path.join(path, filename)) as f: + word_list = f.read(f.namelist()[0]).split() + for idx, _ in enumerate(word_list): + word_list[idx] = word_list[idx].decode() + return word_list diff --git a/tensorlayer/files/dataset_loaders/mnist_dataset.py b/tensorlayer/files/dataset_loaders/mnist_dataset.py new file mode 100644 index 0000000..4e1346d --- /dev/null +++ b/tensorlayer/files/dataset_loaders/mnist_dataset.py @@ -0,0 +1,31 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from tensorlayer.files.utils import _load_mnist_dataset + +__all__ = ['load_mnist_dataset'] + + +def load_mnist_dataset(shape=(-1, 784), path='data'): + """Load the original mnist. + + Automatically download MNIST dataset and return the training, validation and test set with 50000, 10000 and 10000 digit images respectively. + + Parameters + ---------- + shape : tuple + The shape of digit images (the default is (-1, 784), alternatively (-1, 28, 28, 1)). + path : str + The path that the data is downloaded to. + + Returns + ------- + X_train, y_train, X_val, y_val, X_test, y_test: tuple + Return splitted training/validation/test set respectively. + + Examples + -------- + >>> X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1,784), path='datasets') + >>> X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 28, 28, 1)) + """ + return _load_mnist_dataset(shape, path, name='mnist', url='http://yann.lecun.com/exdb/mnist/') diff --git a/tensorlayer/files/dataset_loaders/mnist_fashion_dataset.py b/tensorlayer/files/dataset_loaders/mnist_fashion_dataset.py new file mode 100644 index 0000000..c7f1bb9 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/mnist_fashion_dataset.py @@ -0,0 +1,33 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from tensorlayer.files.utils import _load_mnist_dataset + +__all__ = ['load_fashion_mnist_dataset'] + + +def load_fashion_mnist_dataset(shape=(-1, 784), path='data'): + """Load the fashion mnist. + + Automatically download fashion-MNIST dataset and return the training, validation and test set with 50000, 10000 and 10000 fashion images respectively, `examples `__. + + Parameters + ---------- + shape : tuple + The shape of digit images (the default is (-1, 784), alternatively (-1, 28, 28, 1)). + path : str + The path that the data is downloaded to. + + Returns + ------- + X_train, y_train, X_val, y_val, X_test, y_test: tuple + Return splitted training/validation/test set respectively. + + Examples + -------- + >>> X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_fashion_mnist_dataset(shape=(-1,784), path='datasets') + >>> X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_fashion_mnist_dataset(shape=(-1, 28, 28, 1)) + """ + return _load_mnist_dataset( + shape, path, name='fashion_mnist', url='http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/' + ) diff --git a/tensorlayer/files/dataset_loaders/mnist_utils.py b/tensorlayer/files/dataset_loaders/mnist_utils.py new file mode 100644 index 0000000..b2f27b3 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/mnist_utils.py @@ -0,0 +1,75 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import gzip +import os + +import numpy as np + +from tensorlayer import logging +from tensorlayer.files.utils import maybe_download_and_extract + +__all__ = ["_load_mnist_dataset"] + + +def _load_mnist_dataset(shape, path, name='mnist', url='http://yann.lecun.com/exdb/mnist/'): + """A generic function to load mnist-like dataset. + + Parameters: + ---------- + shape : tuple + The shape of digit images. + path : str + The path that the data is downloaded to. + name : str + The dataset name you want to use(the default is 'mnist'). + url : str + The url of dataset(the default is 'http://yann.lecun.com/exdb/mnist/'). + """ + path = os.path.join(path, name) + + # Define functions for loading mnist-like data's images and labels. + # For convenience, they also download the requested files if needed. + def load_mnist_images(path, filename): + filepath = maybe_download_and_extract(filename, path, url) + + logging.info(filepath) + # Read the inputs in Yann LeCun's binary format. + with gzip.open(filepath, 'rb') as f: + data = np.frombuffer(f.read(), np.uint8, offset=16) + # The inputs are vectors now, we reshape them to monochrome 2D images, + # following the shape convention: (examples, channels, rows, columns) + data = data.reshape(shape) + # The inputs come as bytes, we convert them to float32 in range [0,1]. + # (Actually to range [0, 255/256], for compatibility to the version + # provided at http://deeplearning.net/data/mnist/mnist.pkl.gz.) + return data / np.float32(256) + + def load_mnist_labels(path, filename): + filepath = maybe_download_and_extract(filename, path, url) + # Read the labels in Yann LeCun's binary format. + with gzip.open(filepath, 'rb') as f: + data = np.frombuffer(f.read(), np.uint8, offset=8) + # The labels are vectors of integers now, that's exactly what we want. + return data + + # Download and read the training and test set images and labels. + logging.info("Load or Download {0} > {1}".format(name.upper(), path)) + X_train = load_mnist_images(path, 'train-images-idx3-ubyte.gz') + y_train = load_mnist_labels(path, 'train-labels-idx1-ubyte.gz') + X_test = load_mnist_images(path, 't10k-images-idx3-ubyte.gz') + y_test = load_mnist_labels(path, 't10k-labels-idx1-ubyte.gz') + + # We reserve the last 10000 training examples for validation. + X_train, X_val = X_train[:-10000], X_train[-10000:] + y_train, y_val = y_train[:-10000], y_train[-10000:] + + # We just return all the arrays in order, as expected in main(). + # (It doesn't matter how we do this as long as we can read them again.) + X_train = np.asarray(X_train, dtype=np.float32) + y_train = np.asarray(y_train, dtype=np.int32) + X_val = np.asarray(X_val, dtype=np.float32) + y_val = np.asarray(y_val, dtype=np.int32) + X_test = np.asarray(X_test, dtype=np.float32) + y_test = np.asarray(y_test, dtype=np.int32) + return X_train, y_train, X_val, y_val, X_test, y_test diff --git a/tensorlayer/files/dataset_loaders/mpii_dataset.py b/tensorlayer/files/dataset_loaders/mpii_dataset.py new file mode 100644 index 0000000..a6f88f6 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/mpii_dataset.py @@ -0,0 +1,252 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os + +from tensorlayer import logging +from tensorlayer.files.utils import (del_file, folder_exists, load_file_list, maybe_download_and_extract) + +__all__ = ['load_mpii_pose_dataset'] + + +def load_mpii_pose_dataset(path='data', is_16_pos_only=False): + """Load MPII Human Pose Dataset. + + Parameters + ----------- + path : str + The path that the data is downloaded to. + is_16_pos_only : boolean + If True, only return the peoples contain 16 pose keypoints. (Usually be used for single person pose estimation) + + Returns + ---------- + img_train_list : list of str + The image directories of training data. + ann_train_list : list of dict + The annotations of training data. + img_test_list : list of str + The image directories of testing data. + ann_test_list : list of dict + The annotations of testing data. + + Examples + -------- + >>> import pprint + >>> import tensorlayer as tl + >>> img_train_list, ann_train_list, img_test_list, ann_test_list = tl.files.load_mpii_pose_dataset() + >>> image = tl.vis.read_image(img_train_list[0]) + >>> tl.vis.draw_mpii_pose_to_image(image, ann_train_list[0], 'image.png') + >>> pprint.pprint(ann_train_list[0]) + + References + ----------- + - `MPII Human Pose Dataset. CVPR 14 `__ + - `MPII Human Pose Models. CVPR 16 `__ + - `MPII Human Shape, Poselet Conditioned Pictorial Structures and etc `__ + - `MPII Keyponts and ID `__ + """ + path = os.path.join(path, 'mpii_human_pose') + logging.info("Load or Download MPII Human Pose > {}".format(path)) + + # annotation + url = "http://datasets.d2.mpi-inf.mpg.de/andriluka14cvpr/" + tar_filename = "mpii_human_pose_v1_u12_2.zip" + extracted_filename = "mpii_human_pose_v1_u12_2" + if folder_exists(os.path.join(path, extracted_filename)) is False: + logging.info("[MPII] (annotation) {} is nonexistent in {}".format(extracted_filename, path)) + maybe_download_and_extract(tar_filename, path, url, extract=True) + del_file(os.path.join(path, tar_filename)) + + # images + url = "http://datasets.d2.mpi-inf.mpg.de/andriluka14cvpr/" + tar_filename = "mpii_human_pose_v1.tar.gz" + extracted_filename2 = "images" + if folder_exists(os.path.join(path, extracted_filename2)) is False: + logging.info("[MPII] (images) {} is nonexistent in {}".format(extracted_filename, path)) + maybe_download_and_extract(tar_filename, path, url, extract=True) + del_file(os.path.join(path, tar_filename)) + + # parse annotation, format see http://human-pose.mpi-inf.mpg.de/#download + import scipy.io as sio + logging.info("reading annotations from mat file ...") + # mat = sio.loadmat(os.path.join(path, extracted_filename, "mpii_human_pose_v1_u12_1.mat")) + + # def fix_wrong_joints(joint): # https://github.com/mitmul/deeppose/blob/master/datasets/mpii_dataset.py + # if '12' in joint and '13' in joint and '2' in joint and '3' in joint: + # if ((joint['12'][0] < joint['13'][0]) and + # (joint['3'][0] < joint['2'][0])): + # joint['2'], joint['3'] = joint['3'], joint['2'] + # if ((joint['12'][0] > joint['13'][0]) and + # (joint['3'][0] > joint['2'][0])): + # joint['2'], joint['3'] = joint['3'], joint['2'] + # return joint + + ann_train_list = [] + ann_test_list = [] + img_train_list = [] + img_test_list = [] + + def save_joints(): + # joint_data_fn = os.path.join(path, 'data.json') + # fp = open(joint_data_fn, 'w') + mat = sio.loadmat(os.path.join(path, extracted_filename, "mpii_human_pose_v1_u12_1.mat")) + + for _, (anno, train_flag) in enumerate( # all images + zip(mat['RELEASE']['annolist'][0, 0][0], mat['RELEASE']['img_train'][0, 0][0])): + + img_fn = anno['image']['name'][0, 0][0] + train_flag = int(train_flag) + + # print(i, img_fn, train_flag) # DEBUG print all images + + if train_flag: + img_train_list.append(img_fn) + ann_train_list.append([]) + else: + img_test_list.append(img_fn) + ann_test_list.append([]) + + head_rect = [] + if 'x1' in str(anno['annorect'].dtype): + head_rect = zip( + [x1[0, 0] for x1 in anno['annorect']['x1'][0]], [y1[0, 0] for y1 in anno['annorect']['y1'][0]], + [x2[0, 0] for x2 in anno['annorect']['x2'][0]], [y2[0, 0] for y2 in anno['annorect']['y2'][0]] + ) + else: + head_rect = [] # TODO + + if 'annopoints' in str(anno['annorect'].dtype): + annopoints = anno['annorect']['annopoints'][0] + head_x1s = anno['annorect']['x1'][0] + head_y1s = anno['annorect']['y1'][0] + head_x2s = anno['annorect']['x2'][0] + head_y2s = anno['annorect']['y2'][0] + + for annopoint, head_x1, head_y1, head_x2, head_y2 in zip(annopoints, head_x1s, head_y1s, head_x2s, + head_y2s): + # if annopoint != []: + # if len(annopoint) != 0: + if annopoint.size: + head_rect = [ + float(head_x1[0, 0]), + float(head_y1[0, 0]), + float(head_x2[0, 0]), + float(head_y2[0, 0]) + ] + + # joint coordinates + annopoint = annopoint['point'][0, 0] + j_id = [str(j_i[0, 0]) for j_i in annopoint['id'][0]] + x = [x[0, 0] for x in annopoint['x'][0]] + y = [y[0, 0] for y in annopoint['y'][0]] + joint_pos = {} + for _j_id, (_x, _y) in zip(j_id, zip(x, y)): + joint_pos[int(_j_id)] = [float(_x), float(_y)] + # joint_pos = fix_wrong_joints(joint_pos) + + # visibility list + if 'is_visible' in str(annopoint.dtype): + vis = [v[0] if v.size > 0 else [0] for v in annopoint['is_visible'][0]] + vis = dict([(k, int(v[0])) if len(v) > 0 else v for k, v in zip(j_id, vis)]) + else: + vis = None + + # if len(joint_pos) == 16: + if ((is_16_pos_only ==True) and (len(joint_pos) == 16)) or (is_16_pos_only == False): + # only use image with 16 key points / or use all + data = { + 'filename': img_fn, + 'train': train_flag, + 'head_rect': head_rect, + 'is_visible': vis, + 'joint_pos': joint_pos + } + # print(json.dumps(data), file=fp) # py3 + if train_flag: + ann_train_list[-1].append(data) + else: + ann_test_list[-1].append(data) + + # def write_line(datum, fp): + # joints = sorted([[int(k), v] for k, v in datum['joint_pos'].items()]) + # joints = np.array([j for i, j in joints]).flatten() + # + # out = [datum['filename']] + # out.extend(joints) + # out = [str(o) for o in out] + # out = ','.join(out) + # + # print(out, file=fp) + + # def split_train_test(): + # # fp_test = open('data/mpii/test_joints.csv', 'w') + # fp_test = open(os.path.join(path, 'test_joints.csv'), 'w') + # # fp_train = open('data/mpii/train_joints.csv', 'w') + # fp_train = open(os.path.join(path, 'train_joints.csv'), 'w') + # # all_data = open('data/mpii/data.json').readlines() + # all_data = open(os.path.join(path, 'data.json')).readlines() + # N = len(all_data) + # N_test = int(N * 0.1) + # N_train = N - N_test + # + # print('N:{}'.format(N)) + # print('N_train:{}'.format(N_train)) + # print('N_test:{}'.format(N_test)) + # + # np.random.seed(1701) + # perm = np.random.permutation(N) + # test_indices = perm[:N_test] + # train_indices = perm[N_test:] + # + # print('train_indices:{}'.format(len(train_indices))) + # print('test_indices:{}'.format(len(test_indices))) + # + # for i in train_indices: + # datum = json.loads(all_data[i].strip()) + # write_line(datum, fp_train) + # + # for i in test_indices: + # datum = json.loads(all_data[i].strip()) + # write_line(datum, fp_test) + + save_joints() + # split_train_test() # + + ## read images dir + logging.info("reading images list ...") + img_dir = os.path.join(path, extracted_filename2) + _img_list = load_file_list(path=os.path.join(path, extracted_filename2), regx='\\.jpg', printable=False) + # ann_list = json.load(open(os.path.join(path, 'data.json'))) + for i, im in enumerate(img_train_list): + if im not in _img_list: + print('missing training image {} in {} (remove from img(ann)_train_list)'.format(im, img_dir)) + # img_train_list.remove(im) + del img_train_list[i] + del ann_train_list[i] + for i, im in enumerate(img_test_list): + if im not in _img_list: + print('missing testing image {} in {} (remove from img(ann)_test_list)'.format(im, img_dir)) + # img_test_list.remove(im) + del img_train_list[i] + del ann_train_list[i] + + ## check annotation and images + n_train_images = len(img_train_list) + n_test_images = len(img_test_list) + n_images = n_train_images + n_test_images + logging.info("n_images: {} n_train_images: {} n_test_images: {}".format(n_images, n_train_images, n_test_images)) + n_train_ann = len(ann_train_list) + n_test_ann = len(ann_test_list) + n_ann = n_train_ann + n_test_ann + logging.info("n_ann: {} n_train_ann: {} n_test_ann: {}".format(n_ann, n_train_ann, n_test_ann)) + n_train_people = len(sum(ann_train_list, [])) + n_test_people = len(sum(ann_test_list, [])) + n_people = n_train_people + n_test_people + logging.info("n_people: {} n_train_people: {} n_test_people: {}".format(n_people, n_train_people, n_test_people)) + # add path to all image file name + for i, value in enumerate(img_train_list): + img_train_list[i] = os.path.join(img_dir, value) + for i, value in enumerate(img_test_list): + img_test_list[i] = os.path.join(img_dir, value) + return img_train_list, ann_train_list, img_test_list, ann_test_list diff --git a/tensorlayer/files/dataset_loaders/nietzsche_dataset.py b/tensorlayer/files/dataset_loaders/nietzsche_dataset.py new file mode 100644 index 0000000..3cd0e27 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/nietzsche_dataset.py @@ -0,0 +1,42 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os + +from tensorlayer import logging +from tensorlayer.files.utils import maybe_download_and_extract + +__all__ = ['load_nietzsche_dataset'] + + +def load_nietzsche_dataset(path='data'): + """Load Nietzsche dataset. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/nietzsche/``. + + Returns + -------- + str + The content. + + Examples + -------- + >>> see tutorial_generate_text.py + >>> words = tl.files.load_nietzsche_dataset() + >>> words = basic_clean_str(words) + >>> words = words.split() + + """ + logging.info("Load or Download nietzsche dataset > {}".format(path)) + path = os.path.join(path, 'nietzsche') + + filename = "nietzsche.txt" + url = 'https://s3.amazonaws.com/text-datasets/' + filepath = maybe_download_and_extract(filename, path, url) + + with open(filepath, "r") as f: + words = f.read() + return words diff --git a/tensorlayer/files/dataset_loaders/ptb_dataset.py b/tensorlayer/files/dataset_loaders/ptb_dataset.py new file mode 100644 index 0000000..30746fd --- /dev/null +++ b/tensorlayer/files/dataset_loaders/ptb_dataset.py @@ -0,0 +1,72 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os + +from tensorlayer import logging, nlp +from tensorlayer.files.utils import maybe_download_and_extract + +__all__ = ['load_ptb_dataset'] + + +def load_ptb_dataset(path='data'): + """Load Penn TreeBank (PTB) dataset. + + It is used in many LANGUAGE MODELING papers, + including "Empirical Evaluation and Combination of Advanced Language + Modeling Techniques", "Recurrent Neural Network Regularization". + It consists of 929k training words, 73k validation words, and 82k test + words. It has 10k words in its vocabulary. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/ptb/``. + + Returns + -------- + train_data, valid_data, test_data : list of int + The training, validating and testing data in integer format. + vocab_size : int + The vocabulary size. + + Examples + -------- + >>> train_data, valid_data, test_data, vocab_size = tl.files.load_ptb_dataset() + + References + --------------- + - ``tensorflow.models.rnn.ptb import reader`` + - `Manual download `__ + + Notes + ------ + - If you want to get the raw data, see the source code. + + """ + path = os.path.join(path, 'ptb') + logging.info("Load or Download Penn TreeBank (PTB) dataset > {}".format(path)) + + #Maybe dowload and uncompress tar, or load exsisting files + filename = 'simple-examples.tgz' + url = 'http://www.fit.vutbr.cz/~imikolov/rnnlm/' + maybe_download_and_extract(filename, path, url, extract=True) + + data_path = os.path.join(path, 'simple-examples', 'data') + train_path = os.path.join(data_path, "ptb.train.txt") + valid_path = os.path.join(data_path, "ptb.valid.txt") + test_path = os.path.join(data_path, "ptb.test.txt") + + word_to_id = nlp.build_vocab(nlp.read_words(train_path)) + + train_data = nlp.words_to_word_ids(nlp.read_words(train_path), word_to_id) + valid_data = nlp.words_to_word_ids(nlp.read_words(valid_path), word_to_id) + test_data = nlp.words_to_word_ids(nlp.read_words(test_path), word_to_id) + vocab_size = len(word_to_id) + + # logging.info(nlp.read_words(train_path)) # ... 'according', 'to', 'mr.', '', ''] + # logging.info(train_data) # ... 214, 5, 23, 1, 2] + # logging.info(word_to_id) # ... 'beyond': 1295, 'anti-nuclear': 9599, 'trouble': 1520, '': 2 ... } + # logging.info(vocabulary) # 10000 + # exit() + return train_data, valid_data, test_data, vocab_size diff --git a/tensorlayer/files/dataset_loaders/voc_dataset.py b/tensorlayer/files/dataset_loaders/voc_dataset.py new file mode 100644 index 0000000..5584864 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/voc_dataset.py @@ -0,0 +1,335 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os + +import tensorflow as tf + +from tensorlayer import logging, utils +from tensorlayer.files.utils import (del_file, del_folder, folder_exists, load_file_list, maybe_download_and_extract) + +__all__ = ['load_voc_dataset'] + + +def load_voc_dataset(path='data', dataset='2012', contain_classes_in_person=False): + """Pascal VOC 2007/2012 Dataset. + + It has 20 objects: + aeroplane, bicycle, bird, boat, bottle, bus, car, cat, chair, cow, diningtable, dog, horse, motorbike, person, pottedplant, sheep, sofa, train, tvmonitor + and additional 3 classes : head, hand, foot for person. + + Parameters + ----------- + path : str + The path that the data is downloaded to, defaults is ``data/VOC``. + dataset : str + The VOC dataset version, `2012`, `2007`, `2007test` or `2012test`. We usually train model on `2007+2012` and test it on `2007test`. + contain_classes_in_person : boolean + Whether include head, hand and foot annotation, default is False. + + Returns + --------- + imgs_file_list : list of str + Full paths of all images. + imgs_semseg_file_list : list of str + Full paths of all maps for semantic segmentation. Note that not all images have this map! + imgs_insseg_file_list : list of str + Full paths of all maps for instance segmentation. Note that not all images have this map! + imgs_ann_file_list : list of str + Full paths of all annotations for bounding box and object class, all images have this annotations. + classes : list of str + Classes in order. + classes_in_person : list of str + Classes in person. + classes_dict : dictionary + Class label to integer. + n_objs_list : list of int + Number of objects in all images in ``imgs_file_list`` in order. + objs_info_list : list of str + Darknet format for the annotation of all images in ``imgs_file_list`` in order. ``[class_id x_centre y_centre width height]`` in ratio format. + objs_info_dicts : dictionary + The annotation of all images in ``imgs_file_list``, ``{imgs_file_list : dictionary for annotation}``, + format from `TensorFlow/Models/object-detection `__. + + Examples + ---------- + >>> imgs_file_list, imgs_semseg_file_list, imgs_insseg_file_list, imgs_ann_file_list, + >>> classes, classes_in_person, classes_dict, + >>> n_objs_list, objs_info_list, objs_info_dicts = tl.files.load_voc_dataset(dataset="2012", contain_classes_in_person=False) + >>> idx = 26 + >>> print(classes) + ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'] + >>> print(classes_dict) + {'sheep': 16, 'horse': 12, 'bicycle': 1, 'bottle': 4, 'cow': 9, 'sofa': 17, 'car': 6, 'dog': 11, 'cat': 7, 'person': 14, 'train': 18, 'diningtable': 10, 'aeroplane': 0, 'bus': 5, 'pottedplant': 15, 'tvmonitor': 19, 'chair': 8, 'bird': 2, 'boat': 3, 'motorbike': 13} + >>> print(imgs_file_list[idx]) + data/VOC/VOC2012/JPEGImages/2007_000423.jpg + >>> print(n_objs_list[idx]) + 2 + >>> print(imgs_ann_file_list[idx]) + data/VOC/VOC2012/Annotations/2007_000423.xml + >>> print(objs_info_list[idx]) + 14 0.173 0.461333333333 0.142 0.496 + 14 0.828 0.542666666667 0.188 0.594666666667 + >>> ann = tl.prepro.parse_darknet_ann_str_to_list(objs_info_list[idx]) + >>> print(ann) + [[14, 0.173, 0.461333333333, 0.142, 0.496], [14, 0.828, 0.542666666667, 0.188, 0.594666666667]] + >>> c, b = tl.prepro.parse_darknet_ann_list_to_cls_box(ann) + >>> print(c, b) + [14, 14] [[0.173, 0.461333333333, 0.142, 0.496], [0.828, 0.542666666667, 0.188, 0.594666666667]] + + References + ------------- + - `Pascal VOC2012 Website `__. + - `Pascal VOC2007 Website `__. + + """ + try: + import lxml.etree as etree + except ImportError as e: + print(e) + raise ImportError("Module lxml not found. Please install lxml via pip or other package managers.") + + path = os.path.join(path, 'VOC') + + def _recursive_parse_xml_to_dict(xml): + """Recursively parses XML contents to python dict. + + We assume that `object` tags are the only ones that can appear + multiple times at the same level of a tree. + + Args: + xml: xml tree obtained by parsing XML file contents using lxml.etree + + Returns: + Python dictionary holding XML contents. + + """ + if xml is not None: + return {xml.tag: xml.text} + result = {} + for child in xml: + child_result = _recursive_parse_xml_to_dict(child) + if child.tag != 'object': + result[child.tag] = child_result[child.tag] + else: + if child.tag not in result: + result[child.tag] = [] + result[child.tag].append(child_result[child.tag]) + return {xml.tag: result} + + import xml.etree.ElementTree as ET + + if dataset == "2012": + url = "http://pjreddie.com/media/files/" + tar_filename = "VOCtrainval_11-May-2012.tar" + extracted_filename = "VOC2012" #"VOCdevkit/VOC2012" + logging.info(" [============= VOC 2012 =============]") + elif dataset == "2012test": + extracted_filename = "VOC2012test" #"VOCdevkit/VOC2012" + logging.info(" [============= VOC 2012 Test Set =============]") + logging.info( + " \nAuthor: 2012test only have person annotation, so 2007test is highly recommended for testing !\n" + ) + import time + time.sleep(3) + if os.path.isdir(os.path.join(path, extracted_filename)) is False: + logging.info("For VOC 2012 Test data - online registration required") + logging.info( + " Please download VOC2012test.tar from: \n register: http://host.robots.ox.ac.uk:8080 \n voc2012 : http://host.robots.ox.ac.uk:8080/eval/challenges/voc2012/ \ndownload: http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2012test.tar" + ) + logging.info(" unzip VOC2012test.tar,rename the folder to VOC2012test and put it into %s" % path) + exit() + # # http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2012test.tar + # url = "http://host.robots.ox.ac.uk:8080/eval/downloads/" + # tar_filename = "VOC2012test.tar" + elif dataset == "2007": + url = "http://pjreddie.com/media/files/" + tar_filename = "VOCtrainval_06-Nov-2007.tar" + extracted_filename = "VOC2007" + logging.info(" [============= VOC 2007 =============]") + elif dataset == "2007test": + # http://host.robots.ox.ac.uk/pascal/VOC/voc2007/index.html#testdata + # http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar + url = "http://pjreddie.com/media/files/" + tar_filename = "VOCtest_06-Nov-2007.tar" + extracted_filename = "VOC2007test" + logging.info(" [============= VOC 2007 Test Set =============]") + else: + raise Exception("Please set the dataset aug to 2012, 2012test or 2007.") + + # download dataset + if dataset != "2012test": + from sys import platform as _platform + if folder_exists(os.path.join(path, extracted_filename)) is False: + logging.info("[VOC] {} is nonexistent in {}".format(extracted_filename, path)) + maybe_download_and_extract(tar_filename, path, url, extract=True) + del_file(os.path.join(path, tar_filename)) + if dataset == "2012": + if _platform == "win32": + os.system("move {}\VOCdevkit\VOC2012 {}\VOC2012".format(path, path)) + else: + os.system("mv {}/VOCdevkit/VOC2012 {}/VOC2012".format(path, path)) + elif dataset == "2007": + if _platform == "win32": + os.system("move {}\VOCdevkit\VOC2007 {}\VOC2007".format(path, path)) + else: + os.system("mv {}/VOCdevkit/VOC2007 {}/VOC2007".format(path, path)) + elif dataset == "2007test": + if _platform == "win32": + os.system("move {}\VOCdevkit\VOC2007 {}\VOC2007test".format(path, path)) + else: + os.system("mv {}/VOCdevkit/VOC2007 {}/VOC2007test".format(path, path)) + del_folder(os.path.join(path, 'VOCdevkit')) + # object classes(labels) NOTE: YOU CAN CUSTOMIZE THIS LIST + classes = [ + "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", + "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor" + ] + if contain_classes_in_person: + classes_in_person = ["head", "hand", "foot"] + else: + classes_in_person = [] + + classes += classes_in_person # use extra 3 classes for person + + classes_dict = utils.list_string_to_dict(classes) + logging.info("[VOC] object classes {}".format(classes_dict)) + + # 1. image path list + # folder_imgs = path+"/"+extracted_filename+"/JPEGImages/" + folder_imgs = os.path.join(path, extracted_filename, "JPEGImages") + imgs_file_list = load_file_list(path=folder_imgs, regx='\\.jpg', printable=False) + logging.info("[VOC] {} images found".format(len(imgs_file_list))) + + imgs_file_list.sort( + key=lambda s: int(s.replace('.', ' ').replace('_', '').split(' ')[-2]) + ) # 2007_000027.jpg --> 2007000027 + + imgs_file_list = [os.path.join(folder_imgs, s) for s in imgs_file_list] + # logging.info('IM',imgs_file_list[0::3333], imgs_file_list[-1]) + if dataset != "2012test": + ##======== 2. semantic segmentation maps path list + # folder_semseg = path+"/"+extracted_filename+"/SegmentationClass/" + folder_semseg = os.path.join(path, extracted_filename, "SegmentationClass") + imgs_semseg_file_list = load_file_list(path=folder_semseg, regx='\\.png', printable=False) + logging.info("[VOC] {} maps for semantic segmentation found".format(len(imgs_semseg_file_list))) + imgs_semseg_file_list.sort( + key=lambda s: int(s.replace('.', ' ').replace('_', '').split(' ')[-2]) + ) # 2007_000032.png --> 2007000032 + imgs_semseg_file_list = [os.path.join(folder_semseg, s) for s in imgs_semseg_file_list] + # logging.info('Semantic Seg IM',imgs_semseg_file_list[0::333], imgs_semseg_file_list[-1]) + ##======== 3. instance segmentation maps path list + # folder_insseg = path+"/"+extracted_filename+"/SegmentationObject/" + folder_insseg = os.path.join(path, extracted_filename, "SegmentationObject") + imgs_insseg_file_list = load_file_list(path=folder_insseg, regx='\\.png', printable=False) + logging.info("[VOC] {} maps for instance segmentation found".format(len(imgs_semseg_file_list))) + imgs_insseg_file_list.sort( + key=lambda s: int(s.replace('.', ' ').replace('_', '').split(' ')[-2]) + ) # 2007_000032.png --> 2007000032 + imgs_insseg_file_list = [os.path.join(folder_insseg, s) for s in imgs_insseg_file_list] + # logging.info('Instance Seg IM',imgs_insseg_file_list[0::333], imgs_insseg_file_list[-1]) + else: + imgs_semseg_file_list = [] + imgs_insseg_file_list = [] + # 4. annotations for bounding box and object class + # folder_ann = path+"/"+extracted_filename+"/Annotations/" + folder_ann = os.path.join(path, extracted_filename, "Annotations") + imgs_ann_file_list = load_file_list(path=folder_ann, regx='\\.xml', printable=False) + logging.info( + "[VOC] {} XML annotation files for bounding box and object class found".format(len(imgs_ann_file_list)) + ) + imgs_ann_file_list.sort( + key=lambda s: int(s.replace('.', ' ').replace('_', '').split(' ')[-2]) + ) # 2007_000027.xml --> 2007000027 + imgs_ann_file_list = [os.path.join(folder_ann, s) for s in imgs_ann_file_list] + # logging.info('ANN',imgs_ann_file_list[0::3333], imgs_ann_file_list[-1]) + + if dataset == "2012test": # remove unused images in JPEG folder + imgs_file_list_new = [] + for ann in imgs_ann_file_list: + ann = os.path.split(ann)[-1].split('.')[0] + for im in imgs_file_list: + if ann in im: + imgs_file_list_new.append(im) + break + imgs_file_list = imgs_file_list_new + logging.info("[VOC] keep %d images" % len(imgs_file_list_new)) + + # parse XML annotations + def convert(size, box): + dw = 1. / size[0] + dh = 1. / size[1] + x = (box[0] + box[1]) / 2.0 + y = (box[2] + box[3]) / 2.0 + w = box[1] - box[0] + h = box[3] - box[2] + x = x * dw + w = w * dw + y = y * dh + h = h * dh + return x, y, w, h + + def convert_annotation(file_name): + """Given VOC2012 XML Annotations, returns number of objects and info.""" + in_file = open(file_name) + out_file = "" + tree = ET.parse(in_file) + root = tree.getroot() + size = root.find('size') + w = int(size.find('width').text) + h = int(size.find('height').text) + n_objs = 0 + + for obj in root.iter('object'): + if dataset != "2012test": + difficult = obj.find('difficult').text + cls = obj.find('name').text + if cls not in classes or int(difficult) == 1: + continue + else: + cls = obj.find('name').text + if cls not in classes: + continue + cls_id = classes.index(cls) + xmlbox = obj.find('bndbox') + b = ( + float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), + float(xmlbox.find('ymax').text) + ) + bb = convert((w, h), b) + + out_file += str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n' + n_objs += 1 + if cls in "person": + for part in obj.iter('part'): + cls = part.find('name').text + if cls not in classes_in_person: + continue + cls_id = classes.index(cls) + xmlbox = part.find('bndbox') + b = ( + float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), + float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text) + ) + bb = convert((w, h), b) + # out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') + out_file += str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n' + n_objs += 1 + in_file.close() + return n_objs, out_file + + logging.info("[VOC] Parsing xml annotations files") + n_objs_list = [] + objs_info_list = [] # Darknet Format list of string + objs_info_dicts = {} + for idx, ann_file in enumerate(imgs_ann_file_list): + n_objs, objs_info = convert_annotation(ann_file) + n_objs_list.append(n_objs) + objs_info_list.append(objs_info) + with tf.io.gfile.GFile(ann_file, 'r') as fid: + xml_str = fid.read() + xml = etree.fromstring(xml_str) + data = _recursive_parse_xml_to_dict(xml)['annotation'] + objs_info_dicts.update({imgs_file_list[idx]: data}) + + return imgs_file_list, imgs_semseg_file_list, imgs_insseg_file_list, imgs_ann_file_list, classes, classes_in_person, classes_dict, n_objs_list, objs_info_list, objs_info_dicts diff --git a/tensorlayer/files/dataset_loaders/wmt_en_fr_dataset.py b/tensorlayer/files/dataset_loaders/wmt_en_fr_dataset.py new file mode 100644 index 0000000..0261a85 --- /dev/null +++ b/tensorlayer/files/dataset_loaders/wmt_en_fr_dataset.py @@ -0,0 +1,80 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import gzip +import os +import tarfile + +from tensorflow.python.platform import gfile + +from tensorlayer import logging +from tensorlayer.files.utils import maybe_download_and_extract + +__all__ = ['load_wmt_en_fr_dataset'] + + +def load_wmt_en_fr_dataset(path='data'): + """Load WMT'15 English-to-French translation dataset. + + It will download the data from the WMT'15 Website (10^9-French-English corpus), and the 2013 news test from the same site as development set. + Returns the directories of training data and test data. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/wmt_en_fr/``. + + References + ---------- + - Code modified from /tensorflow/models/rnn/translation/data_utils.py + + Notes + ----- + Usually, it will take a long time to download this dataset. + + """ + path = os.path.join(path, 'wmt_en_fr') + # URLs for WMT data. + _WMT_ENFR_TRAIN_URL = "http://www.statmt.org/wmt10/" + _WMT_ENFR_DEV_URL = "http://www.statmt.org/wmt15/" + + def gunzip_file(gz_path, new_path): + """Unzips from gz_path into new_path.""" + logging.info("Unpacking %s to %s" % (gz_path, new_path)) + with gzip.open(gz_path, "rb") as gz_file: + with open(new_path, "wb") as new_file: + for line in gz_file: + new_file.write(line) + + def get_wmt_enfr_train_set(path): + """Download the WMT en-fr training corpus to directory unless it's there.""" + filename = "training-giga-fren.tar" + maybe_download_and_extract(filename, path, _WMT_ENFR_TRAIN_URL, extract=True) + train_path = os.path.join(path, "giga-fren.release2.fixed") + gunzip_file(train_path + ".fr.gz", train_path + ".fr") + gunzip_file(train_path + ".en.gz", train_path + ".en") + return train_path + + def get_wmt_enfr_dev_set(path): + """Download the WMT en-fr training corpus to directory unless it's there.""" + filename = "dev-v2.tgz" + dev_file = maybe_download_and_extract(filename, path, _WMT_ENFR_DEV_URL, extract=False) + dev_name = "newstest2013" + dev_path = os.path.join(path, "newstest2013") + if not (gfile.Exists(dev_path + ".fr") and gfile.Exists(dev_path + ".en")): + logging.info("Extracting tgz file %s" % dev_file) + with tarfile.open(dev_file, "r:gz") as dev_tar: + fr_dev_file = dev_tar.getmember("dev/" + dev_name + ".fr") + en_dev_file = dev_tar.getmember("dev/" + dev_name + ".en") + fr_dev_file.name = dev_name + ".fr" # Extract without "dev/" prefix. + en_dev_file.name = dev_name + ".en" + dev_tar.extract(fr_dev_file, path) + dev_tar.extract(en_dev_file, path) + return dev_path + + logging.info("Load or Download WMT English-to-French translation > {}".format(path)) + + train_path = get_wmt_enfr_train_set(path) + dev_path = get_wmt_enfr_dev_set(path) + + return train_path, dev_path diff --git a/tensorlayer/files/utils.py b/tensorlayer/files/utils.py new file mode 100644 index 0000000..d05a0c3 --- /dev/null +++ b/tensorlayer/files/utils.py @@ -0,0 +1,2932 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import base64 +import datetime +import gzip +import json +import math +import os +import pickle +import re +import shutil +# import ast +import sys +import tarfile +import time +import zipfile + +import cloudpickle +import h5py +import numpy as np +import progressbar +import scipy.io as sio +import tensorflow as tf +from six.moves import cPickle +from tensorflow.python.keras.saving import model_config as model_config_lib +from tensorflow.python.platform import gfile +from tensorflow.python.util import serialization +from tensorflow.python.util.tf_export import keras_export +from tensorflow.python import pywrap_tensorflow + +import tensorlayer as tl +from tensorlayer import logging, nlp, utils, visualize + +if tl.BACKEND == 'mindspore': + from mindspore.ops.operations import Assign + from mindspore.nn import Cell + from mindspore import Tensor + import mindspore as ms + +if sys.version_info[0] == 2: + from urllib import urlretrieve +else: + from urllib.request import urlretrieve + +# import tensorflow.contrib.eager.python.saver as tfes +# TODO: tf2.0 not stable, cannot import tensorflow.contrib.eager.python.saver + +__all__ = [ + 'assign_weights', + 'del_file', + 'del_folder', + 'download_file_from_google_drive', + 'exists_or_mkdir', + 'file_exists', + 'folder_exists', + 'load_and_assign_npz', + 'load_and_assign_npz_dict', + 'load_ckpt', + 'load_cropped_svhn', + 'load_file_list', + 'load_folder_list', + 'load_npy_to_any', + 'load_npz', + 'maybe_download_and_extract', + 'natural_keys', + 'npz_to_W_pdf', + 'read_file', + 'save_any_to_npy', + 'save_ckpt', + 'save_npz', + 'save_npz_dict', + 'tf_variables_to_numpy', + 'ms_variables_to_numpy', + 'assign_tf_variable', + 'assign_ms_variable', + 'save_weights_to_hdf5', + 'load_hdf5_to_weights_in_order', + 'load_hdf5_to_weights', + 'save_hdf5_graph', + 'load_hdf5_graph', + # 'net2static_graph', + 'static_graph2net', + # 'save_pkl_graph', + # 'load_pkl_graph', + 'load_and_assign_ckpt', + 'ckpt_to_npz_dict' +] + + +def func2str(expr): + b = cloudpickle.dumps(expr) + s = base64.b64encode(b).decode() + return s + + +def str2func(s): + b = base64.b64decode(s) + expr = cloudpickle.loads(b) + return expr + + +# def net2static_graph(network): +# saved_file = dict() +# # if network._NameNone is True: +# # saved_file.update({"name": None}) +# # else: +# # saved_file.update({"name": network.name}) +# # if not isinstance(network.inputs, list): +# # saved_file.update({"inputs": network.inputs._info[0].name}) +# # else: +# # saved_inputs = [] +# # for saved_input in network.inputs: +# # saved_inputs.append(saved_input._info[0].name) +# # saved_file.update({"inputs": saved_inputs}) +# # if not isinstance(network.outputs, list): +# # saved_file.update({"outputs": network.outputs._info[0].name}) +# # else: +# # saved_outputs = [] +# # for saved_output in network.outputs: +# # saved_outputs.append(saved_output._info[0].name) +# # saved_file.update({"outputs": saved_outputs}) +# saved_file.update({"config": network.config}) +# +# return saved_file + + +@keras_export('keras.models.save_model') +def save_keras_model(model): + # f.attrs['keras_model_config'] = json.dumps( + # { + # 'class_name': model.__class__.__name__, + # 'config': model.get_config() + # }, + # default=serialization.get_json_type).encode('utf8') + # + # f.flush() + + return json.dumps( + { + 'class_name': model.__class__.__name__, + 'config': model.get_config() + }, default=serialization.get_json_type + ).encode('utf8') + + +@keras_export('keras.models.load_model') +def load_keras_model(model_config): + + custom_objects = {} + + if model_config is None: + raise ValueError('No model found in config.') + model_config = json.loads(model_config.decode('utf-8')) + model = model_config_lib.model_from_config(model_config, custom_objects=custom_objects) + + return model + + +def save_hdf5_graph(network, filepath='model.hdf5', save_weights=False, customized_data=None): + """Save the architecture of TL model into a hdf5 file. Support saving model weights. + + Parameters + ----------- + network : TensorLayer Model. + The network to save. + filepath : str + The name of model file. + save_weights : bool + Whether to save model weights. + customized_data : dict + The user customized meta data. + + Examples + -------- + >>> # Save the architecture (with parameters) + >>> tl.files.save_hdf5_graph(network, filepath='model.hdf5', save_weights=True) + >>> # Save the architecture (without parameters) + >>> tl.files.save_hdf5_graph(network, filepath='model.hdf5', save_weights=False) + >>> # Load the architecture in another script (no parameters restore) + >>> net = tl.files.load_hdf5_graph(filepath='model.hdf5', load_weights=False) + >>> # Load the architecture in another script (restore parameters) + >>> net = tl.files.load_hdf5_graph(filepath='model.hdf5', load_weights=True) + """ + if network.outputs is None: + raise RuntimeError("save_hdf5_graph not support dynamic mode yet") + + logging.info("[*] Saving TL model into {}, saving weights={}".format(filepath, save_weights)) + + model_config = network.config # net2static_graph(network) + model_config["version_info"]["save_date"] = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc + ).isoformat() + model_config_str = str(model_config) + customized_data_str = str(customized_data) + # version_info = { + # "tensorlayer_version": tl.__version__, + # "backend": "tensorflow", + # "backend_version": tf.__version__, + # "training_device": "gpu", + # "save_date": datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat() + # } + # version_info_str = str(version_info) + + with h5py.File(filepath, 'w') as f: + f.attrs["model_config"] = model_config_str.encode('utf8') + f.attrs["customized_data"] = customized_data_str.encode('utf8') + # f.attrs["version_info"] = version_info_str.encode('utf8') + if save_weights: + _save_weights_to_hdf5_group(f, network.all_layers) + f.flush() + + logging.info("[*] Saved TL model into {}, saving weights={}".format(filepath, save_weights)) + + +def generate_func(args): + for key in args: + if isinstance(args[key], tuple) and args[key][0] == 'is_Func': + fn = str2func(args[key][1]) + args[key] = fn + # if key in ['act']: + # # fn_dict = args[key] + # # module_path = fn_dict['module_path'] + # # func_name = fn_dict['func_name'] + # # lib = importlib.import_module(module_path) + # # fn = getattr(lib, func_name) + # # args[key] = fn + # fn = str2func(args[key]) + # args[key] = fn + # elif key in ['fn']: + # fn = str2func(args[key]) + # args[key] = fn + + +def eval_layer(layer_kwargs): + layer_class = layer_kwargs.pop('class') + args = layer_kwargs['args'] + layer_type = args.pop('layer_type') + if layer_type == "normal": + generate_func(args) + return eval('tl.layers.' + layer_class)(**args) + elif layer_type == "layerlist": + ret_layer = [] + layers = args["layers"] + for layer_graph in layers: + ret_layer.append(eval_layer(layer_graph)) + args['layers'] = ret_layer + return eval('tl.layers.' + layer_class)(**args) + elif layer_type == "modellayer": + M = static_graph2net(args['model']) + args['model'] = M + return eval('tl.layers.' + layer_class)(**args) + elif layer_type == "keraslayer": + M = load_keras_model(args['fn']) + input_shape = args.pop('keras_input_shape') + _ = M(np.random.random(input_shape).astype(np.float32)) + args['fn'] = M + args['fn_weights'] = M.trainable_variables + return eval('tl.layers.' + layer_class)(**args) + else: + raise RuntimeError("Unknown layer type.") + + +def static_graph2net(model_config): + layer_dict = {} + model_name = model_config["name"] + inputs_tensors = model_config["inputs"] + outputs_tensors = model_config["outputs"] + all_args = model_config["model_architecture"] + for idx, layer_kwargs in enumerate(all_args): + layer_class = layer_kwargs["class"] # class of current layer + prev_layers = layer_kwargs.pop("prev_layer") # name of previous layers + net = eval_layer(layer_kwargs) + if layer_class in tl.layers.inputs.__all__: + net = net._nodes[0].out_tensors[0] + if prev_layers is not None: + for prev_layer in prev_layers: + if not isinstance(prev_layer, list): + output = net(layer_dict[prev_layer]) + layer_dict[output._info[0].name] = output + else: + list_layers = [layer_dict[layer] for layer in prev_layer] + output = net(list_layers) + layer_dict[output._info[0].name] = output + else: + layer_dict[net._info[0].name] = net + + if not isinstance(inputs_tensors, list): + model_inputs = layer_dict[inputs_tensors] + else: + model_inputs = [] + for inputs_tensor in inputs_tensors: + model_inputs.append(layer_dict[inputs_tensor]) + if not isinstance(outputs_tensors, list): + model_outputs = layer_dict[outputs_tensors] + else: + model_outputs = [] + for outputs_tensor in outputs_tensors: + model_outputs.append(layer_dict[outputs_tensor]) + from tensorlayer.models import Model + M = Model(inputs=model_inputs, outputs=model_outputs, name=model_name) + logging.info("[*] Load graph finished") + return M + + +def load_hdf5_graph(filepath='model.hdf5', load_weights=False): + """Restore TL model archtecture from a a pickle file. Support loading model weights. + + Parameters + ----------- + filepath : str + The name of model file. + load_weights : bool + Whether to load model weights. + + Returns + -------- + network : TensorLayer Model. + + Examples + -------- + - see ``tl.files.save_hdf5_graph`` + """ + logging.info("[*] Loading TL model from {}, loading weights={}".format(filepath, load_weights)) + + f = h5py.File(filepath, 'r') + + model_config_str = f.attrs["model_config"].decode('utf8') + model_config = eval(model_config_str) + + # version_info_str = f.attrs["version_info"].decode('utf8') + # version_info = eval(version_info_str) + version_info = model_config["version_info"] + backend_version = version_info["backend_version"] + tensorlayer_version = version_info["tensorlayer_version"] + if backend_version != tf.__version__: + logging.warning( + "Saved model uses tensorflow version {}, but now you are using tensorflow version {}".format( + backend_version, tf.__version__ + ) + ) + if tensorlayer_version != tl.__version__: + logging.warning( + "Saved model uses tensorlayer version {}, but now you are using tensorlayer version {}".format( + tensorlayer_version, tl.__version__ + ) + ) + + M = static_graph2net(model_config) + if load_weights: + if not ('layer_names' in f.attrs.keys()): + raise RuntimeError("Saved model does not contain weights.") + M.load_weights(filepath=filepath) + + f.close() + + logging.info("[*] Loaded TL model from {}, loading weights={}".format(filepath, load_weights)) + + return M + + +# def load_pkl_graph(name='model.pkl'): +# """Restore TL model archtecture from a a pickle file. No parameters be restored. +# +# Parameters +# ----------- +# name : str +# The name of graph file. +# +# Returns +# -------- +# network : TensorLayer Model. +# +# Examples +# -------- +# >>> # It is better to use load_hdf5_graph +# """ +# logging.info("[*] Loading TL graph from {}".format(name)) +# with open(name, 'rb') as file: +# saved_file = pickle.load(file) +# +# M = static_graph2net(saved_file) +# +# return M +# +# +# def save_pkl_graph(network, name='model.pkl'): +# """Save the architecture of TL model into a pickle file. No parameters be saved. +# +# Parameters +# ----------- +# network : TensorLayer layer +# The network to save. +# name : str +# The name of graph file. +# +# Example +# -------- +# >>> # It is better to use save_hdf5_graph +# """ +# if network.outputs is None: +# raise AssertionError("save_graph not support dynamic mode yet") +# +# logging.info("[*] Saving TL graph into {}".format(name)) +# +# saved_file = net2static_graph(network) +# +# with open(name, 'wb') as file: +# pickle.dump(saved_file, file, protocol=pickle.HIGHEST_PROTOCOL) +# logging.info("[*] Saved graph") + + +# Load dataset functions +def load_mnist_dataset(shape=(-1, 784), path='data'): + """Load the original mnist. + + Automatically download MNIST dataset and return the training, validation and test set with 50000, 10000 and 10000 digit images respectively. + + Parameters + ---------- + shape : tuple + The shape of digit images (the default is (-1, 784), alternatively (-1, 28, 28, 1)). + path : str + The path that the data is downloaded to. + + Returns + ------- + X_train, y_train, X_val, y_val, X_test, y_test: tuple + Return splitted training/validation/test set respectively. + + Examples + -------- + >>> X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1,784), path='datasets') + >>> X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 28, 28, 1)) + """ + return _load_mnist_dataset(shape, path, name='mnist', url='http://yann.lecun.com/exdb/mnist/') + + +def load_fashion_mnist_dataset(shape=(-1, 784), path='data'): + """Load the fashion mnist. + + Automatically download fashion-MNIST dataset and return the training, validation and test set with 50000, 10000 and 10000 fashion images respectively, `examples `__. + + Parameters + ---------- + shape : tuple + The shape of digit images (the default is (-1, 784), alternatively (-1, 28, 28, 1)). + path : str + The path that the data is downloaded to. + + Returns + ------- + X_train, y_train, X_val, y_val, X_test, y_test: tuple + Return splitted training/validation/test set respectively. + + Examples + -------- + >>> X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_fashion_mnist_dataset(shape=(-1,784), path='datasets') + >>> X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_fashion_mnist_dataset(shape=(-1, 28, 28, 1)) + """ + return _load_mnist_dataset( + shape, path, name='fashion_mnist', url='http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/' + ) + + +def _load_mnist_dataset(shape, path, name='mnist', url='http://yann.lecun.com/exdb/mnist/'): + """A generic function to load mnist-like dataset. + + Parameters: + ---------- + shape : tuple + The shape of digit images. + path : str + The path that the data is downloaded to. + name : str + The dataset name you want to use(the default is 'mnist'). + url : str + The url of dataset(the default is 'http://yann.lecun.com/exdb/mnist/'). + """ + path = os.path.join(path, name) + + # Define functions for loading mnist-like data's images and labels. + # For convenience, they also download the requested files if needed. + def load_mnist_images(path, filename): + filepath = maybe_download_and_extract(filename, path, url) + + logging.info(filepath) + # Read the inputs in Yann LeCun's binary format. + with gzip.open(filepath, 'rb') as f: + data = np.frombuffer(f.read(), np.uint8, offset=16) + # The inputs are vectors now, we reshape them to monochrome 2D images, + # following the shape convention: (examples, channels, rows, columns) + data = data.reshape(shape) + # The inputs come as bytes, we convert them to float32 in range [0,1]. + # (Actually to range [0, 255/256], for compatibility to the version + # provided at http://deeplearning.net/data/mnist/mnist.pkl.gz.) + return data / np.float32(256) + + def load_mnist_labels(path, filename): + filepath = maybe_download_and_extract(filename, path, url) + # Read the labels in Yann LeCun's binary format. + with gzip.open(filepath, 'rb') as f: + data = np.frombuffer(f.read(), np.uint8, offset=8) + # The labels are vectors of integers now, that's exactly what we want. + return data + + # Download and read the training and test set images and labels. + logging.info("Load or Download {0} > {1}".format(name.upper(), path)) + X_train = load_mnist_images(path, 'train-images-idx3-ubyte.gz') + y_train = load_mnist_labels(path, 'train-labels-idx1-ubyte.gz') + X_test = load_mnist_images(path, 't10k-images-idx3-ubyte.gz') + y_test = load_mnist_labels(path, 't10k-labels-idx1-ubyte.gz') + + # We reserve the last 10000 training examples for validation. + X_train, X_val = X_train[:-10000], X_train[-10000:] + y_train, y_val = y_train[:-10000], y_train[-10000:] + + # We just return all the arrays in order, as expected in main(). + # (It doesn't matter how we do this as long as we can read them again.) + X_train = np.asarray(X_train, dtype=np.float32) + y_train = np.asarray(y_train, dtype=np.int32) + X_val = np.asarray(X_val, dtype=np.float32) + y_val = np.asarray(y_val, dtype=np.int32) + X_test = np.asarray(X_test, dtype=np.float32) + y_test = np.asarray(y_test, dtype=np.int32) + return X_train, y_train, X_val, y_val, X_test, y_test + + +def load_cifar10_dataset(shape=(-1, 32, 32, 3), path='data', plotable=False): + """Load CIFAR-10 dataset. + + It consists of 60000 32x32 colour images in 10 classes, with + 6000 images per class. There are 50000 training images and 10000 test images. + + The dataset is divided into five training batches and one test batch, each with + 10000 images. The test batch contains exactly 1000 randomly-selected images from + each class. The training batches contain the remaining images in random order, + but some training batches may contain more images from one class than another. + Between them, the training batches contain exactly 5000 images from each class. + + Parameters + ---------- + shape : tupe + The shape of digit images e.g. (-1, 3, 32, 32) and (-1, 32, 32, 3). + path : str + The path that the data is downloaded to, defaults is ``data/cifar10/``. + plotable : boolean + Whether to plot some image examples, False as default. + + Examples + -------- + >>> X_train, y_train, X_test, y_test = tl.files.load_cifar10_dataset(shape=(-1, 32, 32, 3)) + + References + ---------- + - `CIFAR website `__ + - `Data download link `__ + - ``__ + + """ + path = os.path.join(path, 'cifar10') + logging.info("Load or Download cifar10 > {}".format(path)) + + # Helper function to unpickle the data + def unpickle(file): + fp = open(file, 'rb') + if sys.version_info.major == 2: + data = pickle.load(fp) + elif sys.version_info.major == 3: + data = pickle.load(fp, encoding='latin-1') + fp.close() + return data + + filename = 'cifar-10-python.tar.gz' + url = 'https://www.cs.toronto.edu/~kriz/' + # Download and uncompress file + maybe_download_and_extract(filename, path, url, extract=True) + + # Unpickle file and fill in data + X_train = None + y_train = [] + for i in range(1, 6): + data_dic = unpickle(os.path.join(path, 'cifar-10-batches-py/', "data_batch_{}".format(i))) + if i == 1: + X_train = data_dic['data'] + else: + X_train = np.vstack((X_train, data_dic['data'])) + y_train += data_dic['labels'] + + test_data_dic = unpickle(os.path.join(path, 'cifar-10-batches-py/', "test_batch")) + X_test = test_data_dic['data'] + y_test = np.array(test_data_dic['labels']) + + if shape == (-1, 3, 32, 32): + X_test = X_test.reshape(shape) + X_train = X_train.reshape(shape) + elif shape == (-1, 32, 32, 3): + X_test = X_test.reshape(shape, order='F') + X_train = X_train.reshape(shape, order='F') + X_test = np.transpose(X_test, (0, 2, 1, 3)) + X_train = np.transpose(X_train, (0, 2, 1, 3)) + else: + X_test = X_test.reshape(shape) + X_train = X_train.reshape(shape) + + y_train = np.array(y_train) + + if plotable: + + if sys.platform.startswith('darwin'): + import matplotlib + matplotlib.use('TkAgg') + import matplotlib.pyplot as plt + + logging.info('\nCIFAR-10') + fig = plt.figure(1) + + logging.info('Shape of a training image: X_train[0] %s' % X_train[0].shape) + + plt.ion() # interactive mode + count = 1 + for _ in range(10): # each row + for _ in range(10): # each column + _ = fig.add_subplot(10, 10, count) + if shape == (-1, 3, 32, 32): + # plt.imshow(X_train[count-1], interpolation='nearest') + plt.imshow(np.transpose(X_train[count - 1], (1, 2, 0)), interpolation='nearest') + # plt.imshow(np.transpose(X_train[count-1], (2, 1, 0)), interpolation='nearest') + elif shape == (-1, 32, 32, 3): + plt.imshow(X_train[count - 1], interpolation='nearest') + # plt.imshow(np.transpose(X_train[count-1], (1, 0, 2)), interpolation='nearest') + else: + raise Exception("Do not support the given 'shape' to plot the image examples") + plt.gca().xaxis.set_major_locator(plt.NullLocator()) # 不显示刻度(tick) + plt.gca().yaxis.set_major_locator(plt.NullLocator()) + count = count + 1 + plt.draw() # interactive mode + plt.pause(3) # interactive mode + + logging.info("X_train: %s" % X_train.shape) + logging.info("y_train: %s" % y_train.shape) + logging.info("X_test: %s" % X_test.shape) + logging.info("y_test: %s" % y_test.shape) + + X_train = np.asarray(X_train, dtype=np.float32) + X_test = np.asarray(X_test, dtype=np.float32) + y_train = np.asarray(y_train, dtype=np.int32) + y_test = np.asarray(y_test, dtype=np.int32) + + return X_train, y_train, X_test, y_test + + +def load_cropped_svhn(path='data', include_extra=True): + """Load Cropped SVHN. + + The Cropped Street View House Numbers (SVHN) Dataset contains 32x32x3 RGB images. + Digit '1' has label 1, '9' has label 9 and '0' has label 0 (the original dataset uses 10 to represent '0'), see `ufldl website `__. + + Parameters + ---------- + path : str + The path that the data is downloaded to. + include_extra : boolean + If True (default), add extra images to the training set. + + Returns + ------- + X_train, y_train, X_test, y_test: tuple + Return splitted training/test set respectively. + + Examples + --------- + >>> X_train, y_train, X_test, y_test = tl.files.load_cropped_svhn(include_extra=False) + >>> tl.vis.save_images(X_train[0:100], [10, 10], 'svhn.png') + + """ + start_time = time.time() + + path = os.path.join(path, 'cropped_svhn') + logging.info("Load or Download Cropped SVHN > {} | include extra images: {}".format(path, include_extra)) + url = "http://ufldl.stanford.edu/housenumbers/" + + np_file = os.path.join(path, "train_32x32.npz") + if file_exists(np_file) is False: + filename = "train_32x32.mat" + filepath = maybe_download_and_extract(filename, path, url) + mat = sio.loadmat(filepath) + X_train = mat['X'] / 255.0 # to [0, 1] + X_train = np.transpose(X_train, (3, 0, 1, 2)) + y_train = np.squeeze(mat['y'], axis=1) + y_train[y_train == 10] = 0 # replace 10 to 0 + np.savez(np_file, X=X_train, y=y_train) + del_file(filepath) + else: + v = np.load(np_file, allow_pickle=True) + X_train = v['X'] + y_train = v['y'] + logging.info(" n_train: {}".format(len(y_train))) + + np_file = os.path.join(path, "test_32x32.npz") + if file_exists(np_file) is False: + filename = "test_32x32.mat" + filepath = maybe_download_and_extract(filename, path, url) + mat = sio.loadmat(filepath) + X_test = mat['X'] / 255.0 + X_test = np.transpose(X_test, (3, 0, 1, 2)) + y_test = np.squeeze(mat['y'], axis=1) + y_test[y_test == 10] = 0 + np.savez(np_file, X=X_test, y=y_test) + del_file(filepath) + else: + v = np.load(np_file, allow_pickle=True) + X_test = v['X'] + y_test = v['y'] + logging.info(" n_test: {}".format(len(y_test))) + + if include_extra: + logging.info(" getting extra 531131 images, please wait ...") + np_file = os.path.join(path, "extra_32x32.npz") + if file_exists(np_file) is False: + logging.info(" the first time to load extra images will take long time to convert the file format ...") + filename = "extra_32x32.mat" + filepath = maybe_download_and_extract(filename, path, url) + mat = sio.loadmat(filepath) + X_extra = mat['X'] / 255.0 + X_extra = np.transpose(X_extra, (3, 0, 1, 2)) + y_extra = np.squeeze(mat['y'], axis=1) + y_extra[y_extra == 10] = 0 + np.savez(np_file, X=X_extra, y=y_extra) + del_file(filepath) + else: + v = np.load(np_file, allow_pickle=True) + X_extra = v['X'] + y_extra = v['y'] + # print(X_train.shape, X_extra.shape) + logging.info(" adding n_extra {} to n_train {}".format(len(y_extra), len(y_train))) + t = time.time() + X_train = np.concatenate((X_train, X_extra), 0) + y_train = np.concatenate((y_train, y_extra), 0) + # X_train = np.append(X_train, X_extra, axis=0) + # y_train = np.append(y_train, y_extra, axis=0) + logging.info(" added n_extra {} to n_train {} took {}s".format(len(y_extra), len(y_train), time.time() - t)) + else: + logging.info(" no extra images are included") + logging.info(" image size: %s n_train: %d n_test: %d" % (str(X_train.shape[1:4]), len(y_train), len(y_test))) + logging.info(" took: {}s".format(int(time.time() - start_time))) + return X_train, y_train, X_test, y_test + + +def load_ptb_dataset(path='data'): + """Load Penn TreeBank (PTB) dataset. + + It is used in many LANGUAGE MODELING papers, + including "Empirical Evaluation and Combination of Advanced Language + Modeling Techniques", "Recurrent Neural Network Regularization". + It consists of 929k training words, 73k validation words, and 82k test + words. It has 10k words in its vocabulary. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/ptb/``. + + Returns + -------- + train_data, valid_data, test_data : list of int + The training, validating and testing data in integer format. + vocab_size : int + The vocabulary size. + + Examples + -------- + >>> train_data, valid_data, test_data, vocab_size = tl.files.load_ptb_dataset() + + References + --------------- + - ``tensorflow.models.rnn.ptb import reader`` + - `Manual download `__ + + Notes + ------ + - If you want to get the raw data, see the source code. + + """ + path = os.path.join(path, 'ptb') + logging.info("Load or Download Penn TreeBank (PTB) dataset > {}".format(path)) + + # Maybe dowload and uncompress tar, or load exsisting files + filename = 'simple-examples.tgz' + url = 'http://www.fit.vutbr.cz/~imikolov/rnnlm/' + maybe_download_and_extract(filename, path, url, extract=True) + + data_path = os.path.join(path, 'simple-examples', 'data') + train_path = os.path.join(data_path, "ptb.train.txt") + valid_path = os.path.join(data_path, "ptb.valid.txt") + test_path = os.path.join(data_path, "ptb.test.txt") + + word_to_id = nlp.build_vocab(nlp.read_words(train_path)) + + train_data = nlp.words_to_word_ids(nlp.read_words(train_path), word_to_id) + valid_data = nlp.words_to_word_ids(nlp.read_words(valid_path), word_to_id) + test_data = nlp.words_to_word_ids(nlp.read_words(test_path), word_to_id) + vocab_size = len(word_to_id) + + # logging.info(nlp.read_words(train_path)) # ... 'according', 'to', 'mr.', '', ''] + # logging.info(train_data) # ... 214, 5, 23, 1, 2] + # logging.info(word_to_id) # ... 'beyond': 1295, 'anti-nuclear': 9599, 'trouble': 1520, '': 2 ... } + # logging.info(vocabulary) # 10000 + # exit() + return train_data, valid_data, test_data, vocab_size + + +def load_matt_mahoney_text8_dataset(path='data'): + """Load Matt Mahoney's dataset. + + Download a text file from Matt Mahoney's website + if not present, and make sure it's the right size. + Extract the first file enclosed in a zip file as a list of words. + This dataset can be used for Word Embedding. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/mm_test8/``. + + Returns + -------- + list of str + The raw text data e.g. [.... 'their', 'families', 'who', 'were', 'expelled', 'from', 'jerusalem', ...] + + Examples + -------- + >>> words = tl.files.load_matt_mahoney_text8_dataset() + >>> print('Data size', len(words)) + + """ + path = os.path.join(path, 'mm_test8') + logging.info("Load or Download matt_mahoney_text8 Dataset> {}".format(path)) + + filename = 'text8.zip' + url = 'http://mattmahoney.net/dc/' + maybe_download_and_extract(filename, path, url, expected_bytes=31344016) + + with zipfile.ZipFile(os.path.join(path, filename)) as f: + word_list = f.read(f.namelist()[0]).split() + for idx, _ in enumerate(word_list): + word_list[idx] = word_list[idx].decode() + return word_list + + +def load_imdb_dataset( + path='data', nb_words=None, skip_top=0, maxlen=None, test_split=0.2, seed=113, start_char=1, oov_char=2, + index_from=3 +): + """Load IMDB dataset. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/imdb/``. + nb_words : int + Number of words to get. + skip_top : int + Top most frequent words to ignore (they will appear as oov_char value in the sequence data). + maxlen : int + Maximum sequence length. Any longer sequence will be truncated. + seed : int + Seed for reproducible data shuffling. + start_char : int + The start of a sequence will be marked with this character. Set to 1 because 0 is usually the padding character. + oov_char : int + Words that were cut out because of the num_words or skip_top limit will be replaced with this character. + index_from : int + Index actual words with this index and higher. + + Examples + -------- + >>> X_train, y_train, X_test, y_test = tl.files.load_imdb_dataset( + ... nb_words=20000, test_split=0.2) + >>> print('X_train.shape', X_train.shape) + (20000,) [[1, 62, 74, ... 1033, 507, 27],[1, 60, 33, ... 13, 1053, 7]..] + >>> print('y_train.shape', y_train.shape) + (20000,) [1 0 0 ..., 1 0 1] + + References + ----------- + - `Modified from keras. `__ + + """ + path = os.path.join(path, 'imdb') + + filename = "imdb.pkl" + url = 'https://s3.amazonaws.com/text-datasets/' + maybe_download_and_extract(filename, path, url) + + if filename.endswith(".gz"): + f = gzip.open(os.path.join(path, filename), 'rb') + else: + f = open(os.path.join(path, filename), 'rb') + + X, labels = cPickle.load(f) + f.close() + + np.random.seed(seed) + np.random.shuffle(X) + np.random.seed(seed) + np.random.shuffle(labels) + + if start_char is not None: + X = [[start_char] + [w + index_from for w in x] for x in X] + elif index_from: + X = [[w + index_from for w in x] for x in X] + + if maxlen: + new_X = [] + new_labels = [] + for x, y in zip(X, labels): + if len(x) < maxlen: + new_X.append(x) + new_labels.append(y) + X = new_X + labels = new_labels + if not X: + raise Exception( + 'After filtering for sequences shorter than maxlen=' + str(maxlen) + ', no sequence was kept. ' + 'Increase maxlen.' + ) + if not nb_words: + nb_words = max([max(x) for x in X]) + + # by convention, use 2 as OOV word + # reserve 'index_from' (=3 by default) characters: 0 (padding), 1 (start), 2 (OOV) + if oov_char is not None: + X = [[oov_char if (w >= nb_words or w < skip_top) else w for w in x] for x in X] + else: + nX = [] + for x in X: + nx = [] + for w in x: + if (w >= nb_words or w < skip_top): + nx.append(w) + nX.append(nx) + X = nX + + X_train = np.array(X[:int(len(X) * (1 - test_split))]) + y_train = np.array(labels[:int(len(X) * (1 - test_split))]) + + X_test = np.array(X[int(len(X) * (1 - test_split)):]) + y_test = np.array(labels[int(len(X) * (1 - test_split)):]) + + return X_train, y_train, X_test, y_test + + +def load_nietzsche_dataset(path='data'): + """Load Nietzsche dataset. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/nietzsche/``. + + Returns + -------- + str + The content. + + Examples + -------- + >>> see tutorial_generate_text.py + >>> words = tl.files.load_nietzsche_dataset() + >>> words = basic_clean_str(words) + >>> words = words.split() + + """ + logging.info("Load or Download nietzsche dataset > {}".format(path)) + path = os.path.join(path, 'nietzsche') + + filename = "nietzsche.txt" + url = 'https://s3.amazonaws.com/text-datasets/' + filepath = maybe_download_and_extract(filename, path, url) + + with open(filepath, "r") as f: + words = f.read() + return words + + +def load_wmt_en_fr_dataset(path='data'): + """Load WMT'15 English-to-French translation dataset. + + It will download the data from the WMT'15 Website (10^9-French-English corpus), and the 2013 news test from the same site as development set. + Returns the directories of training data and test data. + + Parameters + ---------- + path : str + The path that the data is downloaded to, defaults is ``data/wmt_en_fr/``. + + References + ---------- + - Code modified from /tensorflow/models/rnn/translation/data_utils.py + + Notes + ----- + Usually, it will take a long time to download this dataset. + + """ + path = os.path.join(path, 'wmt_en_fr') + # URLs for WMT data. + _WMT_ENFR_TRAIN_URL = "http://www.statmt.org/wmt10/" + _WMT_ENFR_DEV_URL = "http://www.statmt.org/wmt15/" + + def gunzip_file(gz_path, new_path): + """Unzips from gz_path into new_path.""" + logging.info("Unpacking %s to %s" % (gz_path, new_path)) + with gzip.open(gz_path, "rb") as gz_file: + with open(new_path, "wb") as new_file: + for line in gz_file: + new_file.write(line) + + def get_wmt_enfr_train_set(path): + """Download the WMT en-fr training corpus to directory unless it's there.""" + filename = "training-giga-fren.tar" + maybe_download_and_extract(filename, path, _WMT_ENFR_TRAIN_URL, extract=True) + train_path = os.path.join(path, "giga-fren.release2.fixed") + gunzip_file(train_path + ".fr.gz", train_path + ".fr") + gunzip_file(train_path + ".en.gz", train_path + ".en") + return train_path + + def get_wmt_enfr_dev_set(path): + """Download the WMT en-fr training corpus to directory unless it's there.""" + filename = "dev-v2.tgz" + dev_file = maybe_download_and_extract(filename, path, _WMT_ENFR_DEV_URL, extract=False) + dev_name = "newstest2013" + dev_path = os.path.join(path, "newstest2013") + if not (gfile.Exists(dev_path + ".fr") and gfile.Exists(dev_path + ".en")): + logging.info("Extracting tgz file %s" % dev_file) + with tarfile.open(dev_file, "r:gz") as dev_tar: + fr_dev_file = dev_tar.getmember("dev/" + dev_name + ".fr") + en_dev_file = dev_tar.getmember("dev/" + dev_name + ".en") + fr_dev_file.name = dev_name + ".fr" # Extract without "dev/" prefix. + en_dev_file.name = dev_name + ".en" + dev_tar.extract(fr_dev_file, path) + dev_tar.extract(en_dev_file, path) + return dev_path + + logging.info("Load or Download WMT English-to-French translation > {}".format(path)) + + train_path = get_wmt_enfr_train_set(path) + dev_path = get_wmt_enfr_dev_set(path) + + return train_path, dev_path + + +def load_flickr25k_dataset(tag='sky', path="data", n_threads=50, printable=False): + """Load Flickr25K dataset. + + Returns a list of images by a given tag from Flick25k dataset, + it will download Flickr25k from `the official website `__ + at the first time you use it. + + Parameters + ------------ + tag : str or None + What images to return. + - If you want to get images with tag, use string like 'dog', 'red', see `Flickr Search `__. + - If you want to get all images, set to ``None``. + + path : str + The path that the data is downloaded to, defaults is ``data/flickr25k/``. + n_threads : int + The number of thread to read image. + printable : boolean + Whether to print infomation when reading images, default is ``False``. + + Examples + ----------- + Get images with tag of sky + + >>> images = tl.files.load_flickr25k_dataset(tag='sky') + + Get all images + + >>> images = tl.files.load_flickr25k_dataset(tag=None, n_threads=100, printable=True) + + """ + path = os.path.join(path, 'flickr25k') + + filename = 'mirflickr25k.zip' + url = 'http://press.liacs.nl/mirflickr/mirflickr25k/' + + # download dataset + if folder_exists(os.path.join(path, "mirflickr")) is False: + logging.info("[*] Flickr25k is nonexistent in {}".format(path)) + maybe_download_and_extract(filename, path, url, extract=True) + del_file(os.path.join(path, filename)) + + # return images by the given tag. + # 1. image path list + folder_imgs = os.path.join(path, "mirflickr") + path_imgs = load_file_list(path=folder_imgs, regx='\\.jpg', printable=False) + path_imgs.sort(key=natural_keys) + + # 2. tag path list + folder_tags = os.path.join(path, "mirflickr", "meta", "tags") + path_tags = load_file_list(path=folder_tags, regx='\\.txt', printable=False) + path_tags.sort(key=natural_keys) + + # 3. select images + if tag is None: + logging.info("[Flickr25k] reading all images") + else: + logging.info("[Flickr25k] reading images with tag: {}".format(tag)) + images_list = [] + for idx, _v in enumerate(path_tags): + tags = read_file(os.path.join(folder_tags, path_tags[idx])).split('\n') + # logging.info(idx+1, tags) + if tag is None or tag in tags: + images_list.append(path_imgs[idx]) + + images = visualize.read_images(images_list, folder_imgs, n_threads=n_threads, printable=printable) + return images + + +def load_flickr1M_dataset(tag='sky', size=10, path="data", n_threads=50, printable=False): + """Load Flick1M dataset. + + Returns a list of images by a given tag from Flickr1M dataset, + it will download Flickr1M from `the official website `__ + at the first time you use it. + + Parameters + ------------ + tag : str or None + What images to return. + - If you want to get images with tag, use string like 'dog', 'red', see `Flickr Search `__. + - If you want to get all images, set to ``None``. + + size : int + integer between 1 to 10. 1 means 100k images ... 5 means 500k images, 10 means all 1 million images. Default is 10. + path : str + The path that the data is downloaded to, defaults is ``data/flickr25k/``. + n_threads : int + The number of thread to read image. + printable : boolean + Whether to print infomation when reading images, default is ``False``. + + Examples + ---------- + Use 200k images + + >>> images = tl.files.load_flickr1M_dataset(tag='zebra', size=2) + + Use 1 Million images + + >>> images = tl.files.load_flickr1M_dataset(tag='zebra') + + """ + path = os.path.join(path, 'flickr1M') + logging.info("[Flickr1M] using {}% of images = {}".format(size * 10, size * 100000)) + images_zip = [ + 'images0.zip', 'images1.zip', 'images2.zip', 'images3.zip', 'images4.zip', 'images5.zip', 'images6.zip', + 'images7.zip', 'images8.zip', 'images9.zip' + ] + tag_zip = 'tags.zip' + url = 'http://press.liacs.nl/mirflickr/mirflickr1m/' + + # download dataset + for image_zip in images_zip[0:size]: + image_folder = image_zip.split(".")[0] + # logging.info(path+"/"+image_folder) + if folder_exists(os.path.join(path, image_folder)) is False: + # logging.info(image_zip) + logging.info("[Flickr1M] {} is missing in {}".format(image_folder, path)) + maybe_download_and_extract(image_zip, path, url, extract=True) + del_file(os.path.join(path, image_zip)) + # os.system("mv {} {}".format(os.path.join(path, 'images'), os.path.join(path, image_folder))) + shutil.move(os.path.join(path, 'images'), os.path.join(path, image_folder)) + else: + logging.info("[Flickr1M] {} exists in {}".format(image_folder, path)) + + # download tag + if folder_exists(os.path.join(path, "tags")) is False: + logging.info("[Flickr1M] tag files is nonexistent in {}".format(path)) + maybe_download_and_extract(tag_zip, path, url, extract=True) + del_file(os.path.join(path, tag_zip)) + else: + logging.info("[Flickr1M] tags exists in {}".format(path)) + + # 1. image path list + images_list = [] + images_folder_list = [] + for i in range(0, size): + images_folder_list += load_folder_list(path=os.path.join(path, 'images%d' % i)) + images_folder_list.sort(key=lambda s: int(s.split('/')[-1])) # folder/images/ddd + + for folder in images_folder_list[0:size * 10]: + tmp = load_file_list(path=folder, regx='\\.jpg', printable=False) + tmp.sort(key=lambda s: int(s.split('.')[-2])) # ddd.jpg + images_list.extend([os.path.join(folder, x) for x in tmp]) + + # 2. tag path list + tag_list = [] + tag_folder_list = load_folder_list(os.path.join(path, "tags")) + + # tag_folder_list.sort(key=lambda s: int(s.split("/")[-1])) # folder/images/ddd + tag_folder_list.sort(key=lambda s: int(os.path.basename(s))) + + for folder in tag_folder_list[0:size * 10]: + tmp = load_file_list(path=folder, regx='\\.txt', printable=False) + tmp.sort(key=lambda s: int(s.split('.')[-2])) # ddd.txt + tmp = [os.path.join(folder, s) for s in tmp] + tag_list += tmp + + # 3. select images + logging.info("[Flickr1M] searching tag: {}".format(tag)) + select_images_list = [] + for idx, _val in enumerate(tag_list): + tags = read_file(tag_list[idx]).split('\n') + if tag in tags: + select_images_list.append(images_list[idx]) + + logging.info("[Flickr1M] reading images with tag: {}".format(tag)) + images = visualize.read_images(select_images_list, '', n_threads=n_threads, printable=printable) + return images + + +def load_cyclegan_dataset(filename='summer2winter_yosemite', path='data'): + """Load images from CycleGAN's database, see `this link `__. + + Parameters + ------------ + filename : str + The dataset you want, see `this link `__. + path : str + The path that the data is downloaded to, defaults is `data/cyclegan` + + Examples + --------- + >>> im_train_A, im_train_B, im_test_A, im_test_B = load_cyclegan_dataset(filename='summer2winter_yosemite') + + """ + path = os.path.join(path, 'cyclegan') + url = 'https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/' + + if folder_exists(os.path.join(path, filename)) is False: + logging.info("[*] {} is nonexistent in {}".format(filename, path)) + maybe_download_and_extract(filename + '.zip', path, url, extract=True) + del_file(os.path.join(path, filename + '.zip')) + + def load_image_from_folder(path): + path_imgs = load_file_list(path=path, regx='\\.jpg', printable=False) + return visualize.read_images(path_imgs, path=path, n_threads=10, printable=False) + + im_train_A = load_image_from_folder(os.path.join(path, filename, "trainA")) + im_train_B = load_image_from_folder(os.path.join(path, filename, "trainB")) + im_test_A = load_image_from_folder(os.path.join(path, filename, "testA")) + im_test_B = load_image_from_folder(os.path.join(path, filename, "testB")) + + def if_2d_to_3d(images): # [h, w] --> [h, w, 3] + for i, _v in enumerate(images): + if len(images[i].shape) == 2: + images[i] = images[i][:, :, np.newaxis] + images[i] = np.tile(images[i], (1, 1, 3)) + return images + + im_train_A = if_2d_to_3d(im_train_A) + im_train_B = if_2d_to_3d(im_train_B) + im_test_A = if_2d_to_3d(im_test_A) + im_test_B = if_2d_to_3d(im_test_B) + + return im_train_A, im_train_B, im_test_A, im_test_B + + +def download_file_from_google_drive(ID, destination): + """Download file from Google Drive. + + See ``tl.files.load_celebA_dataset`` for example. + + Parameters + -------------- + ID : str + The driver ID. + destination : str + The destination for save file. + + """ + try: + from tqdm import tqdm + except ImportError as e: + print(e) + raise ImportError("Module tqdm not found. Please install tqdm via pip or other package managers.") + + try: + import requests + except ImportError as e: + print(e) + raise ImportError("Module requests not found. Please install requests via pip or other package managers.") + + def save_response_content(response, destination, chunk_size=32 * 1024): + + total_size = int(response.headers.get('content-length', 0)) + with open(destination, "wb") as f: + for chunk in tqdm(response.iter_content(chunk_size), total=total_size, unit='B', unit_scale=True, + desc=destination): + if chunk: # filter out keep-alive new chunks + f.write(chunk) + + def get_confirm_token(response): + for key, value in response.cookies.items(): + if key.startswith('download_warning'): + return value + return None + + URL = "https://docs.google.com/uc?export=download" + session = requests.Session() + + response = session.get(URL, params={'id': ID}, stream=True) + token = get_confirm_token(response) + + if token: + params = {'id': ID, 'confirm': token} + response = session.get(URL, params=params, stream=True) + save_response_content(response, destination) + + +def load_celebA_dataset(path='data'): + """Load CelebA dataset + + Return a list of image path. + + Parameters + ----------- + path : str + The path that the data is downloaded to, defaults is ``data/celebA/``. + + """ + data_dir = 'celebA' + filename, drive_id = "img_align_celeba.zip", "0B7EVK8r0v71pZjFTYXZWM3FlRnM" + save_path = os.path.join(path, filename) + image_path = os.path.join(path, data_dir) + if os.path.exists(image_path): + logging.info('[*] {} already exists'.format(save_path)) + else: + exists_or_mkdir(path) + download_file_from_google_drive(drive_id, save_path) + zip_dir = '' + with zipfile.ZipFile(save_path) as zf: + zip_dir = zf.namelist()[0] + zf.extractall(path) + os.remove(save_path) + os.rename(os.path.join(path, zip_dir), image_path) + + data_files = load_file_list(path=image_path, regx='\\.jpg', printable=False) + for i, _v in enumerate(data_files): + data_files[i] = os.path.join(image_path, data_files[i]) + return data_files + + +def load_voc_dataset(path='data', dataset='2012', contain_classes_in_person=False): + """Pascal VOC 2007/2012 Dataset. + + It has 20 objects: + aeroplane, bicycle, bird, boat, bottle, bus, car, cat, chair, cow, diningtable, dog, horse, motorbike, person, pottedplant, sheep, sofa, train, tvmonitor + and additional 3 classes : head, hand, foot for person. + + Parameters + ----------- + path : str + The path that the data is downloaded to, defaults is ``data/VOC``. + dataset : str + The VOC dataset version, `2012`, `2007`, `2007test` or `2012test`. We usually train model on `2007+2012` and test it on `2007test`. + contain_classes_in_person : boolean + Whether include head, hand and foot annotation, default is False. + + Returns + --------- + imgs_file_list : list of str + Full paths of all images. + imgs_semseg_file_list : list of str + Full paths of all maps for semantic segmentation. Note that not all images have this map! + imgs_insseg_file_list : list of str + Full paths of all maps for instance segmentation. Note that not all images have this map! + imgs_ann_file_list : list of str + Full paths of all annotations for bounding box and object class, all images have this annotations. + classes : list of str + Classes in order. + classes_in_person : list of str + Classes in person. + classes_dict : dictionary + Class label to integer. + n_objs_list : list of int + Number of objects in all images in ``imgs_file_list`` in order. + objs_info_list : list of str + Darknet format for the annotation of all images in ``imgs_file_list`` in order. ``[class_id x_centre y_centre width height]`` in ratio format. + objs_info_dicts : dictionary + The annotation of all images in ``imgs_file_list``, ``{imgs_file_list : dictionary for annotation}``, + format from `TensorFlow/Models/object-detection `__. + + Examples + ---------- + >>> imgs_file_list, imgs_semseg_file_list, imgs_insseg_file_list, imgs_ann_file_list, + >>> classes, classes_in_person, classes_dict, + >>> n_objs_list, objs_info_list, objs_info_dicts = tl.files.load_voc_dataset(dataset="2012", contain_classes_in_person=False) + >>> idx = 26 + >>> print(classes) + ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'] + >>> print(classes_dict) + {'sheep': 16, 'horse': 12, 'bicycle': 1, 'bottle': 4, 'cow': 9, 'sofa': 17, 'car': 6, 'dog': 11, 'cat': 7, 'person': 14, 'train': 18, 'diningtable': 10, 'aeroplane': 0, 'bus': 5, 'pottedplant': 15, 'tvmonitor': 19, 'chair': 8, 'bird': 2, 'boat': 3, 'motorbike': 13} + >>> print(imgs_file_list[idx]) + data/VOC/VOC2012/JPEGImages/2007_000423.jpg + >>> print(n_objs_list[idx]) + 2 + >>> print(imgs_ann_file_list[idx]) + data/VOC/VOC2012/Annotations/2007_000423.xml + >>> print(objs_info_list[idx]) + 14 0.173 0.461333333333 0.142 0.496 + 14 0.828 0.542666666667 0.188 0.594666666667 + >>> ann = tl.prepro.parse_darknet_ann_str_to_list(objs_info_list[idx]) + >>> print(ann) + [[14, 0.173, 0.461333333333, 0.142, 0.496], [14, 0.828, 0.542666666667, 0.188, 0.594666666667]] + >>> c, b = tl.prepro.parse_darknet_ann_list_to_cls_box(ann) + >>> print(c, b) + [14, 14] [[0.173, 0.461333333333, 0.142, 0.496], [0.828, 0.542666666667, 0.188, 0.594666666667]] + + References + ------------- + - `Pascal VOC2012 Website `__. + - `Pascal VOC2007 Website `__. + + """ + + import xml.etree.ElementTree as ET + + try: + import lxml.etree as etree + except ImportError as e: + print(e) + raise ImportError("Module lxml not found. Please install lxml via pip or other package managers.") + + path = os.path.join(path, 'VOC') + + def _recursive_parse_xml_to_dict(xml): + """Recursively parses XML contents to python dict. + + We assume that `object` tags are the only ones that can appear + multiple times at the same level of a tree. + + Args: + xml: xml tree obtained by parsing XML file contents using lxml.etree + + Returns: + Python dictionary holding XML contents. + + """ + if not xml: + # if xml is not None: + return {xml.tag: xml.text} + result = {} + for child in xml: + child_result = _recursive_parse_xml_to_dict(child) + if child.tag != 'object': + result[child.tag] = child_result[child.tag] + else: + if child.tag not in result: + result[child.tag] = [] + result[child.tag].append(child_result[child.tag]) + return {xml.tag: result} + + if dataset == "2012": + url = "http://host.robots.ox.ac.uk/pascal/VOC/voc2012/" + tar_filename = "VOCtrainval_11-May-2012.tar" + extracted_filename = "VOC2012" # "VOCdevkit/VOC2012" + logging.info(" [============= VOC 2012 =============]") + elif dataset == "2012test": + extracted_filename = "VOC2012test" # "VOCdevkit/VOC2012" + logging.info(" [============= VOC 2012 Test Set =============]") + logging.info( + " \nAuthor: 2012test only have person annotation, so 2007test is highly recommended for testing !\n" + ) + time.sleep(3) + if os.path.isdir(os.path.join(path, extracted_filename)) is False: + logging.info("For VOC 2012 Test data - online registration required") + logging.info( + " Please download VOC2012test.tar from: \n register: http://host.robots.ox.ac.uk:8080 \n voc2012 : http://host.robots.ox.ac.uk:8080/eval/challenges/voc2012/ \ndownload: http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2012test.tar" + ) + logging.info(" unzip VOC2012test.tar,rename the folder to VOC2012test and put it into %s" % path) + exit() + # # http://host.robots.ox.ac.uk:8080/eval/downloads/VOC2012test.tar + # url = "http://host.robots.ox.ac.uk:8080/eval/downloads/" + # tar_filename = "VOC2012test.tar" + elif dataset == "2007": + url = "http://host.robots.ox.ac.uk/pascal/VOC/voc2007/" + tar_filename = "VOCtrainval_06-Nov-2007.tar" + extracted_filename = "VOC2007" + logging.info(" [============= VOC 2007 =============]") + elif dataset == "2007test": + # http://host.robots.ox.ac.uk/pascal/VOC/voc2007/index.html#testdata + # http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar + url = "http://host.robots.ox.ac.uk/pascal/VOC/voc2007/" + tar_filename = "VOCtest_06-Nov-2007.tar" + extracted_filename = "VOC2007test" + logging.info(" [============= VOC 2007 Test Set =============]") + else: + raise Exception("Please set the dataset aug to 2012, 2012test or 2007.") + + # download dataset + if dataset != "2012test": + _platform = sys.platform + if folder_exists(os.path.join(path, extracted_filename)) is False: + logging.info("[VOC] {} is nonexistent in {}".format(extracted_filename, path)) + maybe_download_and_extract(tar_filename, path, url, extract=True) + del_file(os.path.join(path, tar_filename)) + if dataset == "2012": + if _platform == "win32": + os.system("mv {}\VOCdevkit\VOC2012 {}\VOC2012".format(path, path)) + else: + os.system("mv {}/VOCdevkit/VOC2012 {}/VOC2012".format(path, path)) + elif dataset == "2007": + if _platform == "win32": + os.system("mv {}\VOCdevkit\VOC2007 {}\VOC2007".format(path, path)) + else: + os.system("mv {}/VOCdevkit/VOC2007 {}/VOC2007".format(path, path)) + elif dataset == "2007test": + if _platform == "win32": + os.system("mv {}\VOCdevkit\VOC2007 {}\VOC2007test".format(path, path)) + else: + os.system("mv {}/VOCdevkit/VOC2007 {}/VOC2007test".format(path, path)) + del_folder(os.path.join(path, 'VOCdevkit')) + # object classes(labels) NOTE: YOU CAN CUSTOMIZE THIS LIST + classes = [ + "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", + "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor" + ] + if contain_classes_in_person: + classes_in_person = ["head", "hand", "foot"] + else: + classes_in_person = [] + + classes += classes_in_person # use extra 3 classes for person + + classes_dict = utils.list_string_to_dict(classes) + logging.info("[VOC] object classes {}".format(classes_dict)) + + # 1. image path list + # folder_imgs = path+"/"+extracted_filename+"/JPEGImages/" + folder_imgs = os.path.join(path, extracted_filename, "JPEGImages") + imgs_file_list = load_file_list(path=folder_imgs, regx='\\.jpg', printable=False) + logging.info("[VOC] {} images found".format(len(imgs_file_list))) + + imgs_file_list.sort( + key=lambda s: int(s.replace('.', ' ').replace('_', '').split(' ')[-2]) + ) # 2007_000027.jpg --> 2007000027 + + imgs_file_list = [os.path.join(folder_imgs, s) for s in imgs_file_list] + # logging.info('IM',imgs_file_list[0::3333], imgs_file_list[-1]) + if dataset != "2012test": + # ======== 2. semantic segmentation maps path list + # folder_semseg = path+"/"+extracted_filename+"/SegmentationClass/" + folder_semseg = os.path.join(path, extracted_filename, "SegmentationClass") + imgs_semseg_file_list = load_file_list(path=folder_semseg, regx='\\.png', printable=False) + logging.info("[VOC] {} maps for semantic segmentation found".format(len(imgs_semseg_file_list))) + imgs_semseg_file_list.sort( + key=lambda s: int(s.replace('.', ' ').replace('_', '').split(' ')[-2]) + ) # 2007_000032.png --> 2007000032 + imgs_semseg_file_list = [os.path.join(folder_semseg, s) for s in imgs_semseg_file_list] + # logging.info('Semantic Seg IM',imgs_semseg_file_list[0::333], imgs_semseg_file_list[-1]) + # ======== 3. instance segmentation maps path list + # folder_insseg = path+"/"+extracted_filename+"/SegmentationObject/" + folder_insseg = os.path.join(path, extracted_filename, "SegmentationObject") + imgs_insseg_file_list = load_file_list(path=folder_insseg, regx='\\.png', printable=False) + logging.info("[VOC] {} maps for instance segmentation found".format(len(imgs_semseg_file_list))) + imgs_insseg_file_list.sort( + key=lambda s: int(s.replace('.', ' ').replace('_', '').split(' ')[-2]) + ) # 2007_000032.png --> 2007000032 + imgs_insseg_file_list = [os.path.join(folder_insseg, s) for s in imgs_insseg_file_list] + # logging.info('Instance Seg IM',imgs_insseg_file_list[0::333], imgs_insseg_file_list[-1]) + else: + imgs_semseg_file_list = [] + imgs_insseg_file_list = [] + # 4. annotations for bounding box and object class + # folder_ann = path+"/"+extracted_filename+"/Annotations/" + folder_ann = os.path.join(path, extracted_filename, "Annotations") + imgs_ann_file_list = load_file_list(path=folder_ann, regx='\\.xml', printable=False) + logging.info( + "[VOC] {} XML annotation files for bounding box and object class found".format(len(imgs_ann_file_list)) + ) + imgs_ann_file_list.sort( + key=lambda s: int(s.replace('.', ' ').replace('_', '').split(' ')[-2]) + ) # 2007_000027.xml --> 2007000027 + imgs_ann_file_list = [os.path.join(folder_ann, s) for s in imgs_ann_file_list] + # logging.info('ANN',imgs_ann_file_list[0::3333], imgs_ann_file_list[-1]) + + if dataset == "2012test": # remove unused images in JPEG folder + imgs_file_list_new = [] + for ann in imgs_ann_file_list: + ann = os.path.split(ann)[-1].split('.')[0] + for im in imgs_file_list: + if ann in im: + imgs_file_list_new.append(im) + break + imgs_file_list = imgs_file_list_new + logging.info("[VOC] keep %d images" % len(imgs_file_list_new)) + + # parse XML annotations + def convert(size, box): + dw = 1. / size[0] + dh = 1. / size[1] + x = (box[0] + box[1]) / 2.0 + y = (box[2] + box[3]) / 2.0 + w = box[1] - box[0] + h = box[3] - box[2] + x = x * dw + w = w * dw + y = y * dh + h = h * dh + return x, y, w, h + + def convert_annotation(file_name): + """Given VOC2012 XML Annotations, returns number of objects and info.""" + in_file = open(file_name) + out_file = "" + tree = ET.parse(in_file) + root = tree.getroot() + size = root.find('size') + w = int(size.find('width').text) + h = int(size.find('height').text) + n_objs = 0 + + for obj in root.iter('object'): + if dataset != "2012test": + difficult = obj.find('difficult').text + cls = obj.find('name').text + if cls not in classes or int(difficult) == 1: + continue + else: + cls = obj.find('name').text + if cls not in classes: + continue + cls_id = classes.index(cls) + xmlbox = obj.find('bndbox') + b = ( + float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), + float(xmlbox.find('ymax').text) + ) + bb = convert((w, h), b) + + out_file += str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n' + n_objs += 1 + if cls in "person": + for part in obj.iter('part'): + cls = part.find('name').text + if cls not in classes_in_person: + continue + cls_id = classes.index(cls) + xmlbox = part.find('bndbox') + b = ( + float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), + float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text) + ) + bb = convert((w, h), b) + # out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') + out_file += str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n' + n_objs += 1 + in_file.close() + return n_objs, out_file + + logging.info("[VOC] Parsing xml annotations files") + n_objs_list = [] + objs_info_list = [] # Darknet Format list of string + objs_info_dicts = {} + for idx, ann_file in enumerate(imgs_ann_file_list): + n_objs, objs_info = convert_annotation(ann_file) + n_objs_list.append(n_objs) + objs_info_list.append(objs_info) + with tf.io.gfile.GFile(ann_file, 'r') as fid: + xml_str = fid.read() + xml = etree.fromstring(xml_str) + data = _recursive_parse_xml_to_dict(xml)['annotation'] + objs_info_dicts.update({imgs_file_list[idx]: data}) + + return imgs_file_list, imgs_semseg_file_list, imgs_insseg_file_list, imgs_ann_file_list, classes, classes_in_person, classes_dict, n_objs_list, objs_info_list, objs_info_dicts + + +def load_mpii_pose_dataset(path='data', is_16_pos_only=False): + """Load MPII Human Pose Dataset. + + Parameters + ----------- + path : str + The path that the data is downloaded to. + is_16_pos_only : boolean + If True, only return the peoples contain 16 pose keypoints. (Usually be used for single person pose estimation) + + Returns + ---------- + img_train_list : list of str + The image directories of training data. + ann_train_list : list of dict + The annotations of training data. + img_test_list : list of str + The image directories of testing data. + ann_test_list : list of dict + The annotations of testing data. + + Examples + -------- + >>> import pprint + >>> import tensorlayer as tl + >>> img_train_list, ann_train_list, img_test_list, ann_test_list = tl.files.load_mpii_pose_dataset() + >>> image = tl.vis.read_image(img_train_list[0]) + >>> tl.vis.draw_mpii_pose_to_image(image, ann_train_list[0], 'image.png') + >>> pprint.pprint(ann_train_list[0]) + + References + ----------- + - `MPII Human Pose Dataset. CVPR 14 `__ + - `MPII Human Pose Models. CVPR 16 `__ + - `MPII Human Shape, Poselet Conditioned Pictorial Structures and etc `__ + - `MPII Keyponts and ID `__ + """ + path = os.path.join(path, 'mpii_human_pose') + logging.info("Load or Download MPII Human Pose > {}".format(path)) + + # annotation + url = "http://datasets.d2.mpi-inf.mpg.de/andriluka14cvpr/" + tar_filename = "mpii_human_pose_v1_u12_2.zip" + extracted_filename = "mpii_human_pose_v1_u12_2" + if folder_exists(os.path.join(path, extracted_filename)) is False: + logging.info("[MPII] (annotation) {} is nonexistent in {}".format(extracted_filename, path)) + maybe_download_and_extract(tar_filename, path, url, extract=True) + del_file(os.path.join(path, tar_filename)) + + # images + url = "http://datasets.d2.mpi-inf.mpg.de/andriluka14cvpr/" + tar_filename = "mpii_human_pose_v1.tar.gz" + extracted_filename2 = "images" + if folder_exists(os.path.join(path, extracted_filename2)) is False: + logging.info("[MPII] (images) {} is nonexistent in {}".format(extracted_filename, path)) + maybe_download_and_extract(tar_filename, path, url, extract=True) + del_file(os.path.join(path, tar_filename)) + + # parse annotation, format see http://human-pose.mpi-inf.mpg.de/#download + logging.info("reading annotations from mat file ...") + # mat = sio.loadmat(os.path.join(path, extracted_filename, "mpii_human_pose_v1_u12_1.mat")) + + # def fix_wrong_joints(joint): # https://github.com/mitmul/deeppose/blob/master/datasets/mpii_dataset.py + # if '12' in joint and '13' in joint and '2' in joint and '3' in joint: + # if ((joint['12'][0] < joint['13'][0]) and + # (joint['3'][0] < joint['2'][0])): + # joint['2'], joint['3'] = joint['3'], joint['2'] + # if ((joint['12'][0] > joint['13'][0]) and + # (joint['3'][0] > joint['2'][0])): + # joint['2'], joint['3'] = joint['3'], joint['2'] + # return joint + + ann_train_list = [] + ann_test_list = [] + img_train_list = [] + img_test_list = [] + + def save_joints(): + # joint_data_fn = os.path.join(path, 'data.json') + # fp = open(joint_data_fn, 'w') + mat = sio.loadmat(os.path.join(path, extracted_filename, "mpii_human_pose_v1_u12_1.mat")) + + for _, (anno, train_flag) in enumerate( # all images + zip(mat['RELEASE']['annolist'][0, 0][0], mat['RELEASE']['img_train'][0, 0][0])): + + img_fn = anno['image']['name'][0, 0][0] + train_flag = int(train_flag) + + # print(i, img_fn, train_flag) # DEBUG print all images + + if train_flag: + img_train_list.append(img_fn) + ann_train_list.append([]) + else: + img_test_list.append(img_fn) + ann_test_list.append([]) + + head_rect = [] + if 'x1' in str(anno['annorect'].dtype): + head_rect = zip( + [x1[0, 0] for x1 in anno['annorect']['x1'][0]], [y1[0, 0] for y1 in anno['annorect']['y1'][0]], + [x2[0, 0] for x2 in anno['annorect']['x2'][0]], [y2[0, 0] for y2 in anno['annorect']['y2'][0]] + ) + else: + head_rect = [] # TODO + + if 'annopoints' in str(anno['annorect'].dtype): + annopoints = anno['annorect']['annopoints'][0] + head_x1s = anno['annorect']['x1'][0] + head_y1s = anno['annorect']['y1'][0] + head_x2s = anno['annorect']['x2'][0] + head_y2s = anno['annorect']['y2'][0] + + for annopoint, head_x1, head_y1, head_x2, head_y2 in zip(annopoints, head_x1s, head_y1s, head_x2s, + head_y2s): + # if annopoint != []: + # if len(annopoint) != 0: + if annopoint.size: + head_rect = [ + float(head_x1[0, 0]), + float(head_y1[0, 0]), + float(head_x2[0, 0]), + float(head_y2[0, 0]) + ] + + # joint coordinates + annopoint = annopoint['point'][0, 0] + j_id = [str(j_i[0, 0]) for j_i in annopoint['id'][0]] + x = [x[0, 0] for x in annopoint['x'][0]] + y = [y[0, 0] for y in annopoint['y'][0]] + joint_pos = {} + for _j_id, (_x, _y) in zip(j_id, zip(x, y)): + joint_pos[int(_j_id)] = [float(_x), float(_y)] + # joint_pos = fix_wrong_joints(joint_pos) + + # visibility list + if 'is_visible' in str(annopoint.dtype): + vis = [v[0] if v.size > 0 else [0] for v in annopoint['is_visible'][0]] + vis = dict([(k, int(v[0])) if len(v) > 0 else v for k, v in zip(j_id, vis)]) + else: + vis = None + + # if len(joint_pos) == 16: + if ((is_16_pos_only ==True) and (len(joint_pos) == 16)) or (is_16_pos_only == False): + # only use image with 16 key points / or use all + data = { + 'filename': img_fn, + 'train': train_flag, + 'head_rect': head_rect, + 'is_visible': vis, + 'joint_pos': joint_pos + } + # print(json.dumps(data), file=fp) # py3 + if train_flag: + ann_train_list[-1].append(data) + else: + ann_test_list[-1].append(data) + + # def write_line(datum, fp): + # joints = sorted([[int(k), v] for k, v in datum['joint_pos'].items()]) + # joints = np.array([j for i, j in joints]).flatten() + # + # out = [datum['filename']] + # out.extend(joints) + # out = [str(o) for o in out] + # out = ','.join(out) + # + # print(out, file=fp) + + # def split_train_test(): + # # fp_test = open('data/mpii/test_joints.csv', 'w') + # fp_test = open(os.path.join(path, 'test_joints.csv'), 'w') + # # fp_train = open('data/mpii/train_joints.csv', 'w') + # fp_train = open(os.path.join(path, 'train_joints.csv'), 'w') + # # all_data = open('data/mpii/data.json').readlines() + # all_data = open(os.path.join(path, 'data.json')).readlines() + # N = len(all_data) + # N_test = int(N * 0.1) + # N_train = N - N_test + # + # print('N:{}'.format(N)) + # print('N_train:{}'.format(N_train)) + # print('N_test:{}'.format(N_test)) + # + # np.random.seed(1701) + # perm = np.random.permutation(N) + # test_indices = perm[:N_test] + # train_indices = perm[N_test:] + # + # print('train_indices:{}'.format(len(train_indices))) + # print('test_indices:{}'.format(len(test_indices))) + # + # for i in train_indices: + # datum = json.loads(all_data[i].strip()) + # write_line(datum, fp_train) + # + # for i in test_indices: + # datum = json.loads(all_data[i].strip()) + # write_line(datum, fp_test) + + save_joints() + # split_train_test() # + + # read images dir + logging.info("reading images list ...") + img_dir = os.path.join(path, extracted_filename2) + _img_list = load_file_list(path=os.path.join(path, extracted_filename2), regx='\\.jpg', printable=False) + # ann_list = json.load(open(os.path.join(path, 'data.json'))) + for i, im in enumerate(img_train_list): + if im not in _img_list: + print('missing training image {} in {} (remove from img(ann)_train_list)'.format(im, img_dir)) + # img_train_list.remove(im) + del img_train_list[i] + del ann_train_list[i] + for i, im in enumerate(img_test_list): + if im not in _img_list: + print('missing testing image {} in {} (remove from img(ann)_test_list)'.format(im, img_dir)) + # img_test_list.remove(im) + del img_train_list[i] + del ann_train_list[i] + + # check annotation and images + n_train_images = len(img_train_list) + n_test_images = len(img_test_list) + n_images = n_train_images + n_test_images + logging.info("n_images: {} n_train_images: {} n_test_images: {}".format(n_images, n_train_images, n_test_images)) + n_train_ann = len(ann_train_list) + n_test_ann = len(ann_test_list) + n_ann = n_train_ann + n_test_ann + logging.info("n_ann: {} n_train_ann: {} n_test_ann: {}".format(n_ann, n_train_ann, n_test_ann)) + n_train_people = len(sum(ann_train_list, [])) + n_test_people = len(sum(ann_test_list, [])) + n_people = n_train_people + n_test_people + logging.info("n_people: {} n_train_people: {} n_test_people: {}".format(n_people, n_train_people, n_test_people)) + # add path to all image file name + for i, value in enumerate(img_train_list): + img_train_list[i] = os.path.join(img_dir, value) + for i, value in enumerate(img_test_list): + img_test_list[i] = os.path.join(img_dir, value) + return img_train_list, ann_train_list, img_test_list, ann_test_list + + +def save_npz(save_list=None, name='model.npz'): + """Input parameters and the file name, save parameters into .npz file. Use tl.utils.load_npz() to restore. + + Parameters + ---------- + save_list : list of tensor + A list of parameters (tensor) to be saved. + name : str + The name of the `.npz` file. + + Examples + -------- + Save model to npz + + >>> tl.files.save_npz(network.all_weights, name='model.npz') + + Load model from npz (Method 1) + + >>> load_params = tl.files.load_npz(name='model.npz') + >>> tl.files.assign_weights(load_params, network) + + Load model from npz (Method 2) + + >>> tl.files.load_and_assign_npz(name='model.npz', network=network) + + References + ---------- + `Saving dictionary using numpy `__ + + """ + logging.info("[*] Saving TL weights into %s" % name) + if save_list is None: + save_list = [] + + if tl.BACKEND == 'tensorflow': + save_list_var = tf_variables_to_numpy(save_list) + elif tl.BACKEND == 'mindspore': + save_list_var = ms_variables_to_numpy(save_list) + else: + raise NotImplementedError("This backend is not supported") + # print(name, save_list_var) + np.savez(name, params=save_list_var) + save_list_var = None + del save_list_var + logging.info("[*] Saved") + + +def load_npz(path='', name='model.npz'): + """Load the parameters of a Model saved by tl.files.save_npz(). + + Parameters + ---------- + path : str + Folder path to `.npz` file. + name : str + The name of the `.npz` file. + + Returns + -------- + list of array + A list of parameters in order. + + Examples + -------- + - See ``tl.files.save_npz`` + + References + ---------- + - `Saving dictionary using numpy `__ + + """ + d = np.load(os.path.join(path, name), allow_pickle=True) + return d['params'] + + +def assign_params(**kwargs): + raise Exception("please change assign_params --> assign_weights") + + +def assign_weights(weights, network): + """Assign the given parameters to the TensorLayer network. + + Parameters + ---------- + weights : list of array + A list of model weights (array) in order. + network : :class:`Layer` + The network to be assigned. + + Returns + -------- + 1) list of operations if in graph mode + A list of tf ops in order that assign weights. Support sess.run(ops) manually. + 2) list of tf variables if in eager mode + A list of tf variables (assigned weights) in order. + + Examples + -------- + + References + ---------- + - `Assign value to a TensorFlow variable `__ + + """ + ops = [] + if tl.BACKEND == 'tensorflow': + for idx, param in enumerate(weights): + ops.append(network.all_weights[idx].assign(param)) + + elif tl.BACKEND == 'mindspore': + + class Assign_net(Cell): + + def __init__(self, y): + super(Assign_net, self).__init__() + self.y = y + + def construct(self, x): + Assign()(self.y, x) + + for idx, param in enumerate(weights): + assign_param = Tensor(param, dtype=ms.float32) + # net = Assign_net(network.all_weights[idx]) + # net(assign_param) + Assign()(network.all_weights[idx], assign_param) + return ops + + +def load_and_assign_npz(name=None, network=None): + """Load model from npz and assign to a network. + + Parameters + ------------- + name : str + The name of the `.npz` file. + network : :class:`Model` + The network to be assigned. + + Examples + -------- + - See ``tl.files.save_npz`` + + """ + if network is None: + raise ValueError("network is None.") + + if not os.path.exists(name): + logging.error("file {} doesn't exist.".format(name)) + return False + else: + weights = load_npz(name=name) + assign_weights(weights, network) + logging.info("[*] Load {} SUCCESS!".format(name)) + + +def save_npz_dict(save_list=None, name='model.npz'): + """Input parameters and the file name, save parameters as a dictionary into .npz file. + + Use ``tl.files.load_and_assign_npz_dict()`` to restore. + + Parameters + ---------- + save_list : list of parameters + A list of parameters (tensor) to be saved. + name : str + The name of the `.npz` file. + + """ + if save_list is None: + save_list = [] + + save_list_names = [tensor.name for tensor in save_list] + if tl.BACKEND == 'tensorflow': + save_list_var = tf_variables_to_numpy(save_list) + elif tl.BACKEND == 'mindspore': + save_list_var = ms_variables_to_numpy(save_list) + else: + raise NotImplementedError('Not implemented') + save_var_dict = {save_list_names[idx]: val for idx, val in enumerate(save_list_var)} + np.savez(name, **save_var_dict) + save_list_var = None + save_var_dict = None + del save_list_var + del save_var_dict + logging.info("[*] Model saved in npz_dict %s" % name) + + +def load_and_assign_npz_dict(name='model.npz', network=None, skip=False): + """Restore the parameters saved by ``tl.files.save_npz_dict()``. + + Parameters + ------------- + name : str + The name of the `.npz` file. + network : :class:`Model` + The network to be assigned. + skip : boolean + If 'skip' == True, loaded weights whose name is not found in network's weights will be skipped. + If 'skip' is False, error will be raised when mismatch is found. Default False. + + """ + if not os.path.exists(name): + logging.error("file {} doesn't exist.".format(name)) + return False + + weights = np.load(name, allow_pickle=True) + if len(weights.keys()) != len(set(weights.keys())): + raise Exception("Duplication in model npz_dict %s" % name) + + net_weights_name = [w.name for w in network.all_weights] + + for key in weights.keys(): + if key not in net_weights_name: + if skip: + logging.warning("Weights named '%s' not found in network. Skip it." % key) + else: + raise RuntimeError( + "Weights named '%s' not found in network. Hint: set argument skip=Ture " + "if you want to skip redundant or mismatch weights." % key + ) + else: + if tl.BACKEND == 'tensorflow': + assign_tf_variable(network.all_weights[net_weights_name.index(key)], weights[key]) + elif tl.BACKEND == 'mindspore': + assign_param = Tensor(weights[key], dtype=ms.float32) + assign_ms_variable(network.all_weights[net_weights_name.index(key)], assign_param) + logging.info("[*] Model restored from npz_dict %s" % name) + + +def save_ckpt(mode_name='model.ckpt', save_dir='checkpoint', var_list=None, global_step=None, printable=False): + """Save parameters into `ckpt` file. + + Parameters + ------------ + mode_name : str + The name of the model, default is ``model.ckpt``. + save_dir : str + The path / file directory to the `ckpt`, default is ``checkpoint``. + var_list : list of tensor + The parameters / variables (tensor) to be saved. If empty, save all global variables (default). + global_step : int or None + Step number. + printable : boolean + Whether to print all parameters information. + + See Also + -------- + load_ckpt + + """ + + if var_list is None: + if sess is None: + # FIXME: not sure whether global variables can be accessed in eager mode + raise ValueError( + "If var_list is None, sess must be specified. " + "In eager mode, can not access global variables easily. " + ) + var_list = [] + + ckpt_file = os.path.join(save_dir, mode_name) + if var_list == []: + var_list = tf.global_variables() + + logging.info("[*] save %s n_weights: %d" % (ckpt_file, len(var_list))) + + if printable: + for idx, v in enumerate(var_list): + logging.info(" param {:3}: {:15} {}".format(idx, v.name, str(v.get_shape()))) + + if sess: + # graph mode + saver = tf.train.Saver(var_list) + saver.save(sess, ckpt_file, global_step=global_step) + else: + # eager mode + # saver = tfes.Saver(var_list) + # saver.save(ckpt_file, global_step=global_step) + # TODO: tf2.0 not stable, cannot import tensorflow.contrib.eager.python.saver + pass + + +def load_ckpt(sess=None, mode_name='model.ckpt', save_dir='checkpoint', var_list=None, is_latest=True, printable=False): + """Load parameters from `ckpt` file. + + Parameters + ------------ + sess : Session + TensorFlow Session. + mode_name : str + The name of the model, default is ``model.ckpt``. + save_dir : str + The path / file directory to the `ckpt`, default is ``checkpoint``. + var_list : list of tensor + The parameters / variables (tensor) to be saved. If empty, save all global variables (default). + is_latest : boolean + Whether to load the latest `ckpt`, if False, load the `ckpt` with the name of ```mode_name``. + printable : boolean + Whether to print all parameters information. + + Examples + ---------- + - Save all global parameters. + + >>> tl.files.save_ckpt(sess=sess, mode_name='model.ckpt', save_dir='model', printable=True) + + - Save specific parameters. + + >>> tl.files.save_ckpt(sess=sess, mode_name='model.ckpt', var_list=net.all_params, save_dir='model', printable=True) + + - Load latest ckpt. + + >>> tl.files.load_ckpt(sess=sess, var_list=net.all_params, save_dir='model', printable=True) + + - Load specific ckpt. + + >>> tl.files.load_ckpt(sess=sess, mode_name='model.ckpt', var_list=net.all_params, save_dir='model', is_latest=False, printable=True) + + """ + # if sess is None: + # raise ValueError("session is None.") + if var_list is None: + if sess is None: + # FIXME: not sure whether global variables can be accessed in eager mode + raise ValueError( + "If var_list is None, sess must be specified. " + "In eager mode, can not access global variables easily. " + ) + var_list = [] + + if is_latest: + ckpt_file = tf.train.latest_checkpoint(save_dir) + else: + ckpt_file = os.path.join(save_dir, mode_name) + + if not var_list: + var_list = tf.global_variables() + + logging.info("[*] load %s n_weights: %d" % (ckpt_file, len(var_list))) + + if printable: + for idx, v in enumerate(var_list): + logging.info(" weights {:3}: {:15} {}".format(idx, v.name, str(v.get_shape()))) + + try: + if sess: + # graph mode + saver = tf.train.Saver(var_list) + saver.restore(sess, ckpt_file) + else: + # eager mode + # saver = tfes.Saver(var_list) + # saver.restore(ckpt_file) + # TODO: tf2.0 not stable, cannot import tensorflow.contrib.eager.python.saver + pass + + except Exception as e: + logging.info(e) + logging.info("[*] load ckpt fail ...") + + +def save_any_to_npy(save_dict=None, name='file.npy'): + """Save variables to `.npy` file. + + Parameters + ------------ + save_dict : directory + The variables to be saved. + name : str + File name. + + Examples + --------- + >>> tl.files.save_any_to_npy(save_dict={'data': ['a','b']}, name='test.npy') + >>> data = tl.files.load_npy_to_any(name='test.npy') + >>> print(data) + {'data': ['a','b']} + + """ + if save_dict is None: + save_dict = {} + np.save(name, save_dict) + + +def load_npy_to_any(path='', name='file.npy'): + """Load `.npy` file. + + Parameters + ------------ + path : str + Path to the file (optional). + name : str + File name. + + Examples + --------- + - see tl.files.save_any_to_npy() + + """ + file_path = os.path.join(path, name) + try: + return np.load(file_path, allow_pickle=True).item() + except Exception: + return np.load(file_path, allow_pickle=True) + raise Exception("[!] Fail to load %s" % file_path) + + +def file_exists(filepath): + """Check whether a file exists by given file path.""" + return os.path.isfile(filepath) + + +def folder_exists(folderpath): + """Check whether a folder exists by given folder path.""" + return os.path.isdir(folderpath) + + +def del_file(filepath): + """Delete a file by given file path.""" + os.remove(filepath) + + +def del_folder(folderpath): + """Delete a folder by given folder path.""" + shutil.rmtree(folderpath) + + +def read_file(filepath): + """Read a file and return a string. + + Examples + --------- + >>> data = tl.files.read_file('data.txt') + + """ + with open(filepath, 'r') as afile: + return afile.read() + + +def load_file_list(path=None, regx='\.jpg', printable=True, keep_prefix=False): + r"""Return a file list in a folder by given a path and regular expression. + + Parameters + ---------- + path : str or None + A folder path, if `None`, use the current directory. + regx : str + The regx of file name. + printable : boolean + Whether to print the files infomation. + keep_prefix : boolean + Whether to keep path in the file name. + + Examples + ---------- + >>> file_list = tl.files.load_file_list(path=None, regx='w1pre_[0-9]+\.(npz)') + + """ + if path is None: + path = os.getcwd() + file_list = os.listdir(path) + return_list = [] + for _, f in enumerate(file_list): + if re.search(regx, f): + return_list.append(f) + # return_list.sort() + if keep_prefix: + for i, f in enumerate(return_list): + return_list[i] = os.path.join(path, f) + + if printable: + logging.info('Match file list = %s' % return_list) + logging.info('Number of files = %d' % len(return_list)) + return return_list + + +def load_folder_list(path=""): + """Return a folder list in a folder by given a folder path. + + Parameters + ---------- + path : str + A folder path. + + """ + return [os.path.join(path, o) for o in os.listdir(path) if os.path.isdir(os.path.join(path, o))] + + +def exists_or_mkdir(path, verbose=True): + """Check a folder by given name, if not exist, create the folder and return False, + if directory exists, return True. + + Parameters + ---------- + path : str + A folder path. + verbose : boolean + If True (default), prints results. + + Returns + -------- + boolean + True if folder already exist, otherwise, returns False and create the folder. + + Examples + -------- + >>> tl.files.exists_or_mkdir("checkpoints/train") + + """ + if not os.path.exists(path): + if verbose: + logging.info("[*] creates %s ..." % path) + os.makedirs(path) + return False + else: + if verbose: + logging.info("[!] %s exists ..." % path) + return True + + +def maybe_download_and_extract(filename, working_directory, url_source, extract=False, expected_bytes=None): + """Checks if file exists in working_directory otherwise tries to dowload the file, + and optionally also tries to extract the file if format is ".zip" or ".tar" + + Parameters + ----------- + filename : str + The name of the (to be) dowloaded file. + working_directory : str + A folder path to search for the file in and dowload the file to + url : str + The URL to download the file from + extract : boolean + If True, tries to uncompress the dowloaded file is ".tar.gz/.tar.bz2" or ".zip" file, default is False. + expected_bytes : int or None + If set tries to verify that the downloaded file is of the specified size, otherwise raises an Exception, defaults is None which corresponds to no check being performed. + + Returns + ---------- + str + File path of the dowloaded (uncompressed) file. + + Examples + -------- + >>> down_file = tl.files.maybe_download_and_extract(filename='train-images-idx3-ubyte.gz', + ... working_directory='data/', + ... url_source='http://yann.lecun.com/exdb/mnist/') + >>> tl.files.maybe_download_and_extract(filename='ADEChallengeData2016.zip', + ... working_directory='data/', + ... url_source='http://sceneparsing.csail.mit.edu/data/', + ... extract=True) + + """ + + # We first define a download function, supporting both Python 2 and 3. + def _download(filename, working_directory, url_source): + + progress_bar = progressbar.ProgressBar() + + def _dlProgress(count, blockSize, totalSize, pbar=progress_bar): + if (totalSize != 0): + + if not pbar.max_value: + totalBlocks = math.ceil(float(totalSize) / float(blockSize)) + pbar.max_value = int(totalBlocks) + + pbar.update(count, force=True) + + filepath = os.path.join(working_directory, filename) + + logging.info('Downloading %s...\n' % filename) + + urlretrieve(url_source + filename, filepath, reporthook=_dlProgress) + + exists_or_mkdir(working_directory, verbose=False) + filepath = os.path.join(working_directory, filename) + + if not os.path.exists(filepath): + + _download(filename, working_directory, url_source) + statinfo = os.stat(filepath) + logging.info('Succesfully downloaded %s %s bytes.' % (filename, statinfo.st_size)) # , 'bytes.') + if (not (expected_bytes is None) and (expected_bytes != statinfo.st_size)): + raise Exception('Failed to verify ' + filename + '. Can you get to it with a browser?') + if (extract): + if tarfile.is_tarfile(filepath): + logging.info('Trying to extract tar file') + tarfile.open(filepath, 'r').extractall(working_directory) + logging.info('... Success!') + elif zipfile.is_zipfile(filepath): + logging.info('Trying to extract zip file') + with zipfile.ZipFile(filepath) as zf: + zf.extractall(working_directory) + logging.info('... Success!') + else: + logging.info("Unknown compression_format only .tar.gz/.tar.bz2/.tar and .zip supported") + return filepath + + +def natural_keys(text): + """Sort list of string with number in human order. + + Examples + ---------- + >>> l = ['im1.jpg', 'im31.jpg', 'im11.jpg', 'im21.jpg', 'im03.jpg', 'im05.jpg'] + >>> l.sort(key=tl.files.natural_keys) + ['im1.jpg', 'im03.jpg', 'im05', 'im11.jpg', 'im21.jpg', 'im31.jpg'] + >>> l.sort() # that is what we dont want + ['im03.jpg', 'im05', 'im1.jpg', 'im11.jpg', 'im21.jpg', 'im31.jpg'] + + References + ---------- + - `link `__ + + """ + + # - alist.sort(key=natural_keys) sorts in human order + # http://nedbatchelder.com/blog/200712/human_sorting.html + # (See Toothy's implementation in the comments) + def atoi(text): + return int(text) if text.isdigit() else text + + return [atoi(c) for c in re.split('(\d+)', text)] + + +# Visualizing npz files +def npz_to_W_pdf(path=None, regx='w1pre_[0-9]+\.(npz)'): + r"""Convert the first weight matrix of `.npz` file to `.pdf` by using `tl.visualize.W()`. + + Parameters + ---------- + path : str + A folder path to `npz` files. + regx : str + Regx for the file name. + + Examples + --------- + Convert the first weight matrix of w1_pre...npz file to w1_pre...pdf. + + >>> tl.files.npz_to_W_pdf(path='/Users/.../npz_file/', regx='w1pre_[0-9]+\.(npz)') + + """ + file_list = load_file_list(path=path, regx=regx) + for f in file_list: + W = load_npz(path, f)[0] + logging.info("%s --> %s" % (f, f.split('.')[0] + '.pdf')) + visualize.draw_weights(W, second=10, saveable=True, name=f.split('.')[0], fig_idx=2012) + + +def tf_variables_to_numpy(variables): + """Convert TF tensor or a list of tensors into a list of numpy array""" + if not isinstance(variables, list): + var_list = [variables] + else: + var_list = variables + + results = [v.numpy() for v in var_list] + return results + + +def ms_variables_to_numpy(variables): + """Convert MS tensor or list of tensors into a list of numpy array""" + if not isinstance(variables, list): + var_list = [variables] + else: + var_list = variables + + results = [v.data.asnumpy() for v in var_list] + return results + + +def assign_tf_variable(variable, value): + """Assign value to a TF variable""" + variable.assign(value) + + +def assign_ms_variable(variable, value): + + class Assign_net(Cell): + + def __init__(self, y): + super(Assign_net, self).__init__() + self.y = y + + def construct(self, x): + Assign()(self.y, x) + + # net = Assign_net(variable) + # net(value) + Assign()(variable, value) + + +def _save_weights_to_hdf5_group(f, layers): + """ + Save layer/model weights into hdf5 group recursively. + + Parameters + ---------- + f: hdf5 group + A hdf5 group created by h5py.File() or create_group(). + layers: list + A list of layers to save weights. + + """ + f.attrs['layer_names'] = [layer.name.encode('utf8') for layer in layers] + + for layer in layers: + g = f.create_group(layer.name) + if isinstance(layer, tl.models.Model): + _save_weights_to_hdf5_group(g, layer.all_layers) + elif isinstance(layer, tl.layers.ModelLayer): + _save_weights_to_hdf5_group(g, layer.model.all_layers) + elif isinstance(layer, tl.layers.LayerList): + _save_weights_to_hdf5_group(g, layer.layers) + elif isinstance(layer, tl.layers.Layer): + if layer.all_weights is not None: + weight_values = tf_variables_to_numpy(layer.all_weights) + weight_names = [w.name.encode('utf8') for w in layer.all_weights] + else: + weight_values = [] + weight_names = [] + g.attrs['weight_names'] = weight_names + for name, val in zip(weight_names, weight_values): + val_dataset = g.create_dataset(name, val.shape, dtype=val.dtype) + if not val.shape: + # scalar + val_dataset[()] = val + else: + val_dataset[:] = val + else: + raise Exception("Only layer or model can be saved into hdf5.") + + +def _load_weights_from_hdf5_group_in_order(f, layers): + """ + Load layer weights from a hdf5 group sequentially. + + Parameters + ---------- + f: hdf5 group + A hdf5 group created by h5py.File() or create_group(). + layers: list + A list of layers to load weights. + + """ + layer_names = [n.decode('utf8') for n in f.attrs["layer_names"]] + + for idx, name in enumerate(layer_names): + g = f[name] + layer = layers[idx] + if isinstance(layer, tl.models.Model): + _load_weights_from_hdf5_group_in_order(g, layer.all_layers) + elif isinstance(layer, tl.layers.ModelLayer): + _load_weights_from_hdf5_group_in_order(g, layer.model.all_layers) + elif isinstance(layer, tl.layers.LayerList): + _load_weights_from_hdf5_group_in_order(g, layer.layers) + elif isinstance(layer, tl.layers.Layer): + weight_names = [n.decode('utf8') for n in g.attrs['weight_names']] + for iid, w_name in enumerate(weight_names): + assign_tf_variable(layer.all_weights[iid], np.asarray(g[w_name])) + else: + raise Exception("Only layer or model can be saved into hdf5.") + if idx == len(layers) - 1: + break + + +def _load_weights_from_hdf5_group(f, layers, skip=False): + """ + Load layer weights from a hdf5 group by layer name. + + Parameters + ---------- + f: hdf5 group + A hdf5 group created by h5py.File() or create_group(). + layers: list + A list of layers to load weights. + skip : boolean + If 'skip' == True, loaded layer whose name is not found in 'layers' will be skipped. If 'skip' is False, + error will be raised when mismatch is found. Default False. + + """ + layer_names = [n.decode('utf8') for n in f.attrs["layer_names"]] + layer_index = {layer.name: layer for layer in layers} + + for idx, name in enumerate(layer_names): + if name not in layer_index.keys(): + if skip: + logging.warning("Layer named '%s' not found in network. Skip it." % name) + else: + raise RuntimeError( + "Layer named '%s' not found in network. Hint: set argument skip=Ture " + "if you want to skip redundant or mismatch Layers." % name + ) + else: + g = f[name] + layer = layer_index[name] + if isinstance(layer, tl.models.Model): + _load_weights_from_hdf5_group(g, layer.all_layers, skip) + elif isinstance(layer, tl.layers.ModelLayer): + _load_weights_from_hdf5_group(g, layer.model.all_layers, skip) + elif isinstance(layer, tl.layers.LayerList): + _load_weights_from_hdf5_group(g, layer.layers, skip) + elif isinstance(layer, tl.layers.Layer): + weight_names = [n.decode('utf8') for n in g.attrs['weight_names']] + for iid, w_name in enumerate(weight_names): + # FIXME : this is only for compatibility + if isinstance(layer, tl.layers.BatchNorm) and np.asarray(g[w_name]).ndim > 1: + assign_tf_variable(layer.all_weights[iid], np.asarray(g[w_name]).squeeze()) + continue + assign_tf_variable(layer.all_weights[iid], np.asarray(g[w_name])) + else: + raise Exception("Only layer or model can be saved into hdf5.") + + +def save_weights_to_hdf5(filepath, network): + """Input filepath and save weights in hdf5 format. + + Parameters + ---------- + filepath : str + Filename to which the weights will be saved. + network : Model + TL model. + + Returns + ------- + + """ + logging.info("[*] Saving TL weights into %s" % filepath) + + with h5py.File(filepath, 'w') as f: + _save_weights_to_hdf5_group(f, network.all_layers) + + logging.info("[*] Saved") + + +def load_hdf5_to_weights_in_order(filepath, network): + """Load weights sequentially from a given file of hdf5 format + + Parameters + ---------- + filepath : str + Filename to which the weights will be loaded, should be of hdf5 format. + network : Model + TL model. + + Notes: + If the file contains more weights than given 'weights', then the redundant ones will be ignored + if all previous weights match perfectly. + + Returns + ------- + + """ + f = h5py.File(filepath, 'r') + try: + layer_names = [n.decode('utf8') for n in f.attrs["layer_names"]] + except Exception: + raise NameError( + "The loaded hdf5 file needs to have 'layer_names' as attributes. " + "Please check whether this hdf5 file is saved from TL." + ) + + if len(network.all_layers) != len(layer_names): + logging.warning( + "Number of weights mismatch." + "Trying to load a saved file with " + str(len(layer_names)) + " layers into a model with " + + str(len(network.all_layers)) + " layers." + ) + + _load_weights_from_hdf5_group_in_order(f, network.all_layers) + + f.close() + logging.info("[*] Load %s SUCCESS!" % filepath) + + +def load_hdf5_to_weights(filepath, network, skip=False): + """Load weights by name from a given file of hdf5 format + + Parameters + ---------- + filepath : str + Filename to which the weights will be loaded, should be of hdf5 format. + network : Model + TL model. + skip : bool + If 'skip' == True, loaded weights whose name is not found in 'weights' will be skipped. If 'skip' is False, + error will be raised when mismatch is found. Default False. + + Returns + ------- + + """ + f = h5py.File(filepath, 'r') + try: + layer_names = [n.decode('utf8') for n in f.attrs["layer_names"]] + except Exception: + raise NameError( + "The loaded hdf5 file needs to have 'layer_names' as attributes. " + "Please check whether this hdf5 file is saved from TL." + ) + + net_index = {layer.name: layer for layer in network.all_layers} + + if len(network.all_layers) != len(layer_names): + logging.warning( + "Number of weights mismatch." + "Trying to load a saved file with " + str(len(layer_names)) + " layers into a model with " + + str(len(network.all_layers)) + " layers." + ) + + # check mismatch form network weights to hdf5 + for name in net_index.keys(): + if name not in layer_names: + logging.warning("Network layer named '%s' not found in loaded hdf5 file. It will be skipped." % name) + + # load weights from hdf5 to network + _load_weights_from_hdf5_group(f, network.all_layers, skip) + + f.close() + logging.info("[*] Load %s SUCCESS!" % filepath) + + +def load_and_assign_ckpt(model_dir, network=None, skip=True): + """Load weights by name from a given file of ckpt format + + Parameters + ---------- + model_dir : str + Filename to which the weights will be loaded, should be of ckpt format. + Examples: model_dir = /root/cnn_model/ + network : Model + TL model. + skip : bool + If 'skip' == True, loaded weights whose name is not found in 'weights' will be skipped. If 'skip' is False, + error will be raised when mismatch is found. Default False. + + Returns + ------- + + """ + model_dir = model_dir + model_path = None + for root, dirs, files in os.walk(model_dir): + for file in files: + filename, extension = os.path.splitext(file) + if extension in ['.data-00000-of-00001', '.index', '.meta']: + model_path = model_dir + '/' + filename + break + if model_path == None: + raise Exception('The ckpt file is not found') + + reader = pywrap_tensorflow.NewCheckpointReader(model_path) + var_to_shape_map = reader.get_variable_to_shape_map() + + net_weights_name = [w.name for w in network.all_weights] + + for key in var_to_shape_map: + if key not in net_weights_name: + if skip: + logging.warning("Weights named '%s' not found in network. Skip it." % key) + else: + raise RuntimeError( + "Weights named '%s' not found in network. Hint: set argument skip=Ture " + "if you want to skip redundant or mismatch weights." % key + ) + else: + assign_tf_variable(network.all_weights[net_weights_name.index(key)], reader.get_tensor(key)) + logging.info("[*] Model restored from ckpt %s" % filename) + + +def ckpt_to_npz_dict(model_dir, save_name='model.npz'): + """ Save ckpt weights to npz file + + Parameters + ---------- + model_dir : str + Filename to which the weights will be loaded, should be of ckpt format. + Examples: model_dir = /root/cnn_model/ + save_name : str + The save_name of the `.npz` file. + + Returns + ------- + + """ + model_dir = model_dir + model_path = None + for root, dirs, files in os.walk(model_dir): + for file in files: + filename, extension = os.path.splitext(file) + if extension in ['.data-00000-of-00001', '.index', '.meta']: + model_path = model_dir + '/' + filename + break + if model_path == None: + raise Exception('The ckpt file is not found') + + reader = pywrap_tensorflow.NewCheckpointReader(model_path) + var_to_shape_map = reader.get_variable_to_shape_map() + + parameters_dict = {} + for key in sorted(var_to_shape_map): + parameters_dict[key] = reader.get_tensor(key) + np.savez(save_name, **parameters_dict) + parameters_dict = None + del parameters_dict + logging.info("[*] Ckpt weights saved in npz_dict %s" % save_name) diff --git a/tensorlayer/initializers/__init__.py b/tensorlayer/initializers/__init__.py new file mode 100644 index 0000000..80557bd --- /dev/null +++ b/tensorlayer/initializers/__init__.py @@ -0,0 +1,25 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +# __all__ = [ +# 'Initializer', 'Zeros', 'Ones', 'Constant', 'RandomUniform', 'RandomNormal', 'TruncatedNormal', +# 'deconv2d_bilinear_upsampling_initializer', 'He_Normal' +# ] + +from .load_initializers_backend import Zeros +from .load_initializers_backend import Ones +from .load_initializers_backend import Constant +from .load_initializers_backend import RandomUniform +from .load_initializers_backend import RandomNormal +from .load_initializers_backend import TruncatedNormal +from .load_initializers_backend import deconv2d_bilinear_upsampling_initializer +from .load_initializers_backend import HeNormal + +# Alias +zeros = Zeros +ones = Ones +constant = Constant +random_uniform = RandomUniform +random_normal = RandomNormal +truncated_normal = TruncatedNormal +he_normal = HeNormal \ No newline at end of file diff --git a/tensorlayer/initializers/load_initializers_backend.py b/tensorlayer/initializers/load_initializers_backend.py new file mode 100644 index 0000000..fc65bab --- /dev/null +++ b/tensorlayer/initializers/load_initializers_backend.py @@ -0,0 +1,16 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function +from tensorlayer.backend.ops.load_backend import BACKEND + +if BACKEND == 'tensorflow': + from .tensorflow_initializers import * +elif BACKEND == 'mindspore': + from .tensorflow_initializers import * +elif BACKEND == 'dragon': + from .tensorflow_initializers import * +elif BACKEND == 'paddle': + from .paddle_initializers import * +else: + raise NotImplementedError("This backend is not supported") diff --git a/tensorlayer/initializers/paddle_initializers.py b/tensorlayer/initializers/paddle_initializers.py new file mode 100644 index 0000000..22ffa7a --- /dev/null +++ b/tensorlayer/initializers/paddle_initializers.py @@ -0,0 +1,178 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from paddle.fluid.initializer import ConstantInitializer +from paddle.fluid.initializer import UniformInitializer +from paddle.fluid.initializer import NormalInitializer +from paddle.fluid.initializer import TruncatedNormalInitializer +from paddle.fluid.initializer import MSRAInitializer +import paddle + +__all__ = [ + 'Zeros', 'Ones', 'Constant', 'RandomUniform', 'RandomNormal', 'TruncatedNormal', + 'deconv2d_bilinear_upsampling_initializer', 'HeNormal' +] + + +class Zeros(ConstantInitializer): + """Initializer that generates tensors initialized to 0. + """ + + def __init__(self): + super(Zeros, self).__init__(value=0.0, force_cpu=False) + + +class Ones(object): + """Initializer that generates tensors initialized to 1. + """ + + def __init__(self): + # super(Ones, self).__init__(value=1.0, force_cpu=False) + pass + + def __call__(self, shape, dtype): + return paddle.ones(shape=shape, dtype=dtype) + + +class Constant(ConstantInitializer): + """Initializer that generates tensors initialized to a constant value. + + Parameters + ---------- + value : A python scalar or a numpy array. + The assigned value. + + """ + + def __init__(self, value=0.0): + if value is None: + raise ValueError("value must not be none.") + super(Constant, self).__init__(value=value, force_cpu=False) + self.value = value + + def get_config(self): + return {"value": self.value} + + +class RandomUniform(UniformInitializer): + """Initializer that generates tensors with a uniform distribution. + + Parameters + ---------- + minval : A python scalar or a scalar tensor. + Lower bound of the range of random values to generate. + maxval : A python scalar or a scalar tensor. + Upper bound of the range of random values to generate. + seed : A Python integer. + Used to seed the random generator. + + """ + + def __init__(self, minval=-0.05, maxval=0.05, seed=0): + assert minval is not None, 'low should not be None' + assert maxval is not None, 'high should not be None' + assert maxval >= minval, 'high should greater or equal than low' + super(RandomUniform, self).__init__( + low=minval, high=maxval, seed=seed, diag_num=0, diag_step=0, diag_val=1.0) + self.minval = minval + self.maxval = maxval + self.seed = seed + + def get_config(self): + return {"minval": self.minval, "maxval": self.maxval, "seed": self.seed} + + +class RandomNormal(NormalInitializer): + """Initializer that generates tensors with a normal distribution. + + Parameters + ---------- + mean : A python scalar or a scalar tensor. + Mean of the random values to generate. + stddev : A python scalar or a scalar tensor. + Standard deviation of the random values to generate. + seed : A Python integer. + Used to seed the random generator. + """ + + def __init__(self, mean=0.0, stddev=0.05, seed=0): + assert mean is not None, 'mean should not be None' + assert stddev is not None, 'std should not be None' + super(RandomNormal, self).__init__(loc=mean, scale=stddev, seed=seed) + self.mean = mean + self.stddev = stddev + self.seed = seed + + def get_config(self): + return {"mean": self.mean, "stddev": self.stddev, "seed": self.seed} + + +class TruncatedNormal(TruncatedNormalInitializer): + """Initializer that generates a truncated normal distribution. + + These values are similar to values from a `RandomNormal` + except that values more than two standard deviations from the mean + are discarded and re-drawn. This is the recommended initializer for + neural network weights and filters. + + + Parameters + ---------- + mean : A python scalar or a scalar tensor. + Mean of the random values to generate. + stddev : A python scalar or a scalar tensor. + Standard deviation of the andom values to generate. + seed : A Python integer. + Used to seed the random generator. + """ + + def __init__(self, mean=0.0, stddev=0.05, seed=0): + assert mean is not None, 'mean should not be None' + assert stddev is not None, 'std should not be None' + super(TruncatedNormal, self).__init__(loc=mean, scale=stddev, seed=seed) + self.mean = mean + self.stddev = stddev + self.seed = seed + + def get_config(self): + return {"mean": self.mean, "stddev": self.stddev, "seed": self.seed} + + +class HeNormal(MSRAInitializer): + """He normal initializer. + + Parameters + ---------- + seed : A Python integer. + Used to seed the random generator. + + """ + + def __init__(self, seed=0): + super(HeNormal, self).__init__( + uniform=False, fan_in=None, seed=seed) + self.seed = seed + + def get_config(self): + return {"seed", self.seed} + + +def deconv2d_bilinear_upsampling_initializer(shape): + """Returns the initializer that can be passed to DeConv2dLayer for initializing the + weights in correspondence to channel-wise bilinear up-sampling. + Used in segmentation approaches such as [FCN](https://arxiv.org/abs/1605.06211) + + Parameters + ---------- + shape : tuple of int + The shape of the filters, [height, width, output_channels, in_channels]. + It must match the shape passed to DeConv2dLayer. + + Returns + ------- + ``tf.constant_initializer`` + A constant initializer with weights set to correspond to per channel bilinear upsampling + when passed as W_int in DeConv2dLayer + + """ + raise NotImplementedError diff --git a/tensorlayer/initializers/tensorflow_initializers.py b/tensorlayer/initializers/tensorflow_initializers.py new file mode 100644 index 0000000..8865216 --- /dev/null +++ b/tensorlayer/initializers/tensorflow_initializers.py @@ -0,0 +1,243 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import numpy as np +import tensorlayer as tl + +__all__ = [ + 'Initializer', 'Zeros', 'Ones', 'Constant', 'RandomUniform', 'RandomNormal', 'TruncatedNormal', + 'deconv2d_bilinear_upsampling_initializer', 'HeNormal' +] + + +class Initializer(object): + """Initializer base class: all initializers inherit from this class. + """ + + def __call__(self, shape, dtype=None): + """Returns a tensor object initialized as specified by the initializer. + + Parameters + ---------- + shape : tuple of int. + The shape of the tensor. + dtype : Optional dtype of the tensor. + If not provided will return tensor of `tl.float32`. + + Returns + ------- + + """ + raise NotImplementedError + + def get_config(self): + """Returns the configuration of the initializer as a JSON-serializable dict. + + Returns + ------- + A JSON-serializable Python dict. + """ + return {} + + @classmethod + def from_config(cls, config): + """Instantiates an initializer from a configuration dictionary. + + Parameters + ---------- + config : A python dictionary. + It will typically be the output of `get_config`. + + Returns + ------- + An Initializer instance. + """ + if 'dtype' in config: + config.pop('dtype') + return cls(**config) + + +class Zeros(Initializer): + """Initializer that generates tensors initialized to 0. + """ + + def __call__(self, shape, dtype=tl.float32): + return tl.zeros(shape, dtype=dtype) + + +class Ones(Initializer): + """Initializer that generates tensors initialized to 1. + """ + + def __call__(self, shape, dtype=tl.float32): + return tl.ones(shape, dtype=dtype) + + +class Constant(Initializer): + """Initializer that generates tensors initialized to a constant value. + + Parameters + ---------- + value : A python scalar or a numpy array. + The assigned value. + + """ + + def __init__(self, value=0): + self.value = value + + def __call__(self, shape, dtype=tl.float32): + return tl.constant(self.value, shape=shape, dtype=dtype) + + def get_config(self): + return {"value": self.value} + + +class RandomUniform(Initializer): + """Initializer that generates tensors with a uniform distribution. + + Parameters + ---------- + minval : A python scalar or a scalar tensor. + Lower bound of the range of random values to generate. + maxval : A python scalar or a scalar tensor. + Upper bound of the range of random values to generate. + seed : A Python integer. + Used to seed the random generator. + + """ + + def __init__(self, minval=-0.05, maxval=0.05, seed=None): + self.minval = minval + self.maxval = maxval + self.seed = seed + + def __call__(self, shape, dtype=tl.float32): + return tl.random_uniform(shape, self.minval, self.maxval, dtype=dtype, seed=self.seed) + + def get_config(self): + return {"minval": self.minval, "maxval": self.maxval, "seed": self.seed} + + +class RandomNormal(Initializer): + """Initializer that generates tensors with a normal distribution. + + Parameters + ---------- + mean : A python scalar or a scalar tensor. + Mean of the random values to generate. + stddev : A python scalar or a scalar tensor. + Standard deviation of the random values to generate. + seed : A Python integer. + Used to seed the random generator. + """ + + def __init__(self, mean=0.0, stddev=0.05, seed=None): + self.mean = mean + self.stddev = stddev + self.seed = seed + + def __call__(self, shape, dtype=tl.float32): + return tl.random_normal(shape, self.mean, self.stddev, dtype=dtype, seed=self.seed) + + def get_config(self): + return {"mean": self.mean, "stddev": self.stddev, "seed": self.seed} + + +class TruncatedNormal(Initializer): + """Initializer that generates a truncated normal distribution. + + These values are similar to values from a `RandomNormal` + except that values more than two standard deviations from the mean + are discarded and re-drawn. This is the recommended initializer for + neural network weights and filters. + + + Parameters + ---------- + mean : A python scalar or a scalar tensor. + Mean of the random values to generate. + stddev : A python scalar or a scalar tensor. + Standard deviation of the andom values to generate. + seed : A Python integer. + Used to seed the random generator. + """ + + def __init__(self, mean=0.0, stddev=0.05, seed=None): + self.mean = mean + self.stddev = stddev + self.seed = seed + + def __call__(self, shape, dtype=tl.float32): + return tl.truncated_normal(shape, self.mean, self.stddev, dtype=dtype, seed=self.seed) + + def get_config(self): + return {"mean": self.mean, "stddev": self.stddev, "seed": self.seed} + + +class HeNormal(Initializer): + """He normal initializer. + + Parameters + ---------- + seed : A Python integer. + Used to seed the random generator. + + """ + + def __init__(self, seed=None): + self.seed = seed + + def __call__(self, shape, dtype=tl.float32): + return tl.he_normal(seed=self.seed, shape=shape, dtype=dtype) + + def get_config(self): + return {"seed", self.seed} + + +def deconv2d_bilinear_upsampling_initializer(shape): + """Returns the initializer that can be passed to DeConv2dLayer for initializing the + weights in correspondence to channel-wise bilinear up-sampling. + Used in segmentation approaches such as [FCN](https://arxiv.org/abs/1605.06211) + + Parameters + ---------- + shape : tuple of int + The shape of the filters, [height, width, output_channels, in_channels]. + It must match the shape passed to DeConv2dLayer. + + Returns + ------- + ``tf.constant_initializer`` + A constant initializer with weights set to correspond to per channel bilinear upsampling + when passed as W_int in DeConv2dLayer + + """ + if shape[0] != shape[1]: + raise Exception('deconv2d_bilinear_upsampling_initializer only supports symmetrical filter sizes') + + if shape[3] < shape[2]: + raise Exception( + 'deconv2d_bilinear_upsampling_initializer behaviour is not defined for num_in_channels < num_out_channels ' + ) + + filter_size = shape[0] + num_out_channels = shape[2] + num_in_channels = shape[3] + + # Create bilinear filter kernel as numpy array + bilinear_kernel = np.zeros([filter_size, filter_size], dtype=np.float32) + scale_factor = (filter_size + 1) // 2 + if filter_size % 2 == 1: + center = scale_factor - 1 + else: + center = scale_factor - 0.5 + for x in range(filter_size): + for y in range(filter_size): + bilinear_kernel[x, y] = (1 - abs(x - center) / scale_factor) * (1 - abs(y - center) / scale_factor) + weights = np.zeros((filter_size, filter_size, num_out_channels, num_in_channels), dtype=np.float32) + for i in range(num_out_channels): + weights[:, :, i, i] = bilinear_kernel + + # assign numpy array to constant_initalizer and pass to get_variable + return Constant(value=weights) diff --git a/tensorlayer/iterate.py b/tensorlayer/iterate.py new file mode 100644 index 0000000..804bbb3 --- /dev/null +++ b/tensorlayer/iterate.py @@ -0,0 +1,283 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import numpy as np +from six.moves import xrange + +__all__ = [ + 'minibatches', + 'seq_minibatches', + 'seq_minibatches2', + 'ptb_iterator', +] + + +def minibatches(inputs=None, targets=None, batch_size=None, allow_dynamic_batch_size=False, shuffle=False): + """Generate a generator that input a group of example in numpy.array and + their labels, return the examples and labels by the given batch size. + + Parameters + ---------- + inputs : numpy.array + The input features, every row is a example. + targets : numpy.array + The labels of inputs, every row is a example. + batch_size : int + The batch size. + allow_dynamic_batch_size: boolean + Allow the use of the last data batch in case the number of examples is not a multiple of batch_size, this may result in unexpected behaviour if other functions expect a fixed-sized batch-size. + shuffle : boolean + Indicating whether to use a shuffling queue, shuffle the dataset before return. + + Examples + -------- + >>> X = np.asarray([['a','a'], ['b','b'], ['c','c'], ['d','d'], ['e','e'], ['f','f']]) + >>> y = np.asarray([0,1,2,3,4,5]) + >>> for batch in tl.iterate.minibatches(inputs=X, targets=y, batch_size=2, shuffle=False): + >>> print(batch) + ... (array([['a', 'a'], ['b', 'b']], dtype=' len(inputs): + if allow_dynamic_batch_size: + end_idx = len(inputs) + else: + break + if shuffle: + excerpt = indices[start_idx:end_idx] + else: + excerpt = slice(start_idx, end_idx) + if (isinstance(inputs, list) or isinstance(targets, list)) and (shuffle ==True): + # zsdonghao: for list indexing when shuffle==True + yield [inputs[i] for i in excerpt], [targets[i] for i in excerpt] + else: + yield inputs[excerpt], targets[excerpt] + + +def seq_minibatches(inputs, targets, batch_size, seq_length, stride=1): + """Generate a generator that return a batch of sequence inputs and targets. + If `batch_size=100` and `seq_length=5`, one return will have 500 rows (examples). + + Parameters + ---------- + inputs : numpy.array + The input features, every row is a example. + targets : numpy.array + The labels of inputs, every element is a example. + batch_size : int + The batch size. + seq_length : int + The sequence length. + stride : int + The stride step, default is 1. + + Examples + -------- + Synced sequence input and output. + + >>> X = np.asarray([['a','a'], ['b','b'], ['c','c'], ['d','d'], ['e','e'], ['f','f']]) + >>> y = np.asarray([0, 1, 2, 3, 4, 5]) + >>> for batch in tl.iterate.seq_minibatches(inputs=X, targets=y, batch_size=2, seq_length=2, stride=1): + >>> print(batch) + ... (array([['a', 'a'], ['b', 'b'], ['b', 'b'], ['c', 'c']], dtype='>> return_last = True + >>> num_steps = 2 + >>> X = np.asarray([['a','a'], ['b','b'], ['c','c'], ['d','d'], ['e','e'], ['f','f']]) + >>> Y = np.asarray([0,1,2,3,4,5]) + >>> for batch in tl.iterate.seq_minibatches(inputs=X, targets=Y, batch_size=2, seq_length=num_steps, stride=1): + >>> x, y = batch + >>> if return_last: + >>> tmp_y = y.reshape((-1, num_steps) + y.shape[1:]) + >>> y = tmp_y[:, -1] + >>> print(x, y) + ... [['a' 'a'] + ... ['b' 'b'] + ... ['b' 'b'] + ... ['c' 'c']] [1 2] + ... [['c' 'c'] + ... ['d' 'd'] + ... ['d' 'd'] + ... ['e' 'e']] [3 4] + + """ + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + + n_loads = (batch_size * stride) + (seq_length - stride) + + for start_idx in range(0, len(inputs) - n_loads + 1, (batch_size * stride)): + seq_inputs = np.zeros((batch_size, seq_length) + inputs.shape[1:], dtype=inputs.dtype) + seq_targets = np.zeros((batch_size, seq_length) + targets.shape[1:], dtype=targets.dtype) + for b_idx in xrange(batch_size): + start_seq_idx = start_idx + (b_idx * stride) + end_seq_idx = start_seq_idx + seq_length + seq_inputs[b_idx] = inputs[start_seq_idx:end_seq_idx] + seq_targets[b_idx] = targets[start_seq_idx:end_seq_idx] + flatten_inputs = seq_inputs.reshape((-1, ) + inputs.shape[1:]) + flatten_targets = seq_targets.reshape((-1, ) + targets.shape[1:]) + yield flatten_inputs, flatten_targets + + +def seq_minibatches2(inputs, targets, batch_size, num_steps): + """Generate a generator that iterates on two list of words. Yields (Returns) the source contexts and + the target context by the given batch_size and num_steps (sequence_length). + In TensorFlow's tutorial, this generates the `batch_size` pointers into the raw PTB data, and allows minibatch iteration along these pointers. + + Parameters + ---------- + inputs : list of data + The context in list format; note that context usually be represented by splitting by space, and then convert to unique word IDs. + targets : list of data + The context in list format; note that context usually be represented by splitting by space, and then convert to unique word IDs. + batch_size : int + The batch size. + num_steps : int + The number of unrolls. i.e. sequence length + + Yields + ------ + Pairs of the batched data, each a matrix of shape [batch_size, num_steps]. + + Raises + ------ + ValueError : if batch_size or num_steps are too high. + + Examples + -------- + >>> X = [i for i in range(20)] + >>> Y = [i for i in range(20,40)] + >>> for batch in tl.iterate.seq_minibatches2(X, Y, batch_size=2, num_steps=3): + ... x, y = batch + ... print(x, y) + ... + ... [[ 0. 1. 2.] + ... [ 10. 11. 12.]] + ... [[ 20. 21. 22.] + ... [ 30. 31. 32.]] + ... + ... [[ 3. 4. 5.] + ... [ 13. 14. 15.]] + ... [[ 23. 24. 25.] + ... [ 33. 34. 35.]] + ... + ... [[ 6. 7. 8.] + ... [ 16. 17. 18.]] + ... [[ 26. 27. 28.] + ... [ 36. 37. 38.]] + + Notes + ----- + - Hint, if the input data are images, you can modify the source code `data = np.zeros([batch_size, batch_len)` to `data = np.zeros([batch_size, batch_len, inputs.shape[1], inputs.shape[2], inputs.shape[3]])`. + """ + if len(inputs) != len(targets): + raise AssertionError("The length of inputs and targets should be equal") + + data_len = len(inputs) + batch_len = data_len // batch_size + # data = np.zeros([batch_size, batch_len]) + data = np.zeros((batch_size, batch_len) + inputs.shape[1:], dtype=inputs.dtype) + data2 = np.zeros([batch_size, batch_len]) + + for i in range(batch_size): + data[i] = inputs[batch_len * i:batch_len * (i + 1)] + data2[i] = targets[batch_len * i:batch_len * (i + 1)] + + epoch_size = (batch_len - 1) // num_steps + + if epoch_size == 0: + raise ValueError("epoch_size == 0, decrease batch_size or num_steps") + + for i in range(epoch_size): + x = data[:, i * num_steps:(i + 1) * num_steps] + x2 = data2[:, i * num_steps:(i + 1) * num_steps] + yield (x, x2) + + +def ptb_iterator(raw_data, batch_size, num_steps): + """Generate a generator that iterates on a list of words, see `PTB example `__. + Yields the source contexts and the target context by the given batch_size and num_steps (sequence_length). + + In TensorFlow's tutorial, this generates `batch_size` pointers into the raw + PTB data, and allows minibatch iteration along these pointers. + + Parameters + ---------- + raw_data : a list + the context in list format; note that context usually be + represented by splitting by space, and then convert to unique + word IDs. + batch_size : int + the batch size. + num_steps : int + the number of unrolls. i.e. sequence_length + + Yields + ------ + Pairs of the batched data, each a matrix of shape [batch_size, num_steps]. + The second element of the tuple is the same data time-shifted to the + right by one. + + Raises + ------ + ValueError : if batch_size or num_steps are too high. + + Examples + -------- + >>> train_data = [i for i in range(20)] + >>> for batch in tl.iterate.ptb_iterator(train_data, batch_size=2, num_steps=3): + >>> x, y = batch + >>> print(x, y) + ... [[ 0 1 2] <---x 1st subset/ iteration + ... [10 11 12]] + ... [[ 1 2 3] <---y + ... [11 12 13]] + ... + ... [[ 3 4 5] <--- 1st batch input 2nd subset/ iteration + ... [13 14 15]] <--- 2nd batch input + ... [[ 4 5 6] <--- 1st batch target + ... [14 15 16]] <--- 2nd batch target + ... + ... [[ 6 7 8] 3rd subset/ iteration + ... [16 17 18]] + ... [[ 7 8 9] + ... [17 18 19]] + """ + raw_data = np.array(raw_data, dtype=np.int32) + + data_len = len(raw_data) + batch_len = data_len // batch_size + data = np.zeros([batch_size, batch_len], dtype=np.int32) + for i in range(batch_size): + data[i] = raw_data[batch_len * i:batch_len * (i + 1)] + + epoch_size = (batch_len - 1) // num_steps + + if epoch_size == 0: + raise ValueError("epoch_size == 0, decrease batch_size or num_steps") + + for i in range(epoch_size): + x = data[:, i * num_steps:(i + 1) * num_steps] + y = data[:, i * num_steps + 1:(i + 1) * num_steps + 1] + yield (x, y) diff --git a/tensorlayer/layers/__init__.py b/tensorlayer/layers/__init__.py new file mode 100644 index 0000000..309d586 --- /dev/null +++ b/tensorlayer/layers/__init__.py @@ -0,0 +1,26 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from .activation import * +from .convolution import * +from .core import * +from .dense import * +from .deprecated import * +from .dropout import * +from .embedding import * +from .extend import * +from .image_resampling import * +from .inputs import * +from .lambda_layers import * +from .merge import * +from .noise import * +from .normalization import * +from .padding import * +from .pooling import * +from .quantize import * +# from .recurrent import * +from .scale import * +from .shape import * +from .spatial_transformer import * +from .stack import * +from .utils import * diff --git a/tensorlayer/layers/activation.py b/tensorlayer/layers/activation.py new file mode 100644 index 0000000..c5a0de3 --- /dev/null +++ b/tensorlayer/layers/activation.py @@ -0,0 +1,605 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from tensorlayer import logging +import tensorlayer as tl +from tensorlayer.initializers import truncated_normal +from tensorlayer.layers.core import Module + +__all__ = [ + 'PRelu', + 'PRelu6', + 'PTRelu6', + 'LeakyReLU', + 'LeakyReLU6', + 'LeakyTwiceRelu6', + 'Ramp', + 'Swish', + 'HardTanh', + 'Mish' +] + + +class PRelu(Module): + """ + The :class:`PRelu` class is Parametric Rectified Linear layer. + It follows f(x) = alpha * x for x < 0, f(x) = x for x >= 0, + where alpha is a learned array with the same shape as x. + + Parameters + ---------- + channel_shared : boolean + If True, single weight is shared by all channels. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + a_init : initializer + The initializer for initializing the alpha(s). + name : None or str + A unique layer name. + + Examples + ----------- + >>> inputs = tl.layers.Input([10, 5]) + >>> prelulayer = tl.layers.PRelu(channel_shared=True) + + References + ----------- + - `Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification `__ + - `Convolutional Deep Belief Networks on CIFAR-10 [A. Krizhevsky, 2010] `__ + + """ + + def __init__( + self, channel_shared=False, in_channels=None, a_init=truncated_normal(mean=0.0, stddev=0.05), name=None, + data_format='channels_last', dim=2 + ): + + super(PRelu, self).__init__(name) + self.channel_shared = channel_shared + self.in_channels = in_channels + self.a_init = a_init + self.data_format = data_format + self.dim = dim + + if self.channel_shared: + self.build((None, )) + self._built = True + elif self.in_channels is not None: + self.build((None, self.in_channels)) + self._built = True + + logging.info("PRelu %s: channel_shared: %s" % (self.name, self.channel_shared)) + + def __repr__(self): + s = ('{classname}(') + s += 'channel_shared={channel_shared},' + s += 'in_channels={in_channels},' + s += 'name={name}' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.channel_shared: + w_shape = (1, ) + elif self.data_format == 'channels_last': + w_shape = (self.in_channels, ) + elif self.data_format == 'channels_first': + if self.dim == 2: + w_shape = (1, self.in_channels, 1, 1) + elif self.dim == 1: + w_shape = (1, self.in_channels, 1) + elif self.dim == 3: + w_shape = (1, self.in_channels, 1, 1, 1) + else: + raise Exception("Dim should be equal to 1, 2 or 3") + self.alpha_var = self._get_weights("alpha", shape=w_shape, init=self.a_init) + self.relu = tl.ops.ReLU() + self.sigmoid = tl.ops.Sigmoid() + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + pos = self.relu(inputs) + self.alpha_var_constrained = self.sigmoid(self.alpha_var) + neg = -self.alpha_var_constrained * self.relu(-inputs) + return pos + neg + + +class PRelu6(Module): + """ + The :class:`PRelu6` class is Parametric Rectified Linear layer integrating ReLU6 behaviour. + + This Layer is a modified version of the :class:`PRelu`. + + This activation layer use a modified version :func:`tl.act.leaky_relu` introduced by the following paper: + `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + + This activation function also use a modified version of the activation function :func:`tf.nn.relu6` introduced by the following paper: + `Convolutional Deep Belief Networks on CIFAR-10 [A. Krizhevsky, 2010] `__ + + This activation layer push further the logic by adding `leaky` behaviour both below zero and above six. + + The function return the following results: + - When x < 0: ``f(x) = alpha_low * x``. + - When x in [0, 6]: ``f(x) = x``. + - When x > 6: ``f(x) = 6``. + + Parameters + ---------- + channel_shared : boolean + If True, single weight is shared by all channels. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + a_init : initializer + The initializer for initializing the alpha(s). + name : None or str + A unique layer name. + + References + ----------- + - `Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification `__ + - `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + - `Convolutional Deep Belief Networks on CIFAR-10 [A. Krizhevsky, 2010] `__ + + """ + + def __init__( + self, + channel_shared=False, + in_channels=None, + a_init=truncated_normal(mean=0.0, stddev=0.05), + name=None, # "prelu6" + data_format='channels_last', + dim=2 + ): + + super(PRelu6, self).__init__(name) + self.channel_shared = channel_shared + self.in_channels = in_channels + self.a_init = a_init + self.data_format = data_format + self.dim = dim + + if self.channel_shared: + self.build((None, )) + self._built = True + elif self.in_channels is not None: + self.build((None, self.in_channels)) + self._built = True + + logging.info("PRelu6 %s: channel_shared: %s" % (self.name, self.channel_shared)) + + def __repr__(self): + s = ('{classname}(') + s += 'channel_shared={channel_shared},' + s += 'in_channels={in_channels},' + s += 'name={name}' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.channel_shared: + w_shape = (1, ) + elif self.data_format == 'channels_last': + w_shape = (self.in_channels, ) + elif self.data_format == 'channels_first': + if self.dim == 2: + w_shape = (1, self.in_channels, 1, 1) + elif self.dim == 1: + w_shape = (1, self.in_channels, 1) + elif self.dim == 3: + w_shape = (1, self.in_channels, 1, 1, 1) + else: + raise Exception("Dim should be equal to 1, 2 or 3") + self.alpha_var = self._get_weights("alpha", shape=w_shape, init=self.a_init) + self.sigmoid = tl.ops.Sigmoid() + self.relu = tl.ops.ReLU() + + # @tf.function + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + alpha_var_constrained = self.sigmoid(self.alpha_var) + pos = self.relu(inputs) + pos_6 = -self.relu(inputs - 6) + neg = -alpha_var_constrained * self.relu(-inputs) + return pos + pos_6 + neg + + +class PTRelu6(Module): + """ + The :class:`PTRelu6` class is Parametric Rectified Linear layer integrating ReLU6 behaviour. + + This Layer is a modified version of the :class:`PRelu`. + + This activation layer use a modified version :func:`tl.act.leaky_relu` introduced by the following paper: + `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + + This activation function also use a modified version of the activation function :func:`tf.nn.relu6` introduced by the following paper: + `Convolutional Deep Belief Networks on CIFAR-10 [A. Krizhevsky, 2010] `__ + + This activation layer push further the logic by adding `leaky` behaviour both below zero and above six. + + The function return the following results: + - When x < 0: ``f(x) = alpha_low * x``. + - When x in [0, 6]: ``f(x) = x``. + - When x > 6: ``f(x) = 6 + (alpha_high * (x-6))``. + + This version goes one step beyond :class:`PRelu6` by introducing leaky behaviour on the positive side when x > 6. + + Parameters + ---------- + channel_shared : boolean + If True, single weight is shared by all channels. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + a_init : initializer + The initializer for initializing the alpha(s). + name : None or str + A unique layer name. + + References + ----------- + - `Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification `__ + - `Convolutional Deep Belief Networks on CIFAR-10 [A. Krizhevsky, 2010] `__ + - `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + + """ + + def __init__( + self, + channel_shared=False, + in_channels=None, + data_format='channels_last', + a_init=truncated_normal(mean=0.0, stddev=0.05), + name=None # "ptrelu6" + ): + + super(PTRelu6, self).__init__(name) + self.channel_shared = channel_shared + self.in_channels = in_channels + self.data_format = data_format + self.a_init = a_init + + if self.channel_shared: + self.build((None, )) + self._built = True + elif self.in_channels: + self.build((None, self.in_channels)) + self._built = True + + logging.info("PTRelu6 %s: channel_shared: %s" % (self.name, self.channel_shared)) + + def __repr__(self): + s = ('{classname}(') + s += 'channel_shared={channel_shared},' + s += 'in_channels={in_channels},' + s += 'name={name}' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.channel_shared: + w_shape = (1, ) + elif self.data_format == 'channels_last': + w_shape = (self.in_channels, ) + elif self.data_format == 'channels_first': + if self.dim == 2: + w_shape = (1, self.in_channels, 1, 1) + elif self.dim == 1: + w_shape = (1, self.in_channels, 1) + elif self.dim == 3: + w_shape = (1, self.in_channels, 1, 1, 1) + else: + raise Exception("Dim should be equal to 1, 2 or 3") + + # Alpha for outputs lower than zeros + self.alpha_low = self._get_weights("alpha_low", shape=w_shape, init=self.a_init) + self.sigmoid = tl.ops.Sigmoid() + self.relu = tl.ops.ReLU() + # Alpha for outputs higher than 6 + self.alpha_high = self._get_weights("alpha_high", shape=w_shape, init=self.a_init) + + # @tf.function + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + alpha_low_constrained = self.sigmoid(self.alpha_low) + alpha_high_constrained = self.sigmoid(self.alpha_high) + pos = self.relu(inputs) + pos_6 = -self.relu(inputs - 6) + alpha_high_constrained * self.relu(inputs - 6) + neg = -alpha_low_constrained * self.relu(-inputs) + + return pos + pos_6 + neg + + +class Ramp(Module): + """Ramp activation function. + + Reference: [tf.clip_by_value] + + Parameters + ---------- + x : Tensor + input. + v_min : float + cap input to v_min as a lower bound. + v_max : float + cap input to v_max as a upper bound. + + Returns + ------- + Tensor + A ``Tensor`` in the same type as ``x``. + + """ + + def __init__(self, v_min=0, v_max=1): + super(Ramp, self).__init__() + self._built = True + self.v_min = v_min + self.v_max = v_max + + def forward(self, x): + return tl.ops.clip_by_value(x, clip_value_min=self.v_min, clip_value_max=self.v_max) + + +class LeakyReLU(Module): + """ + + This function is a modified version of ReLU, introducing a nonzero gradient for negative input. Introduced by the paper: + `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + + The function return the following results: + - When x < 0: ``f(x) = alpha_low * x``. + - When x >= 0: ``f(x) = x``. + + Parameters + ---------- + x : Tensor + Support input type ``float``, ``double``, ``int32``, ``int64``, ``uint8``, ``int16``, or ``int8``. + alpha : float + Slope. + name : str + The function name (optional). + + Examples + -------- + >>> import tensorlayer as tl + >>> net = tl.layers.Input([10, 200]) + >>> net = tl.layers.LeakyReLU(alpha=0.5)(net) + + Returns + ------- + Tensor + A ``Tensor`` in the same type as ``x``. + + References + ---------- + - `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + + """ + + def __init__(self, alpha=0.2): + super(LeakyReLU, self).__init__() + self._built = True + self.alpha = alpha + self._leakyrelu = tl.ops.LeakyReLU(alpha=alpha) + + def forward(self, x): + return self._leakyrelu(x) + + +class LeakyReLU6(Module): + """ + This activation function is a modified version :func:`leaky_relu` introduced by the following paper: + `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + + This activation function also follows the behaviour of the activation function :func:`tf.ops.relu6` introduced by the following paper: + `Convolutional Deep Belief Networks on CIFAR-10 [A. Krizhevsky, 2010] `__ + + The function return the following results: + - When x < 0: ``f(x) = alpha_low * x``. + - When x in [0, 6]: ``f(x) = x``. + - When x > 6: ``f(x) = 6``. + + Parameters + ---------- + x : Tensor + Support input type ``float``, ``double``, ``int32``, ``int64``, ``uint8``, ``int16``, or ``int8``. + alpha : float + Slope. + name : str + The function name (optional). + + Examples + -------- + >>> import tensorlayer as tl + >>> net = tl.layers.Input([10, 200]) + >>> net = tl.layers.LeakyReLU6(alpha=0.5)(net) + + Returns + ------- + Tensor + A ``Tensor`` in the same type as ``x``. + + References + ---------- + - `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + - `Convolutional Deep Belief Networks on CIFAR-10 [A. Krizhevsky, 2010] `__ + """ + + def __init__(self, alpha=0.2): + super(LeakyReLU6, self).__init__() + self._built = True + if not (0 < alpha <= 1): + raise ValueError("`alpha` value must be in [0, 1]`") + + self.alpha = alpha + self.minimum = tl.ops.Minimum() + self.maximum = tl.ops.Maximum() + + def forward(self, x): + return self.minimum(self.maximum(x, self.alpha * x), 6) + + +class LeakyTwiceRelu6(Module): + """ + + This activation function is a modified version :func:`leaky_relu` introduced by the following paper: + `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + + This activation function also follows the behaviour of the activation function :func:`tf.ops.relu6` introduced by the following paper: + `Convolutional Deep Belief Networks on CIFAR-10 [A. Krizhevsky, 2010] `__ + + This function push further the logic by adding `leaky` behaviour both below zero and above six. + + The function return the following results: + - When x < 0: ``f(x) = alpha_low * x``. + - When x in [0, 6]: ``f(x) = x``. + - When x > 6: ``f(x) = 6 + (alpha_high * (x-6))``. + + Parameters + ---------- + x : Tensor + Support input type ``float``, ``double``, ``int32``, ``int64``, ``uint8``, ``int16``, or ``int8``. + alpha_low : float + Slope for x < 0: ``f(x) = alpha_low * x``. + alpha_high : float + Slope for x < 6: ``f(x) = 6 (alpha_high * (x-6))``. + name : str + The function name (optional). + + Examples + -------- + >>> import tensorlayer as tl + >>> net = tl.layers.Input([10, 200]) + >>> net = tl.layers.LeakyTwiceRelu6(alpha_low=0.5, alpha_high=0.2)(net) + + Returns + ------- + Tensor + A ``Tensor`` in the same type as ``x``. + + References + ---------- + - `Rectifier Nonlinearities Improve Neural Network Acoustic Models [A. L. Maas et al., 2013] `__ + - `Convolutional Deep Belief Networks on CIFAR-10 [A. Krizhevsky, 2010] `__ + + """ + + def __init__(self, alpha_low=0.2, alpha_high=0.2): + super(LeakyTwiceRelu6, self).__init__() + self._built = True + if not (0 < alpha_high <= 1): + raise ValueError("`alpha_high` value must be in [0, 1]`") + + if not (0 < alpha_low <= 1): + raise ValueError("`alpha_low` value must be in [0, 1]`") + + self.alpha_low = alpha_low + self.alpha_high = alpha_high + self.minimum = tl.ops.Minimum() + self.maximum = tl.ops.Maximum() + + def forward(self, x): + x_is_above_0 = self.minimum(x, 6 * (1 - self.alpha_high) + self.alpha_high * x) + x_is_below_0 = self.minimum(self.alpha_low * x, 0) + return self.maximum(x_is_above_0, x_is_below_0) + + +class Swish(Module): + """Swish function. + + See `Swish: a Self-Gated Activation Function `__. + + Parameters + ---------- + x : Tensor + input. + name: str + function name (optional). + + Returns + ------- + Tensor + A ``Tensor`` in the same type as ``x``. + + """ + + def __init__(self): + super(Swish, self).__init__() + self.sigmoid = tl.ops.Sigmoid() + self._built = True + + def forward(self, x): + return self.sigmoid(x) * x + + +class HardTanh(Module): + """Hard tanh activation function. + + Which is a ramp function with low bound of -1 and upper bound of 1, shortcut is `htanh`. + + Parameters + ---------- + x : Tensor + input. + name : str + The function name (optional). + + Returns + ------- + Tensor + A ``Tensor`` in the same type as ``x``. + + """ + + def __init__(self): + super(HardTanh, self).__init__() + self._built = True + + def forward(self, x): + return tl.ops.clip_by_value(x, -1, 1) + + +class Mish(Module): + """Mish activation function. + + Reference: [Mish: A Self Regularized Non-Monotonic Neural Activation Function .Diganta Misra, 2019] + + Parameters + ---------- + x : Tensor + input. + + Returns + ------- + Tensor + A ``Tensor`` in the same type as ``x``. + + """ + + def __init__(self): + super(Mish, self).__init__() + self._tanh = tl.ops.Tanh() + self._softplus = tl.ops.Softplus() + self._built = True + + def forward(self, x): + return x * self._tanh(self._softplus(x)) diff --git a/tensorlayer/layers/convolution/__init__.py b/tensorlayer/layers/convolution/__init__.py new file mode 100644 index 0000000..668736e --- /dev/null +++ b/tensorlayer/layers/convolution/__init__.py @@ -0,0 +1,83 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +TensorLayer provides rich layer implementations trailed for +various benchmarks and domain-specific problems. In addition, we also +support transparent access to native TensorFlow parameters. +For example, we provide not only layers for local response normalization, but also +layers that allow user to apply ``tf.ops.lrn`` on ``network.outputs``. +More functions can be found in `TensorFlow API `__. +""" + +# from .binary_conv import * +from .deformable_conv import * +from .depthwise_conv import * +# from .dorefa_conv import * +# from .expert_conv import * +# from .expert_deconv import * +# from .group_conv import * +from .quan_conv import * +from .quan_conv_bn import * +# from .separable_conv import * +from .simplified_conv import * +# from .simplified_deconv import * +from .super_resolution import * +from .ternary_conv import * + +__all__ = [ + + # simplified conv + 'Conv1d', + 'Conv2d', + 'Conv3d', + + # simplified deconv + 'DeConv1d', + 'DeConv2d', + 'DeConv3d', + + # expert conv + # 'Conv1dLayer', + # 'Conv2dLayer', + # 'Conv3dLayer', + + # expert conv + # 'DeConv1dLayer', + # 'DeConv2dLayer', + # 'DeConv3dLayer', + + # atrous + # 'AtrousConv1dLayer', + # 'AtrousConv2dLayer', + # 'AtrousDeConv2d', + + # binary + # 'BinaryConv2d', + + # deformable + 'DeformableConv2d', + + # depthwise + 'DepthwiseConv2d', + + # dorefa + # 'DorefaConv2d', + + # group + # 'GroupConv2d', + + # separable + # 'SeparableConv1d', + # 'SeparableConv2d', + + # subpixel + 'SubpixelConv1d', + 'SubpixelConv2d', + + # ternary + 'TernaryConv2d', + + #quan_conv + 'QuanConv2d', + 'QuanConv2dWithBN', +] diff --git a/tensorlayer/layers/convolution/deformable_conv.py b/tensorlayer/layers/convolution/deformable_conv.py new file mode 100644 index 0000000..8a2cba0 --- /dev/null +++ b/tensorlayer/layers/convolution/deformable_conv.py @@ -0,0 +1,324 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'DeformableConv2d', +] + + +class DeformableConv2d(Module): + """The :class:`DeformableConv2d` class is a 2D + `Deformable Convolutional Networks `__. + + Parameters + ---------- + offset_layer : tf.Tensor + To predict the offset of convolution operations. + The shape is (batchsize, input height, input width, 2*(number of element in the convolution kernel)) + e.g. if apply a 3*3 kernel, the number of the last dimension should be 18 (2*3*3) + n_filter : int + The number of filters. + filter_size : tuple of int + The filter size (height, width). + act : activation function + The activation function of this layer. + padding : str + The padding algorithm type: "SAME" or "VALID". + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip biases. + in_channels : int + The number of in channels. + name : str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([5, 10, 10, 16], name='input') + >>> offset1 = tl.layers.Conv2d( + ... n_filter=18, filter_size=(3, 3), strides=(1, 1), padding='SAME', name='offset1' + ... )(net) + >>> deformconv1 = tl.layers.DeformableConv2d( + ... offset_layer=offset1, n_filter=32, filter_size=(3, 3), name='deformable1' + ... )(net) + >>> offset2 = tl.layers.Conv2d( + ... n_filter=18, filter_size=(3, 3), strides=(1, 1), padding='SAME', name='offset2' + ... )(deformconv1) + >>> deformconv2 = tl.layers.DeformableConv2d( + ... offset_layer=offset2, n_filter=64, filter_size=(3, 3), name='deformable2' + ... )(deformconv1) + + References + ---------- + - The deformation operation was adapted from the implementation in `here `__ + + Notes + ----- + - The padding is fixed to 'SAME'. + - The current implementation is not optimized for memory usgae. Please use it carefully. + + """ + + def __init__( + self, + offset_layer=None, + n_filter=32, + filter_size=(3, 3), + act=None, + padding='SAME', + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None + ): + super().__init__(name, act=act) + + self.offset_layer = offset_layer + self.n_filter = n_filter + self.filter_size = filter_size + self.padding = padding + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + # layer forward state + self._forward_state = False + + self.kernel_n = filter_size[0] * filter_size[1] + if self.offset_layer.get_shape()[-1] != 2 * self.kernel_n: + raise AssertionError("offset.get_shape()[-1] is not equal to: %d" % 2 * self.kernel_n) + + if self.in_channels is not None: + self.build(None) + self._built = True + + logging.info( + "DeformableConv2d %s: n_filter: %d, filter_size: %s act: %s" % ( + self.name, self.n_filter, str(self.filter_size + ), self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', padding={padding}' + ) + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + + self.input_h = int(inputs_shape[1]) + self.input_w = int(inputs_shape[2]) + initial_offsets = tl.ops.stack(tl.ops.meshgrid(tl.ops.range(self.filter_size[0]), + tl.ops.range(self.filter_size[1]), indexing='ij')) # initial_offsets --> (kh, kw, 2) + initial_offsets = tl.ops.reshape(initial_offsets, (-1, 2)) # initial_offsets --> (n, 2) + initial_offsets = tl.ops.expand_dims(initial_offsets, 0) # initial_offsets --> (1, n, 2) + initial_offsets = tl.ops.expand_dims(initial_offsets, 0) # initial_offsets --> (1, 1, n, 2) + initial_offsets = tl.ops.tile( + initial_offsets, [self.input_h, self.input_w, 1, 1] + ) # initial_offsets --> (h, w, n, 2) + initial_offsets = tl.ops.cast(initial_offsets, 'float32') + grid = tl.ops.meshgrid( + tl.ops.range( + -int((self.filter_size[0] - 1) / 2.0), int(self.input_h - int((self.filter_size[0] - 1) / 2.0)), 1 + ), + tl.ops.range( + -int((self.filter_size[1] - 1) / 2.0), int(self.input_w - int((self.filter_size[1] - 1) / 2.0)), 1 + ), indexing='ij' + ) + + grid = tl.ops.stack(grid, axis=-1) + grid = tl.ops.cast(grid, 'float32') # grid --> (h, w, 2) + grid = tl.ops.expand_dims(grid, 2) # grid --> (h, w, 1, 2) + grid = tl.ops.tile(grid, [1, 1, self.kernel_n, 1]) # grid --> (h, w, n, 2) + self.grid_offset = grid + initial_offsets # grid_offset --> (h, w, n, 2) + + self.filter_shape = (1, 1, self.kernel_n, self.in_channels, self.n_filter) + + self.W = self._get_weights("W_deformableconv2d", shape=self.filter_shape, init=self.W_init) + + if self.b_init: + self.b = self._get_weights("b_deformableconv2d", shape=(self.n_filter, ), init=self.b_init) + + self.conv3d = tl.ops.Conv3D(strides=[1, 1, 1, 1, 1], padding='VALID') + self.bias_add = tl.ops.BiasAdd() + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + offset = self.offset_layer + grid_offset = self.grid_offset + + input_deform = self._tf_batch_map_offsets(inputs, offset, grid_offset) + outputs = self.conv3d(input=input_deform, filters=self.W) + outputs = tl.ops.reshape(tensor=outputs, shape=[outputs.get_shape()[0], self.input_h, self.input_w, self.n_filter]) + if self.b_init: + outputs = self.bias_add(outputs, self.b) + if self.act: + outputs = self.act(outputs) + return outputs + + def _to_bc_h_w(self, x, x_shape): + """(b, h, w, c) -> (b*c, h, w)""" + x = tl.ops.transpose(a=x, perm=[0, 3, 1, 2]) + x = tl.ops.reshape(x, (-1, x_shape[1], x_shape[2])) + return x + + def _to_b_h_w_n_c(self, x, x_shape): + """(b*c, h, w, n) -> (b, h, w, n, c)""" + x = tl.ops.reshape(x, (-1, x_shape[4], x_shape[1], x_shape[2], x_shape[3])) + x = tl.ops.transpose(a=x, perm=[0, 2, 3, 4, 1]) + return x + + def tf_flatten(self, a): + """Flatten tensor""" + return tl.ops.reshape(a, [-1]) + + def _get_vals_by_coords(self, inputs, coords, idx, out_shape): + indices = tl.ops.stack( + [idx, self.tf_flatten(coords[:, :, :, :, 0]), + self.tf_flatten(coords[:, :, :, :, 1])], axis=-1 + ) + vals = tl.ops.gather_nd(inputs, indices) + vals = tl.ops.reshape(vals, out_shape) + return vals + + def _tf_repeat(self, a, repeats): + """Tensorflow version of np.repeat for 1D""" + # https://github.com/tensorflow/tensorflow/issues/8521 + + if len(a.get_shape()) != 1: + raise AssertionError("This is not a 1D Tensor") + + a = tl.ops.expand_dims(a, -1) + a = tl.ops.tile(a, [1, repeats]) + a = self.tf_flatten(a) + return a + + def _tf_batch_map_coordinates(self, inputs, coords): + """Batch version of tf_map_coordinates + + Only supports 2D feature maps + + Parameters + ---------- + inputs : ``tf.Tensor`` + shape = (b*c, h, w) + coords : ``tf.Tensor`` + shape = (b*c, h, w, n, 2) + + Returns + ------- + ``tf.Tensor`` + A Tensor with the shape as (b*c, h, w, n) + + """ + inputs_shape = inputs.get_shape() + coords_shape = coords.get_shape() + batch_channel = tl.get_tensor_shape(inputs)[0] + input_h = int(inputs_shape[1]) + input_w = int(inputs_shape[2]) + kernel_n = int(coords_shape[3]) + n_coords = input_h * input_w * kernel_n + + coords_lt = tl.ops.cast(tl.ops.floor(coords), 'int32') + coords_rb = tl.ops.cast(tl.ops.ceil(coords), 'int32') + coords_lb = tl.ops.stack([coords_lt[:, :, :, :, 0], coords_rb[:, :, :, :, 1]], axis=-1) + coords_rt = tl.ops.stack([coords_rb[:, :, :, :, 0], coords_lt[:, :, :, :, 1]], axis=-1) + + idx = self._tf_repeat(tl.ops.range(batch_channel), n_coords) + + vals_lt = self._get_vals_by_coords(inputs, coords_lt, idx, (batch_channel, input_h, input_w, kernel_n)) + vals_rb = self._get_vals_by_coords(inputs, coords_rb, idx, (batch_channel, input_h, input_w, kernel_n)) + vals_lb = self._get_vals_by_coords(inputs, coords_lb, idx, (batch_channel, input_h, input_w, kernel_n)) + vals_rt = self._get_vals_by_coords(inputs, coords_rt, idx, (batch_channel, input_h, input_w, kernel_n)) + + coords_offset_lt = coords - tl.ops.cast(coords_lt, 'float32') + + vals_t = vals_lt + (vals_rt - vals_lt) * coords_offset_lt[:, :, :, :, 0] + vals_b = vals_lb + (vals_rb - vals_lb) * coords_offset_lt[:, :, :, :, 0] + mapped_vals = vals_t + (vals_b - vals_t) * coords_offset_lt[:, :, :, :, 1] + + return mapped_vals + + def _tf_batch_map_offsets(self, inputs, offsets, grid_offset): + """Batch map offsets into input + + Parameters + ------------ + inputs : ``tf.Tensor`` + shape = (b, h, w, c) + offsets: ``tf.Tensor`` + shape = (b, h, w, 2*n) + grid_offset: `tf.Tensor`` + Offset grids shape = (h, w, n, 2) + + Returns + ------- + ``tf.Tensor`` + A Tensor with the shape as (b, h, w, c) + + """ + inputs_shape = inputs.get_shape() + batch_size = tl.get_tensor_shape(inputs)[0] + kernel_n = int(int(offsets.get_shape()[3]) / 2) + input_h = inputs_shape[1] + input_w = inputs_shape[2] + channel = inputs_shape[3] + + # inputs (b, h, w, c) --> (b*c, h, w) + inputs = self._to_bc_h_w(inputs, inputs_shape) + + # offsets (b, h, w, 2*n) --> (b, h, w, n, 2) + offsets = tl.ops.reshape(offsets, (batch_size, input_h, input_w, kernel_n, 2)) + # offsets (b, h, w, n, 2) --> (b*c, h, w, n, 2) + # offsets = tf.tile(offsets, [channel, 1, 1, 1, 1]) + + coords = tl.ops.expand_dims(grid_offset, 0) # grid_offset --> (1, h, w, n, 2) + coords = tl.ops.tile(coords, [batch_size, 1, 1, 1, 1]) + offsets # grid_offset --> (b, h, w, n, 2) + + # clip out of bound + coords = tl.ops.stack( + [ + tl.ops.clip_by_value(coords[:, :, :, :, 0], 0.0, tl.ops.cast(input_h - 1, 'float32')), + tl.ops.clip_by_value(coords[:, :, :, :, 1], 0.0, tl.ops.cast(input_w - 1, 'float32')) + ], axis=-1 + ) + coords = tl.ops.tile(coords, [channel, 1, 1, 1, 1]) + + mapped_vals = self._tf_batch_map_coordinates(inputs, coords) + # (b*c, h, w, n) --> (b, h, w, n, c) + mapped_vals = self._to_b_h_w_n_c(mapped_vals, [batch_size, input_h, input_w, kernel_n, channel]) + + return mapped_vals + +if __name__ == '__main__': + net = tl.layers.Input([5, 10, 10, 16], name='input') + offset1 = tl.layers.Conv2d(n_filter=18, filter_size=(3, 3), strides=(1, 1), padding='SAME', name='offset1', in_channels=16)(net) + deformconv1 = DeformableConv2d(offset_layer=offset1, n_filter=32, filter_size=(3, 3), name='deformable1')(net) + offset2 = tl.layers.Conv2d(n_filter=18, filter_size=(3, 3), strides=(1, 1), padding='SAME', name='offset2', in_channels=32)(deformconv1) + deformconv2 = DeformableConv2d(offset_layer=offset2, n_filter=64, filter_size=(3, 3), name='deformable2')(deformconv1) + print(deformconv2) + diff --git a/tensorlayer/layers/convolution/depthwise_conv.py b/tensorlayer/layers/convolution/depthwise_conv.py new file mode 100644 index 0000000..bac18de --- /dev/null +++ b/tensorlayer/layers/convolution/depthwise_conv.py @@ -0,0 +1,170 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorlayer.backend import BACKEND + +__all__ = [ + 'DepthwiseConv2d', +] + + +class DepthwiseConv2d(Module): + """Separable/Depthwise Convolutional 2D layer, see `tf.nn.depthwise_conv2d `__. + + Input: + 4-D Tensor (batch, height, width, in_channels). + Output: + 4-D Tensor (batch, new height, new width, in_channels * depth_multiplier). + + Parameters + ------------ + filter_size : tuple of 2 int + The filter size (height, width). + strides : tuple of 2 int + The stride step (height, width). + act : activation function + The activation function of this layer. + padding : str + The padding algorithm type: "SAME" or "VALID". + data_format : str + "channels_last" (NHWC, default) or "channels_first" (NCHW). + dilation_rate: tuple of 2 int + The dilation rate in which we sample input values across the height and width dimensions in atrous convolution. If it is greater than 1, then all values of strides must be 1. + depth_multiplier : int + The number of channels to expand to. + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip bias. + in_channels : int + The number of in channels. + name : str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([8, 200, 200, 32], name='input') + >>> depthwiseconv2d = tl.layers.DepthwiseConv2d( + ... filter_size=(3, 3), strides=(1, 1), dilation_rate=(2, 2), act=tl.ReLU, depth_multiplier=2, name='depthwise' + ... )(net) + >>> print(depthwiseconv2d) + >>> output shape : (8, 200, 200, 64) + + + References + ----------- + - tflearn's `grouped_conv_2d `__ + - keras's `separableconv2d `__ + + """ + + # https://zhuanlan.zhihu.com/p/31551004 https://github.com/xiaohu2015/DeepLearning_tutorials/blob/master/CNNs/MobileNet.py + def __init__( + self, + filter_size=(3, 3), + strides=(1, 1), + act=None, + padding='SAME', + data_format='channels_last', + dilation_rate=(1, 1), + depth_multiplier=1, + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None # 'depthwise_conv2d' + ): + super().__init__(name, act=act) + self.filter_size = filter_size + self.strides = self._strides = strides + self.padding = padding + self.dilation_rate = self._dilation_rate = dilation_rate + self.data_format = data_format + self.depth_multiplier = depth_multiplier + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels: + self.build(None) + self._built = True + + logging.info( + "DepthwiseConv2d %s: filter_size: %s strides: %s pad: %s act: %s" % ( + self.name, str(filter_size), str(strides), padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', strides={strides}, padding={padding}' + ) + if self.dilation_rate != (1, ) * len(self.dilation_rate): + s += ', dilation={dilation_rate}' + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format( + classname=self.__class__.__name__, n_filter=self.in_channels * self.depth_multiplier, **self.__dict__ + ) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NHWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + self._strides = [1, self._strides[0], self._strides[1], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCHW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + self._strides = [1, 1, self._strides[0], self._strides[1]] + else: + raise Exception("data_format should be either channels_last or channels_first") + + self.filter_shape = (self.filter_size[0], self.filter_size[1], self.in_channels, self.depth_multiplier) + + # Set the size of kernel as (K1,K2), then the shape is (K,Cin,K1,K2), K must be 1. + if BACKEND == 'mindspore': + self.filter_shape = (self.filter_size[0], self.filter_size[1], self.in_channels, 1) + + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + + self.depthwise_conv2d = tl.ops.DepthwiseConv2d( + strides=self._strides, padding=self.padding, data_format=self.data_format, dilations=self._dilation_rate, + ksize=self.filter_size, channel_multiplier=self.depth_multiplier + ) + + self.b_init_flag = False + if self.b_init: + self.b = self._get_weights("biases", shape=(self.in_channels * self.depth_multiplier, ), init=self.b_init) + self.bias_add = tl.ops.BiasAdd(self.data_format) + self.b_init_flag = True + + self.act_init_flag = False + if self.act: + self.act_init_flag = True + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + outputs = self.depthwise_conv2d(input=inputs, filter=self.W) + if self.b_init_flag: + outputs = self.bias_add(outputs, self.b) + if self.act_init_flag: + outputs = self.act(outputs) + return outputs diff --git a/tensorlayer/layers/convolution/quan_conv.py b/tensorlayer/layers/convolution/quan_conv.py new file mode 100644 index 0000000..87f4f52 --- /dev/null +++ b/tensorlayer/layers/convolution/quan_conv.py @@ -0,0 +1,173 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorlayer.layers.utils import (quantize_active_overflow, quantize_weight_overflow) + +__all__ = ['QuanConv2d'] + + +class QuanConv2d(Module): + """The :class:`QuanConv2d` class is a quantized convolutional layer without BN, which weights are 'bitW' bits and the output of the previous layer + are 'bitA' bits while inferencing. + Note that, the bias vector would not be binarized. + + Parameters + ---------- + With TensorLayer + + n_filter : int + The number of filters. + filter_size : tuple of int + The filter size (height, width). + strides : tuple of int + The sliding window strides of corresponding input dimensions. + It must be in the same order as the ``shape`` parameter. + act : activation function + The activation function of this layer. + padding : str + The padding algorithm type: "SAME" or "VALID". + bitW : int + The bits of this layer's parameter + bitA : int + The bits of the output of previous layer + use_gemm : boolean + If True, use gemm instead of ``tf.matmul`` for inference. + TODO: support gemm + data_format : str + "channels_last" (NHWC, default) or "channels_first" (NCHW). + dilation_rate : tuple of int + Specifying the dilation rate to use for dilated convolution. + W_init : initializer + The initializer for the the weight matrix. + b_init : initializer or None + The initializer for the the bias vector. If None, skip biases. + in_channels : int + The number of in channels. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([8, 12, 12, 64], name='input') + >>> quanconv2d = tl.layers.QuanConv2d( + ... n_filter=32, filter_size=(5, 5), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='quancnn2d' + ... )(net) + >>> print(quanconv2d) + >>> output shape : (8, 12, 12, 32) + + """ + + def __init__( + self, + bitW=8, + bitA=8, + n_filter=32, + filter_size=(3, 3), + strides=(1, 1), + act=None, + padding='SAME', + use_gemm=False, + data_format="channels_last", + dilation_rate=(1, 1), + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None # 'quan_cnn2d', + ): + super().__init__(name, act=act) + self.bitW = bitW + self.bitA = bitA + self.n_filter = n_filter + self.filter_size = filter_size + self.strides = self._strides = strides + self.padding = padding + self.use_gemm = use_gemm + self.data_format = data_format + self.dilation_rate = self._dilation_rate = dilation_rate + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels: + self.build(None) + self._built = True + + logging.info( + "QuanConv2d %s: n_filter: %d filter_size: %s strides: %s pad: %s act: %s" % ( + self.name, n_filter, str(filter_size), str(strides), padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + if self.use_gemm: + raise Exception("TODO. The current version use tf.matmul for inferencing.") + + if len(self.strides) != 2: + raise ValueError("len(strides) should be 2.") + + def __repr__(self): + actstr = self.act.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', strides={strides}, padding={padding}' + ) + if self.dilation_rate != (1, ) * len(self.dilation_rate): + s += ', dilation={dilation_rate}' + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NHWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + self._strides = [1, self._strides[0], self._strides[1], 1] + self._dilation_rate = [1, self._dilation_rate[0], self._dilation_rate[1], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCHW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + self._strides = [1, 1, self._strides[0], self._strides[1]] + self._dilation_rate = [1, 1, self._dilation_rate[0], self._dilation_rate[1]] + else: + raise Exception("data_format should be either channels_last or channels_first") + + self.filter_shape = (self.filter_size[0], self.filter_size[1], self.in_channels, self.n_filter) + + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + self.bias_add = tl.ops.BiasAdd(data_format=self.data_format) + + self.conv2d = tl.ops.Conv2D(strides=self.strides, padding=self.padding, data_format=self.data_format, + dilations=self._dilation_rate) + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + inputs = quantize_active_overflow(inputs, self.bitA) + + W_ = quantize_weight_overflow(self.W, self.bitW) + + outputs = self.conv2d(inputs, W_) + + if self.b_init: + outputs = self.bias_add(outputs, self.b) + if self.act: + outputs = self.act(outputs) + + return outputs diff --git a/tensorlayer/layers/convolution/quan_conv_bn.py b/tensorlayer/layers/convolution/quan_conv_bn.py new file mode 100644 index 0000000..335742b --- /dev/null +++ b/tensorlayer/layers/convolution/quan_conv_bn.py @@ -0,0 +1,240 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorflow as tf +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorflow.python.training import moving_averages +from tensorlayer.layers.utils import (quantize_active_overflow, quantize_weight_overflow) +from tensorlayer.backend import BACKEND + +__all__ = ['QuanConv2dWithBN'] + + +class QuanConv2dWithBN(Module): + """The :class:`QuanConv2dWithBN` class is a quantized convolutional layer with BN, which weights are 'bitW' bits and the output of the previous layer + are 'bitA' bits while inferencing. + + Note that, the bias vector would keep the same. + + Parameters + ---------- + n_filter : int + The number of filters. + filter_size : tuple of int + The filter size (height, width). + strides : tuple of int + The sliding window strides of corresponding input dimensions. + It must be in the same order as the ``shape`` parameter. + padding : str + The padding algorithm type: "SAME" or "VALID". + act : activation function + The activation function of this layer. + decay : float + A decay factor for `ExponentialMovingAverage`. + Suggest to use a large value for large dataset. + epsilon : float + Eplison. + is_train : boolean + Is being used for training or inference. + beta_init : initializer or None + The initializer for initializing beta, if None, skip beta. + Usually you should not skip beta unless you know what happened. + gamma_init : initializer or None + The initializer for initializing gamma, if None, skip gamma. + bitW : int + The bits of this layer's parameter + bitA : int + The bits of the output of previous layer + use_gemm : boolean + If True, use gemm instead of ``tf.matmul`` for inferencing. (TODO). + W_init : initializer + The initializer for the the weight matrix. + W_init_args : dictionary + The arguments for the weight matrix initializer. + data_format : str + "NHWC" or "NCHW", default is "NHWC". + dilation_rate : tuple of int + Specifying the dilation rate to use for dilated convolution. + in_channels : int + The number of in channels. + name : str + A unique layer name. + + Examples + --------- + >>> import tensorlayer as tl + >>> net = tl.layers.Input([50, 256, 256, 3]) + >>> layer = tl.layers.QuanConv2dWithBN(n_filter=64, filter_size=(5,5),strides=(1,1),padding='SAME',name='qcnnbn1') + >>> print(layer) + >>> net = tl.layers.QuanConv2dWithBN(n_filter=64, filter_size=(5,5),strides=(1,1),padding='SAME',name='qcnnbn1')(net) + >>> print(net) + """ + + def __init__( + self, + n_filter=32, + filter_size=(3, 3), + strides=(1, 1), + padding='SAME', + act=None, + decay=0.9, + epsilon=1e-5, + is_train=False, + gamma_init=tl.initializers.truncated_normal(stddev=0.02), + beta_init=tl.initializers.truncated_normal(stddev=0.02), + bitW=8, + bitA=8, + use_gemm=False, + W_init=tl.initializers.truncated_normal(stddev=0.02), + W_init_args=None, + data_format="channels_last", + dilation_rate=(1, 1), + in_channels=None, + name='quan_cnn2d_bn', + ): + super(QuanConv2dWithBN, self).__init__(act=act, name=name) + self.n_filter = n_filter + self.filter_size = filter_size + self.strides = strides + self.padding = padding + self.decay = decay + self.epsilon = epsilon + self.is_train = is_train + self.gamma_init = gamma_init + self.beta_init = beta_init + self.bitW = bitW + self.bitA = bitA + self.use_gemm = use_gemm + self.W_init = W_init + self.W_init_args = W_init_args + self.data_format = data_format + self.dilation_rate = dilation_rate + self.in_channels = in_channels + logging.info( + "QuanConv2dWithBN %s: n_filter: %d filter_size: %s strides: %s pad: %s act: %s " % ( + self.name, n_filter, filter_size, str(strides), padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + if BACKEND == 'mindspore': + raise NotImplementedError("MindSpore backend does not implement this method") + + if self.in_channels: + self.build(None) + self._built = True + + if use_gemm: + raise Exception("TODO. The current version use tf.matmul for inferencing.") + + if len(strides) != 2: + raise ValueError("len(strides) should be 2.") + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', strides={strides}, padding={padding}' + actstr + ) + if self.dilation_rate != (1, ) * len(self.dilation_rate): + s += ', dilation={dilation_rate}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NHWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + self._strides = [1, self.strides[0], self.strides[1], 1] + self._dilation_rate = [1, self.dilation_rate[0], self.dilation_rate[1], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCHW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + self._strides = [1, 1, self.strides[0], self.strides[1]] + self._dilation_rate = [1, 1, self.dilation_rate[0], self.dilation_rate[1]] + else: + raise Exception("data_format should be either channels_last or channels_first") + + self.filter_shape = (self.filter_size[0], self.filter_size[1], self.in_channels, self.n_filter) + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + + para_bn_shape = (self.n_filter, ) + if self.gamma_init: + self.scale_para = self._get_weights( + "scale_para", shape=para_bn_shape, init=self.gamma_init, trainable=self.is_train + ) + else: + self.scale_para = None + + if self.beta_init: + self.offset_para = self._get_weights( + "offset_para", shape=para_bn_shape, init=self.beta_init, trainable=self.is_train + ) + else: + self.offset_para = None + + self.moving_mean = self._get_weights( + "moving_mean", shape=para_bn_shape, init=tl.initializers.constant(1.0), trainable=False + ) + self.moving_variance = self._get_weights( + "moving_variance", shape=para_bn_shape, init=tl.initializers.constant(1.0), trainable=False + ) + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + x = inputs + inputs = quantize_active_overflow(inputs, self.bitA) # Do not remove + outputs = tf.nn.conv2d( + input=x, filters=self.W, strides=self._strides, padding=self.padding, data_format=self.data_format, + dilations=self._dilation_rate, name=self.name + ) + + mean, variance = tf.nn.moments(outputs, axes=list(range(len(outputs.get_shape()) - 1))) + + update_moving_mean = moving_averages.assign_moving_average( + self.moving_mean, mean, self.decay, zero_debias=False + ) # if zero_debias=True, has bias + update_moving_variance = moving_averages.assign_moving_average( + self.moving_variance, mean, self.decay, zero_debias=False + ) # if zero_debias=True, has bias + + if self.is_train: + mean, var = self.mean_var_with_update(update_moving_mean, update_moving_variance, mean, variance) + else: + mean, var = self.moving_mean, self.moving_variance + + w_fold = self._w_fold(self.W, self.scale_para, var, self.epsilon) + + W_ = quantize_weight_overflow(w_fold, self.bitW) + + conv_fold = tf.nn.conv2d(inputs, W_, strides=self.strides, padding=self.padding, data_format=self.data_format) + + if self.beta_init: + bias_fold = self._bias_fold(self.offset_para, self.scale_para, mean, var, self.epsilon) + conv_fold = tf.nn.bias_add(conv_fold, bias_fold, name='bn_bias_add') + + if self.act: + conv_fold = self.act(conv_fold) + + return conv_fold + + def mean_var_with_update(self, update_moving_mean, update_moving_variance, mean, variance): + with tf.control_dependencies([update_moving_mean, update_moving_variance]): + return tf.identity(mean), tf.identity(variance) + + def _w_fold(self, w, gama, var, epsilon): + return tf.compat.v1.div(tf.multiply(gama, w), tf.sqrt(var + epsilon)) + + def _bias_fold(self, beta, gama, mean, var, epsilon): + return tf.subtract(beta, tf.compat.v1.div(tf.multiply(gama, mean), tf.sqrt(var + epsilon))) \ No newline at end of file diff --git a/tensorlayer/layers/convolution/simplified_conv.py b/tensorlayer/layers/convolution/simplified_conv.py new file mode 100644 index 0000000..e78dfbd --- /dev/null +++ b/tensorlayer/layers/convolution/simplified_conv.py @@ -0,0 +1,893 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from tensorlayer.layers.core import Module +import tensorlayer as tl +from tensorlayer import logging + + +__all__ = [ + 'Conv1d', + 'Conv2d', + 'Conv3d', + 'DeConv1d', + 'DeConv2d', + 'DeConv3d', +] + + +class Conv1d(Module): + """Simplified version of :class:`Conv1dLayer`. + + Parameters + ---------- + n_filter : int + The number of filters + filter_size : int + The filter size + stride : int + The stride step + dilation_rate : int + Specifying the dilation rate to use for dilated convolution. + act : activation function + The function that is applied to the layer activations + padding : str + The padding algorithm type: "SAME" or "VALID". + data_format : str + "channel_last" (NWC, default) or "channels_first" (NCW). + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip biases. + in_channels : int + The number of in channels. + name : None or str + A unique layer name + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([8, 100, 1], name='input') + >>> conv1d = tl.layers.Conv1d(n_filter=32, filter_size=5, stride=2, b_init=None, in_channels=1, name='conv1d_1') + >>> print(conv1d) + >>> tensor = tl.layers.Conv1d(n_filter=32, filter_size=5, stride=2, act=tl.ops.relu, name='conv1d_2')(net) + >>> print(tensor) + + """ + + def __init__( + self, + n_filter=32, + filter_size=5, + stride=1, + act=None, + padding='SAME', + data_format="channels_last", + dilation_rate=1, + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None # 'conv1d' + ): + super().__init__(name, act=act) + self.n_filter = n_filter + self.filter_size = filter_size + self.stride = stride + self.padding = padding + self.data_format = data_format + self.dilation_rate = dilation_rate + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels: + self.build(None) + self._built = True + + logging.info( + "Conv1d %s: n_filter: %d filter_size: %s stride: %d pad: %s act: %s" % ( + self.name, n_filter, filter_size, stride, padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', stride={stride}, padding={padding}' + ) + if self.dilation_rate != 1: + s += ', dilation={dilation_rate}' + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + elif self.data_format == 'channels_first': + self.data_format = 'NCW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + else: + raise Exception("data_format should be either channels_last or channels_first") + + self.filter_shape = (self.filter_size, self.in_channels, self.n_filter) + + # TODO : check + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + + self.b_init_flag = False + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + self.bias_add = tl.ops.BiasAdd(self.data_format) + self.b_init_flag = True + + self.conv1d = tl.ops.Conv1D( + stride=self.stride, padding=self.padding, data_format=self.data_format, dilations=self.dilation_rate, + out_channel=self.n_filter, k_size=self.filter_size + ) + + self.act_init_flag = False + if self.act: + self.act_init_flag = True + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + outputs = self.conv1d(inputs, self.W) + if self.b_init_flag: + outputs = self.bias_add(outputs, self.b) + if self.act_init_flag: + outputs = self.act(outputs) + + return outputs + + +class Conv2d(Module): + """Simplified version of :class:`Conv2dLayer`. + + Parameters + ---------- + n_filter : int + The number of filters. + filter_size : tuple of int + The filter size (height, width). + strides : tuple of int + The sliding window strides of corresponding input dimensions. + It must be in the same order as the ``shape`` parameter. + dilation_rate : tuple of int + Specifying the dilation rate to use for dilated convolution. + act : activation function + The activation function of this layer. + padding : str + The padding algorithm type: "SAME" or "VALID". + data_format : str + "channels_last" (NHWC, default) or "channels_first" (NCHW). + W_init : initializer + The initializer for the the weight matrix. + b_init : initializer or None + The initializer for the the bias vector. If None, skip biases. + in_channels : int + The number of in channels. + name : None or str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([8, 3, 400, 400], name='input') + >>> conv2d = tl.layers.Conv2d(n_filter=32, filter_size=(3, 3), strides=(2, 2), b_init=None, in_channels=3, name='conv2d_1') + >>> print(conv2d) + >>> tensor = tl.layers.Conv2d(n_filter=32, filter_size=(3, 3), strides=(2, 2), act=tl.ops.relu, name='conv2d_2')(net) + >>> print(tensor) + + """ + + def __init__( + self, + n_filter=32, + filter_size=(3, 3), + strides=(1, 1), + act=None, + padding='SAME', + data_format='channels_last', + dilation_rate=(1, 1), + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None, # 'conv2d', + ): + super(Conv2d, self).__init__(name, act=act) + self.n_filter = n_filter + self.filter_size = filter_size + self._strides = self.strides = strides + self.padding = padding + self.data_format = data_format + self._dilation_rate = self.dilation_rate = dilation_rate + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels: + self.build(None) + self._built = True + + logging.info( + "Conv2d %s: n_filter: %d filter_size: %s strides: %s pad: %s act: %s" % ( + self.name, n_filter, str(filter_size), str(strides), padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', strides={strides}, padding={padding}' + ) + if self.dilation_rate != (1, ) * len(self.dilation_rate): + s += ', dilation={dilation_rate}' + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NHWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + self._strides = [1, self._strides[0], self._strides[1], 1] + self._dilation_rate = [1, self._dilation_rate[0], self._dilation_rate[1], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCHW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + self._strides = [1, 1, self._strides[0], self._strides[1]] + self._dilation_rate = [1, 1, self._dilation_rate[0], self._dilation_rate[1]] + else: + raise Exception("data_format should be either channels_last or channels_first") + + #TODO channels first filter shape [out_channel, in_channel, filter_h, filter_w] + self.filter_shape = (self.filter_size[0], self.filter_size[1], self.in_channels, self.n_filter) + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + + self.b_init_flag = False + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + self.bias_add = tl.ops.BiasAdd(self.data_format) + self.b_init_flag = True + + self.conv2d = tl.ops.Conv2D( + strides=self._strides, padding=self.padding, data_format=self.data_format, dilations=self._dilation_rate, + out_channel=self.n_filter, k_size=(self.filter_size[0], self.filter_size[1]) + ) + + self.act_init_flag = False + if self.act: + self.act_init_flag = True + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + outputs = self.conv2d(inputs, self.W) + if self.b_init_flag: + outputs = self.bias_add(outputs, self.b) + if self.act_init_flag: + outputs = self.act(outputs) + return outputs + + +class Conv3d(Module): + """Simplified version of :class:`Conv3dLayer`. + + Parameters + ---AppData\Local\Continuum\anaconda3\envs\ms_tf\lib\site-packages\mindspore\common\api.py", line 412, in compile + result = self._executor.compile(obj, args_list, phase, use_vm) +RuntimeError: Unable to cast from non-held to held instance (T& to Holder) of type 'std:------- + n_filter : int + The number of filters. + filter_size : tuple of int + The filter size (height, width). + strides : tuple of int + The sliding window strides of corresponding input dimensions. + It must be in the same order as the ``shape`` parameter. + dilation_rate : tuple of int + Specifying the dilation rate to use for dilated convolution. + act : activation function + The activation function of this layer. + padding : str + The padding algorithm type: "SAME" or "VALID". + data_format : str + "channels_last" (NDHWC, default) or "channels_first" (NCDHW). + W_init : initializer + The initializer for the the weight matrix. + b_init : initializer or None + The initializer for the the bias vector. If None, skip biases. + in_channels : int + The number of in channels. + name : None or str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([8, 20, 20, 20, 3], name='input') + >>> conv3d = tl.layers.Conv3d(n_filter=32, filter_size=(3, 3, 3), strides=(2, 2, 2), b_init=None, in_channels=3, name='conv3d_1') + >>> print(conv3d) + >>> tensor = tl.layers.Conv3d(n_filter=32, filter_size=(3, 3, 3), strides=(2, 2, 2), act=tl.ops.relu, name='conv3d_2')(net) + >>> print(tensor) + + """ + + def __init__( + self, + n_filter=32, + filter_size=(3, 3, 3), + strides=(1, 1, 1), + act=None, + padding='SAME', + data_format='channels_last', + dilation_rate=(1, 1, 1), + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None # 'conv3d', + ): + super().__init__(name, act=act) + self.n_filter = n_filter + self.filter_size = filter_size + self._strides = self.strides = strides + self.padding = padding + self.data_format = data_format + self._dilation_rate = self.dilation_rate = dilation_rate + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels: + self.build(None) + self._built = True + + logging.info( + "Conv3d %s: n_filter: %d filter_size: %s strides: %s pad: %s act: %s" % ( + self.name, n_filter, str(filter_size), str(strides), padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', strides={strides}, padding={padding}' + ) + if self.dilation_rate != (1, ) * len(self.dilation_rate): + s += ', dilation={dilation_rate}' + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NDHWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + self._strides = [1, self._strides[0], self._strides[1], self._strides[2], 1] + self._dilation_rate = [1, self.dilation_rate[0], self.dilation_rate[1], self.dilation_rate[2], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCDHW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + self._strides = [1, 1, self._strides[0], self._strides[1], self._strides[2]] + self._dilation_rate = [1, 1, self._dilation_rate[0], self._dilation_rate[1], self._dilation_rate[2]] + else: + raise Exception("data_format should be either channels_last or channels_first") + + self.filter_shape = ( + self.filter_size[0], self.filter_size[1], self.filter_size[2], self.in_channels, self.n_filter + ) + + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + + self.b_init_flag = False + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + self.bias_add = tl.ops.BiasAdd(self.data_format) + self.b_init_flag = True + + self.conv3d = tl.ops.Conv3D( + strides=self._strides, padding=self.padding, data_format=self.data_format, dilations=self._dilation_rate, + out_channel=self.n_filter, k_size=(self.filter_size[0], self.filter_size[1]) + ) + + self.act_init_flag = False + if self.act: + self.act_init_flag = True + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + outputs = self.conv3d(inputs, self.W) + if self.b_init_flag: + outputs = self.bias_add(outputs, self.b) + if self.act_init_flag: + outputs = self.act(outputs) + return outputs + + +class DeConv1d(Module): + """Simplified version of :class:`Deconv1dlayer`. + + Parameters + ---------- + n_filter : int + The number of filters + filter_size : int + The filter size + strides : int or list + An int or list of `ints` that has length `1` or `3`. The number of entries by which the filter is moved right at each step. + output_shape : a 1-D Tensor + containing three elements, representing the output shape of the deconvolution op. + dilation_rate : int or list + Specifying the dilation rate to use for dilated convolution. + act : activation function + The function that is applied to the layer activations + padding : str + The padding algorithm type: "SAME" or "VALID". + data_format : str + "channel_last" (NWC, default) or "channels_first" (NCW). + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip biases. + in_channels : int + The number of in channels. + name : None or str + A unique layer name + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([8, 100, 1], name='input') + >>> conv1d = tl.layers.DeConv1d(n_filter=32, filter_size=5, stride=2, b_init=None, in_channels=1, name='Deonv1d_1') + >>> print(conv1d) + >>> tensor = tl.layers.DeConv1d(n_filter=32, filter_size=5, stride=2, act=tl.ops.relu, name='Deconv1d_2')(net) + >>> print(tensor) + + """ + + def __init__( + self, + n_filter=32, + filter_size=15, + strides=1, + act=None, + padding='SAME', + data_format="channels_last", + dilation_rate=1, + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None # 'conv1d_transpose' + ): + super(DeConv1d, self).__init__(name, act=act) + self.n_filter = n_filter + self.filter_size = filter_size + self.strides = strides + self.padding = padding + self.data_format = data_format + self.dilation_rate = dilation_rate + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels: + self.build(None) + self._built = True + + logging.info( + "DeConv1d %s: n_filter: %d filter_size: %s stride: %d pad: %s act: %s" % ( + self.name, n_filter, filter_size, strides, padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', strides={strides}, padding={padding}' + ) + if self.dilation_rate != 1: + s += ', dilation={dilation_rate}' + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + elif self.data_format == 'channels_first': + self.data_format = 'NCW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + else: + raise Exception("data_format should be either channels_last or channels_first") + + self.filter_shape = (self.filter_size, self.n_filter, self.in_channels) + + # TODO : check + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + + self.b_init_flag = False + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + self.bias_add = tl.ops.BiasAdd(self.data_format) + self.b_init_flag = True + + self.conv1d_transpose = tl.ops.Conv1d_transpose( + strides=self.strides, + padding=self.padding, + data_format=self.data_format, + dilations=self.dilation_rate, + out_channel=self.n_filter, + k_size=self.filter_size, + in_channels=self.in_channels, + ) + + self.act_init_flag = False + if self.act: + self.act_init_flag = True + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + outputs = self.conv1d_transpose(inputs, self.W) + if self.b_init_flag: + outputs = self.bias_add(outputs, self.b) + if self.act_init_flag: + outputs = self.act(outputs) + return outputs + + +class DeConv2d(Module): + """Simplified version of :class:`Deconv2dLayer`. + + Parameters + ---------- + + n_filter : int + The number of filters. + filter_size : tuple of int + The filter size. + strides : tuple of int + The sliding window strides of corresponding input dimensions. + It must be in the same order as the ``shape`` parameter. + output_shape : A 1-D Tensor + representing the output shape of the deconvolution op. + dilation_rate : tuple of int + Specifying the dilation rate to use for dilated convolution. + act : activation function + The activation function of this layer. + padding : str + The padding algorithm type: "SAME" or "VALID". + data_format : str + "channels_last" (NHWC, default) or "channels_first" (NCHW). + W_init : initializer + The initializer for the the weight matrix. + b_init : initializer or None + The initializer for the the bias vector. If None, skip biases. + in_channels : int + The number of in channels. + name : None or str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([8, 3, 400, 400], name='input') + >>> conv2d_transpose = tl.layers.DeConv2d(n_filter=32, filter_size=(3, 3), strides=(2, 2), b_init=None, in_channels=3, name='conv2d_transpose_1') + >>> print(conv2d_transpose) + >>> tensor = tl.layers.DeConv2d(n_filter=32, filter_size=(3, 3), strides=(2, 2), act=tl.ops.relu, name='conv2d_transpose_2')(net) + >>> print(tensor) + + """ + + def __init__( + self, + n_filter=32, + filter_size=(3, 3), + strides=(1, 1), + act=None, + padding='SAME', + data_format='channels_last', + dilation_rate=(1, 1), + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None, # 'conv2d_transpose', + ): + super(DeConv2d, self).__init__(name, act=act) + self.n_filter = n_filter + self.filter_size = filter_size + self._strides = self.strides = strides + self.padding = padding + self.data_format = data_format + self._dilation_rate = self.dilation_rate = dilation_rate + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels: + self.build(None) + self._built = True + + logging.info( + "DeConv2d %s: n_filter: %d filter_size: %s strides: %s pad: %s act: %s" % ( + self.name, n_filter, str(filter_size), str(strides), padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', strides={strides}, padding={padding}' + ) + if self.dilation_rate != (1, ) * len(self.dilation_rate): + s += ', dilation={dilation_rate}' + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NHWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + self._strides = [1, self._strides[0], self._strides[1], 1] + self._dilation_rate = [1, self._dilation_rate[0], self._dilation_rate[1], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCHW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + self._strides = [1, 1, self._strides[0], self._strides[1]] + self._dilation_rate = [1, 1, self._dilation_rate[0], self._dilation_rate[1]] + else: + raise Exception("data_format should be either channels_last or channels_first") + + #TODO channels first filter shape [out_channel, in_channel, filter_h, filter_w] + self.filter_shape = (self.filter_size[0], self.filter_size[1], self.n_filter, self.in_channels) + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + + self.b_init_flag = False + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + self.bias_add = tl.ops.BiasAdd(self.data_format) + self.b_init_flag = True + + self.conv2d_transpose = tl.ops.Conv2d_transpose( + strides=self._strides, padding=self.padding, data_format=self.data_format, dilations=self._dilation_rate, + out_channel=self.n_filter, k_size=(self.filter_size[0], self.filter_size[1]), in_channels=self.in_channels + ) + + self.act_init_flag = False + if self.act: + self.act_init_flag = True + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + outputs = self.conv2d_transpose(inputs, self.W) + if self.b_init_flag: + outputs = self.bias_add(outputs, self.b) + if self.act_init_flag: + outputs = self.act(outputs) + return outputs + + +class DeConv3d(Module): + """Simplified version of :class:`Deconv3dLayer`. + + Parameters + ---AppData\Local\Continuum\anaconda3\envs\ms_tf\lib\site-packages\mindspore\common\api.py", line 412, in compile + result = self._executor.compile(obj, args_list, phase, use_vm) + RuntimeError: Unable to cast from non-held to held instance (T& to Holder) of type 'std:------- + n_filter : int + The number of filters. + filter_size : tuple of int + The filter size (depth, height, width). + output_shape: + A 1-D Tensor representing the output shape of the deconvolution op. + strides : tuple of int + The sliding window strides of corresponding input dimensions. + It must be in the same order as the ``shape`` parameter. + dilation_rate : tuple of int + Specifying the dilation rate to use for dilated convolution. + act : activation function + The activation function of this layer. + padding : str + The padding algorithm type: "SAME" or "VALID". + data_format : str + "channels_last" (NDHWC, default) or "channels_first" (NCDHW). + W_init : initializer + The initializer for the the weight matrix. + b_init : initializer or None + The initializer for the the bias vector. If None, skip biases. + in_channels : int + The number of in channels. + name : None or str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([8, 20, 20, 20, 3], name='input') + >>> deconv3d = tl.layers.DeConv3d(n_filter=32, filter_size=(3, 3, 3), strides=(2, 2, 2), b_init=None, in_channels=3, name='deconv3d_1') + >>> print(deconv3d) + >>> tensor = tl.layers.DeConv3d(n_filter=32, filter_size=(3, 3, 3), strides=(2, 2, 2), act=tl.ops.relu, name='deconv3d_2')(net) + >>> print(tensor) + + """ + + def __init__( + self, + n_filter=32, + filter_size=(3, 3, 3), + strides=(1, 1, 1), + act=None, + padding='SAME', + data_format='channels_last', + dilation_rate=(1, 1, 1), + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None # 'deconv3d', + ): + super(DeConv3d, self).__init__(name, act=act) + self.n_filter = n_filter + self.filter_size = filter_size + self._strides = self.strides = strides + self.padding = padding + self.data_format = data_format + self._dilation_rate = self.dilation_rate = dilation_rate + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels: + self.build(None) + self._built = True + + logging.info( + "DeConv3d %s: n_filter: %d filter_size: %s strides: %s pad: %s act: %s" % ( + self.name, n_filter, str(filter_size), str(strides), padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', strides={strides}, padding={padding}' + ) + if self.dilation_rate != (1, ) * len(self.dilation_rate): + s += ', dilation={dilation_rate}' + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NDHWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + self._strides = [1, self._strides[0], self._strides[1], self._strides[2], 1] + self._dilation_rate = [1, self.dilation_rate[0], self.dilation_rate[1], self.dilation_rate[2], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCDHW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + self._strides = [1, 1, self._strides[0], self._strides[1], self._strides[2]] + self._dilation_rate = [1, 1, self._dilation_rate[0], self._dilation_rate[1], self._dilation_rate[2]] + else: + raise Exception("data_format should be either channels_last or channels_first") + + self.filter_shape = ( + self.filter_size[0], self.filter_size[1], self.filter_size[2], self.n_filter, self.in_channels + ) + + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + + self.b_init_flag = False + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + self.bias_add = tl.ops.BiasAdd(self.data_format) + self.b_init_flag = True + + self.conv3d_transpose = tl.ops.Conv3d_transpose( + strides=self._strides, padding=self.padding, data_format=self.data_format, dilations=self._dilation_rate, + out_channel=self.n_filter, k_size=(self.filter_size[0], self.filter_size[1], self.filter_size[2]) + ) + + self.act_init_flag = False + if self.act: + self.act_init_flag = True + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + outputs = self.conv3d_transpose(inputs, self.W) + if self.b_init_flag: + outputs = self.bias_add(outputs, self.b) + if self.act_init_flag: + outputs = self.act(outputs) + return outputs diff --git a/tensorlayer/layers/convolution/super_resolution.py b/tensorlayer/layers/convolution/super_resolution.py new file mode 100644 index 0000000..102ef52 --- /dev/null +++ b/tensorlayer/layers/convolution/super_resolution.py @@ -0,0 +1,214 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'SubpixelConv1d', + 'SubpixelConv2d', +] + + +class SubpixelConv1d(Module): + """It is a 1D sub-pixel up-sampling layer. + + Calls a TensorFlow function that directly implements this functionality. + We assume input has dim (batch, width, r) + + Parameters + ------------ + scale : int + The up-scaling ratio, a wrong setting will lead to Dimension size error. + act : activation function + The activation function of this layer. + in_channels : int + The number of in channels. + name : str + A unique layer name. + + Examples + ---------- + With TensorLayer + + >>> net = tl.layers.Input([8, 25, 32], name='input') + >>> subpixelconv1d = tl.layers.SubpixelConv1d(scale=2, name='subpixelconv1d')(net) + >>> print(subpixelconv1d) + >>> output shape : (8, 50, 16) + + References + ----------- + `Audio Super Resolution Implementation `__. + + """ + + def __init__( + self, + scale=2, + act=None, + in_channels=None, + name=None # 'subpixel_conv1d' + ): + super().__init__(name, act=act) + self.scale = scale + self.in_channels = in_channels + # self.out_channels = int(self.in_channels / self.scale) + + if self.in_channels is not None: + self.build(None) + self._built = True + + logging.info( + "SubpixelConv1d %s: scale: %d act: %s" % + (self.name, scale, self.act.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): + actstr = self.act.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(in_channels={in_channels}, out_channels={out_channels}') + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if inputs_shape is not None: + self.in_channels = inputs_shape[-1] + self.out_channels = int(self.in_channels / self.scale) + self.transpose = tl.ops.Transpose(perm=[2, 1, 0]) + self.batch_to_space = tl.ops.BatchToSpace(block_size=[self.scale], crops=[[0, 0]]) + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + outputs = self._PS(inputs) + if self.act is not None: + outputs = self.act(outputs) + return outputs + + def _PS(self, I): + X = self.transpose(I) # (r, w, b) + X = self.batch_to_space(X) # (1, r*w, b) + X = self.transpose(X) + return X + + +class SubpixelConv2d(Module): + """It is a 2D sub-pixel up-sampling layer, usually be used + for Super-Resolution applications, see `SRGAN `__ for example. + + Parameters + ------------ + scale : int + The up-scaling ratio, a wrong setting will lead to dimension size error. + n_out_channel : int or None + The number of output channels. + - If None, automatically set n_out_channel == the number of input channels / (scale x scale). + - The number of input channels == (scale x scale) x The number of output channels. + act : activation function + The activation function of this layer. + in_channels : int + The number of in channels. + name : str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> # examples here just want to tell you how to set the n_out_channel. + >>> net = tl.layers.Input([2, 16, 16, 4], name='input1') + >>> subpixelconv2d = tl.layers.SubpixelConv2d(scale=2, n_out_channels=1, name='subpixel_conv2d1')(net) + >>> print(subpixelconv2d) + >>> output shape : (2, 32, 32, 1) + + >>> net = tl.layers.Input([2, 16, 16, 4*10], name='input2') + >>> subpixelconv2d = tl.layers.SubpixelConv2d(scale=2, n_out_channels=10, name='subpixel_conv2d2')(net) + >>> print(subpixelconv2d) + >>> output shape : (2, 32, 32, 10) + + >>> net = tl.layers.Input([2, 16, 16, 25*10], name='input3') + >>> subpixelconv2d = tl.layers.SubpixelConv2d(scale=5, n_out_channels=10, name='subpixel_conv2d3')(net) + >>> print(subpixelconv2d) + >>> output shape : (2, 80, 80, 10) + + References + ------------ + - `Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network `__ + + """ + + # github/Tetrachrome/subpixel https://github.com/Tetrachrome/subpixel/blob/master/subpixel.py + def __init__( + self, + scale=2, + n_out_channels=None, + act=None, + in_channels=None, + name=None # 'subpixel_conv2d' + ): + super().__init__(name, act=act) + self.scale = scale + self.n_out_channels = n_out_channels + self.in_channels = in_channels + + if self.in_channels is not None: + self.build(None) + self._built = True + logging.info( + "SubpixelConv2d %s: scale: %d act: %s" % + (self.name, scale, self.act.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): + actstr = self.act.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(in_channels={in_channels}, out_channels={n_out_channels}') + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + + if inputs_shape is not None: + self.in_channels = inputs_shape[-1] + + if self.in_channels / (self.scale**2) % 1 != 0: + raise Exception( + "SubpixelConv2d: The number of input channels == (scale x scale) x The number of output channels" + ) + self.n_out_channels = int(self.in_channels / (self.scale**2)) + self.depth_to_space = tl.ops.DepthToSpace(block_size=self.scale) + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + outputs = self._PS(X=inputs, r=self.scale, n_out_channels=self.n_out_channels) + if self.act is not None: + outputs = self.act(outputs) + return outputs + + def _PS(self, X, r, n_out_channels): + + _err_log = "SubpixelConv2d: The number of input channels == (scale x scale) x The number of output channels" + + if n_out_channels >= 1: + if int(X.get_shape()[-1]) != (r**2) * n_out_channels: + raise Exception(_err_log) + + X = self.depth_to_space(input=X) + else: + raise RuntimeError(_err_log) + + return X diff --git a/tensorlayer/layers/convolution/ternary_conv.py b/tensorlayer/layers/convolution/ternary_conv.py new file mode 100644 index 0000000..5b60ae0 --- /dev/null +++ b/tensorlayer/layers/convolution/ternary_conv.py @@ -0,0 +1,166 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorlayer.layers.utils import compute_alpha, ternary_operation + +__all__ = ['TernaryConv2d'] + + +class TernaryConv2d(Module): + """ + The :class:`TernaryConv2d` class is a 2D ternary CNN layer, which weights are either -1 or 1 or 0 while inference. + + Note that, the bias vector would not be tenarized. + + Parameters + ---------- + n_filter : int + The number of filters. + filter_size : tuple of int + The filter size (height, width). + strides : tuple of int + The sliding window strides of corresponding input dimensions. + It must be in the same order as the ``shape`` parameter. + act : activation function + The activation function of this layer. + padding : str + The padding algorithm type: "SAME" or "VALID". + use_gemm : boolean + If True, use gemm instead of ``tf.matmul`` for inference. + TODO: support gemm + data_format : str + "channels_last" (NHWC, default) or "channels_first" (NCHW). + dilation_rate : tuple of int + Specifying the dilation rate to use for dilated convolution. + W_init : initializer + The initializer for the the weight matrix. + b_init : initializer or None + The initializer for the the bias vector. If None, skip biases. + in_channels : int + The number of in channels. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([8, 12, 12, 32], name='input') + >>> ternaryconv2d = tl.layers.TernaryConv2d( + ... n_filter=64, filter_size=(5, 5), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='ternaryconv2d' + ... )(net) + >>> print(ternaryconv2d) + >>> output shape : (8, 12, 12, 64) + + """ + + def __init__( + self, + n_filter=32, + filter_size=(3, 3), + strides=(1, 1), + act=None, + padding='SAME', + use_gemm=False, + data_format="channels_last", + dilation_rate=(1, 1), + W_init=tl.initializers.truncated_normal(stddev=0.02), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None # 'ternary_cnn2d', + ): + super().__init__(name, act=act) + self.n_filter = n_filter + self.filter_size = filter_size + self.strides = self._strides = strides + self.padding = padding + self.use_gemm = use_gemm + self.data_format = data_format + self.dilation_rate = self._dilation_rate = dilation_rate + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels: + self.build(None) + self._built = True + + logging.info( + "TernaryConv2d %s: n_filter: %d filter_size: %s strides: %s pad: %s act: %s" % ( + self.name, n_filter, str(filter_size), str(strides), padding, + self.act.__class__.__name__ if self.act is not None else 'No Activation' + ) + ) + + if use_gemm: + raise Exception("TODO. The current version use tf.matmul for inferencing.") + + if len(self.strides) != 2: + raise ValueError("len(strides) should be 2.") + + def __repr__(self): + actstr = self.act.__name__ if self.act is not None else 'No Activation' + s = ( + '{classname}(in_channels={in_channels}, out_channels={n_filter}, kernel_size={filter_size}' + ', strides={strides}, padding={padding}' + ) + if self.dilation_rate != (1, ) * len(self.dilation_rate): + s += ', dilation={dilation_rate}' + if self.b_init is None: + s += ', bias=False' + s += (', ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.data_format == 'channels_last': + self.data_format = 'NHWC' + if self.in_channels is None: + self.in_channels = inputs_shape[-1] + self._strides = [1, self._strides[0], self._strides[1], 1] + self._dilation_rate = [1, self._dilation_rate[0], self._dilation_rate[1], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCHW' + if self.in_channels is None: + self.in_channels = inputs_shape[1] + self._strides = [1, 1, self._strides[0], self._strides[1]] + self._dilation_rate = [1, 1, self._dilation_rate[0], self._dilation_rate[1]] + else: + raise Exception("data_format should be either channels_last or channels_first") + + self.filter_shape = (self.filter_size[0], self.filter_size[1], self.in_channels, self.n_filter) + + self.W = self._get_weights("filters", shape=self.filter_shape, init=self.W_init) + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_filter, ), init=self.b_init) + self.bias_add = tl.ops.BiasAdd(data_format=self.data_format) + + self.conv2d = tl.ops.Conv2D(strides=self._strides, padding=self.padding, data_format=self.data_format, + dilations=self._dilation_rate) + + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + alpha = compute_alpha(self.W) + + W_ = ternary_operation(self.W) + W_ = tl.ops.multiply(alpha, W_) + + outputs = self.conv2d(inputs, W_) + + if self.b_init: + outputs = self.bias_add(outputs, self.b) + if self.act: + outputs = self.act(outputs) + + return outputs diff --git a/tensorlayer/layers/core/__init__.py b/tensorlayer/layers/core/__init__.py new file mode 100644 index 0000000..a3b3f95 --- /dev/null +++ b/tensorlayer/layers/core/__init__.py @@ -0,0 +1,15 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from tensorlayer.backend import BACKEND + +if BACKEND == 'mindspore': + from .core_mindspore import * +elif BACKEND == 'tensorflow': + from .core_tensorflow import * +elif BACKEND == 'paddle': + from .core_paddle import * +elif BACKEND == 'dragon': + from .core_dragon import * +else: + raise ("Unsupported backend:", BACKEND) diff --git a/tensorlayer/layers/core/common.py b/tensorlayer/layers/core/common.py new file mode 100644 index 0000000..1af257f --- /dev/null +++ b/tensorlayer/layers/core/common.py @@ -0,0 +1,174 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os +import tensorlayer as tl +from tensorlayer.files import utils +from tensorlayer import logging + +_act_dict = { + "relu": tl.ops.ReLU, + "relu6": tl.ops.ReLU6, + "leaky_relu": tl.ops.LeakyReLU, + "lrelu": tl.ops.LeakyReLU, + "softplus": tl.ops.Softplus, + "tanh": tl.ops.Tanh, + "sigmoid": tl.ops.Sigmoid, + "softmax": tl.ops.Softmax +} + + +def str2act(act): + if len(act) > 5 and act[0:5] == "lrelu": + try: + alpha = float(act[5:]) + return tl.ops.LeakyReLU(alpha=alpha) + except Exception as e: + raise Exception("{} can not be parsed as a float".format(act[5:])) + + if len(act) > 10 and act[0:10] == "leaky_relu": + try: + alpha = float(act[10:]) + return tl.ops.LeakyReLU(alpha=alpha) + except Exception as e: + raise Exception("{} can not be parsed as a float".format(act[10:])) + + if act not in _act_dict.keys(): + raise Exception("Unsupported act: {}".format(act)) + return _act_dict[act] + +def _save_weights(self, file_path, format=None): + """Input file_path, save model weights into a file of given format. + Use self.load_weights() to restore. + + Parameters + ---------- + file_path : str + Filename to which the model weights will be saved. + format : str or None + Saved file format. + Value should be None, 'hdf5', 'npz', 'npz_dict' or 'ckpt'. Other format is not supported now. + 1) If this is set to None, then the postfix of file_path will be used to decide saved format. + If the postfix is not in ['h5', 'hdf5', 'npz', 'ckpt'], then file will be saved in hdf5 format by default. + 2) 'hdf5' will save model weights name in a list and each layer has its weights stored in a group of + the hdf5 file. + 3) 'npz' will save model weights sequentially into a npz file. + 4) 'npz_dict' will save model weights along with its name as a dict into a npz file. + 5) 'ckpt' will save model weights into a tensorflow ckpt file. + + Default None. + + Examples + -------- + 1) Save model weights in hdf5 format by default. + >>> net = vgg16() + >>> net.save_weights('./model.h5') + ... + >>> net.load_weights('./model.h5') + + 2) Save model weights in npz/npz_dict format + >>> net = vgg16() + >>> net.save_weights('./model.npz') + >>> net.save_weights('./model.npz', format='npz_dict') + + """ + + # self.all_weights = self.network.all_weights + if self.all_weights is None or len(self.all_weights) == 0: + logging.warning("Model contains no weights or layers haven't been built, nothing will be saved") + return + + if format is None: + postfix = file_path.split('.')[-1] + if postfix in ['h5', 'hdf5', 'npz', 'ckpt']: + format = postfix + else: + format = 'hdf5' + + if format == 'hdf5' or format == 'h5': + utils.save_weights_to_hdf5(file_path, self) + elif format == 'npz': + utils.save_npz(self.all_weights, file_path) + elif format == 'npz_dict': + utils.save_npz_dict(self.all_weights, file_path) + elif format == 'ckpt': + # TODO: enable this when tf save ckpt is enabled + raise NotImplementedError("ckpt load/save is not supported now.") + else: + raise ValueError( + "Save format must be 'hdf5', 'npz', 'npz_dict' or 'ckpt'." + "Other format is not supported now." + ) + +def _load_weights(self, file_path, format=None, in_order=True, skip=False): + """Load model weights from a given file, which should be previously saved by self.save_weights(). + + Parameters + ---------- + file_path : str + Filename from which the model weights will be loaded. + format : str or None + If not specified (None), the postfix of the file_path will be used to decide its format. If specified, + value should be 'hdf5', 'npz', 'npz_dict' or 'ckpt'. Other format is not supported now. + In addition, it should be the same format when you saved the file using self.save_weights(). + Default is None. + in_order : bool + Allow loading weights into model in a sequential way or by name. Only useful when 'format' is 'hdf5'. + If 'in_order' is True, weights from the file will be loaded into model in a sequential way. + If 'in_order' is False, weights from the file will be loaded into model by matching the name + with the weights of the model, particularly useful when trying to restore model in eager(graph) mode from + a weights file which is saved in graph(eager) mode. + Default is True. + skip : bool + Allow skipping weights whose name is mismatched between the file and model. Only useful when 'format' is + 'hdf5' or 'npz_dict'. If 'skip' is True, 'in_order' argument will be ignored and those loaded weights + whose name is not found in model weights (self.all_weights) will be skipped. If 'skip' is False, error will + occur when mismatch is found. + Default is False. + + Examples + -------- + 1) load model from a hdf5 file. + >>> net = vgg16() + >>> net.load_weights('./model_graph.h5', in_order=False, skip=True) # load weights by name, skipping mismatch + >>> net.load_weights('./model_eager.h5') # load sequentially + + 2) load model from a npz file + >>> net.load_weights('./model.npz') + + 2) load model from a npz file, which is saved as npz_dict previously + >>> net.load_weights('./model.npz', format='npz_dict') + + Notes + ------- + 1) 'in_order' is only useful when 'format' is 'hdf5'. If you are trying to load a weights file which is + saved in a different mode, it is recommended to set 'in_order' be True. + 2) 'skip' is useful when 'format' is 'hdf5' or 'npz_dict'. If 'skip' is True, + 'in_order' argument will be ignored. + + """ + if not os.path.exists(file_path): + raise FileNotFoundError("file {} doesn't exist.".format(file_path)) + + if format is None: + format = file_path.split('.')[-1] + + if format == 'hdf5' or format == 'h5': + if skip ==True or in_order == False: + # load by weights name + utils.load_hdf5_to_weights(file_path, self, skip) + else: + # load in order + utils.load_hdf5_to_weights_in_order(file_path, self) + elif format == 'npz': + utils.load_and_assign_npz(file_path, self) + elif format == 'npz_dict': + utils.load_and_assign_npz_dict(file_path, self, skip) + elif format == 'ckpt': + # TODO: enable this when tf save ckpt is enabled + raise NotImplementedError("ckpt load/save is not supported now.") + else: + raise ValueError( + "File format must be 'hdf5', 'npz', 'npz_dict' or 'ckpt'. " + "Other format is not supported now." + ) diff --git a/tensorlayer/layers/core/core_dragon.py b/tensorlayer/layers/core/core_dragon.py new file mode 100644 index 0000000..f07772c --- /dev/null +++ b/tensorlayer/layers/core/core_dragon.py @@ -0,0 +1,765 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +#TODO Dragon Module needs a better implementation + +import time +import dragon as dg +import tensorlayer as tl +from tensorlayer.layers.utils import (get_variable_with_initializer) +from .common import str2act, _save_weights, _load_weights +from collections import OrderedDict +from tensorlayer import logging + +__all__ = ['Module', 'SequentialLayer', 'LayerList'] + +_global_layer_name_dict = {} +Parameter_ = dg.Tensor + +class Module(object): + + def __init__(self, name=None, act=None, *args, **kwargs): + self._params = OrderedDict() + self._layers = OrderedDict() + self._params_status = OrderedDict() + self._parameter_layout_dict = {} + self._create_time = int(time.time() * 1e9) + + global _global_layer_name_dict + if name is None: + prefix = self.__class__.__name__.lower() + + if _global_layer_name_dict.get(prefix) is not None: + _global_layer_name_dict[prefix] += 1 + name = prefix + '_' + str(_global_layer_name_dict[prefix]) + else: + _global_layer_name_dict[prefix] = 0 + name = prefix + while True: + if _global_layer_name_dict.get(name) is None: + break + _global_layer_name_dict[prefix] += 1 + name = prefix + '_' + str(_global_layer_name_dict[prefix]) + else: + if _global_layer_name_dict.get(name) is not None: + pass + else: + _global_layer_name_dict[name] = 0 + + self.name = name + + if isinstance(act, str): + str_act = str2act(act) + + if act: + if isinstance(act, str) and (len(act) > 5 and act[0:5] == "lrelu" or len(act) > 10 and act[0:10] == "leaky_relu"): + self.act = str_act + elif isinstance(act, str): + self.act = str_act() + else: + self.act = act() + else: + self.act = act + + # Layer building state + self._built = False + + # Layer nodes state + self._nodes = [] + self._nodes_fixed = False + + # Layer weight state + self._all_weights = [] + self._trainable_weights = [] + self._nontrainable_weights = [] + + # layer forward state + self._forward_state = False + + # Layer training state + self.is_train = True + + def extend_repr(self): + """ + Sets the extended representation of the Module. + + To print customized extended information, re-implement this method in your own Layers. + """ + return '' + + def __repr__(self): + extra_str = self.extend_repr() + info_str = self.__class__.__name__ + '<' + if self._layers: + sub_str = '\n' + if extra_str: + sub_str += '{}\n'.format(self.extend_repr()) + for key, value in self._layers.items(): + sub_str += '({}): {}\n'.format(key, repr(value)) + sub_str = sub_str.replace('\n', '\n ') + '>' + info_str += sub_str + else: + info_str += extra_str + '>' + return info_str + + def __setattr__(self, name, value): + layers = self.__dict__.get('_layers') + params = self.__dict__.get('_params') + + if isinstance(value, Parameter_): + if params is None: + raise AttributeError("Can not assign params before Module.__init__() call.") + if name in self.__dict__: + if self.__dict__[name] is not None: + raise TypeError("Expected type is not in (Parameter, Module), but got Parameter.") + del self.__dict__[name] + if layers and name in layers: + raise TypeError("Expected type is Module, but got Parameter.") + self.insert_param_to_layer(name, value) + + elif isinstance(value, Module): + if layers is None: + raise AttributeError("Can not assign layers before Module.__init__() call.") + if name in self.__dict__: + del self.__dict__[name] + if params and name in params: + raise TypeError("Expected type is Parameter, but got Module.") + # TODO How to prompt the user, enter the in_channels. + # TODO Automatic shape inference when the user does not enter inchannels. + # if value._built is False: + # raise AttributeError( + # "The registered layer `{}` should be built in advance. " + # "Do you forget to pass the keyword argument 'in_channels'? ".format(value.name) + # ) + layers[name] = value + else: + object.__setattr__(self, name, value) + + def __call__(self, inputs, *args, **kwargs): + + output = self.forward(inputs, *args, **kwargs) + + return output + + def forward(self, *inputs, **kwargs): + raise Exception("The forward method must be implemented by inherited class") + + def build(self, inputs_shape): + raise Exception("The build(self, inputs_shape) method must be implemented by inherited class") + + def _get_weights(self, var_name, shape, init=tl.initializers.random_normal(), trainable=True): + """ Get trainable variables. """ + weight = get_variable_with_initializer( + scope_name=self.name, var_name=var_name, shape=shape, init=init, trainable=trainable + ) + self.trainable = trainable + return weight + + def save_weights(self, file_path, format=None): + """Input file_path, save model weights into a file of given format.""" + _save_weights(self, file_path, format) + + def load_weights(self, file_path, format=None, in_order=True, skip=False): + """Load model weights from a given file, which should be previously saved by self.save_weights().""" + _load_weights(self, file_path, format, in_order, skip) + + def _set_mode_for_layers(self, is_train): + """Set all layers of this network to a given mode. + + Parameters + ---------- + is_train : boolean + Network's mode. True means training mode while False means evaluation mode. + + """ + layers = self.layers_and_names(name_prefix='') + for layer_name, layer in layers: + if isinstance(layer, Module): + layer.is_train = is_train + + + def set_train(self): + """Set this network in training mode. After calling this method, + all layers in network are in training mode, in particular, BatchNorm, Dropout, etc. + TODO It is not possible to modify the parameter state after initialization, and a better way needs to be found. + Examples + -------- + >>> import tensorlayer as tl + >>> net = tl.vgg16() + >>> net.set_train() + + """ + if self.is_train !=True: + self.is_train = True + self._set_mode_for_layers(True) + + def set_eval(self): + """Set this network in evaluation mode. After calling this method, + all layers in network are in evaluation mode, in particular, BatchNorm, Dropout, etc. + TODO It is not possible to modify the parameter state after initialization, and a better way needs to be found. + Examples + -------- + >>> import tensorlayer as tl + >>> net = tl.vgg16() + >>> net.eval() + # do evaluation + + """ + if self.is_train != False: + self.is_train = False + self._set_mode_for_layers(False) + + def test(self): + """Set this network in evaluation mode.""" + self.eval() + + def infer(self): + """Set this network in evaluation mode.""" + self.eval() + + @staticmethod + def _compute_shape(tensors): + if isinstance(tensors, list): + shape_mem = [tl.get_tensor_shape(t) for t in tensors] + else: + shape_mem = tl.get_tensor_shape(tensors) + return shape_mem + + def insert_param_to_layer(self, param_name, param, check_name=True): + """ + Adds a parameter to the current layer. + + Inserts a parameter with given name to the layer. Please refer to the usage in + source code of `tensorlayer.layer.Module.__setattr__`. + + Args: + param_name (str): Name of the parameter. + param (Parameter): Parameter to be inserted to the layer. + check_name (bool): Determines whether the name input is compatible. Default: True. + + Raises: + KeyError: If the name of parameter is null or contains dot. + AttributeError: If user did not call init() first. + TypeError: If the type of parameter is not Parameter_. + """ + if not param_name: + raise KeyError("The name of parameter should not be null.") + if check_name and '.' in param_name: + raise KeyError("The name of parameter should not contain \".\"") + if '_params' not in self.__dict__: + raise AttributeError("You need call init() first.") + if hasattr(self, param_name) and param_name not in self._params: + raise KeyError("Duplicated parameter name '{}'.".format(param_name)) + if not isinstance(param, Parameter_) and param is not None: + raise TypeError("The type of parameter should be 'Parameter' if not None.") + self._params[param_name] = param + try: + self._params_status[param_name] = self.trainable + except: + pass + + def _add_node(self, input_tensors, output_tensors): + """Add a LayerNode for this layer given input_tensors, output_tensors. + + WARINING: This function should not be called from outside, it should only be called + in layer.__call__ when building static model. + + Parameters + ---------- + input_tensors : Tensor or a list of tensors + Input tensors to this layer. + output_tensors : Tensor or a list of tensors + Output tensors to this layer. + + """ + raise NotImplementedError + + @property + def create_time(self): + return self._create_time + + def __getattr__(self, name): + if '_params' in self.__dict__: + params = self.__dict__['_params'] + if name in params: + return params[name] + if '_layers' in self.__dict__: + layers = self.__dict__['_layers'] + if name in layers: + return layers[name] + if '_params_status' in self.__dict__: + params_status = self.__dict__['_params_status'] + if name in params_status: + return params_status[name] + raise AttributeError("'{}' object has no attribute '{}'.".format(type(self).__name__, name)) + + def __delattr__(self, name): + if name in self._params: + del self._params[name] + elif name in self._layers: + del self._layers[name] + else: + object.__delattr__(self, name) + + @property + def trainable_weights(self): + """ + Returns all trainable weights. + + Returns a list of all trainable parmeters. + + Args: + recurse (bool): Whether contains the trainable weights of sublayers. Default: True. + + Returns: + List, the list of trainable weights. + """ + self.get_weights() + layers = self.layers_and_names(name_prefix='') + for layer_name, layer in layers: + params = layer._params.items() + params_status = layer._params_status.items() + params_zip = zip(params, params_status) + for params, params_status in params_zip: + if params_status[1] ==True: + self._trainable_weights.append(params[1]) + return self._trainable_weights + + @property + def nontrainable_weights(self): + """ + Returns all untrainable weights. + + Returns a list of all untrainable weights. + + Args: + recurse (bool): Whether contains the untrainable weights of sublayers. Default: True. + + Returns: + List, the list of untrainable weights. + """ + layers = self.layers_and_names(name_prefix='') + for layer_name, layer in layers: + params = layer._params.items() + params_status = layer._params_status.items() + params_zip = zip(params, params_status) + for params, params_status in params_zip: + if params_status[1] == False: + self._nontrainable_weights.append(params[1]) + return self._nontrainable_weights + + @property + def all_weights(self): + layers = self.layers_and_names(name_prefix='') + for layer_name, layer in layers: + params = layer._params.items() + for par, val in params: + self._all_weights.append(val) + return self._all_weights + + def get_weights(self, expand=True): + """ + Returns an iterator over layer weights. + + Yields weights of this layer. If `expand` is True, yield parameters of this layer and all sublayers. + + Args: + expand (bool): If True, yields parameters of this layer and all sublayers. Otherwise, yields only parameters + that are direct members of this layer. Default: True. + + Examples: + >>> net = Net() + >>> for item in net.get_weights(): + >>> print(item) + """ + for _, param in self.parameters_and_names(expand=expand): + yield param + + def check_names(self): + names = set("") + for value, param in self.parameters_and_names(): + if param.name in names: + raise ValueError( + "The value of {} is {}, its name '{}' already exists.".format(value, param, param.name) + ) + names.add(param.name) + + def insert_child_to_layer(self, child_name, child): + """ + Adds a child layer to the current layer. + + Args: + child_name (str): Name of the child layer. + child (Module): The child layer to be inserted. + + Raises: + KeyError: Child Module's name is incorrect or duplicated with the other child name. + TypeError: Child Module's type is incorrect. + """ + if not child_name or '.' in child_name: + raise KeyError("Child layer name is incorrect.") + if hasattr(self, child_name) and child_name not in self._layers: + raise KeyError("Duplicate child name '{}'.".format(child_name)) + if not isinstance(child, Module) and child is not None: + raise TypeError("Child layer type is incorrect.") + self._layers[child_name] = child + + def parameters_and_names(self, name_prefix='', expand=True): + """ + Returns an iterator over layer parameters. + + Includes the parameter's name and itself. + + Args: + name_prefix (str): Namespace. Default: ''. + expand (bool): If True, yields parameters of this layer and all sublayers. Otherwise, yields only parameters + that are direct members of this layer. Default: True. + + Examples: + >>> n = Net() + >>> names = [] + >>> for m in n.parameters_and_names(): + >>> if m[0]: + >>> names.append(m[0]) + """ + layers = [] + if expand: + layers = self.layers_and_names(name_prefix=name_prefix) + else: + layers.append((name_prefix, self)) + + params_set = set() + for layer_name, layer in layers: + params = layer._params.items() + for par_name, par in params: + if par.inited_param is not None: + par = par.inited_param + if par is not None and id(par) not in params_set: + params_set.add(id(par)) + par_new_name = par_name + if layer_name: + par_new_name = layer_name + '.' + par_new_name + + yield par_new_name, par + + def layers_and_names(self, layers=None, name_prefix=''): + """ + Returns an iterator over all layers in the network. + + Includes the layer's name and itself. + + Args: + layers (str): layers to iterate over. Default: None. + name_prefix (str): Namespace. Default: ''. + + Examples: + >>> n = Net() + >>> names = [] + >>> for m in n.layers_and_names(): + >>> if m[0]: + >>> names.append(m[0]) + """ + t_layers = layers if layers else set() + if self in t_layers: + return + + t_layers.add(self) + yield name_prefix, self + + for name, layer in self._layers.items(): + if layer: + layers_name_prefix = name + if name_prefix: + layers_name_prefix = name_prefix + '.' + layers_name_prefix + for ele in layer.layers_and_names(t_layers, layers_name_prefix): + yield ele + + def layers(self): + """Returns an iterator over immediate layers.""" + return self.name_layers().values() + + def name_layers(self): + """ + Returns an iterator over all layers in the network. + + Include name of the layer and layer itself. + """ + value_set = set() + layers = OrderedDict() + for name, layer in self._layers.items(): + if layer is not None and layer not in value_set: + value_set.add(layer) + layers[name] = layer + return layers + + def init_build(self, *inputs, **kwargs): + """ + (1) This method must be called when the Layer has no input in_channels. + (2) Automatic shape inference when the user does not enter inchannels. + """ + + self.forward(*inputs, **kwargs) + + +class SequentialLayer(Module): + """ + Sequential layer container. + + A list of Layers will be added to it in the order they are passed in the constructor. + Alternatively, an ordered dict of layers can also be passed in. + + Args: + args (list, OrderedDict): List of subclass of Module. + + Raises: + TypeError: If the type of the argument is not list or OrderedDict. + + Inputs: + - **input** (Tensor) - Tensor with shape according to the first Module in the sequence. + + Outputs: + Tensor, the output Tensor with shape depending on the input and defined sequence of Layers. + + Examples: + >>> conv = tl.layers.Conv2d(3, 2, 3, pad_mode='valid') + >>> bn = tl.layers.BatchNorm2d(2) + >>> seq = tl.layers.SequentialLayer([conv, bn]) + >>> + >>> x = tl.layers.Input((1, 3, 4, 4)) + >>> seq(x) + """ + def __init__(self, *args): + super(SequentialLayer, self).__init__() + self._built = True + if len(args) == 1: + layers = args[0] + if isinstance(layers, list): + for index, layer in enumerate(layers): + self.insert_child_to_layer(str(index), layer) + elif isinstance(layers, OrderedDict): + for name, layer in layers.items(): + self.insert_child_to_layer(name, layer) + else: + raise TypeError('Layers must be list or orderedDict') + else: + for index, layer in enumerate(args): + self.insert_child_to_layer(str(index), layer) + self.layer_list = list(self._layers.values()) + + def __getitem__(self, index): + if isinstance(index, slice): + return self.__class__( + OrderedDict(list(self._layers.items())[index])) + index = self._valid_index(len(self), index) + return list(self._layers.values())[index] + + def __setitem__(self, index, layer): + if self._valid_module(layer): + index = self._valid_index(len(self), index) + key = list(self._layers.keys())[index] + self._layers[key] = layer + self.layer_list = list(self._layers.values()) + + def __delitem__(self, index): + if isinstance(index, int): + index = self._valid_index(len(self), index) + key = list(self._layers.keys())[index] + del self._layers[key] + elif isinstance(index, slice): + keys = list(self._layers.keys())[index] + for key in keys: + del self._layers[key] + else: + raise TypeError('Index {} is not int type or slice type'.format(index)) + self.layer_list = list(self._layers.values()) + + def __len__(self): + return len(self._layers) + + + def append(self, layer): + if self._valid_module(layer): + self._layers[str(len(self))] = layer + self.layer_list = list(self._layers.values()) + return self + + def build(self, inputs_shape): + pass + + def forward(self, input_data): + for layer in self.layer_list: + input_data = layer(input_data) + return input_data + + def _valid_index(self, layer_num, index): + if not isinstance(index, int): + raise TypeError("Index {} is not int type") + if not -layer_num <= index < layer_num: + raise IndexError("Index should be a number in range [{}, {}), but got {}" + .format(-layer_num, layer_num, index)) + return index % layer_num + + def _valid_module(self, layer): + if issubclass(layer.__class__, Module): + return True + raise TypeError('Module {} is not subclass of Module'.format(layer)) + + +class LayerList(Module): + """ + The class :class:`LayerList` is a linear stack of layers. + + The :class:`LayerList` can be created by passing a list of layer instances. + The given layer instances will be automatically connected one by one. + + Parameters + ---------- + layers: list of Layer + A list of layers. + name : str or None + A unique layer name. If None, a unique name will be automatically assigned. + + Methods + --------- + __init__() + Initializing the LayerList. + weights() + A collection of weights of all the layer instances. + build() + Build the LayerList. The layer instances will be connected automatically one by one. + forward() + Forward the computation. The computation will go through all layer instances. + """ + + def __init__(self, layers, name=None): + """ + Initializing the LayerList given a list of Layer. + + :param layers: list of Layer + :param name: str or None + """ + + super(LayerList, self).__init__(name=name) + self.layers = layers + is_built = True + for layer in self.layers: + self._trainable_weights.extend(layer.trainable_weights) + self._nontrainable_weights.extend(layer.nontrainable_weights) + if layer._built is False: + is_built = False + # if layer._built and layer.all_weights is not None: + # # some layers in the list passed in have already been built + # # e.g. using input shape to construct layers in dynamic eager + # if self._all_weights is None: + # self._all_weights = list() + # self._all_weights.extend(layer.all_weights) + if is_built: + self._built = True + + logging.info( + "LayerList %s including layers [%s]" % (self.name, ', '.join([layer.name for layer in self.layers])) + ) + + # check layer name uniqueness in LayerList + local_layer_name_set = set() + for layer in self.layers: + if layer.name not in local_layer_name_set: + local_layer_name_set.add(layer.name) + else: + raise ValueError( + 'Layer name \'%s\' has already been used by another layer. Please change the layer name.' % + layer.name + ) + + def __getitem__(self, idx): + if isinstance(idx, slice): + return LayerList(list(self.layers)[idx]) + else: + return self.layers[idx] + + def __len__(self): + return len(self.layers) + + def __repr__(self): + tmpstr = 'LayerList' + '(\n' + for idx, layer in enumerate(self.layers): + modstr = layer.__repr__() + modstr = _addindent(modstr, 2) + tmpstr = tmpstr + ' (' + str(idx) + '): ' + modstr + '\n' + + tmpstr = tmpstr + ')' + return tmpstr + + @property + def trainable_weights(self): + return self._trainable_weights + + @property + def nontrainable_weights(self): + return self._nontrainable_weights + + @property + def all_weights(self): + return self._trainable_weights + self._nontrainable_weights + + # def build(self, inputs_shape): + # """ + # Build the LayerList. The layer instances will be connected automatically one by one. + # """ + # in_tensor = self._input_tensors + # # in_layer = self._input_layer + # for layer in self.layers: + # is_build = layer._built + # out_tensor = layer(in_tensor) + # # nlayer = layer(in_layer) + # if is_build is False and layer.all_weights is not None: + # if self._all_weights is None: + # self._all_weights = list() + # self._all_weights.extend(layer.all_weights) + # layer._built = True + # in_tensor = out_tensor + # # in_layer = nlayer + + def forward(self, inputs): + """ + Forward the computation. The computation will go through all layer instances. + """ + z = inputs + for layer in self.layers: + z = layer.forward(z) + return z + + def _set_mode_for_layers(self, is_train): + """Set training/evaluation mode for all layer instances.""" + self.is_train = is_train + for layer in self.layers: + if isinstance(layer, LayerList): + layer._set_mode_for_layers(is_train) + else: + layer.is_train = is_train + + def get_args(self): + init_args = {} + layers = self.layer_args["layers"] + init_args["layers"] = [layer.config for layer in layers] + init_args.update({"layer_type": "layerlist"}) + return init_args + +def tolist(tensors): + if isinstance(tensors, list) or isinstance(tensors, tuple): + ntensors = list() + for t in tensors: + ntensors += tolist(t) + return ntensors + else: + return [tensors] + +def _addindent(s_, numSpaces): + s = s_.split('\n') + # don't do anything for single-line stuff + if len(s) == 1: + return s_ + first = s.pop(0) + s = [(numSpaces * ' ') + line for line in s] + s = '\n'.join(s) + s = first + '\n' + s + return s \ No newline at end of file diff --git a/tensorlayer/layers/core/core_mindspore.py b/tensorlayer/layers/core/core_mindspore.py new file mode 100644 index 0000000..b8bfe0d --- /dev/null +++ b/tensorlayer/layers/core/core_mindspore.py @@ -0,0 +1,355 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from .common import str2act, _save_weights, _load_weights +from mindspore.nn import Cell +import tensorlayer as tl +from tensorlayer.layers.utils import (get_variable_with_initializer) +from collections import OrderedDict + +__all__ = ['Module', 'SequentialLayer', 'LayerList'] + +_global_layer_name_dict = {} # TODO: better implementation? + + +class Module(Cell): + + def __init__(self, name=None, act=None, *args, **kwargs): + super().__init__(*args, **kwargs) + + global _global_layer_name_dict + if name is None: + prefix = self.__class__.__name__.lower() + + if _global_layer_name_dict.get(prefix) is not None: + _global_layer_name_dict[prefix] += 1 + name = prefix + '_' + str(_global_layer_name_dict[prefix]) + else: + _global_layer_name_dict[prefix] = 0 + name = prefix + while True: + if _global_layer_name_dict.get(name) is None: + break + _global_layer_name_dict[prefix] += 1 + name = prefix + '_' + str(_global_layer_name_dict[prefix]) + else: + if _global_layer_name_dict.get(name) is not None: + pass + else: + _global_layer_name_dict[name] = 0 + + self.name = name + + if isinstance(act, str): + str_act = str2act(act) + + if act: + if isinstance(act, str) and (len(act) > 5 and act[0:5] == "lrelu" or len(act) > 10 and act[0:10] == "leaky_relu"): + self.act = str_act + elif isinstance(act, str): + self.act = str_act() + else: + self.act = act() + else: + self.act = act + + # Layer building state + self._built = False + + # Layer nodes state + self._nodes = [] + self._nodes_fixed = False + + # Layer weight state + self._all_weights = [] + self._trainable_weights = [] + self._nontrainable_weights = [] + + # Layer training state + self.is_train = True + + + # layer forward state + self._forward_state = False + + def forward(self, *inputs, **kwargs): + raise Exception("The forward method must be implemented by inherited class") + + def construct(self, *inputs, **kwargs): + return self.forward(*inputs, **kwargs) + + def build(self, inputs_shape): + raise Exception("The build(self, inputs_shape) method must be implemented by inherited class") + + def _get_weights(self, var_name, shape, init=tl.initializers.random_normal(), trainable=True): + """ Get trainable variables. """ + weight = get_variable_with_initializer( + scope_name=self.name, var_name=var_name, shape=shape, init=init, trainable=trainable + ) + self.trainable = trainable + return weight + + def save_weights(self, file_path, format=None): + """Input file_path, save model weights into a file of given format.""" + _save_weights(self, file_path, format) + + def load_weights(self, file_path, format=None, in_order=True, skip=False): + """Load model weights from a given file, which should be previously saved by self.save_weights().""" + _load_weights(self, file_path, format, in_order, skip) + + @staticmethod + def _compute_shape(tensors): + if isinstance(tensors, list): + shape_mem = [tl.get_tensor_shape(t) for t in tensors] + else: + shape_mem = tl.get_tensor_shape(tensors) + return shape_mem + + def _add_node(self, input_tensors, output_tensors): + """Add a LayerNode for this layer given input_tensors, output_tensors. + + WARINING: This function should not be called from outside, it should only be called + in layer.__call__ when building static model. + + Parameters + ---------- + input_tensors : Tensor or a list of tensors + Input tensors to this layer. + output_tensors : Tensor or a list of tensors + Output tensors to this layer. + + """ + raise NotImplementedError + + def set_train(self): + """ + Sets the cell to training mode. + + The cell itself and all children cells will be set to training mode. + + Args: + mode (bool): Specifies whether the model is training. Default: True. + """ + self._phase = 'train' + self.add_flags_recursive(training=True) + return self + + def set_eval(self): + """Set this network in evaluation mode. After calling this method, + all layers in network are in evaluation mode, in particular, BatchNorm, Dropout, etc. + + Examples + -------- + >>> import tensorlayer as tl + >>> net = tl.models.vgg16() + >>> net.eval() + # do evaluation + + """ + self._phase = 'predict' + self.add_flags_recursive(training=False) + return self + + def test(self): + """Set this network in evaluation mode.""" + self.eval() + + def infer(self): + """Set this network in evaluation mode.""" + self.eval() + + @property + def trainable_weights(self): + """ + Returns all trainable weights. + + Returns a list of all trainable parmeters. + + Args: + recurse (bool): Whether contains the trainable weights of sublayers. Default: True. + + Returns: + List, the list of trainable weights. + """ + self._trainable_weights = list(filter(lambda x: x.requires_grad, self.get_parameters(expand=True))) + return self._trainable_weights + + @property + def nontrainable_weights(self): + """ + Returns all untrainable weights. + + Returns a list of all untrainable weights. + + Args: + recurse (bool): Whether contains the untrainable weights of sublayers. Default: True. + + Returns: + List, the list of untrainable weights. + """ + return list(filter(lambda x: not x.requires_grad, self.get_parameters(expand=True))) + + @property + def all_weights(self): + return list(filter(lambda x: x.requires_grad, self.get_parameters(expand=True))) \ + + list(filter(lambda x: not x.requires_grad, self.get_parameters(expand=True))) + + +class SequentialLayer(Module): + """ + Sequential layer container. + + A list of Layers will be added to it in the order they are passed in the constructor. + Alternatively, an ordered dict of layers can also be passed in. + + Args: + args (list, OrderedDict): List of subclass of Module. + + Raises: + TypeError: If the type of the argument is not list or OrderedDict. + + Inputs: + - **input** (Tensor) - Tensor with shape according to the first Module in the sequence. + + Outputs: + Tensor, the output Tensor with shape depending on the input and defined sequence of Layers. + + Examples: + >>> conv = tl.layers.Conv2d(3, 2, 3, pad_mode='valid') + >>> bn = tl.layers.BatchNorm2d(2) + >>> relu = tl.ReLU() + >>> seq = tl.layers.SequentialLayer([conv, bn, relu]) + >>> + >>> x = tl.layers.Input((1, 3, 4, 4)) + >>> seq(x) + """ + def __init__(self, *args): + super(SequentialLayer, self).__init__() + # self._built = True + if len(args) == 1: + layers = args[0] + if isinstance(layers, list): + for index, layer in enumerate(layers): + self.insert_child_to_layer(str(index), layer) + elif isinstance(layers, OrderedDict): + for name, layer in layers.items(): + self.insert_child_to_layer(name, layer) + else: + raise TypeError('Layers must be list or orderedDict') + else: + for index, layer in enumerate(args): + self.insert_child_to_layer(str(index), layer) + self.layer_list = list(self._layers.values()) + + def __getitem__(self, index): + if isinstance(index, slice): + return self.__class__( + OrderedDict(list(self._layers.items())[index])) + index = self._valid_index(len(self), index) + return list(self._layers.values())[index] + + def __setitem__(self, index, layer): + if self._valid_module(layer): + index = self._valid_index(len(self), index) + key = list(self._layers.keys())[index] + self._layers[key] = layer + self.layer_list = list(self._layers.values()) + + def __delitem__(self, index): + if isinstance(index, int): + index = self._valid_index(len(self), index) + key = list(self._layers.keys())[index] + del self._layers[key] + elif isinstance(index, slice): + keys = list(self._layers.keys())[index] + for key in keys: + del self._layers[key] + else: + raise TypeError('Index {} is not int type or slice type'.format(index)) + self.layer_list = list(self._layers.values()) + + def __len__(self): + return len(self._layers) + + def set_grad(self, flag=True): + self.requires_grad = flag + for layer in self._layers.values(): + layer.set_grad(flag) + + def append(self, layer): + if self._valid_module(layer): + self._layers[str(len(self))] = layer + self.layer_list = list(self._layers.values()) + return self + + def build(self, inputs_shape): + pass + + def forward(self, input_data): + for layer in self.layer_list: + input_data = layer(input_data) + return input_data + + def _valid_index(self, layer_num, index): + if not isinstance(index, int): + raise TypeError("Index {} is not int type") + if not -layer_num <= index < layer_num: + raise IndexError("Index should be a number in range [{}, {}), but got {}" + .format(-layer_num, layer_num, index)) + return index % layer_num + + def _valid_module(self, layer): + if issubclass(layer.__class__, Module): + return True + raise TypeError('Module {} is not subclass of Module'.format(layer)) + + +class LayerList(Module): + """ + The class :class:`LayerList` is a linear stack of layers. + + The :class:`LayerList` can be created by passing a list of layer instances. + The given layer instances will be automatically connected one by one. + + Parameters + ---------- + layers: list of Layer + A list of layers. + name : str or None + A unique layer name. If None, a unique name will be automatically assigned. + + Methods + --------- + __init__() + Initializing the LayerList. + weights() + A collection of weights of all the layer instances. + build() + Build the LayerList. The layer instances will be connected automatically one by one. + forward() + Forward the computation. The computation will go through all layer instances. + """ + + def __init__(self, layers, name=None): + """ + Initializing the LayerList given a list of Layer. + + :param layers: list of Layer + :param name: str or None + """ + + super(LayerList, self).__init__(name=name) + pass + + def __getitem__(self, idx): + pass + + def __len__(self): + return len(self.layers) + + def __repr__(self): + pass + + def forward(self, inputs): + pass + diff --git a/tensorlayer/layers/core/core_paddle.py b/tensorlayer/layers/core/core_paddle.py new file mode 100644 index 0000000..19b56ee --- /dev/null +++ b/tensorlayer/layers/core/core_paddle.py @@ -0,0 +1,206 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import copy, six +import tensorlayer as tl +from .common import str2act +from paddle.fluid import framework +from paddle.fluid.dygraph import Layer +from paddle.fluid.framework import in_dygraph_mode + + +_global_layer_name_dict = {} # TODO: better implementation? + + +class Module(Layer): + + def __init__(self, name=None, act=None, *args, **kwargs): + super().__init__(*args, **kwargs) + + global _global_layer_name_dict + if name is None: + prefix = self.__class__.__name__.lower() + + if _global_layer_name_dict.get(prefix) is not None: + _global_layer_name_dict[prefix] += 1 + name = prefix + '_' + str(_global_layer_name_dict[prefix]) + else: + _global_layer_name_dict[prefix] = 0 + name = prefix + while True: + if _global_layer_name_dict.get(name) is None: + break + _global_layer_name_dict[prefix] += 1 + name = prefix + '_' + str(_global_layer_name_dict[prefix]) + else: + if _global_layer_name_dict.get(name) is not None: + pass + else: + _global_layer_name_dict[name] = 0 + + self.name = name + + if isinstance(act, str): + str_act = str2act(act) + + if act: + if isinstance(act, str) and (len(act) > 5 and act[0:5] == "lrelu" or len(act) > 10 and act[0:10] == "leaky_relu"): + self.act = str_act + elif isinstance(act, str): + self.act = str_act() + else: + self.act = act() + else: + self.act = act + + # Layer building state + # self._built = False + + # Layer nodes state + self._nodes = [] + self._nodes_fixed = False + + # Layer weight state + self._all_weights = [] + self._trainable_weights = [] + self._nontrainable_weights = [] + + # Layer training state + self.is_train = True + + # layer forward state + self._forward_state = False + + def set_train(self): + """ + Sets this Layer and all its sublayers to training mode. + This only effects certain modules like `Dropout` and `BatchNorm`. + + Returns: + None + + Example:: + .. code-block:: python + + import paddle + + class MyLayer(paddle.nn.Layer): + def __init__(self): + super(MyLayer, self).__init__() + self._linear = paddle.nn.Linear(1, 1) + self._dropout = paddle.nn.Dropout(p=0.5) + + def forward(self, input): + temp = self._linear(input) + temp = self._dropout(temp) + return temp + + x = paddle.randn([10, 1], 'float32') + mylayer = MyLayer() + mylayer.eval() # set mylayer._dropout to eval mode + out = mylayer(x) + mylayer.train() # set mylayer._dropout to train mode + out = mylayer(x) + + """ + # global setting in dygraph + # NOTE(chenweihang): nn.Layer also can be used in static mode, + # but _dygraph_tracer() can not be called in static mode + if in_dygraph_mode(): + framework._dygraph_tracer().train_mode() + # Layer-level setting + self.training = True + for layer in self.sublayers(): + layer.training = True + + def set_eval(self): + """ + Sets this Layer and all its sublayers to evaluation mode. + This only effects certain modules like `Dropout` and `BatchNorm`. + + Returns: + None + + Example:: + .. code-block:: python + + import paddle + + class MyLayer(paddle.nn.Layer): + def __init__(self): + super(MyLayer, self).__init__() + self._linear = paddle.nn.Linear(1, 1) + self._dropout = paddle.nn.Dropout(p=0.5) + + def forward(self, input): + temp = self._linear(input) + temp = self._dropout(temp) + return temp + + x = paddle.randn([10, 1], 'float32') + mylayer = MyLayer() + mylayer.eval() # set mylayer._dropout to eval mode + out = mylayer(x) + print(out) + + """ + # global setting in dygraph + # NOTE(chenweihang): nn.Layer also can be used in static mode, + # but _dygraph_tracer() can not be called in static mode + if in_dygraph_mode(): + framework._dygraph_tracer().eval_mode() + # Layer-level setting + self.training = False + for layer in self.sublayers(): + layer.training = False + + def build(self, inputs_shape): + raise Exception("The build(self, inputs_shape) method must be implemented by inherited class") + + def forward(self, *inputs, **kwargs): + raise Exception("The forward method must be implemented by inherited class") + + + def _get_weights(self, var_name, shape, init=None, trainable=True): + if var_name in ["filters", "weights"]: + w_tmp = self.create_parameter(shape=shape, attr=init, is_bias=False) + elif var_name in ["biases"]: + w_tmp = self.create_parameter(shape=shape, attr=init, is_bias=True) + else: + w_tmp = self.create_parameter(shape=shape, attr=init) + self.trainable = trainable + return w_tmp + + def create_parameter(self, + shape, + attr=None, + dtype=None, + is_bias=False, + default_initializer=None): + """Create parameters for this layer.""" + temp_attr = copy.deepcopy(attr) + if isinstance(temp_attr, six.string_types) and temp_attr == "": + temp_attr = None + return self._helper.create_parameter(temp_attr, shape, dtype, is_bias, + default_initializer) + + @property + def all_weights(self): + ret = [ + param + for _, param in self.named_parameters( + include_sublayers=True) + ] + return ret + + @property + def trainable_weights(self): + return self.parameters() + + def init_build(self, *inputs, **kwargs): + """ + (1) This method must be called when the Layer has no input in_channels. + (2) Automatic shape inference when the user does not enter inchannels. + """ + + self.forward(*inputs, **kwargs) \ No newline at end of file diff --git a/tensorlayer/layers/core/core_tensorflow.py b/tensorlayer/layers/core/core_tensorflow.py new file mode 100644 index 0000000..0f70388 --- /dev/null +++ b/tensorlayer/layers/core/core_tensorflow.py @@ -0,0 +1,765 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from .common import str2act, _save_weights, _load_weights +from collections import OrderedDict +import time +import tensorlayer as tl +import tensorflow as tf +from tensorlayer.layers.utils import (get_variable_with_initializer) +from tensorlayer import logging + +__all__ = ['Module', 'SequentialLayer', 'LayerList'] + +_global_layer_name_dict = {} +Parameter_ = tf.Variable + + +class Module(object): + + def __init__(self, name=None, act=None, *args, **kwargs): + self._params = OrderedDict() + self._layers = OrderedDict() + self._params_status = OrderedDict() + self._parameter_layout_dict = {} + self._create_time = int(time.time() * 1e9) + + global _global_layer_name_dict + if name is None: + prefix = self.__class__.__name__.lower() + + if _global_layer_name_dict.get(prefix) is not None: + _global_layer_name_dict[prefix] += 1 + name = prefix + '_' + str(_global_layer_name_dict[prefix]) + else: + _global_layer_name_dict[prefix] = 0 + name = prefix + while True: + if _global_layer_name_dict.get(name) is None: + break + _global_layer_name_dict[prefix] += 1 + name = prefix + '_' + str(_global_layer_name_dict[prefix]) + else: + if _global_layer_name_dict.get(name) is not None: + pass + else: + _global_layer_name_dict[name] = 0 + + self.name = name + + if isinstance(act, str): + str_act = str2act(act) + + if act: + if isinstance(act, str) and (len(act) > 5 and act[0:5] == "lrelu" or len(act) > 10 and act[0:10] == "leaky_relu"): + self.act = str_act + elif isinstance(act, str): + self.act = str_act() + else: + self.act = act() + else: + self.act = act + + # Layer building state + self._built = False + + # Layer nodes state + self._nodes = [] + self._nodes_fixed = False + + # Layer weight state + self._all_weights = [] + self._trainable_weights = [] + self._nontrainable_weights = [] + + # layer forward state + self._forward_state = False + + # Layer training state + self.is_train = True + + def extend_repr(self): + """ + Sets the extended representation of the Module. + + To print customized extended information, re-implement this method in your own Layers. + """ + return '' + + def __repr__(self): + extra_str = self.extend_repr() + info_str = self.__class__.__name__ + '<' + if self._layers: + sub_str = '\n' + if extra_str: + sub_str += '{}\n'.format(self.extend_repr()) + for key, value in self._layers.items(): + sub_str += '({}): {}\n'.format(key, repr(value)) + sub_str = sub_str.replace('\n', '\n ') + '>' + info_str += sub_str + else: + info_str += extra_str + '>' + return info_str + + def __setattr__(self, name, value): + layers = self.__dict__.get('_layers') + params = self.__dict__.get('_params') + + if isinstance(value, Parameter_): + if params is None: + raise AttributeError("Can not assign params before Module.__init__() call.") + if name in self.__dict__: + if self.__dict__[name] is not None: + raise TypeError("Expected type is not in (Parameter, Module), but got Parameter.") + del self.__dict__[name] + if layers and name in layers: + raise TypeError("Expected type is Module, but got Parameter.") + self.insert_param_to_layer(name, value) + + elif isinstance(value, Module): + if layers is None: + raise AttributeError("Can not assign layers before Module.__init__() call.") + if name in self.__dict__: + del self.__dict__[name] + if params and name in params: + raise TypeError("Expected type is Parameter, but got Module.") + # TODO How to prompt the user, enter the in_channels. + # TODO Automatic shape inference when the user does not enter inchannels. + # if value._built is False: + # raise AttributeError( + # "The registered layer `{}` should be built in advance. " + # "Do you forget to pass the keyword argument 'in_channels'? ".format(value.name) + # ) + layers[name] = value + else: + object.__setattr__(self, name, value) + + def __call__(self, inputs, *args, **kwargs): + + output = self.forward(inputs, *args, **kwargs) + + return output + + def forward(self, *inputs, **kwargs): + raise Exception("The forward method must be implemented by inherited class") + + def build(self, inputs_shape): + raise Exception("The build(self, inputs_shape) method must be implemented by inherited class") + + def _get_weights(self, var_name, shape, init=tl.initializers.random_normal(), trainable=True): + """ Get trainable variables. """ + weight = get_variable_with_initializer( + scope_name=self.name, var_name=var_name, shape=shape, init=init, trainable=trainable + ) + self.trainable = trainable + return weight + + def save_weights(self, file_path, format=None): + """Input file_path, save model weights into a file of given format.""" + _save_weights(self, file_path, format) + + def load_weights(self, file_path, format=None, in_order=True, skip=False): + """Load model weights from a given file, which should be previously saved by self.save_weights().""" + _load_weights(self, file_path, format, in_order, skip) + + def _set_mode_for_layers(self, is_train): + """Set all layers of this network to a given mode. + + Parameters + ---------- + is_train : boolean + Network's mode. True means training mode while False means evaluation mode. + + """ + layers = self.layers_and_names(name_prefix='') + for layer_name, layer in layers: + if isinstance(layer, Module): + layer.is_train = is_train + + + def set_train(self): + """Set this network in training mode. After calling this method, + all layers in network are in training mode, in particular, BatchNorm, Dropout, etc. + TODO It is not possible to modify the parameter state after initialization, and a better way needs to be found. + Examples + -------- + >>> import tensorlayer as tl + >>> net = tl.vgg16() + >>> net.set_train() + + """ + if self.is_train !=True: + self.is_train = True + self._set_mode_for_layers(True) + + def set_eval(self): + """Set this network in evaluation mode. After calling this method, + all layers in network are in evaluation mode, in particular, BatchNorm, Dropout, etc. + TODO It is not possible to modify the parameter state after initialization, and a better way needs to be found. + Examples + -------- + >>> import tensorlayer as tl + >>> net = tl.vgg16() + >>> net.eval() + # do evaluation + + """ + if self.is_train != False: + self.is_train = False + self._set_mode_for_layers(False) + + def test(self): + """Set this network in evaluation mode.""" + self.eval() + + def infer(self): + """Set this network in evaluation mode.""" + self.eval() + + @staticmethod + def _compute_shape(tensors): + if isinstance(tensors, list): + shape_mem = [tl.get_tensor_shape(t) for t in tensors] + else: + shape_mem = tl.get_tensor_shape(tensors) + return shape_mem + + def insert_param_to_layer(self, param_name, param, check_name=True): + """ + Adds a parameter to the current layer. + + Inserts a parameter with given name to the layer. Please refer to the usage in + source code of `tensorlayer.layer.Module.__setattr__`. + + Args: + param_name (str): Name of the parameter. + param (Parameter): Parameter to be inserted to the layer. + check_name (bool): Determines whether the name input is compatible. Default: True. + + Raises: + KeyError: If the name of parameter is null or contains dot. + AttributeError: If user did not call init() first. + TypeError: If the type of parameter is not Parameter_. + """ + if not param_name: + raise KeyError("The name of parameter should not be null.") + if check_name and '.' in param_name: + raise KeyError("The name of parameter should not contain \".\"") + if '_params' not in self.__dict__: + raise AttributeError("You need call init() first.") + if hasattr(self, param_name) and param_name not in self._params: + raise KeyError("Duplicated parameter name '{}'.".format(param_name)) + if not isinstance(param, Parameter_) and param is not None: + raise TypeError("The type of parameter should be 'Parameter' if not None.") + self._params[param_name] = param + try: + self._params_status[param_name] = self.trainable + except: + pass + + def _add_node(self, input_tensors, output_tensors): + """Add a LayerNode for this layer given input_tensors, output_tensors. + + WARINING: This function should not be called from outside, it should only be called + in layer.__call__ when building static model. + + Parameters + ---------- + input_tensors : Tensor or a list of tensors + Input tensors to this layer. + output_tensors : Tensor or a list of tensors + Output tensors to this layer. + + """ + raise NotImplementedError + + @property + def create_time(self): + return self._create_time + + def __getattr__(self, name): + if '_params' in self.__dict__: + params = self.__dict__['_params'] + if name in params: + return params[name] + if '_layers' in self.__dict__: + layers = self.__dict__['_layers'] + if name in layers: + return layers[name] + if '_params_status' in self.__dict__: + params_status = self.__dict__['_params_status'] + if name in params_status: + return params_status[name] + raise AttributeError("'{}' object has no attribute '{}'.".format(type(self).__name__, name)) + + def __delattr__(self, name): + if name in self._params: + del self._params[name] + elif name in self._layers: + del self._layers[name] + else: + object.__delattr__(self, name) + + @property + def trainable_weights(self): + """ + Returns all trainable weights. + + Returns a list of all trainable parmeters. + + Args: + recurse (bool): Whether contains the trainable weights of sublayers. Default: True. + + Returns: + List, the list of trainable weights. + """ + self.get_weights() + layers = self.layers_and_names(name_prefix='') + for layer_name, layer in layers: + params = layer._params.items() + params_status = layer._params_status.items() + params_zip = zip(params, params_status) + for params, params_status in params_zip: + if params_status[1] ==True: + self._trainable_weights.append(params[1]) + return self._trainable_weights + + @property + def nontrainable_weights(self): + """ + Returns all untrainable weights. + + Returns a list of all untrainable weights. + + Args: + recurse (bool): Whether contains the untrainable weights of sublayers. Default: True. + + Returns: + List, the list of untrainable weights. + """ + layers = self.layers_and_names(name_prefix='') + for layer_name, layer in layers: + params = layer._params.items() + params_status = layer._params_status.items() + params_zip = zip(params, params_status) + for params, params_status in params_zip: + if params_status[1] == False: + self._nontrainable_weights.append(params[1]) + return self._nontrainable_weights + + @property + def all_weights(self): + layers = self.layers_and_names(name_prefix='') + for layer_name, layer in layers: + params = layer._params.items() + for par, val in params: + self._all_weights.append(val) + return self._all_weights + + def get_weights(self, expand=True): + """ + Returns an iterator over layer weights. + + Yields weights of this layer. If `expand` is True, yield parameters of this layer and all sublayers. + + Args: + expand (bool): If True, yields parameters of this layer and all sublayers. Otherwise, yields only parameters + that are direct members of this layer. Default: True. + + Examples: + >>> net = Net() + >>> for item in net.get_weights(): + >>> print(item) + """ + for _, param in self.parameters_and_names(expand=expand): + yield param + + def check_names(self): + names = set("") + for value, param in self.parameters_and_names(): + if param.name in names: + raise ValueError( + "The value of {} is {}, its name '{}' already exists.".format(value, param, param.name) + ) + names.add(param.name) + + def insert_child_to_layer(self, child_name, child): + """ + Adds a child layer to the current layer. + + Args: + child_name (str): Name of the child layer. + child (Module): The child layer to be inserted. + + Raises: + KeyError: Child Module's name is incorrect or duplicated with the other child name. + TypeError: Child Module's type is incorrect. + """ + if not child_name or '.' in child_name: + raise KeyError("Child layer name is incorrect.") + if hasattr(self, child_name) and child_name not in self._layers: + raise KeyError("Duplicate child name '{}'.".format(child_name)) + if not isinstance(child, Module) and child is not None: + raise TypeError("Child layer type is incorrect.") + self._layers[child_name] = child + + def parameters_and_names(self, name_prefix='', expand=True): + """ + Returns an iterator over layer parameters. + + Includes the parameter's name and itself. + + Args: + name_prefix (str): Namespace. Default: ''. + expand (bool): If True, yields parameters of this layer and all sublayers. Otherwise, yields only parameters + that are direct members of this layer. Default: True. + + Examples: + >>> n = Net() + >>> names = [] + >>> for m in n.parameters_and_names(): + >>> if m[0]: + >>> names.append(m[0]) + """ + layers = [] + if expand: + layers = self.layers_and_names(name_prefix=name_prefix) + else: + layers.append((name_prefix, self)) + + params_set = set() + for layer_name, layer in layers: + params = layer._params.items() + for par_name, par in params: + if par.inited_param is not None: + par = par.inited_param + if par is not None and id(par) not in params_set: + params_set.add(id(par)) + par_new_name = par_name + if layer_name: + par_new_name = layer_name + '.' + par_new_name + + yield par_new_name, par + + def layers_and_names(self, layers=None, name_prefix=''): + """ + Returns an iterator over all layers in the network. + + Includes the layer's name and itself. + + Args: + layers (str): layers to iterate over. Default: None. + name_prefix (str): Namespace. Default: ''. + + Examples: + >>> n = Net() + >>> names = [] + >>> for m in n.layers_and_names(): + >>> if m[0]: + >>> names.append(m[0]) + """ + t_layers = layers if layers else set() + if self in t_layers: + return + + t_layers.add(self) + yield name_prefix, self + + for name, layer in self._layers.items(): + if layer: + layers_name_prefix = name + if name_prefix: + layers_name_prefix = name_prefix + '.' + layers_name_prefix + for ele in layer.layers_and_names(t_layers, layers_name_prefix): + yield ele + + def layers(self): + """Returns an iterator over immediate layers.""" + return self.name_layers().values() + + def name_layers(self): + """ + Returns an iterator over all layers in the network. + + Include name of the layer and layer itself. + """ + value_set = set() + layers = OrderedDict() + for name, layer in self._layers.items(): + if layer is not None and layer not in value_set: + value_set.add(layer) + layers[name] = layer + return layers + + def init_build(self, *inputs, **kwargs): + """ + (1) This method must be called when the Layer has no input in_channels. + (2) Automatic shape inference when the user does not enter inchannels. + """ + + self.forward(*inputs, **kwargs) + + +class SequentialLayer(Module): + """ + Sequential layer container. + + A list of Layers will be added to it in the order they are passed in the constructor. + Alternatively, an ordered dict of layers can also be passed in. + + Args: + args (list, OrderedDict): List of subclass of Module. + + Raises: + TypeError: If the type of the argument is not list or OrderedDict. + + Inputs: + - **input** (Tensor) - Tensor with shape according to the first Module in the sequence. + + Outputs: + Tensor, the output Tensor with shape depending on the input and defined sequence of Layers. + + Examples: + >>> conv = tl.layers.Conv2d(3, 2, 3, pad_mode='valid') + >>> bn = tl.layers.BatchNorm2d(2) + >>> seq = tl.layers.SequentialLayer([conv, bn]) + >>> + >>> x = tl.layers.Input((1, 3, 4, 4)) + >>> seq(x) + """ + def __init__(self, *args): + super(SequentialLayer, self).__init__() + self._built = True + if len(args) == 1: + layers = args[0] + if isinstance(layers, list): + for index, layer in enumerate(layers): + self.insert_child_to_layer(str(index), layer) + elif isinstance(layers, OrderedDict): + for name, layer in layers.items(): + self.insert_child_to_layer(name, layer) + else: + raise TypeError('Layers must be list or orderedDict') + else: + for index, layer in enumerate(args): + self.insert_child_to_layer(str(index), layer) + self.layer_list = list(self._layers.values()) + + def __getitem__(self, index): + if isinstance(index, slice): + return self.__class__( + OrderedDict(list(self._layers.items())[index])) + index = self._valid_index(len(self), index) + return list(self._layers.values())[index] + + def __setitem__(self, index, layer): + if self._valid_module(layer): + index = self._valid_index(len(self), index) + key = list(self._layers.keys())[index] + self._layers[key] = layer + self.layer_list = list(self._layers.values()) + + def __delitem__(self, index): + if isinstance(index, int): + index = self._valid_index(len(self), index) + key = list(self._layers.keys())[index] + del self._layers[key] + elif isinstance(index, slice): + keys = list(self._layers.keys())[index] + for key in keys: + del self._layers[key] + else: + raise TypeError('Index {} is not int type or slice type'.format(index)) + self.layer_list = list(self._layers.values()) + + def __len__(self): + return len(self._layers) + + + def append(self, layer): + if self._valid_module(layer): + self._layers[str(len(self))] = layer + self.layer_list = list(self._layers.values()) + return self + + def build(self, inputs_shape): + pass + + def forward(self, input_data): + for layer in self.layer_list: + input_data = layer(input_data) + return input_data + + def _valid_index(self, layer_num, index): + if not isinstance(index, int): + raise TypeError("Index {} is not int type") + if not -layer_num <= index < layer_num: + raise IndexError("Index should be a number in range [{}, {}), but got {}" + .format(-layer_num, layer_num, index)) + return index % layer_num + + def _valid_module(self, layer): + if issubclass(layer.__class__, Module): + return True + raise TypeError('Module {} is not subclass of Module'.format(layer)) + + +class LayerList(Module): + """ + The class :class:`LayerList` is a linear stack of layers. + + The :class:`LayerList` can be created by passing a list of layer instances. + The given layer instances will be automatically connected one by one. + + Parameters + ---------- + layers: list of Layer + A list of layers. + name : str or None + A unique layer name. If None, a unique name will be automatically assigned. + + Methods + --------- + __init__() + Initializing the LayerList. + weights() + A collection of weights of all the layer instances. + build() + Build the LayerList. The layer instances will be connected automatically one by one. + forward() + Forward the computation. The computation will go through all layer instances. + """ + + def __init__(self, layers, name=None): + """ + Initializing the LayerList given a list of Layer. + + :param layers: list of Layer + :param name: str or None + """ + + super(LayerList, self).__init__(name=name) + self.layers = layers + is_built = True + for layer in self.layers: + self._trainable_weights.extend(layer.trainable_weights) + self._nontrainable_weights.extend(layer.nontrainable_weights) + if layer._built is False: + is_built = False + # if layer._built and layer.all_weights is not None: + # # some layers in the list passed in have already been built + # # e.g. using input shape to construct layers in dynamic eager + # if self._all_weights is None: + # self._all_weights = list() + # self._all_weights.extend(layer.all_weights) + if is_built: + self._built = True + + logging.info( + "LayerList %s including layers [%s]" % (self.name, ', '.join([layer.name for layer in self.layers])) + ) + + # check layer name uniqueness in LayerList + local_layer_name_set = set() + for layer in self.layers: + if layer.name not in local_layer_name_set: + local_layer_name_set.add(layer.name) + else: + raise ValueError( + 'Layer name \'%s\' has already been used by another layer. Please change the layer name.' % + layer.name + ) + + def __getitem__(self, idx): + if isinstance(idx, slice): + return LayerList(list(self.layers)[idx]) + else: + return self.layers[idx] + + def __len__(self): + return len(self.layers) + + def __repr__(self): + tmpstr = 'LayerList' + '(\n' + for idx, layer in enumerate(self.layers): + modstr = layer.__repr__() + modstr = _addindent(modstr, 2) + tmpstr = tmpstr + ' (' + str(idx) + '): ' + modstr + '\n' + + tmpstr = tmpstr + ')' + return tmpstr + + @property + def trainable_weights(self): + return self._trainable_weights + + @property + def nontrainable_weights(self): + return self._nontrainable_weights + + @property + def all_weights(self): + return self._trainable_weights + self._nontrainable_weights + + # def build(self, inputs_shape): + # """ + # Build the LayerList. The layer instances will be connected automatically one by one. + # """ + # in_tensor = self._input_tensors + # # in_layer = self._input_layer + # for layer in self.layers: + # is_build = layer._built + # out_tensor = layer(in_tensor) + # # nlayer = layer(in_layer) + # if is_build is False and layer.all_weights is not None: + # if self._all_weights is None: + # self._all_weights = list() + # self._all_weights.extend(layer.all_weights) + # layer._built = True + # in_tensor = out_tensor + # # in_layer = nlayer + + def forward(self, inputs): + """ + Forward the computation. The computation will go through all layer instances. + """ + z = inputs + for layer in self.layers: + z = layer.forward(z) + return z + + def _set_mode_for_layers(self, is_train): + """Set training/evaluation mode for all layer instances.""" + self.is_train = is_train + for layer in self.layers: + if isinstance(layer, LayerList): + layer._set_mode_for_layers(is_train) + else: + layer.is_train = is_train + + def get_args(self): + init_args = {} + layers = self.layer_args["layers"] + init_args["layers"] = [layer.config for layer in layers] + init_args.update({"layer_type": "layerlist"}) + return init_args + +def tolist(tensors): + if isinstance(tensors, list) or isinstance(tensors, tuple): + ntensors = list() + for t in tensors: + ntensors += tolist(t) + return ntensors + else: + return [tensors] + +def _addindent(s_, numSpaces): + s = s_.split('\n') + # don't do anything for single-line stuff + if len(s) == 1: + return s_ + first = s.pop(0) + s = [(numSpaces * ' ') + line for line in s] + s = '\n'.join(s) + s = first + '\n' + s + return s \ No newline at end of file diff --git a/tensorlayer/layers/dense/__init__.py b/tensorlayer/layers/dense/__init__.py new file mode 100644 index 0000000..2291b94 --- /dev/null +++ b/tensorlayer/layers/dense/__init__.py @@ -0,0 +1,28 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +TensorLayer provides rich layer implementations trailed for +various benchmarks and domain-specific problems. In addition, we also +support transparent access to native TensorFlow parameters. +For example, we provide not only layers for local response normalization, but also +layers that allow user to apply ``tf.ops.lrn`` on ``network.outputs``. +More functions can be found in `TensorFlow API `__. +""" + +from .base_dense import * +from .binary_dense import * +from .dorefa_dense import * +from .dropconnect import * +from .quan_dense import * +from .quan_dense_bn import * +from .ternary_dense import * + +__all__ = [ + 'BinaryDense', + 'Dense', + 'DorefaDense', + 'DropconnectDense', + 'TernaryDense', + 'QuanDense', + 'QuanDenseWithBN', +] diff --git a/tensorlayer/layers/dense/base_dense.py b/tensorlayer/layers/dense/base_dense.py new file mode 100644 index 0000000..a047030 --- /dev/null +++ b/tensorlayer/layers/dense/base_dense.py @@ -0,0 +1,122 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'Dense', +] + + +class Dense(Module): + """The :class:`Dense` class is a fully connected layer. + + Parameters + ---------- + n_units : int + The number of units of this layer. + act : activation function + The activation function of this layer. + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip biases. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + name : None or str + A unique layer name. If None, a unique name will be automatically generated. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([100, 50], name='input') + >>> dense = tl.layers.Dense(n_units=800, act=tl.ops.relu, in_channels=50, name='dense_1') + >>> print(dense) + Dense(n_units=800, relu, in_channels='50', name='dense_1') + >>> tensor = tl.layers.Dense(n_units=800, act=tl.ops.relu, name='dense_2')(net) + >>> print(tensor) + tf.Tensor([...], shape=(100, 800), dtype=float32) + + Notes + ----- + If the layer input has more than two axes, it needs to be flatten by using :class:`Flatten`. + + """ + + # @cell_attr_register + def __init__( + self, + n_units, + act=None, + W_init=tl.initializers.truncated_normal(stddev=0.05), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None, # 'dense', + ): + + super(Dense, self).__init__(name, act=act) + + self.n_units = n_units + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels is not None: + self.build(self.in_channels) + self._built = True + + logging.info( + "Dense %s: %d %s" % + (self.name, self.n_units, self.act.__class__.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(n_units={n_units}, ' + actstr) + if self.in_channels is not None: + s += ', in_channels=\'{in_channels}\'' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.in_channels is None and len(inputs_shape) != 2: + raise AssertionError("The input dimension must be rank 2, please reshape or flatten it") + if self.in_channels: + shape = [self.in_channels, self.n_units] + else: + self.in_channels = inputs_shape[1] + shape = [inputs_shape[1], self.n_units] + + self.W = self._get_weights("weights", shape=tuple(shape), init=self.W_init) + + self.b_init_flag = False + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_units, ), init=self.b_init) + self.b_init_flag = True + self.bias_add = tl.ops.BiasAdd() + + self.act_init_flag = False + if self.act: + self.act_init_flag = True + + self.matmul = tl.ops.MatMul() + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + z = self.matmul(inputs, self.W) + if self.b_init_flag: + z = self.bias_add(z, self.b) + if self.act_init_flag: + z = self.act(z) + return z diff --git a/tensorlayer/layers/dense/binary_dense.py b/tensorlayer/layers/dense/binary_dense.py new file mode 100644 index 0000000..90c6e2b --- /dev/null +++ b/tensorlayer/layers/dense/binary_dense.py @@ -0,0 +1,109 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorlayer.layers.utils import quantize + +__all__ = [ + 'BinaryDense', +] + + +class BinaryDense(Module): + """The :class:`BinaryDense` class is a binary fully connected layer, which weights are either -1 or 1 while inferencing. + + Note that, the bias vector would not be binarized. + + Parameters + ---------- + n_units : int + The number of units of this layer. + act : activation function + The activation function of this layer, usually set to ``tf.act.sign`` or apply :class:`Sign` after :class:`BatchNorm`. + use_gemm : boolean + If True, use gemm instead of ``tf.matmul`` for inference. (TODO). + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip biases. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + name : None or str + A unique layer name. + + """ + + def __init__( + self, + n_units=100, + act=None, + use_gemm=False, + W_init=tl.initializers.truncated_normal(stddev=0.05), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None, + ): + super().__init__(name, act=act) + self.n_units = n_units + self.use_gemm = use_gemm + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels is not None: + self.build((None, self.in_channels)) + self._built = True + + logging.info( + "BinaryDense %s: %d %s" % + (self.name, n_units, self.act.__class__.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(n_units={n_units}, ' + actstr) + if self.in_channels is not None: + s += ', in_channels=\'{in_channels}\'' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if len(inputs_shape) != 2: + raise Exception("The input dimension must be rank 2, please reshape or flatten it") + + if self.in_channels is None: + self.in_channels = inputs_shape[1] + + if self.use_gemm: + raise Exception("TODO. The current version use tf.matmul for inferencing.") + + n_in = inputs_shape[-1] + self.W = self._get_weights("weights", shape=(n_in, self.n_units), init=self.W_init) + if self.b_init is not None: + self.b = self._get_weights("biases", shape=(self.n_units), init=self.b_init) + self.bias_add = tl.ops.BiasAdd() + + self.matmul = tl.ops.MatMul() + + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + W_ = quantize(self.W) + outputs = self.matmul(inputs, W_) + + if self.b_init is not None: + outputs = self.bias_add(outputs, self.b) + + if self.act: + outputs = self.act(outputs) + return outputs diff --git a/tensorlayer/layers/dense/dorefa_dense.py b/tensorlayer/layers/dense/dorefa_dense.py new file mode 100644 index 0000000..bf35c14 --- /dev/null +++ b/tensorlayer/layers/dense/dorefa_dense.py @@ -0,0 +1,116 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorlayer.layers.utils import cabs, quantize_active, quantize_weight + +__all__ = [ + 'DorefaDense', +] + + +class DorefaDense(Module): + """The :class:`DorefaDense` class is a binary fully connected layer, which weights are 'bitW' bits and the output of the previous layer + are 'bitA' bits while inferencing. + + Note that, the bias vector would not be binarized. + + Parameters + ---------- + bitW : int + The bits of this layer's parameter + bitA : int + The bits of the output of previous layer + n_units : int + The number of units of this layer. + act : activation function + The activation function of this layer, usually set to ``tf.act.sign`` or apply :class:`Sign` after :class:`BatchNorm`. + use_gemm : boolean + If True, use gemm instead of ``tf.matmul`` for inferencing. (TODO). + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip biases. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + name : a str + A unique layer name. + + """ + + def __init__( + self, + bitW=1, + bitA=3, + n_units=100, + act=None, + use_gemm=False, + W_init=tl.initializers.truncated_normal(stddev=0.05), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None, #'dorefa_dense', + ): + super().__init__(name, act=act) + self.bitW = bitW + self.bitA = bitA + self.n_units = n_units + self.use_gemm = use_gemm + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels is not None: + self.build((None, self.in_channels)) + self._built = True + + logging.info( + "DorefaDense %s: %d %s" % + (self.name, n_units, self.act.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): + actstr = self.act.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(n_units={n_units}, ' + actstr) + s += ', bitW={bitW}, bitA={bitA}' + if self.in_channels is not None: + s += ', in_channels=\'{in_channels}\'' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if len(inputs_shape) != 2: + raise Exception("The input dimension must be rank 2, please reshape or flatten it") + + if self.in_channels is None: + self.in_channels = inputs_shape[1] + + if self.use_gemm: + raise Exception("TODO. The current version use tf.matmul for inferencing.") + + n_in = inputs_shape[-1] + self.W = self._get_weights("weights", shape=(n_in, self.n_units), init=self.W_init) + if self.b_init is not None: + self.b = self._get_weights("biases", shape=(self.n_units), init=self.b_init) + self.bias_add = tl.ops.BiasAdd() + self.matmul = tl.ops.MatMul() + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + inputs = quantize_active(cabs(inputs), self.bitA) + W_ = quantize_weight(self.W, self.bitW) + outputs = self.matmul(inputs, W_) + if self.b_init is not None: + outputs = self.bias_add(outputs, self.b) + if self.act: + outputs = self.act(outputs) + return outputs \ No newline at end of file diff --git a/tensorlayer/layers/dense/dropconnect.py b/tensorlayer/layers/dense/dropconnect.py new file mode 100644 index 0000000..178ea2c --- /dev/null +++ b/tensorlayer/layers/dense/dropconnect.py @@ -0,0 +1,125 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import numbers +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'DropconnectDense', +] + + +class DropconnectDense(Module): + """ + The :class:`DropconnectDense` class is :class:`Dense` with DropConnect + behaviour which randomly removes connections between this layer and the previous + layer according to a keeping probability. + + Parameters + ---------- + keep : float + The keeping probability. + The lower the probability it is, the more activations are set to zero. + n_units : int + The number of units of this layer. + act : activation function + The activation function of this layer. + W_init : weights initializer + The initializer for the weight matrix. + b_init : biases initializer + The initializer for the bias vector. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + name : str + A unique layer name. + + Examples + -------- + >>> net = tl.layers.Input([None, 784], name='input') + >>> net = tl.layers.DropconnectDense(keep=0.8, + ... n_units=800, act=tl.ReLU, name='relu1')(net) + >>> net = tl.layers.DropconnectDense(keep=0.5, + ... n_units=800, act=tl.ReLU, name='relu2')(net) + >>> net = tl.layers.DropconnectDense(keep=0.5, + ... n_units=10, name='output')(net) + + References + ---------- + - `Wan, L. (2013). Regularization of neural networks using dropconnect `__ + + """ + + def __init__( + self, + keep=0.5, + n_units=100, + act=None, + W_init=tl.initializers.truncated_normal(stddev=0.05), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None, # 'dropconnect', + ): + super().__init__(name, act=act) + + if isinstance(keep, numbers.Real) and not (keep > 0 and keep <= 1): + raise ValueError("keep must be a scalar tensor or a float in the " "range (0, 1], got %g" % keep) + + self.keep = keep + self.n_units = n_units + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels is not None: + self.build((None, self.in_channels)) + self._built = True + + logging.info( + "DropconnectDense %s: %d %s" % + (self.name, n_units, self.act.__class__.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): + actstr = self.act.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(n_units={n_units}, ' + actstr) + s += ', keep={keep}' + if self.in_channels is not None: + s += ', in_channels=\'{in_channels}\'' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if len(inputs_shape) != 2: + raise Exception("The input dimension must be rank 2") + + if self.in_channels is None: + self.in_channels = inputs_shape[1] + + n_in = inputs_shape[-1] + self.W = self._get_weights("weights", shape=(n_in, self.n_units), init=self.W_init) + if self.b_init: + self.b = self._get_weights("biases", shape=(self.n_units), init=self.b_init) + + self.dropout = tl.ops.Dropout(keep=self.keep) + self.matmul = tl.ops.MatMul() + self.bias_add = tl.ops.BiasAdd() + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + W_dropcon = self.dropout(self.W) + outputs = self.matmul(inputs, W_dropcon) + if self.b_init: + outputs = self.bias_add(outputs, self.b) + if self.act: + outputs = self.act(outputs) + return outputs diff --git a/tensorlayer/layers/dense/quan_dense.py b/tensorlayer/layers/dense/quan_dense.py new file mode 100644 index 0000000..4604023 --- /dev/null +++ b/tensorlayer/layers/dense/quan_dense.py @@ -0,0 +1,119 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorlayer.layers.utils import (quantize_active_overflow, quantize_weight_overflow) + +__all__ = [ + 'QuanDense', +] + + +class QuanDense(Module): + """The :class:`QuanDense` class is a quantized fully connected layer with BN, which weights are 'bitW' bits and the output of the previous layer + are 'bitA' bits while inferencing. + + Parameters + ---------- + n_units : int + The number of units of this layer. + act : activation function + The activation function of this layer. + bitW : int + The bits of this layer's parameter + bitA : int + The bits of the output of previous layer + use_gemm : boolean + If True, use gemm instead of ``tf.matmul`` for inference. (TODO). + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip biases. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + name : None or str + A unique layer name. + + """ + + def __init__( + self, + n_units=100, + act=None, + bitW=8, + bitA=8, + use_gemm=False, + W_init=tl.initializers.truncated_normal(stddev=0.05), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None, #'quan_dense', + ): + super().__init__(name, act=act) + self.n_units = n_units + self.bitW = bitW + self.bitA = bitA + self.use_gemm = use_gemm + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels is not None: + self.build((None, self.in_channels)) + self._built = True + + logging.info( + "QuanDense %s: %d %s" % + (self.name, n_units, self.act.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): + actstr = self.act.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(n_units={n_units}, ' + actstr) + s += ', bitW={bitW}, bitA={bitA}' + if self.in_channels is not None: + s += ', in_channels=\'{in_channels}\'' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if len(inputs_shape) != 2: + raise Exception("The input dimension must be rank 2, please reshape or flatten it") + + if self.in_channels is None: + self.in_channels = inputs_shape[1] + + if self.use_gemm: + raise Exception("TODO. The current version use tf.matmul for inferencing.") + + n_in = inputs_shape[-1] + self.W = self._get_weights("weights", shape=(n_in, self.n_units), init=self.W_init) + if self.b_init is not None: + self.b = self._get_weights("biases", shape=int(self.n_units), init=self.b_init) + self.bias_add = tl.ops.BiasAdd() + + self.matmul = tl.ops.MatMul() + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + inputs = quantize_active_overflow(inputs, self.bitA) + + W_ = quantize_weight_overflow(self.W, self.bitW) + + # outputs = tf.matmul(inputs, self.W) + outputs = self.matmul(inputs, W_) # hao dong change to this + + if self.b_init is not None: + outputs = self.bias_add(outputs, self.b) + if self.act: + outputs = self.act(outputs) + return outputs diff --git a/tensorlayer/layers/dense/quan_dense_bn.py b/tensorlayer/layers/dense/quan_dense_bn.py new file mode 100644 index 0000000..3f811a2 --- /dev/null +++ b/tensorlayer/layers/dense/quan_dense_bn.py @@ -0,0 +1,188 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + + + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorflow.python.training import moving_averages +from tensorlayer.layers.utils import (quantize_active_overflow, quantize_weight_overflow, + mean_var_with_update, w_fold, bias_fold) + +__all__ = [ + 'QuanDenseWithBN', +] + + +class QuanDenseWithBN(Module): + """The :class:`QuanDenseWithBN` class is a quantized fully connected layer with BN, which weights are 'bitW' bits and the output of the previous layer + are 'bitA' bits while inferencing. + # TODO The QuanDenseWithBN only supports TensorFlow backend. + Parameters + ---------- + n_units : int + The number of units of this layer. + act : activation function + The activation function of this layer. + decay : float + A decay factor for `ExponentialMovingAverage`. + Suggest to use a large value for large dataset. + epsilon : float + Eplison. + is_train : boolean + Is being used for training or inference. + beta_init : initializer or None + The initializer for initializing beta, if None, skip beta. + Usually you should not skip beta unless you know what happened. + gamma_init : initializer or None + The initializer for initializing gamma, if None, skip gamma. + bitW : int + The bits of this layer's parameter + bitA : int + The bits of the output of previous layer + use_gemm : boolean + If True, use gemm instead of ``tf.matmul`` for inferencing. (TODO). + W_init : initializer + The initializer for the the weight matrix. + W_init_args : dictionary + The arguments for the weight matrix initializer. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + name : a str + A unique layer name. + + Examples + --------- + >>> import tensorlayer as tl + >>> net = tl.layers.Input([50, 256]) + >>> layer = tl.layers.QuanDenseWithBN(128, act='relu', name='qdbn1')(net) + >>> net = tl.layers.QuanDenseWithBN(256, act='relu', name='qdbn2')(net) + """ + + def __init__( + self, + n_units=100, + act=None, + decay=0.9, + epsilon=1e-5, + is_train=False, + bitW=8, + bitA=8, + gamma_init=tl.initializers.truncated_normal(stddev=0.05), + beta_init=tl.initializers.truncated_normal(stddev=0.05), + use_gemm=False, + W_init=tl.initializers.truncated_normal(stddev=0.05), + W_init_args=None, + in_channels=None, + name=None, # 'quan_dense_with_bn', + ): + super(QuanDenseWithBN, self).__init__(act=act, W_init_args=W_init_args, name=name) + self.n_units = n_units + self.decay = decay + self.epsilon = epsilon + self.is_train = is_train + self.bitW = bitW + self.bitA = bitA + self.gamma_init = gamma_init + self.beta_init = beta_init + self.use_gemm = use_gemm + self.W_init = W_init + self.in_channels = in_channels + + if self.in_channels is not None: + self.build((None, self.in_channels)) + self._built = True + + logging.info( + "QuanDenseLayerWithBN %s: %d %s" % + (self.name, n_units, self.act.__class__.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(n_units={n_units}, ' + actstr) + s += ', bitW={bitW}, bitA={bitA}' + if self.in_channels is not None: + s += ', in_channels=\'{in_channels}\'' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.in_channels is None and len(inputs_shape) != 2: + raise Exception("The input dimension must be rank 2, please reshape or flatten it") + + if self.in_channels is None: + self.in_channels = inputs_shape[1] + + if self.use_gemm: + raise Exception("TODO. The current version use tf.matmul for inferencing.") + + n_in = inputs_shape[-1] + self.W = self._get_weights("weights", shape=(n_in, self.n_units), init=self.W_init) + + para_bn_shape = (self.n_units, ) + if self.gamma_init: + self.scale_para = self._get_weights("gamm_weights", shape=para_bn_shape, init=self.gamma_init) + else: + self.scale_para = None + + if self.beta_init: + self.offset_para = self._get_weights("beta_weights", shape=para_bn_shape, init=self.beta_init) + else: + self.offset_para = None + + self.moving_mean = self._get_weights( + "moving_mean", shape=para_bn_shape, init=tl.initializers.constant(1.0), trainable=False + ) + self.moving_variance = self._get_weights( + "moving_variacne", shape=para_bn_shape, init=tl.initializers.constant(1.0), trainable=False + ) + + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + x = inputs + inputs = quantize_active_overflow(inputs, self.bitA) + mid_out = tl.ops.matmul(x, self.W) + + mean, variance = tl.ops.moments(x=mid_out, axes=list(range(len(mid_out.get_shape()) - 1))) + + update_moving_mean = moving_averages.assign_moving_average( + self.moving_mean, mean, self.decay, zero_debias=False + ) # if zero_debias=True, has bias + + update_moving_variance = moving_averages.assign_moving_average( + self.moving_variance, variance, self.decay, zero_debias=False + ) # if zero_debias=True, has bias + + if self.is_train: + mean, var = mean_var_with_update(update_moving_mean, update_moving_variance, mean, variance) + else: + mean, var = self.moving_mean, self.moving_variance + + _w_fold = w_fold(self.W, self.scale_para, var, self.epsilon) + + W = quantize_weight_overflow(_w_fold, self.bitW) + + outputs = tl.ops.matmul(inputs, W) + + if self.beta_init: + _bias_fold = bias_fold(self.offset_para, self.scale_para, mean, var, self.epsilon) + outputs = tl.ops.bias_add(outputs, _bias_fold) + else: + outputs = outputs + + if self.act: + outputs = self.act(outputs) + else: + outputs = outputs + return outputs diff --git a/tensorlayer/layers/dense/ternary_dense.py b/tensorlayer/layers/dense/ternary_dense.py new file mode 100644 index 0000000..5cf4457 --- /dev/null +++ b/tensorlayer/layers/dense/ternary_dense.py @@ -0,0 +1,109 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorlayer.layers.utils import compute_alpha, ternary_operation + +__all__ = [ + 'TernaryDense', +] + + +class TernaryDense(Module): + """The :class:`TernaryDense` class is a ternary fully connected layer, which weights are either -1 or 1 or 0 while inference. + # TODO The TernaryDense only supports TensorFlow backend. + + Note that, the bias vector would not be tenaried. + + Parameters + ---------- + n_units : int + The number of units of this layer. + act : activation function + The activation function of this layer, usually set to ``tf.act.sign`` or apply :class:`SignLayer` after :class:`BatchNormLayer`. + use_gemm : boolean + If True, use gemm instead of ``tf.matmul`` for inference. (TODO). + W_init : initializer + The initializer for the weight matrix. + b_init : initializer or None + The initializer for the bias vector. If None, skip biases. + in_channels: int + The number of channels of the previous layer. + If None, it will be automatically detected when the layer is forwarded for the first time. + name : None or str + A unique layer name. + + """ + + def __init__( + self, + n_units=100, + act=None, + use_gemm=False, + W_init=tl.initializers.truncated_normal(stddev=0.05), + b_init=tl.initializers.constant(value=0.0), + in_channels=None, + name=None, #'ternary_dense', + ): + super().__init__(name, act=act) + self.n_units = n_units + self.use_gemm = use_gemm + self.W_init = W_init + self.b_init = b_init + self.in_channels = in_channels + + if self.in_channels is not None: + self.build((None, self.in_channels)) + self._built = True + + logging.info( + "TernaryDense %s: %d %s" % + (self.name, n_units, self.act.__name__ if self.act is not None else 'No Activation') + ) + + def __repr__(self): + actstr = self.act.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(n_units={n_units}, ' + actstr) + if self.in_channels is not None: + s += ', in_channels=\'{in_channels}\'' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if len(inputs_shape) != 2: + raise Exception("The input dimension must be rank 2, please reshape or flatten it") + + if self.in_channels is None: + self.in_channels = inputs_shape[1] + + if self.use_gemm: + raise Exception("TODO. The current version use tf.matmul for inferencing.") + + n_in = inputs_shape[-1] + + self.W = self._get_weights(var_name="weights", shape=(n_in, self.n_units), init=self.W_init) + if self.b_init is not None: + self.b = self._get_weights(var_name="biases", shape=(self.n_units), init=self.b_init) + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + alpha = compute_alpha(self.W) + W_ = ternary_operation(self.W) + W_ = tl.ops.multiply(alpha, W_) + + outputs = tl.ops.matmul(inputs, W_) + + if self.b_init is not None: + outputs = tl.ops.bias_add(outputs, self.b, name='bias_add') + if self.act: + outputs = self.act(outputs) + return outputs diff --git a/tensorlayer/layers/deprecated.py b/tensorlayer/layers/deprecated.py new file mode 100644 index 0000000..2cb6699 --- /dev/null +++ b/tensorlayer/layers/deprecated.py @@ -0,0 +1,416 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +__all__ = [] + + +class NonExistingLayerError(Exception): + pass + + +# activation.py +__all__ += [ + 'PReluLayer', + 'PRelu6Layer', + 'PTRelu6Layer', +] + +__log__ = '\n Hint: 1) downgrade TF and TL from version 2.x to 1.x. 2) check the documentation of TF and TL version 2.x' + + +def PReluLayer(*args, **kwargs): + raise NonExistingLayerError("PReluLayer(net, name='a') --> PRelu(name='a')(net))" + __log__) + + +def PRelu6Layer(*args, **kwargs): + raise NonExistingLayerError("PRelu6Layer(net, name='a') --> PRelu6(name='a')(net))" + __log__) + + +def PTRelu6Layer(*args, **kwargs): + raise NonExistingLayerError("PTRelu6Layer(net, name='a') --> PTRelu(name='a')(net))" + __log__) + + +# convolution/atrous_conv.py +__all__ += [ + 'AtrousConv1dLayer', + 'AtrousConv2dLayer', + 'AtrousDeConv2dLayer', +] + + +def AtrousConv1dLayer(*args, **kwargs): + raise NonExistingLayerError("use `tl.layers.Conv1d` with dilation instead" + __log__) + + +def AtrousConv2dLayer(*args, **kwargs): + raise NonExistingLayerError("use `tl.layers.Conv2d` with dilation instead" + __log__) + + +def AtrousDeConv2dLayer(*args, **kwargs): + # raise NonExistingLayerError("AtrousDeConv2dLayer(net, name='a') --> AtrousDeConv2d(name='a')(net)") + raise NonExistingLayerError("use `tl.layers.DeConv2d` with dilation instead" + __log__) + + +# dense/base_dense.py +__all__ += [ + 'DenseLayer', +] + + +def DenseLayer(*args, **kwargs): + raise NonExistingLayerError("DenseLayer(net, name='a') --> Dense(name='a')(net)" + __log__) + + +# dense/binary_dense.py +__all__ += [ + 'BinaryDenseLayer', +] + + +def BinaryDenseLayer(*args, **kwargs): + raise NonExistingLayerError("BinaryDenseLayer(net, name='a') --> BinaryDense(name='a')(net)" + __log__) + + +# dense/dorefa_dense.py +__all__ += [ + 'DorefaDenseLayer', +] + + +def DorefaDenseLayer(*args, **kwargs): + raise NonExistingLayerError("DorefaDenseLayer(net, name='a') --> DorefaDense(name='a')(net)" + __log__) + + +# dense/dropconnect.py +__all__ += [ + 'DropconnectDenseLayer', +] + + +def DropconnectDenseLayer(*args, **kwargs): + raise NonExistingLayerError("DropconnectDenseLayer(net, name='a') --> DropconnectDense(name='a')(net)" + __log__) + + +# dense/quan_dense_bn.py +__all__ += [ + 'QuanDenseLayerWithBN', +] + + +def QuanDenseLayerWithBN(*args, **kwargs): + raise NonExistingLayerError("QuanDenseLayerWithBN(net, name='a') --> QuanDenseWithBN(name='a')(net)" + __log__) + + +# dense/ternary_dense.py +__all__ += [ + 'TernaryDenseLayer', +] + + +def TernaryDenseLayer(*args, **kwargs): + raise NonExistingLayerError("TernaryDenseLayer(net, name='a') --> TernaryDense(name='a')(net)" + __log__) + + +# dropout.py +__all__ += [ + 'DropoutLayer', +] + + +def DropoutLayer(*args, **kwargs): + raise NonExistingLayerError( + "DropoutLayer(net, is_train=True, name='a') --> Dropout(name='a')(net, is_train=True)" + __log__ + ) + + +# extend.py +__all__ += [ + 'ExpandDimsLayer', + 'TileLayer', +] + + +def ExpandDimsLayer(*args, **kwargs): + raise NonExistingLayerError("ExpandDimsLayer(net, name='a') --> ExpandDims(name='a')(net)" + __log__) + + +def TileLayer(*args, **kwargs): + raise NonExistingLayerError("TileLayer(net, name='a') --> Tile(name='a')(net)" + __log__) + + +# image_resampling.py +__all__ += [ + 'UpSampling2dLayer', + 'DownSampling2dLayer', +] + + +def UpSampling2dLayer(*args, **kwargs): + raise NonExistingLayerError("UpSampling2dLayer(net, name='a') --> UpSampling2d(name='a')(net)" + __log__) + + +def DownSampling2dLayer(*args, **kwargs): + raise NonExistingLayerError("DownSampling2dLayer(net, name='a') --> DownSampling2d(name='a')(net)" + __log__) + + +# importer.py +__all__ += [ + 'SlimNetsLayer', + 'KerasLayer', +] + + +def SlimNetsLayer(*args, **kwargs): + raise NonExistingLayerError("SlimNetsLayer(net, name='a') --> SlimNets(name='a')(net)" + __log__) + + +def KerasLayer(*args, **kwargs): + raise NonExistingLayerError("KerasLayer(net, name='a') --> Keras(name='a')(net)" + __log__) + + +# inputs.py +__all__ += [ + 'InputLayer', +] + + +def InputLayer(*args, **kwargs): + raise NonExistingLayerError("InputLayer(x, name='a') --> Input(name='a')(x)" + __log__) + + +# embedding.py +__all__ += [ + 'OneHotInputLayer', + 'Word2vecEmbeddingInputlayer', + 'EmbeddingInputlayer', + 'AverageEmbeddingInputlayer', +] + + +def OneHotInputLayer(*args, **kwargs): + raise NonExistingLayerError( + "Not longer Input layer: OneHotInputLayer(x, name='a') --> OneHot(name='a')(layer)" + __log__ + ) + + +def Word2vecEmbeddingInputlayer(*args, **kwargs): + raise NonExistingLayerError( + "Not longer Input layer: Word2vecEmbeddingInputlayer(x, name='a') --> Word2vecEmbedding(name='a')(layer)" + + __log__ + ) + + +def EmbeddingInputlayer(*args, **kwargs): + raise NonExistingLayerError( + "Not longer Input layer: EmbeddingInputlayer(x, name='a') --> Embedding(name='a')(layer)" + __log__ + ) + + +def AverageEmbeddingInputlayer(*args, **kwargs): + raise NonExistingLayerError( + "Not longer Input layer: AverageEmbeddingInputlayer(x, name='a') --> AverageEmbedding(name='a')(layer)" + + __log__ + ) + + +# lambda.py +__all__ += [ + 'LambdaLayer', + 'ElementwiseLambdaLayer', +] + + +def LambdaLayer(*args, **kwargs): + raise NonExistingLayerError( + "LambdaLayer(x, lambda x: 2*x, name='a') --> Lambda(lambda x: 2*x, name='a')(x)" + __log__ + ) + + +def ElementwiseLambdaLayer(*args, **kwargs): + raise NonExistingLayerError( + "ElementwiseLambdaLayer(x, ..., name='a') --> ElementwiseLambda(..., name='a')(x)" + __log__ + ) + + +# merge.py +__all__ += [ + 'ConcatLayer', + 'ElementwiseLayer', +] + + +def ConcatLayer(*args, **kwargs): + raise NonExistingLayerError("ConcatLayer(x, ..., name='a') --> Concat(..., name='a')(x)" + __log__) + + +def ElementwiseLayer(*args, **kwargs): + raise NonExistingLayerError("ElementwiseLayer(x, ..., name='a') --> Elementwise(..., name='a')(x)" + __log__) + + +# noise.py +__all__ += [ + 'GaussianNoiseLayer', +] + + +def GaussianNoiseLayer(*args, **kwargs): + raise NonExistingLayerError("GaussianNoiseLayer(x, ..., name='a') --> GaussianNoise(..., name='a')(x)" + __log__) + + +# normalization.py +__all__ += [ + 'BatchNormLayer', + 'InstanceNormLayer', + 'LayerNormLayer', + 'LocalResponseNormLayer', + 'GroupNormLayer', + 'SwitchNormLayer', +] + + +def BatchNormLayer(*args, **kwargs): + raise NonExistingLayerError( + "BatchNormLayer(x, is_train=True, name='a') --> BatchNorm(name='a')(x, is_train=True)" + __log__ + ) + + +def InstanceNormLayer(*args, **kwargs): + raise NonExistingLayerError("InstanceNormLayer(x, name='a') --> InstanceNorm(name='a')(x)" + __log__) + + +def LayerNormLayer(*args, **kwargs): + raise NonExistingLayerError("LayerNormLayer(x, name='a') --> LayerNorm(name='a')(x)" + __log__) + + +def LocalResponseNormLayer(*args, **kwargs): + raise NonExistingLayerError("LocalResponseNormLayer(x, name='a') --> LocalResponseNorm(name='a')(x)" + __log__) + + +def GroupNormLayer(*args, **kwargs): + raise NonExistingLayerError("GroupNormLayer(x, name='a') --> GroupNorm(name='a')(x)" + __log__) + + +def SwitchNormLayer(*args, **kwargs): + raise NonExistingLayerError("SwitchNormLayer(x, name='a') --> SwitchNorm(name='a')(x)" + __log__) + + +# quantize_layer.py +__all__ += [ + 'SignLayer', +] + + +def SignLayer(*args, **kwargs): + raise NonExistingLayerError("SignLayer(x, name='a') --> Sign(name='a')(x)" + __log__) + + +# recurrent/lstm_layers.py +__all__ += [ + 'ConvLSTMLayer', +] + + +def ConvLSTMLayer(*args, **kwargs): + raise NonExistingLayerError("ConvLSTMLayer(x, name='a') --> ConvLSTM(name='a')(x)" + __log__) + + +# recurrent/rnn_dynamic_layers.py +__all__ += [ + 'DynamicRNNLayer', + 'BiDynamicRNNLayer', +] + + +def DynamicRNNLayer(*args, **kwargs): + raise NonExistingLayerError( + "DynamicRNNLayer(x, is_train=True, name='a') --> DynamicRNN(name='a')(x, is_train=True)" + __log__ + ) + + +def BiDynamicRNNLayer(*args, **kwargs): + raise NonExistingLayerError( + "BiDynamicRNNLayer(x, is_train=True, name='a') --> BiDynamicRNN(name='a')(x, is_train=True)" + __log__ + ) + + +# recurrent/rnn_layers.py +__all__ += [ + 'RNNLayer', + 'BiRNNLayer', +] + + +def RNNLayer(*args, **kwargs): + raise NonExistingLayerError("RNNLayer(x, name='a') --> RNN(name='a')(x)" + __log__) + + +def BiRNNLayer(*args, **kwargs): + raise NonExistingLayerError( + "BiRNNLayer(x, is_train=True, name='a') --> BiRNN(name='a')(x, is_train=True)" + __log__ + ) + + +# reshape.py +__all__ += [ + 'FlattenLayer', + 'ReshapeLayer', + 'TransposeLayer', +] + + +def FlattenLayer(*args, **kwargs): + raise NonExistingLayerError("FlattenLayer(x, name='a') --> Flatten(name='a')(x)" + __log__) + + +def ReshapeLayer(*args, **kwargs): + raise NonExistingLayerError("ReshapeLayer(x, name='a') --> Reshape(name='a')(x)" + __log__) + + +def TransposeLayer(*args, **kwargs): + raise NonExistingLayerError("TransposeLayer(x, name='a') --> Transpose(name='a')(x)" + __log__) + + +# scale.py +__all__ += [ + 'ScaleLayer', +] + + +def ScaleLayer(*args, **kwargs): + raise NonExistingLayerError("ScaleLayer(x, name='a') --> Scale(name='a')(x)" + __log__) + + +# spatial_transformer.py +__all__ += ['SpatialTransformer2dAffineLayer'] + + +def SpatialTransformer2dAffineLayer(*args, **kwargs): + raise NonExistingLayerError( + "SpatialTransformer2dAffineLayer(x1, x2, name='a') --> SpatialTransformer2dAffine(name='a')(x1, x2)" + __log__ + ) + + +# stack.py +__all__ += [ + 'StackLayer', + 'UnStackLayer', +] + + +def StackLayer(*args, **kwargs): + raise NonExistingLayerError("StackLayer(x1, x2, name='a') --> Stack(name='a')(x1, x2)" + __log__) + + +def UnStackLayer(*args, **kwargs): + raise NonExistingLayerError("UnStackLayer(x1, x2, name='a') --> UnStack(name='a')(x1, x2)" + __log__) + + +# time_distributed.py +__all__ += [ + 'TimeDistributedLayer', +] + + +def TimeDistributedLayer(*args, **kwargs): + # raise NonExistingLayerError("TimeDistributedLayer(x1, x2, name='a') --> TimeDistributed(name='a')(x1, x2)") + raise NonExistingLayerError("TimeDistributedLayer is removed for TF 2.0, please use eager mode instead." + __log__) diff --git a/tensorlayer/layers/dropout.py b/tensorlayer/layers/dropout.py new file mode 100644 index 0000000..8dccda6 --- /dev/null +++ b/tensorlayer/layers/dropout.py @@ -0,0 +1,56 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'Dropout', +] + + +class Dropout(Module): + """ + The :class:`Dropout` class is a noise layer which randomly set some + activations to zero according to a keeping probability. + + Parameters + ---------- + keep : float + The keeping probability. + The lower the probability it is, the more activations are set to zero. + seed : int or None + The seed for random dropout. + name : None or str + A unique layer name. + + """ + + def __init__(self, keep, seed=0, name=None): #"dropout"): + super(Dropout, self).__init__(name) + self.keep = keep + self.seed = seed + + self.build() + self._built = True + + logging.info("Dropout %s: keep: %f " % (self.name, self.keep)) + + def __repr__(self): + s = ('{classname}(keep={keep}') + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.dropout = tl.ops.Dropout(keep=self.keep, seed=self.seed) + + # @tf.function + def forward(self, inputs): + if self.is_train: + outputs = self.dropout(inputs) + else: + outputs = inputs + return outputs diff --git a/tensorlayer/layers/embedding.py b/tensorlayer/layers/embedding.py new file mode 100644 index 0000000..a6b4313 --- /dev/null +++ b/tensorlayer/layers/embedding.py @@ -0,0 +1,517 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +# from tensorlayer.layers.core import LayersConfig + +__all__ = ['OneHot', 'Word2vecEmbedding', 'Embedding', 'AverageEmbedding'] + + +class OneHot(Module): + """ + The :class:`OneHot` class is the starting layer of a neural network, see ``tf.one_hot``. + Useful link: `https://www.tensorflow.org/api_docs/python/tf/one_hot`. + + Parameters + ---------- + depth : None or int + If the input indices is rank N, the output will have rank N+1. The new axis is created at dimension `axis` (default: the new axis is appended at the end). + on_value : None or number + The value to represnt `ON`. If None, it will default to the value 1. + off_value : None or number + The value to represnt `OFF`. If None, it will default to the value 0. + axis : None or int + The axis. + dtype : None or TensorFlow dtype + The data type, None means tf.float32. + name : str + A unique layer name. + + Examples + --------- + >>> import tensorflow as tf + >>> import tensorlayer as tl + >>> net = tl.layers.Input([32], dtype=tl.int32) + >>> onehot = tl.layers.OneHot(depth=8) + >>> print(onehot) + OneHot(depth=8, name='onehot') + >>> tensor = tl.layers.OneHot(depth=8)(net) + >>> print(tensor) + tf.Tensor([...], shape=(32, 8), dtype=float32) + + """ + + def __init__(self, depth=None, on_value=1.0, off_value=0.0, axis=-1, dtype=tl.float32, name=None): + super(OneHot, self).__init__(name) + self.depth = depth + self.on_value = on_value + self.off_value = off_value + self.axis = axis + self.dtype = dtype + logging.info("OneHotInput %s" % (self.name)) + + self.build() + self._built = True + + if self.depth is None: + raise RuntimeError(self.__class__.__name__ + ": depth == None the number of output units is undefined") + + def __repr__(self): + s = ('{classname}(depth={depth}') + if self.on_value is not None: + s += ', on_value={on_value}' + if self.off_value is not None: + s += ', off_value={off_value}' + if self.axis is not None: + s += ', axis={axis}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.onehot = tl.ops.OneHot( + depth=self.depth, on_value=self.on_value, off_value=self.off_value, axis=self.axis, dtype=self.dtype + ) + + def forward(self, inputs): + """ + Parameters + ---------- + inputs : input tensor + The inputs are indices. The locations represented by indices in indices take value on_value, while all other locations take value off_value. + """ + outputs = self.onehot(inputs) + return outputs + + +class Word2vecEmbedding(Module): + """ + The :class:`Word2vecEmbedding` class is a fully connected layer. + For Word Embedding, words are input as integer index. + The output is the embedded word vector. + + The layer integrates NCE loss by default (activate_nce_loss=True). + If the NCE loss is activated, in a dynamic model, + the computation of nce loss can be turned off in customised forward feeding + by setting use_nce_loss=False when the layer is called. + The NCE loss can be deactivated by setting activate_nce_loss=False. + + Parameters + ---------- + vocabulary_size : int + The size of vocabulary, number of words + embedding_size : int + The number of embedding dimensions + num_sampled : int + The number of negative examples for NCE loss + activate_nce_loss : boolean + Whether activate nce loss or not. By default, True + If True, the layer will return both outputs of embedding and nce_cost in forward feeding. + If False, the layer will only return outputs of embedding. + In a dynamic model, the computation of nce loss can be turned off in forward feeding + by setting use_nce_loss=False when the layer is called. + In a static model, once the model is constructed, the computation of nce loss + cannot be changed (always computed or not computed). + nce_loss_args : dictionary + The arguments for tf.ops.nce_loss() + E_init : initializer + The initializer for initializing the embedding matrix + nce_W_init : initializer + The initializer for initializing the nce decoder weight matrix + nce_b_init : initializer + The initializer for initializing of the nce decoder bias vector + name : str + A unique layer name + + Attributes + ---------- + outputs : Tensor + The embedding layer outputs. + normalized_embeddings : Tensor + Normalized embedding matrix. + nce_weights : Tensor + The NCE weights only when activate_nce_loss is True. + nce_biases: Tensor + The NCE biases only when activate_nce_loss is True. + + Examples + -------- + Word2Vec With TensorLayer (Example in `examples/text_word_embedding/tutorial_word2vec_basic.py`) + + >>> import tensorflow as tf + >>> import tensorlayer as tl + >>> batch_size = 8 + >>> embedding_size = 50 + >>> inputs = tl.layers.Input([batch_size], dtype=tf.int32) + >>> labels = tl.layers.Input([batch_size, 1], dtype=tf.int32) + >>> emb_net = tl.layers.Word2vecEmbedding( + >>> vocabulary_size=10000, + >>> embedding_size=embedding_size, + >>> num_sampled=100, + >>> activate_nce_loss=True, # the nce loss is activated + >>> nce_loss_args={}, + >>> E_init=tl.initializers.random_uniform(minval=-1.0, maxval=1.0), + >>> nce_W_init=tl.initializers.truncated_normal(stddev=float(1.0 / np.sqrt(embedding_size))), + >>> nce_b_init=tl.initializers.constant(value=0.0), + >>> name='word2vec_layer', + >>> ) + >>> print(emb_net) + Word2vecEmbedding(vocabulary_size=10000, embedding_size=50, num_sampled=100, activate_nce_loss=True, nce_loss_args={}) + >>> embed_tensor = emb_net(inputs, use_nce_loss=False) # the nce loss is turned off and no need to provide labels + >>> embed_tensor = emb_net([inputs, labels], use_nce_loss=False) # the nce loss is turned off and the labels will be ignored + >>> embed_tensor, embed_nce_loss = emb_net([inputs, labels]) # the nce loss is calculated + >>> outputs = tl.layers.Dense(n_units=10, name="dense")(embed_tensor) + >>> model = tl.models.Model(inputs=[inputs, labels], outputs=[outputs, embed_nce_loss], name="word2vec_model") # a static model + >>> out = model([data_x, data_y], is_train=True) # where data_x is inputs and data_y is labels + + References + ---------- + `https://www.tensorflow.org/tutorials/representation/word2vec` + + """ + + def __init__( + self, + vocabulary_size, + embedding_size, + num_sampled=64, + activate_nce_loss=True, + nce_loss_args=None, + E_init=tl.initializers.random_uniform(minval=-1.0, maxval=1.0), + nce_W_init=tl.initializers.truncated_normal(stddev=0.03), + nce_b_init=tl.initializers.constant(value=0.0), + name=None, #'word2vec', + ): + + super(Word2vecEmbedding, self).__init__(name) + self.vocabulary_size = vocabulary_size + self.embedding_size = embedding_size + self.num_sampled = num_sampled + self.E_init = E_init + self.activate_nce_loss = activate_nce_loss + + if self.activate_nce_loss: + self.nce_loss_args = nce_loss_args + self.nce_W_init = nce_W_init + self.nce_b_init = nce_b_init + + if not self._built: + self.build(tuple()) + self._built = True + + logging.info("Word2vecEmbedding %s: (%d, %d)" % (self.name, self.vocabulary_size, self.embedding_size)) + + def __repr__(self): + s = ('{classname}(') + s += 'vocabulary_size={vocabulary_size}' + s += ', embedding_size={embedding_size}' + s += ', num_sampled={num_sampled}' + s += ', activate_nce_loss={activate_nce_loss}' + if self.activate_nce_loss: + s += ', nce_loss_args={nce_loss_args}' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + """ + Parameters + ---------- + inputs_shape : tuple + the shape of inputs tensor + """ + # Look up embeddings for inputs. + # Note: a row of 'embeddings' is the vector representation of a word. + # for the sake of speed, it is better to slice the embedding matrix + # instead of transferring a word id to one-hot-format vector and then + # multiply by the embedding matrix. + # embed is the outputs of the hidden layer (embedding layer), it is a + # row vector with 'embedding_size' values. + + self.embeddings = self._get_weights( + "embeddings", + shape=(self.vocabulary_size, self.embedding_size), + init=self.E_init, + ) + + self.normalized_embeddings = tl.L2Normalize(axis=1)(self.embeddings) + + if self.activate_nce_loss: + # Construct the variables for the NCE loss (i.e. negative sampling) + self.nce_weights = self._get_weights( + "nce_weights", + shape=(self.vocabulary_size, self.embedding_size), + init=self.nce_W_init, + ) + + self.nce_biases = self._get_weights( + "nce_biases", + shape=(self.vocabulary_size, ), + init=self.nce_b_init, + ) + + self.embedding_lookup = tl.EmbeddingLookup() + + if self.activate_nce_loss: + self.nce_loss = tl.NCELoss(**self.nce_loss_args) + + def forward(self, inputs, use_nce_loss=None): + """ + Parameters + ---------- + inputs : tensor or list + If the nce loss is activated and is used, the argument should be a list of two tensors [inputs, labels]. + Otherwise, the argument should be a single tensor which is inputs. + use_nce_loss: boolean + Whether use NCE loss in this run. + If the nce loss is used, the activate_nce_loss should be True when the layer is initialized. + By default, same as activate_nce_loss. + + Outputs: + ---------- + outputs: tensor + nce_cost: tensor + The nce_cost is returned only if the nce_loss is used. + """ + + if isinstance(inputs, list): + outputs = self.embedding_lookup(params=self.embeddings, ids=inputs[0]) + else: + outputs = self.embedding_lookup(params=self.embeddings, ids=inputs) + + if use_nce_loss is True and not self.activate_nce_loss: + raise AttributeError( + "The nce loss is not activated when the %s is initialized. Please set activate_nce_loss=True." % + self.__class__.__name__ + ) + + if self.activate_nce_loss and (use_nce_loss is True or use_nce_loss is None): + if not isinstance(inputs, list): + raise ValueError("If nce loss is used, the labels of inputs must be provided.") + + nce_cost = tl.reduce_mean( + input_tensor=self.nce_loss( + weights=self.nce_weights, biases=self.nce_biases, inputs=outputs, labels=inputs[1], + num_sampled=self.num_sampled, num_classes=self.vocabulary_size + ) + ) + + return outputs, nce_cost + + return outputs + + +class Embedding(Module): + """ + The :class:`Embedding` class is a look-up table for word embedding. + + Word content are accessed using integer indexes, then the output is the embedded word vector. + To train a word embedding matrix, you can used :class:`Word2vecEmbedding`. + If you have a pre-trained matrix, you can assign the parameters into it. + + Parameters + ---------- + vocabulary_size : int + The size of vocabulary, number of words. + embedding_size : int + The number of embedding dimensions. + E_init : initializer + The initializer for the embedding matrix. + E_init_args : dictionary + The arguments for embedding matrix initializer. + name : str + A unique layer name. + + Attributes + ---------- + outputs : tensor + The embedding layer output is a 3D tensor in the shape: (batch_size, num_steps(num_words), embedding_size). + + Examples + -------- + >>> import tensorflow as tf + >>> import tensorlayer as tl + >>> input = tl.layers.Input([8, 100], dtype=tf.int32) + >>> embed = tl.layers.Embedding(vocabulary_size=1000, embedding_size=50, name='embed') + >>> print(embed) + Embedding(vocabulary_size=1000, embedding_size=50) + >>> tensor = embed(input) + >>> print(tensor) + tf.Tensor([...], shape=(8, 100, 50), dtype=float32) + + """ + + def __init__( + self, + vocabulary_size, + embedding_size, + E_init=tl.initializers.random_uniform(-0.1, 0.1), + name=None, #'embedding', + ): + super(Embedding, self).__init__(name) + self.vocabulary_size = vocabulary_size + self.embedding_size = embedding_size + self.E_init = E_init + + if not self._built: + self.build(tuple()) + self._built = True + + logging.info("Embedding %s: (%d, %d)" % (self.name, self.vocabulary_size, self.embedding_size)) + + def __repr__(self): + s = ('{classname}(') + s += 'vocabulary_size={vocabulary_size}' + s += ', embedding_size={embedding_size}' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + """ + Parameters + ---------- + inputs_shape : tuple + the shape of inputs tensor + """ + + self.embeddings = self._get_weights( + "embeddings", + shape=(self.vocabulary_size, self.embedding_size), + init=self.E_init, + ) + self.embedding_lookup = tl.EmbeddingLookup() + + def forward(self, inputs): + """ + Parameters + ---------- + inputs : Tensor + The input of a network. + """ + outputs = self.embedding_lookup(params=self.embeddings, ids=inputs) + return outputs + + +class AverageEmbedding(Module): + """The :class:`AverageEmbedding` averages over embeddings of inputs. + This is often used as the input layer for models like DAN[1] and FastText[2]. + + Parameters + ---------- + vocabulary_size : int + The size of vocabulary. + embedding_size : int + The dimension of the embedding vectors. + pad_value : int + The scalar padding value used in inputs, 0 as default. + E_init : initializer + The initializer of the embedding matrix. + name : str + A unique layer name. + + Attributes + ---------- + outputs : tensor + The embedding layer output is a 2D tensor in the shape: (batch_size, embedding_size). + + References + ---------- + - [1] Iyyer, M., Manjunatha, V., Boyd-Graber, J., & Daum’e III, H. (2015). Deep Unordered Composition Rivals Syntactic Methods for Text Classification. In Association for Computational Linguistics. + - [2] Joulin, A., Grave, E., Bojanowski, P., & Mikolov, T. (2016). `Bag of Tricks for Efficient Text Classification. `__ + + Examples + --------- + >>> import tensorflow as tf + >>> import tensorlayer as tl + >>> batch_size = 8 + >>> length = 5 + >>> input = tl.layers.Input([batch_size, length], dtype=tf.int32) + >>> avgembed = tl.layers.AverageEmbedding(vocabulary_size=1000, embedding_size=50, name='avg') + >>> print(avgembed) + AverageEmbedding(vocabulary_size=1000, embedding_size=50, pad_value=0) + >>> tensor = avgembed(input) + >>> print(tensor) + tf.Tensor([...], shape=(8, 50), dtype=float32) + + """ + + def __init__( + self, + vocabulary_size, + embedding_size, + pad_value=0, + E_init=tl.initializers.random_uniform(-0.1, 0.1), + name=None, # 'average_embedding', + ): + + super(AverageEmbedding, self).__init__(name) + self.vocabulary_size = vocabulary_size + self.embedding_size = embedding_size + self.pad_value = pad_value + self.E_init = E_init + + if not self._built: + self.build(tuple()) + self._built = True + + logging.info("AverageEmbedding %s: (%d, %d)" % (self.name, self.vocabulary_size, self.embedding_size)) + + def __repr__(self): + s = ('{classname}(') + s += 'vocabulary_size={vocabulary_size}' + s += ', embedding_size={embedding_size}' + s += ', pad_value={pad_value}' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + """ + Parameters + ---------- + inputs_shape : tuple + the shape of inputs tensor. + """ + # if len(inputs_shape) != 2: + # raise ValueError('inputs must be of size (batch_size, sentence_length)') + + self.embeddings = self._get_weights( + "embeddings", + shape=(self.vocabulary_size, self.embedding_size), + init=self.E_init, + ) + self.embedding_lookup = tl.EmbeddingLookup() + self.not_equal = tl.Not_equal() + self.cast = tl.Cast(tl.float32) + self.expand_dims = tl.ExpandDims(axis=-1) + self.reduce_sum = tl.ReduceSum(axis=1) + self.count_nonzero = tl.Count_nonzero(keepdims=True, dtype=tl.float32) + + def forward(self, inputs): + """ + Parameters + ---------- + inputs : tensor + The network input. + For word inputs, please use integer index format, 2D tensor: (batch_size, sentence_length). + """ + word_embeddings = self.embedding_lookup(params=self.embeddings, ids=inputs) + + # Zero out embeddings of pad value + masks = self.not_equal(inputs, self.pad_value) + word_embeddings *= self.cast(self.expand_dims(masks)) + sum_word_embeddings = self.reduce_sum(input=word_embeddings) + + # Count number of non-padding words in each sentence + sentence_lengths = self.count_nonzero(masks, axis=1) + + sentence_embeddings = tl.ops.divide( + sum_word_embeddings, + sentence_lengths + 1e-8, # Add epsilon to avoid dividing by 0 + ) + + outputs = sentence_embeddings + + return outputs + diff --git a/tensorlayer/layers/extend.py b/tensorlayer/layers/extend.py new file mode 100644 index 0000000..9f765c5 --- /dev/null +++ b/tensorlayer/layers/extend.py @@ -0,0 +1,105 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl + +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'ExpandDims', + 'Tile', +] + + +class ExpandDims(Module): + """ + The :class:`ExpandDims` class inserts a dimension of 1 into a tensor's shape, + see `tf.expand_dims() `__ . + + Parameters + ---------- + axis : int + The dimension index at which to expand the shape of input. + name : str + A unique layer name. If None, a unique name will be automatically assigned. + + Examples + -------- + >>> x = tl.layers.Input([10, 3], name='in') + >>> y = tl.layers.ExpandDims(axis=-1)(x) + [10, 3, 1] + """ + + def __init__( + self, + axis, + name=None # 'expand_dims', + ): + super(ExpandDims, self).__init__(name) + self.axis = axis + + self.build((None, )) + self._built = True + + logging.info("ExpandDims %s: axis: %d" % (self.name, self.axis)) + + def __repr__(self): + s = '{classname}(' + s += 'axis={axis},' + s += 'name={name}' + s += ")" + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + self.expand_dims = tl.ops.ExpandDims(axis=self.axis) + + # @tf.function + def forward(self, inputs): + outputs = self.expand_dims(inputs) + return outputs + + +class Tile(Module): + """ + The :class:`Tile` class constructs a tensor by tiling a given tensor, + see `tf.tile() `__ . + + Parameters + ---------- + multiples: tensor + Must be one of the following types: int32, int64. + 1-D Length must be the same as the number of dimensions in input. + name : None or str + A unique layer name. + + Examples + -------- + >>> x = tl.layers.Input([10, 3], name='in') + >>> y = tl.layers.Tile(multiples=[2, 3])(x) + """ + + def __init__(self, multiples=None, name=None): #'tile'): + + super(Tile, self).__init__(name) + self.multiples = multiples + + self.build((None, )) + self._built = True + + logging.info("Tile %s: multiples: %s" % (self.name, self.multiples)) + + def __repr__(self): + s = '{classname}(' + s += 'multiples={multiples},' + s += 'name={name}' + s += ")" + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + self.tile = tl.ops.Tile() + + # @tf.function + def forward(self, inputs): + outputs = self.tile(inputs, multiples=self.multiples) + return outputs diff --git a/tensorlayer/layers/image_resampling.py b/tensorlayer/layers/image_resampling.py new file mode 100644 index 0000000..a676a34 --- /dev/null +++ b/tensorlayer/layers/image_resampling.py @@ -0,0 +1,170 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'UpSampling2d', + 'DownSampling2d', +] + + +class UpSampling2d(Module): + """The :class:`UpSampling2d` class is a up-sampling 2D layer. + + See `tf.image.resize_images `__. + + Parameters + ---------- + scale : int/float or tuple of int/float + (height, width) scale factor. + method : str + The resize method selected through the given string. Default 'bilinear'. + - 'bilinear', Bilinear interpolation. + - 'nearest', Nearest neighbor interpolation. + - 'bicubic', Bicubic interpolation. + - 'area', Area interpolation. + antialias : boolean + Whether to use an anti-aliasing filter when downsampling an image. + data_format : str + channels_last 'channel_last' (default) or channels_first. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> ni = tl.layers.Input([None, 50, 50, 32], name='input') + >>> ni = tl.layers.UpSampling2d(scale=(2, 2))(ni) + >>> output shape : [None, 100, 100, 32] + + """ + + def __init__(self, scale, method='bilinear', antialias=False, data_format='channels_last', name=None, ksize=None): + super(UpSampling2d, self).__init__(name) + self.method = method + self.antialias = antialias + self.data_format = data_format + self.ksize = ksize + + logging.info( + "UpSampling2d %s: scale: %s method: %s antialias: %s" % (self.name, scale, self.method, self.antialias) + ) + + if isinstance(scale, (list, tuple)) and len(scale) != 2: + raise ValueError("scale must be int or tuple/list of length 2") + + self.scale = (scale, scale) if isinstance(scale, int) else scale + self.build(None) + self._built = True + + def __repr__(self): + s = '{classname}(scale={scale}, method={method}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, scale=self.scale, method=self.method, name=self.name) + + def build(self, inputs_shape): + self.resize = tl.ops.Resize( + scale=self.scale, method=self.method, antialias=self.antialias, data_format=self.data_format, + ksize=self.ksize + ) + + def forward(self, inputs): + """ + + Parameters + ------------ + inputs : :class:`Tensor` + Inputs tensors with 4-D Tensor of the shape (batch, height, width, channels) + """ + outputs = self.resize(inputs) + return outputs + +class DownSampling2d(Module): + """The :class:`DownSampling2d` class is down-sampling 2D layer. + + See `tf.image.resize_images `__. + + Parameters + ---------- + scale : int/float or tuple of int/float + (height, width) scale factor. + method : str + The resize method selected through the given string. Default 'bilinear'. + - 'bilinear', Bilinear interpolation. + - 'nearest', Nearest neighbor interpolation. + - 'bicubic', Bicubic interpolation. + - 'area', Area interpolation. + antialias : boolean + Whether to use an anti-aliasing filter when downsampling an image. + data_format : str + channels_last 'channel_last' (default) or channels_first. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> ni = tl.layers.Input([None, 50, 50, 32], name='input') + >>> ni = tl.layers.DownSampling2d(scale=(2, 2))(ni) + >>> output shape : [None, 25, 25, 32] + + """ + + def __init__( + self, + scale, + method='bilinear', + antialias=False, + data_format='channels_last', + name=None, + ksize=None + ): + super(DownSampling2d, self).__init__(name) + self.method = method + self.antialias = antialias + self.data_format = data_format + self.ksize = ksize + logging.info( + "DownSampling2d %s: scale: %s method: %s antialias: %s" % (self.name, scale, self.method, self.antialias) + ) + + if isinstance(scale, (list, tuple)) and len(scale) != 2: + raise ValueError("scale must be int or tuple/list of length 2") + + self.scale = (scale, scale) if isinstance(scale, int) else scale + + self.build(None) + self._built = True + + def __repr__(self): + s = '{classname}(scale={scale}, method={method}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, scale=self.scale, method=self.method, name=self.name) + + def build(self, inputs_shape): + scale = [1.0 / self.scale[0], 1.0 / self.scale[1]] + self.resize = tl.ops.Resize( + scale=scale, method=self.method, antialias=self.antialias, data_format=self.data_format, + ksize=self.ksize + ) + + def forward(self, inputs): + """ + + Parameters + ------------ + inputs : :class:`Tensor` + Inputs tensors with 4-D Tensor of the shape (batch, height, width, channels) + """ + + outputs = self.resize(inputs) + return outputs \ No newline at end of file diff --git a/tensorlayer/layers/inputs.py b/tensorlayer/layers/inputs.py new file mode 100644 index 0000000..34a8778 --- /dev/null +++ b/tensorlayer/layers/inputs.py @@ -0,0 +1,70 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = ['Input', '_InputLayer'] + + +class _InputLayer(Module): + """ + The :class:`Input` class is the starting layer of a neural network. + + Parameters + ---------- + shape : tuple (int) + Including batch size. + dtype: dtype + The type of input values. By default, tf.float32. + name : None or str + A unique layer name. + + """ + + def __init__(self, shape, dtype=tl.float32, name=None, init=None): + super(_InputLayer, self).__init__(name) + + logging.info("Input %s: %s" % (self.name, str(shape))) + self.shape = shape + self.dtype = dtype + self.shape_without_none = [_ if _ is not None else 1 for _ in shape] + if init is None: + self.outputs = tl.initializers.ones()(self.shape_without_none, dtype=self.dtype) + else: + self.outputs = init(self.shape_without_none, dtype=self.dtype) + self._built = True + + def __repr__(self): + s = 'Input(shape=%s' % str(self.shape) + if self.name is not None: + s += (', name=\'%s\'' % self.name) + s += ')' + return s + + def __call__(self, *args, **kwargs): + return self.outputs + + def build(self, inputs_shape): + pass + + def forward(self): + return self.outputs + + +def Input(shape, init=tl.initializers.ones(), dtype=tl.float32, name=None): + """ + The :class:`Input` class is the starting layer of a neural network. + + Parameters + ---------- + shape : tuple (int) + Including batch size. + name : None or str + A unique layer name. + + """ + input_layer = _InputLayer(shape, dtype=dtype, name=name, init=init) + outputs = input_layer() + return outputs diff --git a/tensorlayer/layers/lambda_layers.py b/tensorlayer/layers/lambda_layers.py new file mode 100644 index 0000000..1184f29 --- /dev/null +++ b/tensorlayer/layers/lambda_layers.py @@ -0,0 +1,280 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorflow as tf + +from tensorlayer import logging +from tensorlayer.files import utils +from tensorlayer.layers.core import Module + +__all__ = [ + 'Lambda', + 'ElementwiseLambda', +] + + +class Lambda(Module): + """A layer that takes a user-defined function using Lambda. + If the function has trainable weights, the weights should be provided. + Remember to make sure the weights provided when the layer is constructed are SAME as + the weights used when the layer is forwarded. + For multiple inputs see :class:`ElementwiseLambda`. + + Parameters + ---------- + fn : function + The function that applies to the inputs (e.g. tensor from the previous layer). + fn_weights : list + The trainable weights for the function if any. Optional. + fn_args : dict + The arguments for the function if any. Optional. + name : str or None + A unique layer name. + + Examples + --------- + Non-parametric and non-args case: + This case is supported in the Model.save() / Model.load() to save / load the whole model architecture and weights(optional). + + >>> x = tl.layers.Input([8, 3], name='input') + >>> y = tl.layers.Lambda(lambda x: 2*x, name='lambda')(x) + + + Non-parametric and with args case: + This case is supported in the Model.save() / Model.load() to save / load the whole model architecture and weights(optional). + + >>> def customize_func(x, foo=42): # x is the inputs, foo is an argument + >>> return foo * x + >>> x = tl.layers.Input([8, 3], name='input') + >>> lambdalayer = tl.layers.Lambda(customize_func, fn_args={'foo': 2}, name='lambda')(x) + + + Any function with outside variables: + This case has not been supported in Model.save() / Model.load() yet. + Please avoid using Model.save() / Model.load() to save / load models that contain such Lambda layer. Instead, you may use Model.save_weights() / Model.load_weights() to save / load model weights. + Note: In this case, fn_weights should be a list, and then the trainable weights in this Lambda layer can be added into the weights of the whole model. + + >>> a = tf.Variable(1.0) + >>> def func(x): + >>> return x + a + >>> x = tl.layers.Input([8, 3], name='input') + >>> y = tl.layers.Lambda(func, fn_weights=[a], name='lambda')(x) + + + Parametric case, merge other wrappers into TensorLayer: + This case is supported in the Model.save() / Model.load() to save / load the whole model architecture and weights(optional). + + >>> layers = [ + >>> tf.keras.layers.Dense(10, activation=tf.nn.relu), + >>> tf.keras.layers.Dense(5, activation=tf.nn.sigmoid), + >>> tf.keras.layers.Dense(1, activation=tf.identity) + >>> ] + >>> perceptron = tf.keras.Sequential(layers) + >>> # in order to compile keras model and get trainable_variables of the keras model + >>> _ = perceptron(np.random.random([100, 5]).astype(np.float32)) + >>> + >>> class CustomizeModel(tl.models.Model): + >>> def __init__(self): + >>> super(CustomizeModel, self).__init__() + >>> self.dense = tl.layers.Dense(in_channels=1, n_units=5) + >>> self.lambdalayer = tl.layers.Lambda(perceptron, perceptron.trainable_variables) + >>> + >>> def forward(self, x): + >>> z = self.dense(x) + >>> z = self.lambdalayer(z) + >>> return z + >>> + >>> optimizer = tl.optimizers.Adam(learning_rate=0.1) + >>> model = CustomizeModel() + >>> model.train() + >>> + >>> for epoch in range(50): + >>> with tf.GradientTape() as tape: + >>> pred_y = model(data_x) + >>> loss = tl.cost.mean_squared_error(pred_y, data_y) + >>> + >>> gradients = tape.gradient(loss, model.trainable_weights) + >>> optimizer.apply_gradients(zip(gradients, model.trainable_weights)) + + """ + + def __init__( + self, + fn, + fn_weights=None, + fn_args=None, + name=None, + ): + + super(Lambda, self).__init__(name=name) + self.fn = fn + self._trainable_weights = fn_weights if fn_weights is not None else [] + self.fn_args = fn_args if fn_args is not None else {} + + try: + fn_name = repr(self.fn) + except: + fn_name = 'name not available' + logging.info("Lambda %s: func: %s, len_weights: %s" % (self.name, fn_name, len(self._trainable_weights))) + + self.build() + self._built = True + + def __repr__(self): + s = '{classname}(' + s += 'fn={fn_name},' + s += 'len_weights={len_weights},' + s += 'name=\'{name}\'' + s += ')' + try: + fn_name = repr(self.fn) + except: + fn_name = 'name not available' + return s.format( + classname=self.__class__.__name__, fn_name=fn_name, len_weights=len(self._trainable_weights), + **self.__dict__ + ) + + def build(self, inputs_shape=None): + pass + + def forward(self, inputs, **kwargs): + + if len(kwargs) == 0: + outputs = self.fn(inputs, **self.fn_args) + else: + outputs = self.fn(inputs, **kwargs) + + return outputs + + def get_args(self): + init_args = {} + if isinstance(self.fn, tf.keras.layers.Layer) or isinstance(self.fn, tf.keras.Model): + init_args.update({"layer_type": "keraslayer"}) + init_args["fn"] = utils.save_keras_model(self.fn) + init_args["fn_weights"] = None + if len(self._nodes) == 0: + init_args["keras_input_shape"] = [] + else: + init_args["keras_input_shape"] = self._nodes[0].in_tensors[0].get_shape().as_list() + else: + init_args = {"layer_type": "normal"} + return init_args + + +class ElementwiseLambda(Module): + """A layer that use a custom function to combine multiple :class:`Layer` inputs. + If the function has trainable weights, the weights should be provided. + Remember to make sure the weights provided when the layer is constructed are SAME as + the weights used when the layer is forwarded. + + Parameters + ---------- + fn : function + The function that applies to the inputs (e.g. tensor from the previous layer). + fn_weights : list + The trainable weights for the function if any. Optional. + fn_args : dict + The arguments for the function if any. Optional. + name : str or None + A unique layer name. + + Examples + -------- + + Non-parametric and with args case + This case is supported in the Model.save() / Model.load() to save / load the whole model architecture and weights(optional). + + >>> # z = mean + noise * tf.exp(std * 0.5) + foo + >>> def func(noise, mean, std, foo=42): + >>> return mean + noise * tf.exp(std * 0.5) + foo + >>> noise = tl.layers.Input([100, 1]) + >>> mean = tl.layers.Input([100, 1]) + >>> std = tl.layers.Input([100, 1]) + >>> out = tl.layers.ElementwiseLambda(fn=func, fn_args={'foo': 84}, name='elementwiselambda')([noise, mean, std]) + + + Non-parametric and non-args case + This case is supported in the Model.save() / Model.load() to save / load the whole model architecture and weights(optional). + + >>> # z = mean + noise * tf.exp(std * 0.5) + >>> noise = tl.layers.Input([100, 1]) + >>> mean = tl.layers.Input([100, 1]) + >>> std = tl.layers.Input([100, 1]) + >>> out = tl.layers.ElementwiseLambda(fn=lambda x, y, z: x + y * tf.exp(z * 0.5), name='elementwiselambda')([noise, mean, std]) + + + Any function with outside variables + This case has not been supported in Model.save() / Model.load() yet. + Please avoid using Model.save() / Model.load() to save / load models that contain such ElementwiseLambda layer. Instead, you may use Model.save_weights() / Model.load_weights() to save / load model weights. + Note: In this case, fn_weights should be a list, and then the trainable weights in this ElementwiseLambda layer can be added into the weights of the whole model. + + >>> # z = mean + noise * tf.exp(std * 0.5) + vara + >>> vara = [tf.Variable(1.0)] + >>> def func(noise, mean, std): + >>> return mean + noise * tf.exp(std * 0.5) + vara + >>> noise = tl.layers.Input([100, 1]) + >>> mean = tl.layers.Input([100, 1]) + >>> std = tl.layers.Input([100, 1]) + >>> out = tl.layers.ElementwiseLambda(fn=func, fn_weights=vara, name='elementwiselambda')([noise, mean, std]) + + """ + + def __init__( + self, + fn, + fn_weights=None, + fn_args=None, + name=None, #'elementwiselambda', + ): + + super(ElementwiseLambda, self).__init__(name=name) + self.fn = fn + self._trainable_weights = fn_weights if fn_weights is not None else [] + self.fn_args = fn_args if fn_args is not None else {} + + try: + fn_name = repr(self.fn) + except: + fn_name = 'name not available' + logging.info( + "ElementwiseLambda %s: func: %s, len_weights: %s" % (self.name, fn_name, len(self._trainable_weights)) + ) + + self.build() + self._built = True + + def __repr__(self): + s = '{classname}(' + s += 'fn={fn_name},' + s += 'len_weights={len_weights},' + s += 'name=\'{name}\'' + s += ')' + try: + fn_name = repr(self.fn) + except: + fn_name = 'name not available' + return s.format( + classname=self.__class__.__name__, fn_name=fn_name, len_weights=len(self._trainable_weights), + **self.__dict__ + ) + + def build(self, inputs_shape=None): + # do nothing + # the weights of the function are provided when the Lambda layer is constructed + pass + + # @tf.function + def forward(self, inputs, **kwargs): + + if not isinstance(inputs, list): + raise TypeError( + "The inputs should be a list of values which corresponds with the customised lambda function." + ) + + if len(kwargs) == 0: + outputs = self.fn(*inputs, **self.fn_args) + else: + outputs = self.fn(*inputs, **kwargs) + + return outputs \ No newline at end of file diff --git a/tensorlayer/layers/merge.py b/tensorlayer/layers/merge.py new file mode 100644 index 0000000..8e41d5a --- /dev/null +++ b/tensorlayer/layers/merge.py @@ -0,0 +1,142 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl + +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'Concat', + 'Elementwise', +] + + +class Concat(Module): + """A layer that concats multiple tensors according to given axis. + + Parameters + ---------- + concat_dim : int + The dimension to concatenate. + name : None or str + A unique layer name. + + Examples + ---------- + >>> class CustomModel(Module): + >>> def __init__(self): + >>> super(CustomModel, self).__init__(name="custom") + >>> self.dense1 = tl.layers.Dense(in_channels=20, n_units=10, act=tf.nn.relu, name='relu1_1') + >>> self.dense2 = tl.layers.Dense(in_channels=20, n_units=10, act=tf.nn.relu, name='relu2_1') + >>> self.concat = tl.layers.Concat(concat_dim=1, name='concat_layer') + + >>> def forward(self, inputs): + >>> d1 = self.dense1(inputs) + >>> d2 = self.dense2(inputs) + >>> outputs = self.concat([d1, d2]) + >>> return outputs + + """ + + def __init__( + self, + concat_dim=-1, + name=None, #'concat', + ): + + super(Concat, self).__init__(name) + self.concat_dim = concat_dim + + self.build(None) + self._built = True + + logging.info("Concat %s: concat_dim: %d" % (self.name, concat_dim)) + + def __repr__(self): + s = ('{classname}(concat_dim={concat_dim})') + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + self.concat = tl.ops.Concat(self.concat_dim) + + # @tf.function + def forward(self, inputs): + """ + + prev_layer : list of :class:`Layer` + List of layers to concatenate. + """ + outputs = self.concat(inputs) + return outputs + +class Elementwise(Module): + """A layer that combines multiple :class:`Layer` that have the same output shapes + according to an element-wise operation. + If the element-wise operation is complicated, please consider to use :class:`ElementwiseLambda`. + + Parameters + ---------- + combine_fn : a TensorFlow element-wise combine function + e.g. AND is ``tf.minimum`` ; OR is ``tf.maximum`` ; ADD is ``tf.add`` ; MUL is ``tf.multiply`` and so on. + See `TensorFlow Math API `__ . + If the combine function is more complicated, please consider to use :class:`ElementwiseLambda`. + act : activation function + The activation function of this layer. + name : None or str + A unique layer name. + + Examples + -------- + >>> class CustomModel(tl.models.Model): + >>> def __init__(self): + >>> super(CustomModel, self).__init__(name="custom") + >>> self.dense1 = tl.layers.Dense(in_channels=20, n_units=10, act=tf.nn.relu, name='relu1_1') + >>> self.dense2 = tl.layers.Dense(in_channels=20, n_units=10, act=tf.nn.relu, name='relu2_1') + >>> self.element = tl.layers.Elementwise(combine_fn=tf.minimum, name='minimum', act=tf.identity) + + >>> def forward(self, inputs): + >>> d1 = self.dense1(inputs) + >>> d2 = self.dense2(inputs) + >>> outputs = self.element([d1, d2]) + >>> return outputs + """ + + def __init__( + self, + combine_fn=tl.ops.minimum, + act=None, + name=None, #'elementwise', + ): + + super(Elementwise, self).__init__(name, act=act) + self.combine_fn = combine_fn + self.combine_fn_str = str(combine_fn).split(' ')[1] + + self.build(None) + self._built = True + + logging.info( + "Elementwise %s: fn: %s act: %s" % + (self.name, combine_fn.__name__, ('No Activation' if self.act is None else self.act.__class__.__name__)) + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(combine_fn={combine_fn_str}, ' + actstr) + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + pass + + # @tf.function + def forward(self, inputs): + outputs = inputs[0] + for input in inputs[1:]: + outputs = self.combine_fn(outputs, input) + if self.act: + outputs = self.act(outputs) + return outputs \ No newline at end of file diff --git a/tensorlayer/layers/noise.py b/tensorlayer/layers/noise.py new file mode 100644 index 0000000..65e12fc --- /dev/null +++ b/tensorlayer/layers/noise.py @@ -0,0 +1,80 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'GaussianNoise', +] + + +class GaussianNoise(Module): + """ + The :class:`GaussianNoise` class is noise layer that adding noise with + gaussian distribution to the activation. + + Parameters + ------------ + mean : float + The mean. Default is 0.0. + stddev : float + The standard deviation. Default is 1.0. + is_always : boolean + Is True, add noise for train and eval mode. If False, skip this layer in eval mode. + seed : int or None + The seed for random noise. + name : str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([64, 200], name='input') + >>> net = tl.layers.Dense(in_channels=200, n_units=100, act=tl.ReLU, name='dense')(net) + >>> gaussianlayer = tl.layers.GaussianNoise(name='gaussian')(net) + >>> print(gaussianlayer) + >>> output shape : (64, 100) + + """ + + def __init__( + self, + mean=0.0, + stddev=1.0, + is_always=True, + seed=None, + name=None, # 'gaussian_noise', + ): + super().__init__(name) + self.mean = mean + self.stddev = stddev + self.seed = seed + self.is_always = is_always + + self.build() + self._built = True + + logging.info("GaussianNoise %s: mean: %f stddev: %f" % (self.name, self.mean, self.stddev)) + + def __repr__(self): + s = '{classname}(mean={mean}, stddev={stddev}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs=None): + pass + + def forward(self, inputs): + if (self.is_train or self.is_always) is False: + return inputs + else: + shapes = tl.get_tensor_shape(inputs) + noise = tl.ops.random_normal(shape=shapes, mean=self.mean, stddev=self.stddev, seed=self.seed) + print(noise) + outputs = inputs + noise + return outputs diff --git a/tensorlayer/layers/normalization.py b/tensorlayer/layers/normalization.py new file mode 100644 index 0000000..5ab2e89 --- /dev/null +++ b/tensorlayer/layers/normalization.py @@ -0,0 +1,258 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'BatchNorm', + 'BatchNorm1d', + 'BatchNorm2d', + 'BatchNorm3d', +] + + +class BatchNorm(Module): + """ + The :class:`BatchNorm` is a batch normalization layer for both fully-connected and convolution outputs. + See ``tf.nn.batch_normalization`` and ``tf.nn.moments``. + + Parameters + ---------- + decay : float + A decay factor for `ExponentialMovingAverage`. + Suggest to use a large value for large dataset. + epsilon : float + Eplison. + act : activation function + The activation function of this layer. + is_train : boolean + Is being used for training or inference. + beta_init : initializer or None + The initializer for initializing beta, if None, skip beta. + Usually you should not skip beta unless you know what happened. + gamma_init : initializer or None + The initializer for initializing gamma, if None, skip gamma. + When the batch normalization layer is use instead of 'biases', or the next layer is linear, this can be + disabled since the scaling can be done by the next layer. see `Inception-ResNet-v2 `__ + moving_mean_init : initializer or None + The initializer for initializing moving mean, if None, skip moving mean. + moving_var_init : initializer or None + The initializer for initializing moving var, if None, skip moving var. + num_features: int + Number of features for input tensor. Useful to build layer if using BatchNorm1d, BatchNorm2d or BatchNorm3d, + but should be left as None if using BatchNorm. Default None. + data_format : str + channels_last 'channel_last' (default) or channels_first. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 50, 50, 32], name='input') + >>> net = tl.layers.BatchNorm()(net) + + Notes + ----- + The :class:`BatchNorm` is universally suitable for 3D/4D/5D input in static model, but should not be used + in dynamic model where layer is built upon class initialization. So the argument 'num_features' should only be used + for subclasses :class:`BatchNorm1d`, :class:`BatchNorm2d` and :class:`BatchNorm3d`. All the three subclasses are + suitable under all kinds of conditions. + + References + ---------- + - `Source `__ + - `stackoverflow `__ + + """ + + def __init__( + self, + decay=0.9, + epsilon=0.00001, + act=None, + is_train=True, + beta_init=tl.initializers.zeros(), + gamma_init=tl.initializers.random_normal(mean=1.0, stddev=0.002), + moving_mean_init=tl.initializers.zeros(), + moving_var_init=tl.initializers.zeros(), + num_features=None, + data_format='channels_last', + name=None, + ): + super(BatchNorm, self).__init__(name=name, act=act) + self.decay = decay + self.epsilon = epsilon + self.data_format = data_format + self.beta_init = beta_init + self.gamma_init = gamma_init + self.moving_mean_init = moving_mean_init + self.moving_var_init = moving_var_init + self.num_features = num_features + self.is_train = is_train + + self.axes = None + + # if self.num_features is None: + # raise AttributeError( + # "The registered layer `{}` should be built in advance. " + # "Do you forget to pass the keyword argument 'num_feature'? " + # ) + + if self.num_features: + self.build(None) + self._built = True + + + if self.decay < 0.0 or 1.0 < self.decay: + raise ValueError("decay should be between 0 to 1") + + logging.info( + "BatchNorm %s: decay: %f epsilon: %f act: %s is_train: %s" % ( + self.name, decay, epsilon, self.act.__class__.__name__ if self.act is not None else 'No Activation', + is_train + ) + ) + + def __repr__(self): + actstr = self.act.__class__.__name__ if self.act is not None else 'No Activation' + s = ('{classname}(num_features={num_features}, decay={decay}' ', epsilon={epsilon}') + s += (', ' + actstr) + if self.name is not None: + s += ', name="{name}"' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def _get_param_shape(self, inputs_shape): + if self.data_format == 'channels_last': + axis = -1 + elif self.data_format == 'channels_first': + axis = 1 + else: + raise ValueError('data_format should be either %s or %s' % ('channels_last', 'channels_first')) + + channels = inputs_shape[axis] + params_shape = [channels] + + return params_shape + + def _check_input_shape(self, inputs): + if inputs.ndim <= 1: + raise ValueError('expected input at least 2D, but got {}D input'.format(inputs.ndim)) + + def build(self, inputs_shape): + params_shape = [self.num_features] if self.num_features is not None else self._get_param_shape(inputs_shape) + + self.beta, self.gamma = None, None + if self.beta_init: + self.beta = self._get_weights(var_name="beta", shape=params_shape, init=self.beta_init) + + if self.gamma_init: + self.gamma = self._get_weights(var_name="gamma", shape=params_shape, init=self.gamma_init) + + self.moving_mean = self._get_weights( + var_name="moving_mean", shape=params_shape, init=self.moving_mean_init, trainable=False + ) + self.moving_var = self._get_weights( + var_name="moving_var", shape=params_shape, init=self.moving_var_init, trainable=False + ) + + self.batchnorm = tl.ops.BatchNorm( + decay=self.decay, epsilon=self.epsilon, beta=self.beta, gamma=self.gamma, moving_mean=self.moving_mean, + moving_var=self.moving_var, num_features=self.num_features, data_format=self.data_format, + is_train=self.is_train + ) + + self.act_init_flag = False + if self.act: + self.act_init_flag = True + + def forward(self, inputs): + if self._forward_state == False: + if self._built == False: + self.build(tl.get_tensor_shape(inputs)) + self._built = True + self._forward_state = True + + if not self.is_train: + self.batchnorm = tl.ops.BatchNorm( + decay=self.decay, epsilon=self.epsilon, beta=self.beta, gamma=self.gamma, moving_mean=self.moving_mean, + moving_var=self.moving_var, num_features=self.num_features, data_format=self.data_format, + is_train=False + ) + outputs = self.batchnorm(inputs=inputs) + if self.act_init_flag: + outputs = self.act(outputs) + return outputs + + +class BatchNorm1d(BatchNorm): + """The :class:`BatchNorm1d` applies Batch Normalization over 2D/3D input (a mini-batch of 1D + inputs (optional) with additional channel dimension), of shape (N, C) or (N, L, C) or (N, C, L). + See more details in :class:`BatchNorm`. + + Examples + --------- + With TensorLayer + + >>> # in static model, no need to specify num_features + >>> net = tl.layers.Input([None, 50, 32], name='input') + >>> net = tl.layers.BatchNorm1d()(net) + >>> # in dynamic model, build by specifying num_features + >>> conv = tl.layers.Conv1d(32, 5, 1, in_channels=3) + >>> bn = tl.layers.BatchNorm1d(num_features=32) + + """ + + def _check_input_shape(self, inputs): + if inputs.ndim != 2 and inputs.ndim != 3: + raise ValueError('expected input to be 2D or 3D, but got {}D input'.format(inputs.ndim)) + + +class BatchNorm2d(BatchNorm): + """The :class:`BatchNorm2d` applies Batch Normalization over 4D input (a mini-batch of 2D + inputs with additional channel dimension) of shape (N, H, W, C) or (N, C, H, W). + See more details in :class:`BatchNorm`. + + Examples + --------- + With TensorLayer + + >>> # in static model, no need to specify num_features + >>> net = tl.layers.Input([None, 50, 50, 32], name='input') + >>> net = tl.layers.BatchNorm2d()(net) + >>> # in dynamic model, build by specifying num_features + >>> conv = tl.layers.Conv2d(32, (5, 5), (1, 1), in_channels=3) + >>> bn = tl.layers.BatchNorm2d(num_features=32) + + """ + + def _check_input_shape(self, inputs): + if inputs.ndim != 4: + raise ValueError('expected input to be 4D, but got {}D input'.format(inputs.ndim)) + + +class BatchNorm3d(BatchNorm): + """The :class:`BatchNorm3d` applies Batch Normalization over 5D input (a mini-batch of 3D + inputs with additional channel dimension) with shape (N, D, H, W, C) or (N, C, D, H, W). + See more details in :class:`BatchNorm`. + + Examples + --------- + With TensorLayer + + >>> # in static model, no need to specify num_features + >>> net = tl.layers.Input([None, 50, 50, 50, 32], name='input') + >>> net = tl.layers.BatchNorm3d()(net) + >>> # in dynamic model, build by specifying num_features + >>> conv = tl.layers.Conv3d(32, (5, 5, 5), (1, 1), in_channels=3) + >>> bn = tl.layers.BatchNorm3d(num_features=32) + + """ + + def _check_input_shape(self, inputs): + if inputs.ndim != 5: + raise ValueError('expected input to be 5D, but got {}D input'.format(inputs.ndim)) diff --git a/tensorlayer/layers/padding.py b/tensorlayer/layers/padding.py new file mode 100644 index 0000000..5a21b50 --- /dev/null +++ b/tensorlayer/layers/padding.py @@ -0,0 +1,235 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'PadLayer', + 'ZeroPad1d', + 'ZeroPad2d', + 'ZeroPad3d', +] + + +class PadLayer(Module): + """The :class:`PadLayer` class is a padding layer for any mode and dimension. + Please see `tf.pad `__ for usage. + + Parameters + ---------- + padding : list of lists of 2 ints, or a Tensor of type int32. + The int32 values to pad. + mode : str + "CONSTANT", "REFLECT", or "SYMMETRIC" (case-insensitive). + name : None or str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([None, 224, 224, 3], name='input') + >>> padlayer = tl.layers.PadLayer([[0, 0], [3, 3], [3, 3], [0, 0]], "REFLECT", name='inpad')(net) + >>> print(padlayer) + >>> output shape : (None, 230, 230, 3) + + """ + + def __init__( + self, + padding=None, + mode='CONSTANT', + name=None, # 'pad_layer', + ): + super().__init__(name) + self.padding = padding + self.mode = mode + + logging.info("PadLayer %s: padding: %s mode: %s" % (self.name, self.padding, self.mode)) + + if self.padding is None: + raise Exception( + "padding should be a Tensor of type int32. see https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/pad" + ) + + self.build() + self._built = True + + def __repr__(self): + s = '{classname}(padding={padding}, mode={mode}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.pad = tl.ops.Pad(paddings=self.padding, mode=self.mode) + + def forward(self, inputs): + outputs = self.pad(inputs) + return outputs + + +class ZeroPad1d(Module): + """ + The :class:`ZeroPad1d` class is a 1D padding layer for signal [batch, length, channel]. + + Parameters + ---------- + padding : int, or tuple of 2 ints + - If int, zeros to add at the beginning and end of the padding dimension (axis 1). + - If tuple of 2 ints, zeros to add at the beginning and at the end of the padding dimension. + name : None or str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([None, 100, 1], name='input') + >>> pad1d = tl.layers.ZeroPad1d(padding=(3, 3))(net) + >>> print(pad1d) + >>> output shape : (None, 106, 1) + + """ + + def __init__( + self, + padding, + name=None, # 'zeropad1d', + ): + super().__init__(name) + self.padding = padding + logging.info("ZeroPad1d %s: padding: %s" % (self.name, str(padding))) + + if not isinstance(self.padding, (int, tuple, dict)): + raise AssertionError() + + self.build() + self._built = True + + def __repr__(self): + s = '{classname}(padding={padding}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.layer = tl.ops.ZeroPadding1D(padding=self.padding) + + def forward(self, inputs): + outputs = self.layer(inputs) + return outputs + + +class ZeroPad2d(Module): + """ + The :class:`ZeroPad2d` class is a 2D padding layer for image [batch, height, width, channel]. + + Parameters + ---------- + padding : tuple of 2 ints or int, or tuple of 2 tuples of 2 ints. + - If int, the same symmetric padding is applied to width and height. + - If tuple of 2 ints, interpreted as two different symmetric padding values for height and width as ``(symmetric_height_pad, symmetric_width_pad)``. + - If tuple of 2 tuples of 2 ints, interpreted as ``((top_pad, bottom_pad), (left_pad, right_pad))``. + name : None or str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([None, 100, 100, 3], name='input') + >>> pad2d = tl.layers.ZeroPad2d(padding=((3, 3), (4, 4)))(net) + >>> print(pad2d) + >>> output shape : (None, 106, 108, 3) + + """ + + def __init__( + self, + padding, + name=None, # 'zeropad2d', + ): + super().__init__(name) + + self.padding = padding + logging.info("ZeroPad2d %s: padding: %s" % (self.name, str(self.padding))) + + if not isinstance(self.padding, (int, tuple)): + raise AssertionError("Padding should be of type `int` or `tuple`") + + self.build() + self._built = True + + def __repr__(self): + s = '{classname}(padding={padding}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.layer = tl.ops.ZeroPadding2D(padding=self.padding) + + def forward(self, inputs): + outputs = self.layer(inputs) + return outputs + + +class ZeroPad3d(Module): + """ + The :class:`ZeroPad3d` class is a 3D padding layer for volume [batch, depth, height, width, channel]. + + Parameters + ---------- + padding : int, or tuple of 2 ints, or tuple of 2 tuples of 2 ints. + - If int, the same symmetric padding is applied to width and height. + - If tuple of 2 ints, interpreted as two different symmetric padding values for height and width as ``(symmetric_dim1_pad, symmetric_dim2_pad, symmetric_dim3_pad)``. + - If tuple of 2 tuples of 2 ints, interpreted as ``((left_dim1_pad, right_dim1_pad), (left_dim2_pad, right_dim2_pad), (left_dim3_pad, right_dim3_pad))``. + name : None or str + A unique layer name. + + Examples + -------- + With TensorLayer + + >>> net = tl.layers.Input([None, 100, 100, 100, 3], name='input') + >>> pad3d = tl.layers.ZeroPad3d(padding=((3, 3), (4, 4), (5, 5)))(net) + >>> print(pad3d) + >>> output shape : (None, 106, 108, 110, 3) + + """ + + def __init__( + self, + padding, + name=None, # 'zeropad3d', + ): + super().__init__(name) + self.padding = padding + + logging.info("ZeroPad3d %s: padding: %s" % (self.name, str(self.padding))) + + if not isinstance(self.padding, (int, tuple)): + raise AssertionError() + + self.build() + self._built = True + + def __repr__(self): + s = '{classname}(padding={padding}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.layer = tl.ops.ZeroPadding3D(padding=self.padding) + + def forward(self, inputs): + outputs = self.layer(inputs) + return outputs diff --git a/tensorlayer/layers/pooling.py b/tensorlayer/layers/pooling.py new file mode 100644 index 0000000..51cc9a7 --- /dev/null +++ b/tensorlayer/layers/pooling.py @@ -0,0 +1,979 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + + +__all__ = [ + 'PoolLayer', + 'MaxPool1d', + 'MeanPool1d', + 'MaxPool2d', + 'MeanPool2d', + 'MaxPool3d', + 'MeanPool3d', + 'GlobalMaxPool1d', + 'GlobalMeanPool1d', + 'GlobalMaxPool2d', + 'GlobalMeanPool2d', + 'GlobalMaxPool3d', + 'GlobalMeanPool3d', + 'CornerPool2d', +] + + +class PoolLayer(Module): + """ + The :class:`PoolLayer` class is a Pooling layer. + You can choose ``tl.ops.max_pool`` and ``tl.ops.avg_pool`` for 2D input or + ``tl.ops.max_pool3d`` and ``tl.ops.avg_pool3d`` for 3D input. + + Parameters + ---------- + filter_size : tuple of int + The size of the window for each dimension of the input tensor. + Note that: len(filter_size) >= 4. + strides : tuple of int + The stride of the sliding window for each dimension of the input tensor. + Note that: len(strides) >= 4. + padding : str + The padding algorithm type: "SAME" or "VALID". + pool : pooling function + One of ``tl.ops.max_pool``, ``tl.ops.avg_pool``, ``tl.ops.max_pool3d`` and ``f.ops.avg_pool3d``. + See `TensorFlow pooling APIs `__ + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 50, 50, 32], name='input') + >>> net = tl.layers.PoolLayer()(net) + >>> output shape : [None, 25, 25, 32] + + """ + + def __init__( + self, + filter_size=(1, 2, 2, 1), + strides=(1, 2, 2, 1), + padding='SAME', + pool=tl.ops.MaxPool, + name=None # 'pool_pro', + ): + super().__init__(name) + self.filter_size = filter_size + self.strides = strides + self.padding = padding + self.pool = pool + + self.build() + self._built = True + + logging.info( + "PoolLayer %s: filter_size: %s strides: %s padding: %s pool: %s" % + (self.name, str(self.filter_size), str(self.strides), self.padding, pool.__name__) + ) + + def __repr__(self): + s = '{classname}(pool={poolname}, filter_size={strides}, padding={padding}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, poolname=self.pool.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self._pool = self.pool(ksize=self.filter_size, strides=self.strides, padding=self.padding) + + def forward(self, inputs): + outputs = self._pool(inputs) + return outputs + + +class MaxPool1d(Module): + """Max pooling for 1D signal. + + Parameters + ---------- + filter_size : int + Pooling window size. + strides : int + Stride of the pooling operation. + padding : str + The padding method: 'VALID' or 'SAME'. + data_format : str + One of channels_last (default, [batch, length, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 50, 32], name='input') + >>> net = tl.layers.MaxPool1d(filter_size=3, strides=2, padding='SAME', name='maxpool1d')(net) + >>> output shape : [None, 25, 32] + + """ + + def __init__( + self, + filter_size=3, + strides=2, + padding='SAME', + data_format='channels_last', + dilation_rate=1, + name=None # 'maxpool1d' + ): + super().__init__(name) + self.filter_size = self._filter_size = filter_size + self.strides = self._strides = strides + self.padding = padding + self.data_format = data_format + self.dilation_rate = self._dilation_rate = dilation_rate + + self.build() + self._built = True + + logging.info( + "MaxPool1d %s: filter_size: %s strides: %s padding: %s" % + (self.name, str(filter_size), str(strides), str(padding)) + ) + + def __repr__(self): + s = ('{classname}(filter_size={filter_size}' ', strides={strides}, padding={padding}') + if self.dilation_rate != 1: + s += ', dilation={dilation_rate}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + # https://tensorflow.google.cn/versions/r2.0/api_docs/python/tf/nn/pool + if self.data_format == 'channels_last': + self.data_format = 'NWC' + elif self.data_format == 'channels_first': + self.data_format = 'NCW' + else: + raise Exception("unsupported data format") + self._filter_size = [self.filter_size] + self._strides = [self.strides] + self._dilation_rate = [self.dilation_rate] + + def forward(self, inputs): + outputs = tl.ops.pool( + input=inputs, + window_shape=self._filter_size, + pooling_type="MAX", + strides=self._strides, + padding=self.padding, + data_format=self.data_format, + dilations=self._dilation_rate, + ) + return outputs + + +class MeanPool1d(Module): + """Mean pooling for 1D signal. + + Parameters + ------------ + filter_size : int + Pooling window size. + strides : int + Strides of the pooling operation. + padding : str + The padding method: 'VALID' or 'SAME'. + data_format : str + One of channels_last (default, [batch, length, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 50, 32], name='input') + >>> net = tl.layers.MeanPool1d(filter_size=3, strides=2, padding='SAME')(net) + >>> output shape : [None, 25, 32] + + """ + + def __init__( + self, + filter_size=3, + strides=2, + padding='SAME', + data_format='channels_last', + dilation_rate=1, + name=None # 'meanpool1d' + ): + super().__init__(name) + self.filter_size = self._filter_size = filter_size + self.strides = self._strides = strides + self.padding = padding + self.data_format = data_format + self.dilation_rate = self._dilation_rate = dilation_rate + + self.build() + self._built = True + + logging.info( + "MeanPool1d %s: filter_size: %s strides: %s padding: %s" % + (self.name, str(filter_size), str(strides), str(padding)) + ) + + def __repr__(self): + s = ('{classname}(filter_size={filter_size}' ', strides={strides}, padding={padding}') + if self.dilation_rate != 1: + s += ', dilation={dilation_rate}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + # https://tensorflow.google.cn/versions/r2.0/api_docs/python/tf/nn/pool + if self.data_format == 'channels_last': + self.data_format = 'NWC' + elif self.data_format == 'channels_first': + self.data_format = 'NCW' + else: + raise Exception("unsupported data format") + self._filter_size = [self.filter_size] + self._strides = [self.strides] + self._dilation_rate = [self.dilation_rate] + + def forward(self, inputs): + outputs = tl.ops.pool( + input=inputs, window_shape=self._filter_size, pooling_type="AVG", padding=self.padding, + dilations=self._dilation_rate, strides=self._strides, data_format=self.data_format + ) + return outputs + + +class MaxPool2d(Module): + """Max pooling for 2D image. + + Parameters + ----------- + filter_size : tuple of int + (height, width) for filter size. + strides : tuple of int + (height, width) for strides. + padding : str + The padding method: 'VALID' or 'SAME'. + data_format : str + One of channels_last (default, [batch, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 50, 50, 32], name='input') + >>> net = tl.layers.MaxPool2d(filter_size=(3, 3), strides=(2, 2), padding='SAME')(net) + >>> output shape : [None, 25, 25, 32] + + """ + + def __init__( + self, + filter_size=(3, 3), + strides=(2, 2), + padding='SAME', + data_format='channels_last', + name=None # 'maxpool2d' + ): + super().__init__(name) + self.filter_size = filter_size + if strides is None: + strides = filter_size + self.strides = self._strides = strides + self.padding = padding + self.data_format = data_format + + self.build() + self._built = True + + logging.info( + "MaxPool2d %s: filter_size: %s strides: %s padding: %s" % + (self.name, str(filter_size), str(strides), str(padding)) + ) + + def __repr__(self): + s = ('{classname}(filter_size={filter_size}' ', strides={strides}, padding={padding}') + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + if self.data_format == 'channels_last': + self.data_format = 'NHWC' + self._strides = [1, self.strides[0], self.strides[1], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCHW' + self._strides = [1, 1, self.strides[0], self.strides[1]] + else: + raise Exception("unsupported data format") + + self.max_pool = tl.ops.MaxPool( + ksize=self.filter_size, strides=self._strides, padding=self.padding, data_format=self.data_format + ) + + def forward(self, inputs): + outputs = self.max_pool(inputs) + return outputs + + +class MeanPool2d(Module): + """Mean pooling for 2D image [batch, height, width, channel]. + + Parameters + ----------- + filter_size : tuple of int + (height, width) for filter size. + strides : tuple of int + (height, width) for strides. + padding : str + The padding method: 'VALID' or 'SAME'. + data_format : str + One of channels_last (default, [batch, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 50, 50, 32], name='input') + >>> net = tl.layers.MeanPool2d(filter_size=(3, 3), strides=(2, 2), padding='SAME')(net) + >>> output shape : [None, 25, 25, 32] + + """ + + def __init__( + self, + filter_size=(3, 3), + strides=(2, 2), + padding='SAME', + data_format='channels_last', + name=None # 'meanpool2d' + ): + super().__init__(name) + self.filter_size = filter_size + if strides is None: + strides = filter_size + self.strides = self._strides = strides + self.padding = padding + self.data_format = data_format + + self.build() + self._built = True + + logging.info( + "MeanPool2d %s: filter_size: %s strides: %s padding: %s" % + (self.name, str(filter_size), str(strides), str(padding)) + ) + + def __repr__(self): + s = ('{classname}(filter_size={filter_size}' ', strides={strides}, padding={padding}') + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + if self.data_format == 'channels_last': + self.data_format = 'NHWC' + self._strides = [1, self.strides[0], self.strides[1], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCHW' + self._strides = [1, 1, self.strides[0], self.strides[1]] + else: + raise Exception("unsupported data format") + self.avg_pool = tl.ops.AvgPool( + ksize=self.filter_size, strides=self._strides, padding=self.padding, data_format=self.data_format + ) + + def forward(self, inputs): + outputs = self.avg_pool(inputs) + return outputs + + +class MaxPool3d(Module): + """Max pooling for 3D volume. + + Parameters + ------------ + filter_size : tuple of int + Pooling window size. + strides : tuple of int + Strides of the pooling operation. + padding : str + The padding method: 'VALID' or 'SAME'. + data_format : str + One of channels_last (default, [batch, depth, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Returns + ------- + :class:`tf.Tensor` + A max pooling 3-D layer with a output rank as 5. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 50, 50, 50, 32], name='input') + >>> net = tl.layers.MaxPool3d(filter_size=(3, 3, 3), strides=(2, 2, 2), padding='SAME')(net) + >>> output shape : [None, 25, 25, 25, 32] + + """ + + def __init__( + self, + filter_size=(3, 3, 3), + strides=(2, 2, 2), + padding='VALID', + data_format='channels_last', + name=None # 'maxpool3d' + ): + super().__init__(name) + self.filter_size = filter_size + self.strides = self._strides = strides + self.padding = padding + self.data_format = data_format + + self.build() + self._built = True + + logging.info( + "MaxPool3d %s: filter_size: %s strides: %s padding: %s" % + (self.name, str(filter_size), str(strides), str(padding)) + ) + + def __repr__(self): + s = ('{classname}(filter_size={filter_size}' ', strides={strides}, padding={padding}') + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + if self.data_format == 'channels_last': + self.data_format = 'NDHWC' + self._strides = [1, self.strides[0], self.strides[1], self.strides[2], 1] + elif self.data_format == 'channels_first': + self.data_format = 'NCDHW' + self._strides = [1, 1, self.strides[0], self.strides[1], self.strides[2]] + else: + raise Exception("unsupported data format") + + def forward(self, inputs): + outputs = tl.ops.max_pool3d( + input=inputs, + ksize=self.filter_size, + strides=self._strides, + padding=self.padding, + data_format=self.data_format, + ) + return outputs + + +class MeanPool3d(Module): + """Mean pooling for 3D volume. + + Parameters + ------------ + filter_size : tuple of int + Pooling window size. + strides : tuple of int + Strides of the pooling operation. + padding : str + The padding method: 'VALID' or 'SAME'. + data_format : str + One of channels_last (default, [batch, depth, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Returns + ------- + :class:`tf.Tensor` + A mean pooling 3-D layer with a output rank as 5. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 50, 50, 50, 32], name='input') + >>> net = tl.layers.MeanPool3d(filter_size=(3, 3, 3), strides=(2, 2, 2), padding='SAME')(net) + >>> output shape : [None, 25, 25, 25, 32] + + """ + + def __init__( + self, + filter_size=(3, 3, 3), + strides=(2, 2, 2), + padding='VALID', + data_format='channels_last', + name=None # 'meanpool3d' + ): + super().__init__(name) + self.filter_size = filter_size + self.strides = self._strides = strides + self.padding = padding + self.data_format = data_format + + self.build() + self._built = True + + logging.info( + "MeanPool3d %s: filter_size: %s strides: %s padding: %s" % + (self.name, str(filter_size), str(strides), str(padding)) + ) + + def __repr__(self): + s = ('{classname}(filter_size={filter_size}' ', strides={strides}, padding={padding}') + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self._strides = [1, self.strides[0], self.strides[1], self.strides[2], 1] + if self.data_format == 'channels_last': + self.data_format = 'NDHWC' + elif self.data_format == 'channels_first': + self.data_format = 'NCDHW' + else: + raise Exception("unsupported data format") + + def forward(self, inputs): + outputs = tl.ops.avg_pool3d( + input=inputs, + ksize=self.filter_size, + strides=self._strides, + padding=self.padding, + data_format=self.data_format, + ) + return outputs + + +class GlobalMaxPool1d(Module): + """The :class:`GlobalMaxPool1d` class is a 1D Global Max Pooling layer. + + Parameters + ------------ + data_format : str + One of channels_last (default, [batch, length, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 100, 30], name='input') + >>> net = tl.layers.GlobalMaxPool1d()(net) + >>> output shape : [None, 30] + + """ + + def __init__( + self, + data_format="channels_last", + name=None # 'globalmaxpool1d' + ): + super().__init__(name) + + self.data_format = data_format + + self.build() + self._built = True + + logging.info("GlobalMaxPool1d %s" % self.name) + + def __repr__(self): + s = '{classname}(' + if self.name is not None: + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + if self.data_format == 'channels_last': + self.reduce_max = tl.ReduceMax(axis=1) + elif self.data_format == 'channels_first': + self.reduce_max = tl.ReduceMax(axis=2) + else: + raise ValueError( + "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" + ) + + def forward(self, inputs): + outputs = self.reduce_max(inputs) + return outputs + + +class GlobalMeanPool1d(Module): + """The :class:`GlobalMeanPool1d` class is a 1D Global Mean Pooling layer. + + Parameters + ------------ + data_format : str + One of channels_last (default, [batch, length, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 100, 30], name='input') + >>> net = tl.layers.GlobalMeanPool1d()(net) + >>> output shape : [None, 30] + + """ + + def __init__( + self, + data_format='channels_last', + name=None # 'globalmeanpool1d' + ): + super().__init__(name) + self.data_format = data_format + + self.build() + self._built = True + + logging.info("GlobalMeanPool1d %s" % self.name) + + def __repr__(self): + s = '{classname}(' + if self.name is not None: + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + if self.data_format == 'channels_last': + self.reduce_mean = tl.ReduceMean(axis=1) + elif self.data_format == 'channels_first': + self.reduce_mean = tl.ReduceMean(axis=2) + else: + raise ValueError( + "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" + ) + + def forward(self, inputs): + outputs = self.reduce_mean(inputs) + return outputs + + +class GlobalMaxPool2d(Module): + """The :class:`GlobalMaxPool2d` class is a 2D Global Max Pooling layer. + + Parameters + ------------ + data_format : str + One of channels_last (default, [batch, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 100, 100, 30], name='input') + >>> net = tl.layers.GlobalMaxPool2d()(net) + >>> output shape : [None, 30] + + """ + + def __init__( + self, + data_format='channels_last', + name=None # 'globalmaxpool2d' + ): + super().__init__(name) + self.data_format = data_format + + self.build() + self._built = True + + logging.info("GlobalMaxPool2d %s" % self.name) + + def __repr__(self): + s = '{classname}(' + if self.name is not None: + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + if self.data_format == 'channels_last': + self.reduce_max = tl.ReduceMax(axis=[1, 2]) + elif self.data_format == 'channels_first': + self.reduce_max = tl.ReduceMax(axis=[2, 3]) + else: + raise ValueError( + "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" + ) + + def forward(self, inputs): + outputs = self.reduce_max(inputs) + return outputs + + +class GlobalMeanPool2d(Module): + """The :class:`GlobalMeanPool2d` class is a 2D Global Mean Pooling layer. + + Parameters + ------------ + data_format : str + One of channels_last (default, [batch, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 100, 100, 30], name='input') + >>> net = tl.layers.GlobalMeanPool2d()(net) + >>> output shape : [None, 30] + + """ + + def __init__( + self, + data_format='channels_last', + name=None # 'globalmeanpool2d' + ): + super().__init__(name) + + self.data_format = data_format + + self.build() + self._built = True + + logging.info("GlobalMeanPool2d %s" % self.name) + + def __repr__(self): + s = '{classname}(' + if self.name is not None: + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + if self.data_format == 'channels_last': + self.reduce_mean = tl.ReduceMean(axis=[1, 2]) + elif self.data_format == 'channels_first': + self.reduce_mean = tl.ReduceMean(axis=[2, 3]) + else: + raise ValueError( + "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" + ) + + def forward(self, inputs): + outputs = self.reduce_mean(inputs) + return outputs + + +class GlobalMaxPool3d(Module): + """The :class:`GlobalMaxPool3d` class is a 3D Global Max Pooling layer. + + Parameters + ------------ + data_format : str + One of channels_last (default, [batch, depth, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 100, 100, 100, 30], name='input') + >>> net = tl.layers.GlobalMaxPool3d()(net) + >>> output shape : [None, 30] + + """ + + def __init__( + self, + data_format='channels_last', + name=None # 'globalmaxpool3d' + ): + super().__init__(name) + + self.data_format = data_format + + self.build() + self._built = True + + logging.info("GlobalMaxPool3d %s" % self.name) + + def __repr__(self): + s = '{classname}(' + if self.name is not None: + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + if self.data_format == 'channels_last': + self.reduce_max = tl.ReduceMax(axis=[1, 2, 3]) + elif self.data_format == 'channels_first': + self.reduce_max = tl.ReduceMax(axis=[2, 3, 4]) + else: + raise ValueError( + "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" + ) + + def forward(self, inputs): + outputs = self.reduce_max(inputs) + return outputs + + +class GlobalMeanPool3d(Module): + """The :class:`GlobalMeanPool3d` class is a 3D Global Mean Pooling layer. + + Parameters + ------------ + data_format : str + One of channels_last (default, [batch, depth, height, width, channel]) or channels_first. The ordering of the dimensions in the inputs. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 100, 100, 100, 30], name='input') + >>> net = tl.layers.GlobalMeanPool3d()(net) + >>> output shape : [None, 30] + + """ + + def __init__( + self, + data_format='channels_last', + name=None # 'globalmeanpool3d' + ): + super().__init__(name) + self.data_format = data_format + + self.build() + self._built = True + + logging.info("GlobalMeanPool3d %s" % self.name) + + def __repr__(self): + s = '{classname}(' + if self.name is not None: + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + pass + + def forward(self, inputs): + if self.data_format == 'channels_last': + outputs = tl.reduce_mean(input_tensor=inputs, axis=[1, 2, 3]) + elif self.data_format == 'channels_first': + outputs = tl.reduce_mean(input_tensor=inputs, axis=[2, 3, 4]) + else: + raise ValueError( + "`data_format` should have one of the following values: [`channels_last`, `channels_first`]" + ) + return outputs + + +class CornerPool2d(Module): + """Corner pooling for 2D image [batch, height, width, channel], see `here `__. + + Parameters + ---------- + mode : str + TopLeft for the top left corner, + Bottomright for the bottom right corner. + name : None or str + A unique layer name. + + Examples + --------- + With TensorLayer + + >>> net = tl.layers.Input([None, 32, 32, 8], name='input') + >>> net = tl.layers.CornerPool2d(mode='TopLeft',name='cornerpool2d')(net) + >>> output shape : [None, 32, 32, 8] + + """ + + def __init__( + self, + mode='TopLeft', + name=None # 'cornerpool2d' + ): + super().__init__(name) + self.mode = mode + self.build() + self._built = True + + logging.info("CornerPool2d %s : mode: %s" % (self.name, str(mode))) + + def __repr__(self): + s = ('{classname}(mode={mode}') + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + pass + + def forward(self, inputs): + _, input_width, input_height, _ = tl.get_tensor_shape(inputs) + # input_width = inputs.shape[2] + # input_height = inputs.shape[1] + batch_min = tl.reduce_min(inputs) + if self.mode == 'TopLeft': + temp_bottom = tl.pad( + inputs, tl.constant([[0, 0], [0, input_height - 1], [0, 0], [0, 0]]), constant_values=batch_min + ) + temp_right = tl.pad( + inputs, tl.constant([[0, 0], [0, 0], [0, input_width - 1], [0, 0]]), constant_values=batch_min + ) + temp_bottom = tl.ops.max_pool(temp_bottom, ksize=(input_height, 1), strides=(1, 1), padding='VALID') + temp_right = tl.ops.max_pool(temp_right, ksize=(1, input_width), strides=(1, 1), padding='VALID') + outputs = tl.add(temp_bottom, temp_right)#, name=self.name) + elif self.mode == 'BottomRight': + temp_top = tl.pad( + inputs, tl.constant([[0, 0], [input_height - 1, 0], [0, 0], [0, 0]]), constant_values=batch_min + ) + temp_left = tl.pad( + inputs, tl.constant([[0, 0], [0, 0], [input_width - 1, 0], [0, 0]]), constant_values=batch_min + ) + temp_top = tl.ops.max_pool(temp_top, ksize=(input_height, 1), strides=(1, 1), padding='VALID') + temp_left = tl.ops.max_pool(temp_left, ksize=(1, input_width), strides=(1, 1), padding='VALID') + outputs = tl.add(temp_top, temp_left) + else: + outputs = tl.identity(inputs) + return outputs + +if __name__ == '__main__': + net = tl.layers.Input([None, 32, 32, 8], name='input') + net = CornerPool2d(mode='TopLeft',name='cornerpool2d')(net) + print(net) \ No newline at end of file diff --git a/tensorlayer/layers/quantize.py b/tensorlayer/layers/quantize.py new file mode 100644 index 0000000..1a64f63 --- /dev/null +++ b/tensorlayer/layers/quantize.py @@ -0,0 +1,49 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +import os +os.environ['TL_BACKEND'] = 'tensorflow' + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module +from tensorlayer.layers.utils import quantize + +__all__ = [ + 'Sign', +] + + +class Sign(Module): + """The :class:`SignLayer` class is for quantizing the layer outputs to -1 or 1 while inferencing. + + Parameters + ---------- + name : a str + A unique layer name. + + """ + + # @deprecated_alias(layer='prev_layer', end_support_version=1.9) # TODO remove this line for the 1.9 release + def __init__( + self, + name=None # 'sign', + ): + super().__init__(name) + logging.info("Sign %s" % self.name) + + self.build() + self._built = True + + def build(self, inputs_shape=None): + pass + + def __repr__(self): + s = ('{classname}(') + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def forward(self, inputs): + outputs = quantize(inputs) + return outputs diff --git a/tensorlayer/layers/recurrent.py b/tensorlayer/layers/recurrent.py new file mode 100644 index 0000000..23d611a --- /dev/null +++ b/tensorlayer/layers/recurrent.py @@ -0,0 +1,8 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import numpy as np + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module diff --git a/tensorlayer/layers/scale.py b/tensorlayer/layers/scale.py new file mode 100644 index 0000000..b86dcae --- /dev/null +++ b/tensorlayer/layers/scale.py @@ -0,0 +1,57 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'Scale', +] + + +class Scale(Module): + """The :class:`Scale` class is to multiple a trainable scale value to the layer outputs. Usually be used on the output of binary net. + + Parameters + ---------- + init_scale : float + The initial value for the scale factor. + name : a str + A unique layer name. + + Examples + ---------- + >>> inputs = tl.layers.Input([8, 3]) + >>> dense = tl.layers.Dense(n_units=10, in_channels=3)(inputs) + >>> outputs = tl.layers.Scale(init_scale=0.5)(dense) + + """ + + def __init__( + self, + init_scale=0.05, + name='scale', + ): + super(Scale, self).__init__(name) + self.init_scale = init_scale + + self.build((None, )) + self._built = True + + logging.info("Scale %s: init_scale: %f" % (self.name, self.init_scale)) + + def __repr__(self): + s = '{classname}(' + s += 'init_scale={init_scale},' + s += 'name={name}' + s += ")" + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + self.scale = self._get_weights("scale", shape=[1], init=tl.initializers.constant(value=self.init_scale)) + + # @tf.function + def forward(self, inputs): + outputs = inputs * self.scale + return outputs diff --git a/tensorlayer/layers/shape.py b/tensorlayer/layers/shape.py new file mode 100644 index 0000000..477847d --- /dev/null +++ b/tensorlayer/layers/shape.py @@ -0,0 +1,219 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from tensorlayer import logging +from tensorlayer.layers.core import Module +import tensorlayer as tl + +__all__ = [ + 'Flatten', + 'Reshape', + 'Transpose', + 'Shuffle', +] + + +class Flatten(Module): + """A layer that reshapes high-dimension input into a vector. + + Then we often apply Dense, RNN, Concat and etc on the top of a flatten layer. + [batch_size, mask_row, mask_col, n_mask] ---> [batch_size, mask_row * mask_col * n_mask] + + Parameters + ---------- + name : None or str + A unique layer name. + + Examples + -------- + >>> x = tl.layers.Input([8, 4, 3], name='input') + >>> y = tl.layers.Flatten(name='flatten')(x) + [8, 12] + + """ + + def __init__(self, name=None): #'flatten'): + super(Flatten, self).__init__(name) + + self.build() + self._built = True + + logging.info("Flatten %s:" % (self.name)) + + def __repr__(self): + s = '{classname}(' + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.flatten_reshape = tl.ops.FlattenReshape() + + # @tf.function + def forward(self, inputs): + outputs = self.flatten_reshape(inputs) + return outputs + + +class Reshape(Module): + """A layer that reshapes a given tensor. + + Parameters + ---------- + shape : tuple of int + The output shape, see ``tf.reshape``. + name : str + A unique layer name. + + Examples + -------- + >>> x = tl.layers.Input([8, 4, 3], name='input') + >>> y = tl.layers.Reshape(shape=[-1, 12], name='reshape')(x) + (8, 12) + + """ + + def __init__(self, shape, name=None): #'reshape'): + super(Reshape, self).__init__(name) + self.shape = shape + + logging.info("Reshape %s" % (self.name)) + + self.build() + self._built = True + + def __repr__(self): + s = '{classname}(' + s += 'shape={shape},' + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.reshape = tl.ops.Reshape(self.shape) + + def forward(self, inputs): + outputs = self.reshape(inputs) + return outputs + + +class Transpose(Module): + """A layer that transposes the dimension of a tensor. + + See `tf.transpose() `__ . + + Parameters + ---------- + perm: list of int + The permutation of the dimensions, similar with ``numpy.transpose``. + If None, it is set to (n-1...0), where n is the rank of the input tensor. + conjugate: bool + By default False. If True, returns the complex conjugate of complex numbers (and transposed) + For example [[1+1j, 2+2j]] --> [[1-1j], [2-2j]] + name : str + A unique layer name. + + Examples + ---------- + >>> x = tl.layers.Input([8, 4, 3], name='input') + >>> y = tl.layers.Transpose(perm=[0, 2, 1], conjugate=False, name='trans')(x) + (8, 3, 4) + + """ + + def __init__(self, perm=None, conjugate=False, name=None): #'transpose'): + super(Transpose, self).__init__(name) + self.perm = perm + self.conjugate = conjugate + + logging.info("Transpose %s: perm: %s, conjugate: %s" % (self.name, self.perm, self.conjugate)) + + self.build() + self._built = True + + def __repr__(self): + s = '{classname}(' + s += 'perm={perm},' + s += 'conjugate={conjugate},' + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.transpose = tl.ops.Transpose(perm=self.perm, conjugate=self.conjugate) + + # @tf.function + def forward(self, inputs): + outputs = self.transpose(a=inputs) + return outputs + + +class Shuffle(Module): + """A layer that shuffle a 2D image [batch, height, width, channel], see `here `__. + + Parameters + ---------- + group: int + The number of groups. + name : str + A unique layer name. + + Examples + -------- + >>> x = tl.layers.Input([1, 16, 16, 8], name='input') + >>> y = tl.layers.Shuffle(group=2, name='shuffle')(x) + (1, 16, 16, 8) + + """ + + def __init__(self, group, in_channels=None, name=None): #'reshape'): + super(Shuffle, self).__init__(name) + self.group = group + self.inchannels = in_channels + + logging.info("Shuffle %s" % (self.name)) + + self.build() + self._built = True + + def __repr__(self): + s = '{classname}(' + s += 'group={group},' + s += 'name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape=None): + self.transpose = tl.ops.Transpose([0, 1, 2, 4, 3]) + inputs_shape = self.inchannels + if tl.BACKEND == 'mindspore' and inputs_shape == None: + raise ValueError("Do you forget to pass the keyword argument 'in_channels") + if tl.BACKEND == 'mindspore': + h, w, in_channel = inputs_shape[1:] + if in_channel % self.group != 0: + raise ValueError( + "The in_channel must be a multiple of the number of groups. The in_channel got %d and the number of groups is %d." + % (in_channel, self.group) + ) + self.reshape1 = tl.ops.Reshape([-1, h, w, in_channel // self.group, self.group]) + self.reshape2 = tl.ops.Reshape([-1, h, w, in_channel]) + + def forward(self, inputs): + if tl.BACKEND == 'tensorflow': + in_shape = tl.get_tensor_shape(inputs) + h, w, in_channel = in_shape[1:] + # if in_channel % self.group != 0: + # raise ValueError( + # "The in_channel must be a multiple of the number of groups. The in_channel got %d and the number of groups is %d." + # % (in_channel, self.group) + # ) + reshape1 = tl.ops.Reshape([-1, h, w, in_channel // self.group, self.group]) + temp = reshape1(inputs) + temp = self.transpose(temp) + reshape2 = tl.ops.Reshape([-1, h, w, in_channel]) + outputs = reshape2(temp) + else: + temp = self.reshape1(inputs) + temp = self.transpose(temp) + outputs = self.reshape2(temp) + return outputs diff --git a/tensorlayer/layers/spatial_transformer.py b/tensorlayer/layers/spatial_transformer.py new file mode 100644 index 0000000..23c94eb --- /dev/null +++ b/tensorlayer/layers/spatial_transformer.py @@ -0,0 +1,280 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import numpy as np +from six.moves import xrange +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'transformer', + 'batch_transformer', + 'SpatialTransformer2dAffine', +] + + +def transformer(U, theta, out_size, name='SpatialTransformer2dAffine'): + """Spatial Transformer Layer for `2D Affine Transformation `__ + , see :class:`SpatialTransformer2dAffine` class. + + Parameters + ---------- + U : list of float + The output of a convolutional net should have the + shape [num_batch, height, width, num_channels]. + theta: float + The output of the localisation network should be [num_batch, 6], value range should be [0, 1] (via tanh). + out_size: tuple of int + The size of the output of the network (height, width) + name: str + Optional function name + + Returns + ------- + Tensor + The transformed tensor. + + References + ---------- + - `Spatial Transformer Networks `__ + - `TensorFlow/Models `__ + + Notes + ----- + To initialize the network to the identity transform init. + + >>> import tensorflow as tf + >>> # ``theta`` to + >>> identity = np.array([[1., 0., 0.], [0., 1., 0.]]) + >>> identity = identity.flatten() + >>> theta = tf.Variable(initial_value=identity) + + """ + + def _repeat(x, n_repeats): + rep = tl.transpose(a=tl.expand_dims(tl.ones(shape=tl.stack([ + n_repeats, + ])), axis=1), perm=[1, 0]) + rep = tl.cast(rep, 'int32') + x = tl.matmul(tl.reshape(x, (-1, 1)), rep) + return tl.reshape(x, [-1]) + + def _interpolate(im, x, y, out_size): + # constants + num_batch, height, width, channels = tl.get_tensor_shape(im) + x = tl.cast(x, 'float32') + y = tl.cast(y, 'float32') + height_f = tl.cast(height, 'float32') + width_f = tl.cast(width, 'float32') + out_height = out_size[0] + out_width = out_size[1] + zero = tl.zeros([], dtype='int32') + max_y = tl.cast(height - 1, 'int32') + max_x = tl.cast(width - 1, 'int32') + + # scale indices from [-1, 1] to [0, width/height] + x = (x + 1.0) * (width_f) / 2.0 + y = (y + 1.0) * (height_f) / 2.0 + + # do sampling + x0 = tl.cast(tl.floor(x), 'int32') + x1 = x0 + 1 + y0 = tl.cast(tl.floor(y), 'int32') + y1 = y0 + 1 + + x0 = tl.clip_by_value(x0, zero, max_x) + x1 = tl.clip_by_value(x1, zero, max_x) + y0 = tl.clip_by_value(y0, zero, max_y) + y1 = tl.clip_by_value(y1, zero, max_y) + dim2 = width + dim1 = width * height + base = _repeat(tl.range(num_batch) * dim1, out_height * out_width) + base_y0 = base + y0 * dim2 + base_y1 = base + y1 * dim2 + idx_a = base_y0 + x0 + idx_b = base_y1 + x0 + idx_c = base_y0 + x1 + idx_d = base_y1 + x1 + + # use indices to lookup pixels in the flat image and restore + # channels dim + im_flat = tl.reshape(im, tl.stack([-1, channels])) + im_flat = tl.cast(im_flat, 'float32') + Ia = tl.gather(im_flat, idx_a) + Ib = tl.gather(im_flat, idx_b) + Ic = tl.gather(im_flat, idx_c) + Id = tl.gather(im_flat, idx_d) + + # and finally calculate interpolated values + x0_f = tl.cast(x0, 'float32') + x1_f = tl.cast(x1, 'float32') + y0_f = tl.cast(y0, 'float32') + y1_f = tl.cast(y1, 'float32') + wa = tl.expand_dims(((x1_f - x) * (y1_f - y)), 1) + wb = tl.expand_dims(((x1_f - x) * (y - y0_f)), 1) + wc = tl.expand_dims(((x - x0_f) * (y1_f - y)), 1) + wd = tl.expand_dims(((x - x0_f) * (y - y0_f)), 1) + output = tl.add_n([wa * Ia, wb * Ib, wc * Ic, wd * Id]) + return output + + def _meshgrid(height, width): + # This should be equivalent to: + # x_t, y_t = np.meshgrid(np.linspace(-1, 1, width), + # np.linspace(-1, 1, height)) + # ones = np.ones(np.prod(x_t.shape)) + # grid = np.vstack([x_t.flatten(), y_t.flatten(), ones]) + x_t = tl.matmul( + tl.ones(shape=tl.stack([height, 1])), + tl.transpose(a=tl.expand_dims(tl.linspace(-1.0, 1.0, width), 1), perm=[1, 0]) + ) + y_t = tl.matmul(tl.expand_dims(tl.linspace(-1.0, 1.0, height), 1), tl.ones(shape=tl.stack([1, width]))) + + x_t_flat = tl.reshape(x_t, (1, -1)) + y_t_flat = tl.reshape(y_t, (1, -1)) + + ones = tl.ones(shape=tl.get_tensor_shape(x_t_flat)) + grid = tl.concat(axis=0, values=[x_t_flat, y_t_flat, ones]) + return grid + + def _transform(theta, input_dim, out_size): + num_batch, _, _, num_channels = tl.get_tensor_shape(input_dim) + theta = tl.reshape(theta, (-1, 2, 3)) + theta = tl.cast(theta, 'float32') + + # grid of (x_t, y_t, 1), eq (1) in ref [1] + out_height = out_size[0] + out_width = out_size[1] + grid = _meshgrid(out_height, out_width) + grid = tl.expand_dims(grid, 0) + grid = tl.reshape(grid, [-1]) + grid = tl.tile(grid, tl.stack([num_batch])) + grid = tl.reshape(grid, tl.stack([num_batch, 3, -1])) + + # Transform A x (x_t, y_t, 1)^T -> (x_s, y_s) + T_g = tl.matmul(theta, grid) + x_s = tl.slice(T_g, [0, 0, 0], [-1, 1, -1]) + y_s = tl.slice(T_g, [0, 1, 0], [-1, 1, -1]) + x_s_flat = tl.reshape(x_s, [-1]) + y_s_flat = tl.reshape(y_s, [-1]) + + input_transformed = _interpolate(input_dim, x_s_flat, y_s_flat, out_size) + + output = tl.reshape(input_transformed, tl.stack([num_batch, out_height, out_width, num_channels])) + return output + + output = _transform(theta, U, out_size) + return output + + +def batch_transformer(U, thetas, out_size, name='BatchSpatialTransformer2dAffine'): + """Batch Spatial Transformer function for `2D Affine Transformation `__. + + Parameters + ---------- + U : list of float + tensor of inputs [batch, height, width, num_channels] + thetas : list of float + a set of transformations for each input [batch, num_transforms, 6] + out_size : list of int + the size of the output [out_height, out_width] + name : str + optional function name + + Returns + ------ + float + Tensor of size [batch * num_transforms, out_height, out_width, num_channels] + + """ + # with tf.compat.v1.variable_scope(name): + num_batch, num_transforms = map(int, thetas.get_shape().as_list()[:2]) + indices = [[i] * num_transforms for i in xrange(num_batch)] + input_repeated = tl.gather(U, tl.reshape(indices, [-1])) + return transformer(input_repeated, thetas, out_size) + + +class SpatialTransformer2dAffine(Module): + """The :class:`SpatialTransformer2dAffine` class is a 2D `Spatial Transformer Layer `__ for + `2D Affine Transformation `__. + + Parameters + ----------- + out_size : tuple of int or None + - The size of the output of the network (height, width), the feature maps will be resized by this. + in_channels : int + The number of in channels. + data_format : str + "channel_last" (NHWC, default) or "channels_first" (NCHW). + name : str + - A unique layer name. + + References + ----------- + - `Spatial Transformer Networks `__ + - `TensorFlow/Models `__ + + """ + + def __init__( + self, + out_size=(40, 40), + in_channels=None, + data_format='channel_last', + name=None, + ): + super(SpatialTransformer2dAffine, self).__init__(name) + + self.in_channels = in_channels + self.out_size = out_size + self.data_format = data_format + if self.in_channels is not None: + self.build(self.in_channels) + self._built = True + + logging.info("SpatialTransformer2dAffine %s" % self.name) + + def __repr__(self): + s = '{classname}(out_size={out_size}, ' + if self.in_channels is not None: + s += 'in_channels=\'{in_channels}\'' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + if self.in_channels is None and len(inputs_shape) != 2: + raise AssertionError("The dimension of theta layer input must be rank 2, please reshape or flatten it") + if self.in_channels: + shape = [self.in_channels, 6] + else: + # self.in_channels = inputs_shape[1] # BUG + # shape = [inputs_shape[1], 6] + self.in_channels = inputs_shape[0][-1] # zsdonghao + shape = [self.in_channels, 6] + self.W = self._get_weights("weights", shape=tuple(shape), init=tl.initializers.Zeros()) + identity = np.reshape(np.array([[1, 0, 0], [0, 1, 0]], dtype=np.float32), newshape=(6, )) + self.b = self._get_weights("biases", shape=(6, ), init=tl.initializers.Constant(identity)) + + def forward(self, inputs): + """ + :param inputs: a tuple (theta_input, U). + - theta_input is of size [batch, in_channels]. We will use a :class:`Dense` to + make the theta size to [batch, 6], value range to [0, 1] (via tanh). + - U is the previous layer, which the affine transformation is applied to. + :return: tensor of size [batch, out_size[0], out_size[1], n_channels] after affine transformation, + n_channels is identical to that of U. + """ + theta_input, U = inputs + theta = tl.tanh(tl.matmul(theta_input, self.W) + self.b) + outputs = transformer(U, theta, out_size=self.out_size) + # automatically set batch_size and channels + # e.g. [?, 40, 40, ?] --> [64, 40, 40, 1] or [64, 20, 20, 4] + batch_size = theta_input.shape[0] + n_channels = U.shape[-1] + if self.data_format == 'channel_last': + outputs = tl.reshape(outputs, shape=[batch_size, self.out_size[0], self.out_size[1], n_channels]) + else: + raise Exception("unimplement data_format {}".format(self.data_format)) + return outputs diff --git a/tensorlayer/layers/stack.py b/tensorlayer/layers/stack.py new file mode 100644 index 0000000..570f805 --- /dev/null +++ b/tensorlayer/layers/stack.py @@ -0,0 +1,114 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.layers.core import Module + +__all__ = [ + 'Stack', + 'UnStack', +] + + +class Stack(Module): + """ + The :class:`Stack` class is a layer for stacking a list of rank-R tensors into one rank-(R+1) tensor, see `tf.stack() `__. + + Parameters + ---------- + axis : int + New dimension along which to stack. + name : str + A unique layer name. + + Examples + --------- + >>> import tensorflow as tf + >>> import tensorlayer as tl + >>> ni = tl.layers.Input([None, 784], name='input') + >>> net1 = tl.layers.Dense(10, name='dense1')(ni) + >>> net2 = tl.layers.Dense(10, name='dense2')(ni) + >>> net3 = tl.layers.Dense(10, name='dense3')(ni) + >>> net = tl.layers.Stack(axis=1, name='stack')([net1, net2, net3]) + (?, 3, 10) + + """ + + def __init__( + self, + axis=1, + name=None, #'stack', + ): + super().__init__(name) + self.axis = axis + + self.build(None) + self._built = True + logging.info("Stack %s: axis: %d" % (self.name, self.axis)) + + def __repr__(self): + s = '{classname}(axis={axis}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + self.stack = tl.ops.Stack(axis=self.axis) + + def forward(self, inputs): + outputs = self.stack(inputs) + return outputs + + +class UnStack(Module): + """ + The :class:`UnStack` class is a layer for unstacking the given dimension of a rank-R tensor into rank-(R-1) tensors., see `tf.unstack() `__. + + Parameters + ---------- + num : int or None + The length of the dimension axis. Automatically inferred if None (the default). + axis : int + Dimension along which axis to concatenate. + name : str + A unique layer name. + + Returns + ------- + list of :class:`Layer` + The list of layer objects unstacked from the input. + + Examples + -------- + >>> ni = Input([4, 10], name='input') + >>> nn = Dense(n_units=5)(ni) + >>> nn = UnStack(axis=1)(nn) # unstack in channel axis + >>> len(nn) # 5 + >>> nn[0].shape # (4,) + + """ + + def __init__(self, num=None, axis=0, name=None): #'unstack'): + super().__init__(name) + self.num = num + self.axis = axis + + self.build(None) + self._built = True + logging.info("UnStack %s: num: %s axis: %d" % (self.name, self.num, self.axis)) + + def __repr__(self): + s = '{classname}(num={num}, axis={axis}' + if self.name is not None: + s += ', name=\'{name}\'' + s += ')' + return s.format(classname=self.__class__.__name__, **self.__dict__) + + def build(self, inputs_shape): + self.unstack = tl.ops.Unstack(num=self.num, axis=self.axis) + + def forward(self, inputs): + outputs = self.unstack(inputs) + return outputs diff --git a/tensorlayer/layers/utils.py b/tensorlayer/layers/utils.py new file mode 100644 index 0000000..b231d1b --- /dev/null +++ b/tensorlayer/layers/utils.py @@ -0,0 +1,440 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorflow as tf +from tensorflow.python.ops.rnn_cell import LSTMStateTuple + +import tensorlayer as tl +from tensorlayer import logging +from tensorlayer.decorators import deprecated, deprecated_alias +from tensorlayer.backend.ops.load_backend import BACKEND + +__all__ = [ + 'cabs', + 'compute_alpha', + 'flatten_reshape', + 'get_collection_trainable', + 'get_layers_with_name', + 'get_variables_with_name', + 'initialize_global_variables', + 'initialize_rnn_state', + 'list_remove_repeat', + 'merge_networks', + 'print_all_variables', + 'quantize', + 'quantize_active', + 'quantize_weight', + 'quantize_active_overflow', + 'quantize_weight_overflow', + 'set_name_reuse', + 'ternary_operation', +] + +########## Module Public Functions ########## + + +def cabs(x): + return tf.minimum(1.0, tf.abs(x), name='cabs') + + +def compute_alpha(x): + """Computing the scale parameter.""" + threshold = _compute_threshold(x) + alpha1_temp1 = tf.where(tf.greater(x, threshold), x, tf.zeros_like(x, tf.float32)) + alpha1_temp2 = tf.where(tf.less(x, -threshold), x, tf.zeros_like(x, tf.float32)) + alpha_array = tf.add(alpha1_temp1, alpha1_temp2, name=None) + alpha_array_abs = tf.abs(alpha_array) + alpha_array_abs1 = tf.where( + tf.greater(alpha_array_abs, 0), tf.ones_like(alpha_array_abs, tf.float32), + tf.zeros_like(alpha_array_abs, tf.float32) + ) + alpha_sum = tf.reduce_sum(input_tensor=alpha_array_abs) + n = tf.reduce_sum(input_tensor=alpha_array_abs1) + # alpha = tf.compat.v1.div(alpha_sum, n) + alpha = tf.math.divide(alpha_sum, n) + return alpha + + +def flatten_reshape(variable, name='flatten'): + """Reshapes a high-dimension vector input. + + [batch_size, mask_row, mask_col, n_mask] ---> [batch_size, mask_row x mask_col x n_mask] + + Parameters + ---------- + variable : TensorFlow variable or tensor + The variable or tensor to be flatten. + name : str + A unique layer name. + + Returns + ------- + Tensor + Flatten Tensor + + """ + dim = 1 + for d in tl.get_tensor_shape(variable)[1:]: # variable.get_shape()[1:].as_list(): + dim *= d + return tl.reshape(variable, shape=[-1, dim]) + + +def get_collection_trainable(name=''): + variables = [] + for p in tf.compat.v1.trainable_variables(): + # print(p.name.rpartition('/')[0], self.name) + if p.name.rpartition('/')[0] == name: + variables.append(p) + return variables + + +@deprecated_alias(printable='verbose', end_support_version=1.9) # TODO remove this line for the 1.9 release +def get_layers_with_name(net, name="", verbose=False): + """Get a list of layers' output in a network by a given name scope. + + Parameters + ----------- + net : :class:`Layer` + The last layer of the network. + name : str + Get the layers' output that contain this name. + verbose : boolean + If True, print information of all the layers' output + + Returns + -------- + list of Tensor + A list of layers' output (TensorFlow tensor) + + Examples + --------- + >>> import tensorlayer as tl + >>> layers = tl.layers.get_layers_with_name(net, "CNN", True) + + """ + logging.info(" [*] geting layers with %s" % name) + + layers = [] + i = 0 + + for layer in net.all_layers: + # logging.info(type(layer.name)) + if name in layer.name: + layers.append(layer) + + if verbose: + logging.info(" got {:3}: {:15} {}".format(i, layer.name, str(layer.get_shape()))) + i = i + 1 + + return layers + + +def get_variable_with_initializer(scope_name, var_name, shape, init=tl.initializers.random_normal(), trainable=True): + # FIXME: documentation needed + var_name = scope_name + "/" + var_name + # FIXME: not sure whether this is correct? + # TODO mindspore weights shape : [out_channel, in_channel, kernel_h, kernel_w] + if BACKEND == 'mindspore': + if len(shape) == 2: + pass + else: + shape = shape[::-1] + + initial_value = init(shape=shape) + + if BACKEND == 'dragon': + return initial_value + + var = tl.Variable(initial_value=initial_value, name=var_name, trainable=trainable) + return var + + +@deprecated_alias(printable='verbose', end_support_version=1.9) # TODO remove this line for the 1.9 release +def get_variables_with_name(name=None, train_only=True, verbose=False): + """Get a list of TensorFlow variables by a given name scope. + + Parameters + ---------- + name : str + Get the variables that contain this name. + train_only : boolean + If Ture, only get the trainable variables. + verbose : boolean + If True, print the information of all variables. + + Returns + ------- + list of Tensor + A list of TensorFlow variables + + Examples + -------- + >>> import tensorlayer as tl + >>> dense_vars = tl.layers.get_variables_with_name('dense', True, True) + + """ + if name is None: + raise Exception("please input a name") + + logging.info(" [*] geting variables with %s" % name) + + # tvar = tf.trainable_variables() if train_only else tf.all_variables() + if train_only: + t_vars = tf.compat.v1.trainable_variables() + + else: + t_vars = tf.compat.v1.global_variables() + + d_vars = [var for var in t_vars if name in var.name] + + if verbose: + for idx, v in enumerate(d_vars): + logging.info(" got {:3}: {:15} {}".format(idx, v.name, str(v.get_shape()))) + + return d_vars + + +@deprecated( + date="2018-09-30", instructions="This API is deprecated in favor of `sess.run(tf.global_variables_initializer())`" +) +def initialize_global_variables(sess): + """Initialize the global variables of TensorFlow. + + Run ``sess.run(tf.global_variables_initializer())`` for TF 0.12+ or + ``sess.run(tf.initialize_all_variables())`` for TF 0.11. + + Parameters + ---------- + sess : Session + TensorFlow session. + + """ + if sess is None: + raise AssertionError('The session must be defined') + + sess.run(tf.compat.v1.global_variables_initializer()) + + +def initialize_rnn_state(state, feed_dict=None): + """Returns the initialized RNN state. + The inputs are `LSTMStateTuple` or `State` of `RNNCells`, and an optional `feed_dict`. + + Parameters + ---------- + state : RNN state. + The TensorFlow's RNN state. + feed_dict : dictionary + Initial RNN state; if None, returns zero state. + + Returns + ------- + RNN state + The TensorFlow's RNN state. + + """ + if isinstance(state, LSTMStateTuple): + c = state.c.eval(feed_dict=feed_dict) + h = state.h.eval(feed_dict=feed_dict) + return c, h + else: + new_state = state.eval(feed_dict=feed_dict) + return new_state + + +def list_remove_repeat(x): + """Remove the repeated items in a list, and return the processed list. + You may need it to create merged layer like Concat, Elementwise and etc. + + Parameters + ---------- + x : list + Input + + Returns + ------- + list + A list that after removing it's repeated items + + Examples + ------- + >>> l = [2, 3, 4, 2, 3] + >>> l = list_remove_repeat(l) + [2, 3, 4] + + """ + y = [] + for i in x: + if i not in y: + y.append(i) + + return y + + +def merge_networks(layers=None): + """Merge all parameters, layers and dropout probabilities to a :class:`Layer`. + The output of return network is the first network in the list. + + Parameters + ---------- + layers : list of :class:`Layer` + Merge all parameters, layers and dropout probabilities to the first layer in the list. + + Returns + -------- + :class:`Layer` + The network after merging all parameters, layers and dropout probabilities to the first network in the list. + + Examples + --------- + >>> import tensorlayer as tl + >>> n1 = ... + >>> n2 = ... + >>> n1 = tl.layers.merge_networks([n1, n2]) + + """ + if layers is None: + raise Exception("layers should be a list of TensorLayer's Layers.") + layer = layers[0] + + all_params = [] + all_layers = [] + all_drop = {} + + for l in layers: + all_params.extend(l.all_params) + all_layers.extend(l.all_layers) + all_drop.update(l.all_drop) + + layer.all_params = list(all_params) + layer.all_layers = list(all_layers) + layer.all_drop = dict(all_drop) + + layer.all_layers = list_remove_repeat(layer.all_layers) + layer.all_params = list_remove_repeat(layer.all_params) + + return layer + + +def print_all_variables(train_only=False): + """Print information of trainable or all variables, + without ``tl.layers.initialize_global_variables(sess)``. + + Parameters + ---------- + train_only : boolean + Whether print trainable variables only. + - If True, print the trainable variables. + - If False, print all variables. + + """ + # tvar = tf.trainable_variables() if train_only else tf.all_variables() + if train_only: + t_vars = tf.compat.v1.trainable_variables() + logging.info(" [*] printing trainable variables") + + else: + t_vars = tf.compat.v1.global_variables() + logging.info(" [*] printing global variables") + + for idx, v in enumerate(t_vars): + logging.info(" var {:3}: {:15} {}".format(idx, str(v.get_shape()), v.name)) + + +def quantize(x): + # ref: https://github.com/AngusG/tensorflow-xnor-bnn/blob/master/models/binary_net.py#L70 + # https://github.com/itayhubara/BinaryNet.tf/blob/master/nnUtils.py + with tf.compat.v1.get_default_graph().gradient_override_map({"Sign": "TL_Sign_QuantizeGrad"}): + return tf.sign(x) + + +def quantize_active(x, bitA): + if bitA == 32: + return x + return _quantize_dorefa(x, bitA) + + +def quantize_weight(x, bitW, force_quantization=False): + G = tf.compat.v1.get_default_graph() + if bitW == 32 and not force_quantization: + return x + if bitW == 1: # BWN + with G.gradient_override_map({"Sign": "Identity"}): + E = tf.stop_gradient(tf.reduce_mean(input_tensor=tf.abs(x))) + return tf.sign(x / E) * E + x = tf.clip_by_value(x * 0.5 + 0.5, 0.0, 1.0) # it seems as though most weights are within -1 to 1 region anyways + return 2 * _quantize_dorefa(x, bitW) - 1 + + +def quantize_active_overflow(x, bitA): + if bitA == 32: + return x + return _quantize_overflow(x, bitA) + + +def quantize_weight_overflow(x, bitW): + if bitW == 32: + return x + return _quantize_overflow(x, bitW) + + +@deprecated(date="2018-06-30", instructions="TensorLayer relies on TensorFlow to check name reusing") +def set_name_reuse(enable=True): + logging.warning('this method is DEPRECATED and has no effect, please remove it from your code.') + + +def ternary_operation(x): + """Ternary operation use threshold computed with weights.""" + g = tf.compat.v1.get_default_graph() + with g.gradient_override_map({"Sign": "Identity"}): + threshold = _compute_threshold(x) + x = tf.sign(tf.add(tf.sign(tf.add(x, threshold)), tf.sign(tf.add(x, -threshold)))) + return x + + +########## Module Private Functions ########## + + +@tf.RegisterGradient("TL_Sign_QuantizeGrad") +def _quantize_grad(op, grad): + """Clip and binarize tensor using the straight through estimator (STE) for the gradient.""" + return tf.clip_by_value(grad, -1, 1) + + +def _quantize_dorefa(x, k): + G = tf.compat.v1.get_default_graph() + n = float(2**k - 1) + with G.gradient_override_map({"Round": "Identity"}): + return tf.round(x * n) / n + + +def _quantize_overflow(x, k): + G = tf.compat.v1.get_default_graph() + n = float(2**k - 1) + max_value = tf.reduce_max(input_tensor=x) + min_value = tf.reduce_min(input_tensor=x) + with G.gradient_override_map({"Round": "Identity"}): + step = tf.stop_gradient((max_value - min_value) / n) + return tf.round((tf.maximum(tf.minimum(x, max_value), min_value) - min_value) / step) * step + min_value + + +def _compute_threshold(x): + """ + ref: https://github.com/XJTUWYD/TWN + Computing the threshold. + """ + x_sum = tf.reduce_sum(input_tensor=tf.abs(x), axis=None, keepdims=False, name=None) + # threshold = tf.compat.v1.div(x_sum, tf.cast(tf.size(input=x), tf.float32), name=None) + threshold = tf.math.divide(x_sum, tf.cast(tf.size(input=x), tf.float32), name=None) + threshold = tf.multiply(0.7, threshold, name=None) + return threshold + + +def mean_var_with_update(update_moving_mean, update_moving_variance, mean, variance): + with tf.control_dependencies([update_moving_mean, update_moving_variance]): + return tf.identity(mean), tf.identity(variance) + +def w_fold(w, gama, var, epsilon): + return tf.compat.v1.div(tf.multiply(gama, w), tf.sqrt(var + epsilon)) + +def bias_fold(beta, gama, mean, var, epsilon): + return tf.subtract(beta, tf.compat.v1.div(tf.multiply(gama, mean), tf.sqrt(var + epsilon))) \ No newline at end of file diff --git a/tensorlayer/lazy_imports.py b/tensorlayer/lazy_imports.py new file mode 100644 index 0000000..4a079a4 --- /dev/null +++ b/tensorlayer/lazy_imports.py @@ -0,0 +1,99 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +"""This module provides lazy import functionality to improve the import +performance of nitime. For example, some parts of nitime leverage and import +matplotlib, which is quite a big package, yet most of the nitime code does not +depend on matplotlib. By lazily-loading a module, we defer the overhead of +importing it until the first time it is actually used, thereby speeding up +nitime imports. + +A generic :class:`LazyImport` class is implemented which takes the module name +as a parameter, and acts as a proxy for that module, importing it only when +the module is used, but effectively acting as the module in every other way +(including inside IPython with respect to introspection and tab completion) +with the *exception* of reload() - reloading a :class:`LazyImport` raises an +:class:`ImportError`. + +Commonly used nitime lazy imports are also defined in :mod:`nitime.lazy`, so +they can be reused throughout nitime. +""" +import os +import sys +import types + + +class LazyImport(types.ModuleType): + """ + This class takes the module name as a parameter, and acts as a proxy for + that module, importing it only when the module is used, but effectively + acting as the module in every other way (including inside IPython with + respect to introspection and tab completion) with the *exception* of + reload()- reloading a :class:`LazyImport` raises an :class:`ImportError`. + + >>> mlab = LazyImport('matplotlib.mlab') + + No import happens on the above line, until we do something like call an + ``mlab`` method or try to do tab completion or introspection on ``mlab`` + in IPython. + + >>> mlab + + + Now the :class:`LazyImport` will do an actual import, and call the dist + function of the imported module. + + >>> mlab.dist(1969,2011) + 42.0 + """ + + def __getattribute__(self, x): + # This method will be called only once, since we'll change + # self.__class__ to LoadedLazyImport, and __getattribute__ will point + # to module.__getattribute__ + + name = object.__getattribute__(self, '__name__') + __import__(name) + + # if name above is 'package.foo.bar', package is returned, the docs + # recommend that in order to get back the full thing, that we import + # and then lookup the full name is sys.modules, see: + # http://docs.python.org/library/functions.html#__import__ + + module = sys.modules[name] + + # Now that we've done the import, cutout the middleman and make self + # act as the imported module + + class LoadedLazyImport(types.ModuleType): + __getattribute__ = module.__getattribute__ + __repr__ = module.__repr__ + + object.__setattr__(self, '__class__', LoadedLazyImport) + + # The next line will make "reload(l)" a silent no-op + return module.__getattribute__(x) + + def __repr__(self): + return "" % object.__getattribute__(self, '__name__') + + +if 'READTHEDOCS' in os.environ: + lazy_doc = """ + WARNING: To get Sphinx documentation to build we disable + LazyImports, which makes Sphinx incorrectly report this + class as having a base class of object. In reality, + :class:`LazyImport`'s base class is + :class:`types.ModuleType`. + """ + + lazy_doc += LazyImport.__doc__ + + class LazyImport(object): + __doc__ = lazy_doc + + def __init__(self, x): + __import__(x) + self.module = sys.modules[x] + + def __getattr__(self, x): + return self.module.__getattribute__(x) diff --git a/tensorlayer/logging/__init__.py b/tensorlayer/logging/__init__.py new file mode 100644 index 0000000..e3c0dac --- /dev/null +++ b/tensorlayer/logging/__init__.py @@ -0,0 +1,34 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +TensorLayer provides rich layer implementations trailed for +various benchmarks and domain-specific problems. In addition, we also +support transparent access to native TensorFlow parameters. +For example, we provide not only layers for local response normalization, but also +layers that allow user to apply ``tf.ops.lrn`` on ``network.outputs``. +More functions can be found in `TensorFlow API `__. +""" + +from tensorlayer.lazy_imports import LazyImport + +from .tl_logging import * + +# Lazy Imports +contrib = LazyImport("tensorlayer.logging.contrib") + +__all__ = [ + # tl_logging + 'DEBUG', + 'debug', + 'ERROR', + 'error', + 'FATAL', + 'fatal', + 'INFO', + 'info', + 'WARN', + 'warn', + 'warning', + 'set_verbosity', + 'get_verbosity' +] diff --git a/tensorlayer/logging/contrib/__init__.py b/tensorlayer/logging/contrib/__init__.py new file mode 100644 index 0000000..69a3ccb --- /dev/null +++ b/tensorlayer/logging/contrib/__init__.py @@ -0,0 +1,12 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +TensorLayer provides rich layer implementations trailed for +various benchmarks and domain-specific problems. In addition, we also +support transparent access to native TensorFlow parameters. +For example, we provide not only layers for local response normalization, but also +layers that allow user to apply ``tf.ops.lrn`` on ``network.outputs``. +More functions can be found in `TensorFlow API `__. +""" + +from .hyperdash import * diff --git a/tensorlayer/logging/contrib/hyperdash.py b/tensorlayer/logging/contrib/hyperdash.py new file mode 100644 index 0000000..7c21e65 --- /dev/null +++ b/tensorlayer/logging/contrib/hyperdash.py @@ -0,0 +1,63 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + +import hyperdash as hd +import tensorlayer as tl + +__all__ = ["HyperDashHandler", "monitor", "Experiment", "IPythonMagicsWrapper"] + + +class HyperDashHandler(object): + apikey = None + + @classmethod + def reset_apikey(cls): + cls.apikey = None + + @classmethod + def set_apikey(cls, apikey): + cls.apikey = apikey + + @classmethod + def get_apikey(cls): + + if cls.apikey is None: + raise ValueError( + "Hyperdash API is not set.\n" + "You can obtain your API Key using: `hyperdash login --email` or `hyperdash login --github`\n" + "You should first call `HyperDashHandler.set_apikey('my_api_key')` in order to use `hyperdash`" + ) + + tl.logging.debug("Hyperdash API Key: %s" % cls.apikey) + + return cls.apikey + + @classmethod + def monitor(cls, model_name, api_key=None, capture_io=True): + + if api_key is not None: + cls.set_apikey(api_key) + + return hd.monitor(model_name, api_key_getter=cls.get_apikey, capture_io=capture_io) + + +class Experiment(hd.Experiment): + + def __init__( + self, + model_name, + api_key=None, + capture_io=True, + ): + + if api_key is not None: + HyperDashHandler.set_apikey(api_key) + + super(Experiment, + self).__init__(model_name=model_name, api_key_getter=HyperDashHandler.get_apikey, capture_io=capture_io) + + +monitor = HyperDashHandler.monitor +IPythonMagicsWrapper = hd.IPythonMagicsWrapper diff --git a/tensorlayer/logging/tl_logging.py b/tensorlayer/logging/tl_logging.py new file mode 100644 index 0000000..415fcd3 --- /dev/null +++ b/tensorlayer/logging/tl_logging.py @@ -0,0 +1,262 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import logging as _logging +import os as _os +import sys as _sys +import threading +import time as _time +from logging import DEBUG, ERROR, FATAL, INFO, WARN + +import six + +from tensorlayer.decorators import deprecated + +__all__ = [ + 'DEBUG', + 'debug', + 'ERROR', + 'error', + 'FATAL', + 'fatal', + 'INFO', + 'info', + 'WARN', + 'warning', + 'warn', # Deprecated + 'set_verbosity', + 'get_verbosity' +] + +# Don't use this directly. Use _get_logger() instead. +_logger = None +_logger_lock = threading.Lock() + +_level_names = { + FATAL: 'FATAL', + ERROR: 'ERROR', + WARN: 'WARN', + INFO: 'INFO', + DEBUG: 'DEBUG', +} + + +def _get_logger(): + global _logger + + # Use double-checked locking to avoid taking lock unnecessarily. + if _logger is not None: + return _logger + + _logger_lock.acquire() + + try: + if _logger: + return _logger + + # Scope the TensorFlow logger to not conflict with users' loggers. + logger = _logging.getLogger('tensorlayer') + + # Don't further configure the TensorFlow logger if the root logger is + # already configured. This prevents double logging in those cases. + if not _logging.getLogger().handlers: + # Determine whether we are in an interactive environment + # This is only defined in interactive shells. + if hasattr(_sys, "ps1"): + _interactive = True + else: + _interactive = _sys.flags.interactive + + # If we are in an interactive environment (like Jupyter), set loglevel + # to INFO and pipe the output to stdout. + if _interactive: + logger.setLevel(INFO) + _logging_target = _sys.stdout + else: + _logging_target = _sys.stderr + + # Add the output handler. + _handler = _logging.StreamHandler(_logging_target) + _handler.setFormatter(_logging.Formatter('[TL] %(message)s')) + logger.addHandler(_handler) + + _logger = logger + return _logger + + finally: + _logger_lock.release() + + +def log(level, msg, *args, **kwargs): + _get_logger().log(level, msg, *args, **kwargs) + + +def debug(msg, *args, **kwargs): + _get_logger().debug(msg, *args, **kwargs) + + +def info(msg, *args, **kwargs): + _get_logger().info(msg, *args, **kwargs) + + +def error(msg, *args, **kwargs): + _get_logger().error("ERROR: %s" % msg, *args, **kwargs) + + +def fatal(msg, *args, **kwargs): + _get_logger().fatal("FATAL: %s" % msg, *args, **kwargs) + + +@deprecated(date="2018-09-30", instructions="This API is deprecated. Please use as `tl.logging.warning`") +def warn(msg, *args, **kwargs): + warning(msg, *args, **kwargs) + + +def warning(msg, *args, **kwargs): + _get_logger().warning("WARNING: %s" % msg, *args, **kwargs) + + +# Mask to convert integer thread ids to unsigned quantities for logging +# purposes +_THREAD_ID_MASK = 2 * _sys.maxsize + 1 + +_log_prefix = None # later set to google2_log_prefix + +# Counter to keep track of number of log entries per token. +_log_counter_per_token = {} + + +def TaskLevelStatusMessage(msg): + error(msg) + + +def flush(): + raise NotImplementedError() + + +def vlog(level, msg, *args, **kwargs): + _get_logger().log(level, msg, *args, **kwargs) + + +def _GetNextLogCountPerToken(token): + """Wrapper for _log_counter_per_token. + + Args: + token: The token for which to look up the count. + + Returns: + The number of times this function has been called with + *token* as an argument (starting at 0) + """ + global _log_counter_per_token # pylint: disable=global-variable-not-assigned + _log_counter_per_token[token] = 1 + _log_counter_per_token.get(token, -1) + return _log_counter_per_token[token] + + +def log_every_n(level, msg, n, *args): + """Log 'msg % args' at level 'level' once per 'n' times. + + Logs the 1st call, (N+1)st call, (2N+1)st call, etc. + Not threadsafe. + + Args: + level: The level at which to log. + msg: The message to be logged. + n: The number of times this should be called before it is logged. + *args: The args to be substituted into the msg. + """ + count = _GetNextLogCountPerToken(_GetFileAndLine()) + log_if(level, msg, not (count % n), *args) + + +def log_first_n(level, msg, n, *args): # pylint: disable=g-bad-name + """Log 'msg % args' at level 'level' only first 'n' times. + + Not threadsafe. + + Args: + level: The level at which to log. + msg: The message to be logged. + n: The number of times this should be called before it is logged. + *args: The args to be substituted into the msg. + """ + count = _GetNextLogCountPerToken(_GetFileAndLine()) + log_if(level, msg, count < n, *args) + + +def log_if(level, msg, condition, *args): + """Log 'msg % args' at level 'level' only if condition is fulfilled.""" + if condition: + vlog(level, msg, *args) + + +def _GetFileAndLine(): + """Returns (filename, linenumber) for the stack frame.""" + # Use sys._getframe(). This avoids creating a traceback object. + # pylint: disable=protected-access + f = _sys._getframe() + # pylint: enable=protected-access + our_file = f.f_code.co_filename + f = f.f_back + while f: + code = f.f_code + if code.co_filename != our_file: + return (code.co_filename, f.f_lineno) + f = f.f_back + return ('', 0) + + +def google2_log_prefix(level, timestamp=None, file_and_line=None): + """Assemble a logline prefix using the google2 format.""" + # pylint: disable=global-variable-not-assigned + global _level_names + # pylint: enable=global-variable-not-assigned + + # Record current time + now = timestamp or _time.time() + now_tuple = _time.localtime(now) + now_microsecond = int(1e6 * (now % 1.0)) + + (filename, line) = file_and_line or _GetFileAndLine() + basename = _os.path.basename(filename) + + # Severity string + severity = 'I' + if level in _level_names: + severity = _level_names[level][0] + + s = '%c%02d%02d %02d: %02d: %02d.%06d %5d %s: %d] ' % ( + severity, + now_tuple[1], # month + now_tuple[2], # day + now_tuple[3], # hour + now_tuple[4], # min + now_tuple[5], # sec + now_microsecond, + _get_thread_id(), + basename, + line + ) + + return s + + +def get_verbosity(): + """Return how much logging output will be produced.""" + return _get_logger().getEffectiveLevel() + + +def set_verbosity(v): + """Sets the threshold for what messages will be logged.""" + _get_logger().setLevel(v) + + +def _get_thread_id(): + """Get id of current thread, suitable for logging as an unsigned quantity.""" + # pylint: disable=protected-access + thread_id = six.moves._thread.get_ident() + # pylint:enable=protected-access + return thread_id & _THREAD_ID_MASK + + +_log_prefix = google2_log_prefix diff --git a/tensorlayer/models/__init__.py b/tensorlayer/models/__init__.py new file mode 100644 index 0000000..2ebf9f0 --- /dev/null +++ b/tensorlayer/models/__init__.py @@ -0,0 +1,12 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +# """A collections of pre-defined well known models.""" + +from .core import * +# from .resnet import ResNet50 +# from .mobilenetv1 import MobileNetV1 +# from .squeezenetv1 import SqueezeNetV1 +# from .vgg import * +# from .seq2seq import Seq2seq +# from .seq2seq_with_attention import Seq2seqLuongAttention diff --git a/tensorlayer/models/core.py b/tensorlayer/models/core.py new file mode 100644 index 0000000..15b5439 --- /dev/null +++ b/tensorlayer/models/core.py @@ -0,0 +1,392 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from collections.abc import Iterable +from tensorlayer.files import utils +from tensorlayer import logging +import tensorlayer as tl +from tensorlayer.layers.core import Module +import numpy as np +import os +import time + +if tl.BACKEND == 'tensorflow': + import tensorflow as tf +if tl.BACKEND == 'mindspore': + import mindspore as ms + from mindspore.ops import composite + from mindspore.ops import operations as P + from mindspore.ops import functional as F + # from mindspore.parallel._utils import (_get_device_num, _get_mirror_mean, _get_parallel_mode) + # from mindspore.train.parallel_utils import ParallelMode + from mindspore.nn.wrap import DistributedGradReducer + from mindspore.common import ParameterTuple + + +class Model: + """ + High-Level API for Training or Testing. + + `Model` groups layers into an object with training and inference features. + + Args: + network : The training or testing network. + loss_fn : Objective function, if loss_fn is None, the + network should contain the logic of loss and grads calculation, and the logic + of parallel if needed. Default: None. + optimizer : Optimizer for updating the weights. Default: None. + metrics (Union[dict, set]): Dict or set of metrics to be evaluated by the model during + training and testing. eg: {'accuracy', 'recall'}. Default: None. + eval_network (Cell): Network for evaluation. If not defined, `network` and `loss_fn` would be wrapped as + `eval_network`. Default: None. + eval_indexes (list): In case of defining the `eval_network`, if `eval_indexes` is None, all outputs of + `eval_network` would be passed to metrics, otherwise `eval_indexes` must contain three + elements, representing the positions of loss value, predict value and label, the loss + value would be passed to `Loss` metric, predict value and label would be passed to other + metric. Default: None. + amp_level (str): Option for argument `level` in `mindspore.amp.build_train_network`, level for mixed + precision training. Supports [O0, O2, O3]. Default: "O0". + + - O0: Do not change. + - O2: Cast network to float16, keep batchnorm run in float32, using dynamic loss scale. + - O3: Cast network to float16, with additional property 'keep_batchnorm_fp32=False'. + + O2 is recommended on GPU, O3 is recommended on Ascend. + + loss_scale_manager (Union[None, LossScaleManager]): If None, not scale the loss, or else + scale the loss by LossScaleManager. If it is set, overwrite the level setting. It's a eyword argument. + e.g. Use `loss_scale_manager=None` to set the value. + keep_batchnorm_fp32 (bool): Keep Batchnorm run in `float32`. If set, overwrite the level setting. Default: True. + + Examples: + >>> import tensorlayer as tl + >>> class Net(Module): + >>> def __init__(self): + >>> super(Net, self).__init__() + >>> self.conv = tl.layers.Conv2d(n_filter=32, filter_size=(3, 3), strides=(2, 2), in_channels=5, name='conv2d') + >>> self.bn = tl.layers.BatchNorm2d(num_features=32, act=tl.ReLU) + >>> self.flatten = tl.layers.Flatten() + >>> self.fc = tl.layers.Dense(n_units=12, in_channels=32*224*224) # padding=0 + >>> + >>> def construct(self, x): + >>> x = self.conv(x) + >>> x = self.bn(x) + >>> x = self.flatten(x) + >>> out = self.fc(x) + >>> return out + >>> + >>> net = Net() + >>> loss = tl.cost.SoftmaxCrossEntropyWithLogits(is_grad=False, sparse=True) + >>> optim = tl.layers.Momentum(params=net.trainable_weights, learning_rate=0.1, momentum=0.9) + >>> model = Model(net, loss_fn=loss, optimizer=optim, metrics=None) + >>> dataset = get_dataset() + >>> model.train(2, dataset) + """ + + def __init__( + self, network, loss_fn=None, optimizer=None, metrics=None, eval_network=None, eval_indexes=None, amp_level="O0", + **kwargs + ): + self.network = network + self.loss_fn = loss_fn + self.optimizer = optimizer + self.metrics = metrics + self.all_weights = network.all_weights + self.train_weights = self.network.trainable_weights + + def train(self, n_epoch, train_dataset=None, test_dataset=False, print_train_batch=False, print_freq=5): + if not isinstance(train_dataset, Iterable): + raise Exception("Expected type in (train_dataset, Iterable), but got {}.".format(type(train_dataset))) + + if tl.BACKEND == 'tensorflow': + self.tf_train( + n_epoch=n_epoch, train_dataset=train_dataset, network=self.network, loss_fn=self.loss_fn, + train_weights=self.train_weights, optimizer=self.optimizer, metrics=self.metrics, + print_train_batch=print_train_batch, print_freq=print_freq, test_dataset=test_dataset + ) + elif tl.BACKEND == 'mindspore': + self.ms_train( + n_epoch=n_epoch, train_dataset=train_dataset, network=self.network, loss_fn=self.loss_fn, + train_weights=self.train_weights, optimizer=self.optimizer, metrics=self.metrics, + print_train_batch=print_train_batch, print_freq=print_freq, test_dataset=test_dataset + ) + + def eval(self, test_dataset): + self.network.eval() + test_loss, test_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in test_dataset: + _logits = self.network(X_batch) + test_loss += self.loss_fn(_logits, y_batch) + if self.metrics: + test_acc += self.metrics(_logits, y_batch) + else: + test_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 + print(" test loss: {}".format(test_loss / n_iter)) + print(" test acc: {}".format(test_acc / n_iter)) + + def save_weights(self, file_path, format=None): + """Input file_path, save model weights into a file of given format. + Use self.load_weights() to restore. + + Parameters + ---------- + file_path : str + Filename to which the model weights will be saved. + format : str or None + Saved file format. + Value should be None, 'hdf5', 'npz', 'npz_dict' or 'ckpt'. Other format is not supported now. + 1) If this is set to None, then the postfix of file_path will be used to decide saved format. + If the postfix is not in ['h5', 'hdf5', 'npz', 'ckpt'], then file will be saved in hdf5 format by default. + 2) 'hdf5' will save model weights name in a list and each layer has its weights stored in a group of + the hdf5 file. + 3) 'npz' will save model weights sequentially into a npz file. + 4) 'npz_dict' will save model weights along with its name as a dict into a npz file. + 5) 'ckpt' will save model weights into a tensorflow ckpt file. + + Default None. + + Examples + -------- + 1) Save model weights in hdf5 format by default. + >>> net = vgg16() + >>> net.save_weights('./model.h5') + ... + >>> net.load_weights('./model.h5') + + 2) Save model weights in npz/npz_dict format + >>> net = vgg16() + >>> net.save_weights('./model.npz') + >>> net.save_weights('./model.npz', format='npz_dict') + + """ + + # self.all_weights = self.network.all_weights + if self.all_weights is None or len(self.all_weights) == 0: + logging.warning("Model contains no weights or layers haven't been built, nothing will be saved") + return + + if format is None: + postfix = file_path.split('.')[-1] + if postfix in ['h5', 'hdf5', 'npz', 'ckpt']: + format = postfix + else: + format = 'hdf5' + + if format == 'hdf5' or format == 'h5': + utils.save_weights_to_hdf5(file_path, self) + elif format == 'npz': + utils.save_npz(self.all_weights, file_path) + elif format == 'npz_dict': + utils.save_npz_dict(self.all_weights, file_path) + elif format == 'ckpt': + # TODO: enable this when tf save ckpt is enabled + raise NotImplementedError("ckpt load/save is not supported now.") + else: + raise ValueError( + "Save format must be 'hdf5', 'npz', 'npz_dict' or 'ckpt'." + "Other format is not supported now." + ) + + def load_weights(self, file_path, format=None, in_order=True, skip=False): + """Load model weights from a given file, which should be previously saved by self.save_weights(). + + Parameters + ---------- + file_path : str + Filename from which the model weights will be loaded. + format : str or None + If not specified (None), the postfix of the file_path will be used to decide its format. If specified, + value should be 'hdf5', 'npz', 'npz_dict' or 'ckpt'. Other format is not supported now. + In addition, it should be the same format when you saved the file using self.save_weights(). + Default is None. + in_order : bool + Allow loading weights into model in a sequential way or by name. Only useful when 'format' is 'hdf5'. + If 'in_order' is True, weights from the file will be loaded into model in a sequential way. + If 'in_order' is False, weights from the file will be loaded into model by matching the name + with the weights of the model, particularly useful when trying to restore model in eager(graph) mode from + a weights file which is saved in graph(eager) mode. + Default is True. + skip : bool + Allow skipping weights whose name is mismatched between the file and model. Only useful when 'format' is + 'hdf5' or 'npz_dict'. If 'skip' is True, 'in_order' argument will be ignored and those loaded weights + whose name is not found in model weights (self.all_weights) will be skipped. If 'skip' is False, error will + occur when mismatch is found. + Default is False. + + Examples + -------- + 1) load model from a hdf5 file. + >>> net = tl.models.vgg16() + >>> net.load_weights('./model_graph.h5', in_order=False, skip=True) # load weights by name, skipping mismatch + >>> net.load_weights('./model_eager.h5') # load sequentially + + 2) load model from a npz file + >>> net.load_weights('./model.npz') + + 2) load model from a npz file, which is saved as npz_dict previously + >>> net.load_weights('./model.npz', format='npz_dict') + + Notes + ------- + 1) 'in_order' is only useful when 'format' is 'hdf5'. If you are trying to load a weights file which is + saved in a different mode, it is recommended to set 'in_order' be True. + 2) 'skip' is useful when 'format' is 'hdf5' or 'npz_dict'. If 'skip' is True, + 'in_order' argument will be ignored. + + """ + if not os.path.exists(file_path): + raise FileNotFoundError("file {} doesn't exist.".format(file_path)) + + if format is None: + format = file_path.split('.')[-1] + + if format == 'hdf5' or format == 'h5': + if skip ==True or in_order == False: + # load by weights name + utils.load_hdf5_to_weights(file_path, self, skip) + else: + # load in order + utils.load_hdf5_to_weights_in_order(file_path, self) + elif format == 'npz': + utils.load_and_assign_npz(file_path, self) + elif format == 'npz_dict': + utils.load_and_assign_npz_dict(file_path, self, skip) + elif format == 'ckpt': + # TODO: enable this when tf save ckpt is enabled + raise NotImplementedError("ckpt load/save is not supported now.") + else: + raise ValueError( + "File format must be 'hdf5', 'npz', 'npz_dict' or 'ckpt'. " + "Other format is not supported now." + ) + + def tf_train( + self, n_epoch, train_dataset, network, loss_fn, train_weights, optimizer, metrics, print_train_batch, + print_freq, test_dataset + ): + for epoch in range(n_epoch): + start_time = time.time() + + train_loss, train_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in train_dataset: + network.set_train() + + with tf.GradientTape() as tape: + # compute outputs + _logits = network(X_batch) + # compute loss and update model + _loss_ce = loss_fn(_logits, y_batch) + + grad = tape.gradient(_loss_ce, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + + train_loss += _loss_ce + if metrics: + train_acc += metrics(_logits, y_batch) + else: + train_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 + + if print_train_batch: + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + print(" train loss: {}".format(train_loss / n_iter)) + print(" train acc: {}".format(train_acc / n_iter)) + + if epoch + 1 == 1 or (epoch + 1) % print_freq == 0: + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + print(" train loss: {}".format(train_loss / n_iter)) + print(" train acc: {}".format(train_acc / n_iter)) + + if test_dataset: + # use training and evaluation sets to evaluate the model every print_freq epoch + if epoch + 1 == 1 or (epoch + 1) % print_freq == 0: + network.eval() + val_loss, val_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in test_dataset: + _logits = network(X_batch) # is_train=False, disable dropout + val_loss += loss_fn(_logits, y_batch, name='eval_loss') + if metrics: + val_acc += metrics(_logits, y_batch) + else: + val_acc += np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + n_iter += 1 + print(" val loss: {}".format(val_loss / n_iter)) + print(" val acc: {}".format(val_acc / n_iter)) + + def ms_train( + self, n_epoch, train_dataset, network, loss_fn, train_weights, optimizer, metrics, print_train_batch, + print_freq, test_dataset + ): + net_with_criterion = WithLoss(network, loss_fn) + train_network = GradWrap(net_with_criterion) + train_network.set_train() + for epoch in range(n_epoch): + start_time = time.time() + train_loss, train_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in train_dataset: + output = network(X_batch) + loss_output = loss_fn(output, y_batch) + grads = train_network(X_batch, y_batch) + success = optimizer.apply_gradients(zip(grads, train_weights)) + loss = loss_output.asnumpy() + train_loss += loss + if metrics: + train_acc += metrics(output, y_batch) + else: + train_acc += np.mean((P.Equal()(P.Argmax(axis=1)(output), y_batch).asnumpy())) + n_iter += 1 + + if print_train_batch: + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + print(" train loss: {}".format(train_loss / n_iter)) + print(" train acc: {}".format(train_acc / n_iter)) + + if epoch + 1 == 1 or (epoch + 1) % print_freq == 0: + print("Epoch {} of {} took {}".format(epoch + 1, n_epoch, time.time() - start_time)) + print(" train loss: {}".format(train_loss / n_iter)) + print(" train acc: {}".format(train_acc / n_iter)) + + if test_dataset: + # use training and evaluation sets to evaluate the model every print_freq epoch + if epoch + 1 == 1 or (epoch + 1) % print_freq == 0: + network.eval() + val_loss, val_acc, n_iter = 0, 0, 0 + for X_batch, y_batch in test_dataset: + _logits = network(X_batch) + val_loss += loss_fn(_logits, y_batch, name='eval_loss') + if metrics: + val_acc += metrics(_logits, y_batch) + else: + val_acc += np.mean((P.Equal()(P.Argmax(axis=1)(output), y_batch).asnumpy())) + n_iter += 1 + print(" val loss: {}".format(val_loss / n_iter)) + print(" val acc: {}".format(val_acc / n_iter)) + + +class WithLoss(Module): + + def __init__(self, backbone, loss_fn): + super(WithLoss, self).__init__() + self._backbone = backbone + self._loss_fn = loss_fn + + def construct(self, data, label): + out = self._backbone(data) + return self._loss_fn(out, label) + + @property + def backbone_network(self): + return self._backbone + + +class GradWrap(Module): + """ GradWrap definition """ + + def __init__(self, network): + super(GradWrap, self).__init__(auto_prefix=False) + self.network = network + self.weights = ParameterTuple(network.trainable_weights) + + def forward(self, x, label): + return composite.GradOperation(get_by_list=True)(self.network, self.weights)(x, label) diff --git a/tensorlayer/models/models/resnet50_weights_tf_dim_ordering_tf_kernels.h5 b/tensorlayer/models/models/resnet50_weights_tf_dim_ordering_tf_kernels.h5 new file mode 100644 index 0000000000000000000000000000000000000000..904349fea3fbc3f8267a7cc70c5b7d7f464781e5 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/tensorlayer/nlp.py b/tensorlayer/nlp.py new file mode 100644 index 0000000..1f22584 --- /dev/null +++ b/tensorlayer/nlp.py @@ -0,0 +1,1174 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import collections +import os +import random +import re +import subprocess +import tempfile +import warnings +from collections import Counter + +import numpy as np +import six as _six +import tensorflow as tf +from six.moves import urllib, xrange +from tensorflow.python.platform import gfile + +import tensorlayer as tl +from tensorlayer.lazy_imports import LazyImport + +nltk = LazyImport("nltk") + +__all__ = [ + 'generate_skip_gram_batch', + 'sample', + 'sample_top', + 'SimpleVocabulary', + 'Vocabulary', + 'process_sentence', + 'create_vocab', + 'simple_read_words', + 'read_words', + 'read_analogies_file', + 'build_vocab', + 'build_reverse_dictionary', + 'build_words_dataset', + 'words_to_word_ids', + 'word_ids_to_words', + 'save_vocab', + 'basic_tokenizer', + 'create_vocabulary', + 'initialize_vocabulary', + 'sentence_to_token_ids', + 'data_to_token_ids', + 'moses_multi_bleu', +] + + +def as_bytes(bytes_or_text, encoding='utf-8'): + """Converts either bytes or unicode to `bytes`, using utf-8 encoding for text. + Args: + bytes_or_text: A `bytes`, `str`, or `unicode` object. + encoding: A string indicating the charset for encoding unicode. + Returns: + A `bytes` object. + Raises: + TypeError: If `bytes_or_text` is not a binary or unicode string. + """ + if isinstance(bytes_or_text, _six.text_type): + return bytes_or_text.encode(encoding) + elif isinstance(bytes_or_text, bytes): + return bytes_or_text + else: + raise TypeError('Expected binary or unicode string, got %r' % (bytes_or_text, )) + + +def as_text(bytes_or_text, encoding='utf-8'): + """Returns the given argument as a unicode string. + Args: + bytes_or_text: A `bytes`, `str`, or `unicode` object. + encoding: A string indicating the charset for decoding unicode. + Returns: + A `unicode` (Python 2) or `str` (Python 3) object. + Raises: + TypeError: If `bytes_or_text` is not a binary or unicode string. + """ + if isinstance(bytes_or_text, _six.text_type): + return bytes_or_text + elif isinstance(bytes_or_text, bytes): + return bytes_or_text.decode(encoding) + else: + raise TypeError('Expected binary or unicode string, got %r' % bytes_or_text) + + +def generate_skip_gram_batch(data, batch_size, num_skips, skip_window, data_index=0): + """Generate a training batch for the Skip-Gram model. + + See `Word2Vec example `__. + + Parameters + ---------- + data : list of data + To present context, usually a list of integers. + batch_size : int + Batch size to return. + num_skips : int + How many times to reuse an input to generate a label. + skip_window : int + How many words to consider left and right. + data_index : int + Index of the context location. This code use `data_index` to instead of yield like ``tl.iterate``. + + Returns + ------- + batch : list of data + Inputs. + labels : list of data + Labels + data_index : int + Index of the context location. + + Examples + -------- + Setting num_skips=2, skip_window=1, use the right and left words. + In the same way, num_skips=4, skip_window=2 means use the nearby 4 words. + + >>> data = [1,2,3,4,5,6,7,8,9,10,11] + >>> batch, labels, data_index = tl.nlp.generate_skip_gram_batch(data=data, batch_size=8, num_skips=2, skip_window=1, data_index=0) + >>> print(batch) + [2 2 3 3 4 4 5 5] + >>> print(labels) + [[3] + [1] + [4] + [2] + [5] + [3] + [4] + [6]] + + """ + # global data_index # you can put data_index outside the function, then + # modify the global data_index in the function without return it. + # note: without using yield, this code use data_index to instead. + + if batch_size % num_skips != 0: + raise Exception("batch_size should be able to be divided by num_skips.") + if num_skips > 2 * skip_window: + raise Exception("num_skips <= 2 * skip_window") + batch = np.ndarray(shape=(batch_size), dtype=np.int32) + labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32) + span = 2 * skip_window + 1 # [ skip_window target skip_window ] + buffer = collections.deque(maxlen=span) + for _ in range(span): + buffer.append(data[data_index]) + data_index = (data_index + 1) % len(data) + for i in range(batch_size // num_skips): + target = skip_window # target label at the center of the buffer + targets_to_avoid = [skip_window] + for j in range(num_skips): + while target in targets_to_avoid: + target = random.randint(0, span - 1) + targets_to_avoid.append(target) + batch[i * num_skips + j] = buffer[skip_window] + labels[i * num_skips + j, 0] = buffer[target] + buffer.append(data[data_index]) + data_index = (data_index + 1) % len(data) + return batch, labels, data_index + + +def sample(a=None, temperature=1.0): + """Sample an index from a probability array. + + Parameters + ---------- + a : list of float + List of probabilities. + temperature : float or None + The higher the more uniform. When a = [0.1, 0.2, 0.7], + - temperature = 0.7, the distribution will be sharpen [0.05048273, 0.13588945, 0.81362782] + - temperature = 1.0, the distribution will be the same [0.1, 0.2, 0.7] + - temperature = 1.5, the distribution will be filtered [0.16008435, 0.25411807, 0.58579758] + - If None, it will be ``np.argmax(a)`` + + Notes + ------ + - No matter what is the temperature and input list, the sum of all probabilities will be one. Even if input list = [1, 100, 200], the sum of all probabilities will still be one. + - For large vocabulary size, choice a higher temperature or ``tl.nlp.sample_top`` to avoid error. + + """ + if a is None: + raise Exception("a : list of float") + b = np.copy(a) + try: + if temperature == 1: + return np.argmax(np.random.multinomial(1, a, 1)) + if temperature is None: + return np.argmax(a) + else: + a = np.log(a) / temperature + a = np.exp(a) / np.sum(np.exp(a)) + return np.argmax(np.random.multinomial(1, a, 1)) + except Exception: + # np.set_printoptions(threshold=np.nan) + # tl.logging.info(a) + # tl.logging.info(np.sum(a)) + # tl.logging.info(np.max(a)) + # tl.logging.info(np.min(a)) + # exit() + message = "For large vocabulary_size, choice a higher temperature\ + to avoid log error. Hint : use ``sample_top``. " + + warnings.warn(message, Warning) + # tl.logging.info(a) + # tl.logging.info(b) + return np.argmax(np.random.multinomial(1, b, 1)) + + +def sample_top(a=None, top_k=10): + """Sample from ``top_k`` probabilities. + + Parameters + ---------- + a : list of float + List of probabilities. + top_k : int + Number of candidates to be considered. + + """ + if a is None: + a = [] + + idx = np.argpartition(a, -top_k)[-top_k:] + probs = a[idx] + # tl.logging.info("new %f" % probs) + probs = probs / np.sum(probs) + choice = np.random.choice(idx, p=probs) + return choice + # old implementation + # a = np.array(a) + # idx = np.argsort(a)[::-1] + # idx = idx[:top_k] + # # a = a[idx] + # probs = a[idx] + # tl.logging.info("prev %f" % probs) + # # probs = probs / np.sum(probs) + # # choice = np.random.choice(idx, p=probs) + # # return choice + + +# Vector representations of words (Advanced) UNDOCUMENT +class SimpleVocabulary(object): + """Simple vocabulary wrapper, see create_vocab(). + + Parameters + ------------ + vocab : dictionary + A dictionary that maps word to ID. + unk_id : int + The ID for 'unknown' word. + + """ + + def __init__(self, vocab, unk_id): + """Initialize the vocabulary.""" + self._vocab = vocab + self._unk_id = unk_id + + def word_to_id(self, word): + """Returns the integer id of a word string.""" + if word in self._vocab: + return self._vocab[word] + else: + return self._unk_id + + +class Vocabulary(object): + """Create Vocabulary class from a given vocabulary and its id-word, word-id convert. + See create_vocab() and ``tutorial_tfrecord3.py``. + + Parameters + ----------- + vocab_file : str + The file contains the vocabulary (can be created via ``tl.nlp.create_vocab``), where the words are the first whitespace-separated token on each line (other tokens are ignored) and the word ids are the corresponding line numbers. + start_word : str + Special word denoting sentence start. + end_word : str + Special word denoting sentence end. + unk_word : str + Special word denoting unknown words. + + Attributes + ------------ + vocab : dictionary + A dictionary that maps word to ID. + reverse_vocab : list of int + A list that maps ID to word. + start_id : int + For start ID. + end_id : int + For end ID. + unk_id : int + For unknown ID. + pad_id : int + For Padding ID. + + Examples + ------------- + The vocab file looks like follow, includes `start_word` , `end_word` ... + + >>> a 969108 + >>> 586368 + >>> 586368 + >>> . 440479 + >>> on 213612 + >>> of 202290 + >>> the 196219 + >>> in 182598 + >>> with 152984 + >>> and 139109 + >>> is 97322 + + """ + + def __init__(self, vocab_file, start_word="", end_word="", unk_word="", pad_word=""): + if not tf.io.gfile.exists(vocab_file): + tl.logging.fatal("Vocab file %s not found." % vocab_file) + tl.logging.info("Initializing vocabulary from file: %s" % vocab_file) + + with tf.io.gfile.GFile(vocab_file, mode="r") as f: + reverse_vocab = list(f.readlines()) + reverse_vocab = [line.split()[0] for line in reverse_vocab] + # assert start_word in reverse_vocab + # assert end_word in reverse_vocab + if start_word not in reverse_vocab: # haodong + reverse_vocab.append(start_word) + if end_word not in reverse_vocab: + reverse_vocab.append(end_word) + if unk_word not in reverse_vocab: + reverse_vocab.append(unk_word) + if pad_word not in reverse_vocab: + reverse_vocab.append(pad_word) + + vocab = dict([(x, y) for (y, x) in enumerate(reverse_vocab)]) + + tl.logging.info("Vocabulary from %s : %s %s %s" % (vocab_file, start_word, end_word, unk_word)) + tl.logging.info(" vocabulary with %d words (includes start_word, end_word, unk_word)" % len(vocab)) + # tl.logging.info(" vocabulary with %d words" % len(vocab)) + + self.vocab = vocab # vocab[word] = id + self.reverse_vocab = reverse_vocab # reverse_vocab[id] = word + + # Save special word ids. + self.start_id = vocab[start_word] + self.end_id = vocab[end_word] + self.unk_id = vocab[unk_word] + self.pad_id = vocab[pad_word] + tl.logging.info(" start_id: %d" % self.start_id) + tl.logging.info(" end_id : %d" % self.end_id) + tl.logging.info(" unk_id : %d" % self.unk_id) + tl.logging.info(" pad_id : %d" % self.pad_id) + + def word_to_id(self, word): + """Returns the integer word id of a word string.""" + if word in self.vocab: + return self.vocab[word] + else: + return self.unk_id + + def id_to_word(self, word_id): + """Returns the word string of an integer word id.""" + if word_id >= len(self.reverse_vocab): + return self.reverse_vocab[self.unk_id] + else: + return self.reverse_vocab[word_id] + + +def process_sentence(sentence, start_word="", end_word=""): + """Seperate a sentence string into a list of string words, add start_word and end_word, + see ``create_vocab()`` and ``tutorial_tfrecord3.py``. + + Parameters + ---------- + sentence : str + A sentence. + start_word : str or None + The start word. If None, no start word will be appended. + end_word : str or None + The end word. If None, no end word will be appended. + + Returns + --------- + list of str + A list of strings that separated into words. + + Examples + ----------- + >>> c = "how are you?" + >>> c = tl.nlp.process_sentence(c) + >>> print(c) + ['', 'how', 'are', 'you', '?', ''] + + Notes + ------- + - You have to install the following package. + - `Installing NLTK `__ + - `Installing NLTK data `__ + + """ + if start_word is not None: + process_sentence = [start_word] + else: + process_sentence = [] + process_sentence.extend(nltk.tokenize.word_tokenize(sentence.lower())) + + if end_word is not None: + process_sentence.append(end_word) + return process_sentence + + +def create_vocab(sentences, word_counts_output_file, min_word_count=1): + """Creates the vocabulary of word to word_id. + + See ``tutorial_tfrecord3.py``. + + The vocabulary is saved to disk in a text file of word counts. The id of each + word in the file is its corresponding 0-based line number. + + Parameters + ------------ + sentences : list of list of str + All sentences for creating the vocabulary. + word_counts_output_file : str + The file name. + min_word_count : int + Minimum number of occurrences for a word. + + Returns + -------- + :class:`SimpleVocabulary` + The simple vocabulary object, see :class:`Vocabulary` for more. + + Examples + -------- + Pre-process sentences + + >>> captions = ["one two , three", "four five five"] + >>> processed_capts = [] + >>> for c in captions: + >>> c = tl.nlp.process_sentence(c, start_word="", end_word="") + >>> processed_capts.append(c) + >>> print(processed_capts) + ...[['', 'one', 'two', ',', 'three', ''], ['', 'four', 'five', 'five', '']] + + Create vocabulary + + >>> tl.nlp.create_vocab(processed_capts, word_counts_output_file='vocab.txt', min_word_count=1) + Creating vocabulary. + Total words: 8 + Words in vocabulary: 8 + Wrote vocabulary file: vocab.txt + + Get vocabulary object + + >>> vocab = tl.nlp.Vocabulary('vocab.txt', start_word="", end_word="", unk_word="") + INFO:tensorflow:Initializing vocabulary from file: vocab.txt + [TL] Vocabulary from vocab.txt : + vocabulary with 10 words (includes start_word, end_word, unk_word) + start_id: 2 + end_id: 3 + unk_id: 9 + pad_id: 0 + + """ + tl.logging.info("Creating vocabulary.") + + counter = Counter() + + for c in sentences: + counter.update(c) + # tl.logging.info('c',c) + tl.logging.info(" Total words: %d" % len(counter)) + + # Filter uncommon words and sort by descending count. + word_counts = [x for x in counter.items() if x[1] >= min_word_count] + word_counts.sort(key=lambda x: x[1], reverse=True) + word_counts = [("", 0)] + word_counts # 1st id should be reserved for padding + # tl.logging.info(word_counts) + tl.logging.info(" Words in vocabulary: %d" % len(word_counts)) + + # Write out the word counts file. + with tf.io.gfile.GFile(word_counts_output_file, "w") as f: + f.write("\n".join(["%s %d" % (w, c) for w, c in word_counts])) + tl.logging.info(" Wrote vocabulary file: %s" % word_counts_output_file) + + # Create the vocabulary dictionary. + reverse_vocab = [x[0] for x in word_counts] + unk_id = len(reverse_vocab) + vocab_dict = dict([(x, y) for (y, x) in enumerate(reverse_vocab)]) + vocab = SimpleVocabulary(vocab_dict, unk_id) + + return vocab + + +# Vector representations of words +def simple_read_words(filename="nietzsche.txt"): + """Read context from file without any preprocessing. + + Parameters + ---------- + filename : str + A file path (like .txt file) + + Returns + -------- + str + The context in a string. + + """ + with open(filename, "r") as f: + words = f.read() + return words + + +def read_words(filename="nietzsche.txt", replace=None): + """Read list format context from a file. + + For customized read_words method, see ``tutorial_generate_text.py``. + + Parameters + ---------- + filename : str + a file path. + replace : list of str + replace original string by target string. + + Returns + ------- + list of str + The context in a list (split using space). + """ + if replace is None: + replace = ['\n', ''] + + with tf.io.gfile.GFile(filename, "r") as f: + try: # python 3.4 or older + context_list = f.read().replace(*replace).split() + except Exception: # python 3.5 + f.seek(0) + replace = [x.encode('utf-8') for x in replace] + context_list = f.read().replace(*replace).split() + return context_list + + +def read_analogies_file(eval_file='questions-words.txt', word2id=None): + """Reads through an analogy question file, return its id format. + + Parameters + ---------- + eval_file : str + The file name. + word2id : dictionary + a dictionary that maps word to ID. + + Returns + -------- + numpy.array + A ``[n_examples, 4]`` numpy array containing the analogy question's word IDs. + + Examples + --------- + The file should be in this format + + >>> : capital-common-countries + >>> Athens Greece Baghdad Iraq + >>> Athens Greece Bangkok Thailand + >>> Athens Greece Beijing China + >>> Athens Greece Berlin Germany + >>> Athens Greece Bern Switzerland + >>> Athens Greece Cairo Egypt + >>> Athens Greece Canberra Australia + >>> Athens Greece Hanoi Vietnam + >>> Athens Greece Havana Cuba + + Get the tokenized analogy question data + + >>> words = tl.files.load_matt_mahoney_text8_dataset() + >>> data, count, dictionary, reverse_dictionary = tl.nlp.build_words_dataset(words, vocabulary_size, True) + >>> analogy_questions = tl.nlp.read_analogies_file(eval_file='questions-words.txt', word2id=dictionary) + >>> print(analogy_questions) + [[ 3068 1248 7161 1581] + [ 3068 1248 28683 5642] + [ 3068 1248 3878 486] + ..., + [ 1216 4309 19982 25506] + [ 1216 4309 3194 8650] + [ 1216 4309 140 312]] + + """ + if word2id is None: + word2id = {} + + questions = [] + questions_skipped = 0 + + with open(eval_file, "rb") as analogy_f: + for line in analogy_f: + if line.startswith(b":"): # Skip comments. + continue + words = line.strip().lower().split(b" ") # lowercase + ids = [word2id.get(w.strip().decode()) for w in words] + if None in ids or len(ids) != 4: + questions_skipped += 1 + else: + questions.append(np.array(ids)) + tl.logging.info("Eval analogy file: %s" % eval_file) + tl.logging.info("Questions: %d", len(questions)) + tl.logging.info("Skipped: %d", questions_skipped) + analogy_questions = np.array(questions, dtype=np.int32) + return analogy_questions + + +def build_vocab(data): + """Build vocabulary. + + Given the context in list format. + Return the vocabulary, which is a dictionary for word to id. + e.g. {'campbell': 2587, 'atlantic': 2247, 'aoun': 6746 .... } + + Parameters + ---------- + data : list of str + The context in list format + + Returns + -------- + dictionary + that maps word to unique ID. e.g. {'campbell': 2587, 'atlantic': 2247, 'aoun': 6746 .... } + + References + --------------- + - `tensorflow.models.rnn.ptb.reader `_ + + Examples + -------- + >>> data_path = os.getcwd() + '/simple-examples/data' + >>> train_path = os.path.join(data_path, "ptb.train.txt") + >>> word_to_id = build_vocab(read_txt_words(train_path)) + + """ + # data = _read_words(filename) + counter = collections.Counter(data) + # tl.logging.info('counter %s' % counter) # dictionary for the occurrence number of each word, e.g. 'banknote': 1, 'photography': 1, 'kia': 1 + count_pairs = sorted(counter.items(), key=lambda x: (-x[1], x[0])) + # tl.logging.info('count_pairs %s' % count_pairs) # convert dictionary to list of tuple, e.g. ('ssangyong', 1), ('swapo', 1), ('wachter', 1) + words, _ = list(zip(*count_pairs)) + word_to_id = dict(zip(words, range(len(words)))) + # tl.logging.info(words) # list of words + # tl.logging.info(word_to_id) # dictionary for word to id, e.g. 'campbell': 2587, 'atlantic': 2247, 'aoun': 6746 + return word_to_id + + +def build_reverse_dictionary(word_to_id): + """Given a dictionary that maps word to integer id. + Returns a reverse dictionary that maps a id to word. + + Parameters + ---------- + word_to_id : dictionary + that maps word to ID. + + Returns + -------- + dictionary + A dictionary that maps IDs to words. + + """ + reverse_dictionary = dict(zip(word_to_id.values(), word_to_id.keys())) + return reverse_dictionary + + +def build_words_dataset(words=None, vocabulary_size=50000, printable=True, unk_key='UNK'): + """Build the words dictionary and replace rare words with 'UNK' token. + The most common word has the smallest integer id. + + Parameters + ---------- + words : list of str or byte + The context in list format. You may need to do preprocessing on the words, such as lower case, remove marks etc. + vocabulary_size : int + The maximum vocabulary size, limiting the vocabulary size. Then the script replaces rare words with 'UNK' token. + printable : boolean + Whether to print the read vocabulary size of the given words. + unk_key : str + Represent the unknown words. + + Returns + -------- + data : list of int + The context in a list of ID. + count : list of tuple and list + Pair words and IDs. + - count[0] is a list : the number of rare words + - count[1:] are tuples : the number of occurrence of each word + - e.g. [['UNK', 418391], (b'the', 1061396), (b'of', 593677), (b'and', 416629), (b'one', 411764)] + dictionary : dictionary + It is `word_to_id` that maps word to ID. + reverse_dictionary : a dictionary + It is `id_to_word` that maps ID to word. + + Examples + -------- + >>> words = tl.files.load_matt_mahoney_text8_dataset() + >>> vocabulary_size = 50000 + >>> data, count, dictionary, reverse_dictionary = tl.nlp.build_words_dataset(words, vocabulary_size) + + References + ----------------- + - `tensorflow/examples/tutorials/word2vec/word2vec_basic.py `__ + + """ + if words is None: + raise Exception("words : list of str or byte") + + count = [[unk_key, -1]] + count.extend(collections.Counter(words).most_common(vocabulary_size - 1)) + dictionary = dict() + for word, _ in count: + dictionary[word] = len(dictionary) + data = list() + unk_count = 0 + for word in words: + if word in dictionary: + index = dictionary[word] + else: + index = 0 # dictionary['UNK'] + unk_count += 1 + data.append(index) + count[0][1] = unk_count + reverse_dictionary = dict(zip(dictionary.values(), dictionary.keys())) + if printable: + tl.logging.info('Real vocabulary size %d' % len(collections.Counter(words).keys())) + tl.logging.info('Limited vocabulary size {}'.format(vocabulary_size)) + if len(collections.Counter(words).keys()) < vocabulary_size: + raise Exception( + "len(collections.Counter(words).keys()) >= vocabulary_size , the limited vocabulary_size must be less than or equal to the read vocabulary_size" + ) + return data, count, dictionary, reverse_dictionary + + +def words_to_word_ids(data=None, word_to_id=None, unk_key='UNK'): + """Convert a list of string (words) to IDs. + + Parameters + ---------- + data : list of string or byte + The context in list format + word_to_id : a dictionary + that maps word to ID. + unk_key : str + Represent the unknown words. + + Returns + -------- + list of int + A list of IDs to represent the context. + + Examples + -------- + >>> words = tl.files.load_matt_mahoney_text8_dataset() + >>> vocabulary_size = 50000 + >>> data, count, dictionary, reverse_dictionary = tl.nlp.build_words_dataset(words, vocabulary_size, True) + >>> context = [b'hello', b'how', b'are', b'you'] + >>> ids = tl.nlp.words_to_word_ids(words, dictionary) + >>> context = tl.nlp.word_ids_to_words(ids, reverse_dictionary) + >>> print(ids) + [6434, 311, 26, 207] + >>> print(context) + [b'hello', b'how', b'are', b'you'] + + References + --------------- + - `tensorflow.models.rnn.ptb.reader `__ + + """ + if data is None: + raise Exception("data : list of string or byte") + if word_to_id is None: + raise Exception("word_to_id : a dictionary") + # if isinstance(data[0], six.string_types): + # tl.logging.info(type(data[0])) + # # exit() + # tl.logging.info(data[0]) + # tl.logging.info(word_to_id) + # return [word_to_id[str(word)] for word in data] + # else: + + word_ids = [] + for word in data: + if word_to_id.get(word) is not None: + word_ids.append(word_to_id[word]) + else: + word_ids.append(word_to_id[unk_key]) + return word_ids + # return [word_to_id[word] for word in data] # this one + + # if isinstance(data[0], str): + # # tl.logging.info('is a string object') + # return [word_to_id[word] for word in data] + # else:#if isinstance(s, bytes): + # # tl.logging.info('is a unicode object') + # # tl.logging.info(data[0]) + # return [word_to_id[str(word)] f + + +def word_ids_to_words(data, id_to_word): + """Convert a list of integer to strings (words). + + Parameters + ---------- + data : list of int + The context in list format. + id_to_word : dictionary + a dictionary that maps ID to word. + + Returns + -------- + list of str + A list of string or byte to represent the context. + + Examples + --------- + see ``tl.nlp.words_to_word_ids`` + + """ + return [id_to_word[i] for i in data] + + +def save_vocab(count=None, name='vocab.txt'): + """Save the vocabulary to a file so the model can be reloaded. + + Parameters + ---------- + count : a list of tuple and list + count[0] is a list : the number of rare words, + count[1:] are tuples : the number of occurrence of each word, + e.g. [['UNK', 418391], (b'the', 1061396), (b'of', 593677), (b'and', 416629), (b'one', 411764)] + + Examples + --------- + >>> words = tl.files.load_matt_mahoney_text8_dataset() + >>> vocabulary_size = 50000 + >>> data, count, dictionary, reverse_dictionary = tl.nlp.build_words_dataset(words, vocabulary_size, True) + >>> tl.nlp.save_vocab(count, name='vocab_text8.txt') + >>> vocab_text8.txt + UNK 418391 + the 1061396 + of 593677 + and 416629 + one 411764 + in 372201 + a 325873 + to 316376 + + """ + if count is None: + count = [] + + pwd = os.getcwd() + vocabulary_size = len(count) + with open(os.path.join(pwd, name), "w") as f: + for i in xrange(vocabulary_size): + f.write("%s %d\n" % (as_text(count[i][0]), count[i][1])) + tl.logging.info("%d vocab saved to %s in %s" % (vocabulary_size, name, pwd)) + + +# Functions for translation + + +def basic_tokenizer(sentence, _WORD_SPLIT=re.compile(b"([.,!?\"':;)(])")): + """Very basic tokenizer: split the sentence into a list of tokens. + + Parameters + ----------- + sentence : tensorflow.python.platform.gfile.GFile Object + _WORD_SPLIT : regular expression for word spliting. + + + Examples + -------- + >>> see create_vocabulary + >>> from tensorflow.python.platform import gfile + >>> train_path = "wmt/giga-fren.release2" + >>> with gfile.GFile(train_path + ".en", mode="rb") as f: + >>> for line in f: + >>> tokens = tl.nlp.basic_tokenizer(line) + >>> tl.logging.info(tokens) + >>> exit() + [b'Changing', b'Lives', b'|', b'Changing', b'Society', b'|', b'How', + b'It', b'Works', b'|', b'Technology', b'Drives', b'Change', b'Home', + b'|', b'Concepts', b'|', b'Teachers', b'|', b'Search', b'|', b'Overview', + b'|', b'Credits', b'|', b'HHCC', b'Web', b'|', b'Reference', b'|', + b'Feedback', b'Virtual', b'Museum', b'of', b'Canada', b'Home', b'Page'] + + References + ---------- + - Code from ``/tensorflow/models/rnn/translation/data_utils.py`` + + """ + words = [] + sentence = as_bytes(sentence) + for space_separated_fragment in sentence.strip().split(): + words.extend(re.split(_WORD_SPLIT, space_separated_fragment)) + return [w for w in words if w] + + +def create_vocabulary( + vocabulary_path, data_path, max_vocabulary_size, tokenizer=None, normalize_digits=True, + _DIGIT_RE=re.compile(br"\d"), _START_VOCAB=None +): + r"""Create vocabulary file (if it does not exist yet) from data file. + + Data file is assumed to contain one sentence per line. Each sentence is + tokenized and digits are normalized (if normalize_digits is set). + Vocabulary contains the most-frequent tokens up to max_vocabulary_size. + We write it to vocabulary_path in a one-token-per-line format, so that later + token in the first line gets id=0, second line gets id=1, and so on. + + Parameters + ----------- + vocabulary_path : str + Path where the vocabulary will be created. + data_path : str + Data file that will be used to create vocabulary. + max_vocabulary_size : int + Limit on the size of the created vocabulary. + tokenizer : function + A function to use to tokenize each data sentence. If None, basic_tokenizer will be used. + normalize_digits : boolean + If true, all digits are replaced by `0`. + _DIGIT_RE : regular expression function + Default is ``re.compile(br"\d")``. + _START_VOCAB : list of str + The pad, go, eos and unk token, default is ``[b"_PAD", b"_GO", b"_EOS", b"_UNK"]``. + + References + ---------- + - Code from ``/tensorflow/models/rnn/translation/data_utils.py`` + + """ + if _START_VOCAB is None: + _START_VOCAB = [b"_PAD", b"_GO", b"_EOS", b"_UNK"] + if not gfile.Exists(vocabulary_path): + tl.logging.info("Creating vocabulary %s from data %s" % (vocabulary_path, data_path)) + vocab = {} + with gfile.GFile(data_path, mode="rb") as f: + counter = 0 + for line in f: + counter += 1 + if counter % 100000 == 0: + tl.logging.info(" processing line %d" % counter) + tokens = tokenizer(line) if tokenizer else basic_tokenizer(line) + for w in tokens: + word = re.sub(_DIGIT_RE, b"0", w) if normalize_digits else w + if word in vocab: + vocab[word] += 1 + else: + vocab[word] = 1 + vocab_list = _START_VOCAB + sorted(vocab, key=vocab.get, reverse=True) + if len(vocab_list) > max_vocabulary_size: + vocab_list = vocab_list[:max_vocabulary_size] + with gfile.GFile(vocabulary_path, mode="wb") as vocab_file: + for w in vocab_list: + vocab_file.write(w + b"\n") + else: + tl.logging.info("Vocabulary %s from data %s exists" % (vocabulary_path, data_path)) + + +def initialize_vocabulary(vocabulary_path): + """Initialize vocabulary from file, return the `word_to_id` (dictionary) + and `id_to_word` (list). + + We assume the vocabulary is stored one-item-per-line, so a file will result in a vocabulary {"dog": 0, "cat": 1}, and this function will also return the reversed-vocabulary ["dog", "cat"]. + + Parameters + ----------- + vocabulary_path : str + Path to the file containing the vocabulary. + + Returns + -------- + vocab : dictionary + a dictionary that maps word to ID. + rev_vocab : list of int + a list that maps ID to word. + + Examples + --------- + >>> Assume 'test' contains + dog + cat + bird + >>> vocab, rev_vocab = tl.nlp.initialize_vocabulary("test") + >>> print(vocab) + >>> {b'cat': 1, b'dog': 0, b'bird': 2} + >>> print(rev_vocab) + >>> [b'dog', b'cat', b'bird'] + + Raises + ------- + ValueError : if the provided vocabulary_path does not exist. + + """ + if gfile.Exists(vocabulary_path): + rev_vocab = [] + with gfile.GFile(vocabulary_path, mode="rb") as f: + rev_vocab.extend(f.readlines()) + rev_vocab = [as_bytes(line.strip()) for line in rev_vocab] + vocab = dict([(x, y) for (y, x) in enumerate(rev_vocab)]) + return vocab, rev_vocab + else: + raise ValueError("Vocabulary file %s not found.", vocabulary_path) + + +def sentence_to_token_ids( + sentence, vocabulary, tokenizer=None, normalize_digits=True, UNK_ID=3, _DIGIT_RE=re.compile(br"\d") +): + """Convert a string to list of integers representing token-ids. + + For example, a sentence "I have a dog" may become tokenized into + ["I", "have", "a", "dog"] and with vocabulary {"I": 1, "have": 2, + "a": 4, "dog": 7"} this function will return [1, 2, 4, 7]. + + Parameters + ----------- + sentence : tensorflow.python.platform.gfile.GFile Object + The sentence in bytes format to convert to token-ids, see ``basic_tokenizer()`` and ``data_to_token_ids()``. + vocabulary : dictionary + Mmapping tokens to integers. + tokenizer : function + A function to use to tokenize each sentence. If None, ``basic_tokenizer`` will be used. + normalize_digits : boolean + If true, all digits are replaced by 0. + + Returns + -------- + list of int + The token-ids for the sentence. + + """ + if tokenizer: + words = tokenizer(sentence) + else: + words = basic_tokenizer(sentence) + if not normalize_digits: + return [vocabulary.get(w, UNK_ID) for w in words] + # Normalize digits by 0 before looking words up in the vocabulary. + return [vocabulary.get(re.sub(_DIGIT_RE, b"0", w), UNK_ID) for w in words] + + +def data_to_token_ids( + data_path, target_path, vocabulary_path, tokenizer=None, normalize_digits=True, UNK_ID=3, + _DIGIT_RE=re.compile(br"\d") +): + """Tokenize data file and turn into token-ids using given vocabulary file. + + This function loads data line-by-line from data_path, calls the above + sentence_to_token_ids, and saves the result to target_path. See comment + for sentence_to_token_ids on the details of token-ids format. + + Parameters + ----------- + data_path : str + Path to the data file in one-sentence-per-line format. + target_path : str + Path where the file with token-ids will be created. + vocabulary_path : str + Path to the vocabulary file. + tokenizer : function + A function to use to tokenize each sentence. If None, ``basic_tokenizer`` will be used. + normalize_digits : boolean + If true, all digits are replaced by 0. + + References + ---------- + - Code from ``/tensorflow/models/rnn/translation/data_utils.py`` + + """ + if not gfile.Exists(target_path): + tl.logging.info("Tokenizing data in %s" % data_path) + vocab, _ = initialize_vocabulary(vocabulary_path) + with gfile.GFile(data_path, mode="rb") as data_file: + with gfile.GFile(target_path, mode="w") as tokens_file: + counter = 0 + for line in data_file: + counter += 1 + if counter % 100000 == 0: + tl.logging.info(" tokenizing line %d" % counter) + token_ids = sentence_to_token_ids( + line, vocab, tokenizer, normalize_digits, UNK_ID=UNK_ID, _DIGIT_RE=_DIGIT_RE + ) + tokens_file.write(" ".join([str(tok) for tok in token_ids]) + "\n") + else: + tl.logging.info("Target path %s exists" % target_path) + + +def moses_multi_bleu(hypotheses, references, lowercase=False): + """Calculate the bleu score for hypotheses and references + using the MOSES ulti-bleu.perl script. + + Parameters + ------------ + hypotheses : numpy.array.string + A numpy array of strings where each string is a single example. + references : numpy.array.string + A numpy array of strings where each string is a single example. + lowercase : boolean + If True, pass the "-lc" flag to the multi-bleu script + + Examples + --------- + >>> hypotheses = ["a bird is flying on the sky"] + >>> references = ["two birds are flying on the sky", "a bird is on the top of the tree", "an airplane is on the sky",] + >>> score = tl.nlp.moses_multi_bleu(hypotheses, references) + + Returns + -------- + float + The BLEU score + + References + ---------- + - `Google/seq2seq/metric/bleu `__ + + """ + if np.size(hypotheses) == 0: + return np.float32(0.0) + + # Get MOSES multi-bleu script + try: + multi_bleu_path, _ = urllib.request.urlretrieve( + "https://raw.githubusercontent.com/moses-smt/mosesdecoder/" + "master/scripts/generic/multi-bleu.perl" + ) + os.chmod(multi_bleu_path, 0o755) + except Exception: # pylint: disable=W0702 + tl.logging.info("Unable to fetch multi-bleu.perl script, using local.") + metrics_dir = os.path.dirname(os.path.realpath(__file__)) + bin_dir = os.path.abspath(os.path.join(metrics_dir, "..", "..", "bin")) + multi_bleu_path = os.path.join(bin_dir, "tools/multi-bleu.perl") + + # Dump hypotheses and references to tempfiles + hypothesis_file = tempfile.NamedTemporaryFile() + hypothesis_file.write("\n".join(hypotheses).encode("utf-8")) + hypothesis_file.write(b"\n") + hypothesis_file.flush() + reference_file = tempfile.NamedTemporaryFile() + reference_file.write("\n".join(references).encode("utf-8")) + reference_file.write(b"\n") + reference_file.flush() + + # Calculate BLEU using multi-bleu script + with open(hypothesis_file.name, "r") as read_pred: + bleu_cmd = [multi_bleu_path] + if lowercase: + bleu_cmd += ["-lc"] + bleu_cmd += [reference_file.name] + try: + bleu_out = subprocess.check_output(bleu_cmd, stdin=read_pred, stderr=subprocess.STDOUT) + bleu_out = bleu_out.decode("utf-8") + bleu_score = re.search(r"BLEU = (.+?),", bleu_out).group(1) + bleu_score = float(bleu_score) + except subprocess.CalledProcessError as error: + if error.output is not None: + tl.logging.warning("multi-bleu.perl script returned non-zero exit code") + tl.logging.warning(error.output) + bleu_score = np.float32(0.0) + + # Close temp files + hypothesis_file.close() + reference_file.close() + + return np.float32(bleu_score) diff --git a/tensorlayer/optimizers/__init__.py b/tensorlayer/optimizers/__init__.py new file mode 100644 index 0000000..ffe9995 --- /dev/null +++ b/tensorlayer/optimizers/__init__.py @@ -0,0 +1,25 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +""" +TensorLayer provides rich layer implementations trailed for +various benchmarks and domain-specific problems. In addition, we also +support transparent access to native TensorFlow parameters. +For example, we provide not only layers for local response normalization, but also +layers that allow user to apply ``tf.ops.lrn`` on ``network.outputs``. +More functions can be found in `TensorFlow API `__. +""" + +from .amsgrad import AMSGrad + +# ['Adadelta', 'Adagrad', 'Adam', 'Admax', 'Ftrl', 'Nadam', 'RMSprop', 'SGD', 'Momentum', 'Lamb', 'LARS'] +from .load_optimizers_backend import Adadelta +from .load_optimizers_backend import Adagrad +from .load_optimizers_backend import Adam +from .load_optimizers_backend import Admax +from .load_optimizers_backend import Ftrl +from .load_optimizers_backend import Nadam +from .load_optimizers_backend import RMSprop +from .load_optimizers_backend import SGD +from .load_optimizers_backend import Momentum +from .load_optimizers_backend import Lamb +from .load_optimizers_backend import LARS diff --git a/tensorlayer/optimizers/amsgrad.py b/tensorlayer/optimizers/amsgrad.py new file mode 100644 index 0000000..446426c --- /dev/null +++ b/tensorlayer/optimizers/amsgrad.py @@ -0,0 +1,195 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +"""AMSGrad Implementation based on the paper: "On the Convergence of Adam and Beyond" (ICLR 2018) +Article Link: https://openreview.net/pdf?id=ryQu7f-RZ +Original Implementation by: https://github.com/taki0112/AMSGrad-Tensorflow +""" + +from tensorflow.python.eager import context +from tensorflow.python.framework import ops +from tensorflow.python.ops import (control_flow_ops, math_ops, resource_variable_ops, state_ops, variable_scope) +from tensorflow.python.training import optimizer + + +class AMSGrad(optimizer.Optimizer): + """Implementation of the AMSGrad optimization algorithm. + + See: `On the Convergence of Adam and Beyond - [Reddi et al., 2018] `__. + + Parameters + ---------- + learning_rate: float + A Tensor or a floating point value. The learning rate. + beta1: float + A float value or a constant float tensor. + The exponential decay rate for the 1st moment estimates. + beta2: float + A float value or a constant float tensor. + The exponential decay rate for the 2nd moment estimates. + epsilon: float + A small constant for numerical stability. + This epsilon is "epsilon hat" in the Kingma and Ba paper + (in the formula just before Section 2.1), not the epsilon in Algorithm 1 of the paper. + use_locking: bool + If True use locks for update operations. + name: str + Optional name for the operations created when applying gradients. + Defaults to "AMSGrad". + """ + + def __init__(self, learning_rate=0.01, beta1=0.9, beta2=0.99, epsilon=1e-8, use_locking=False, name="AMSGrad"): + """Construct a new Adam optimizer.""" + super(AMSGrad, self).__init__(use_locking, name) + self._lr = learning_rate + self._beta1 = beta1 + self._beta2 = beta2 + self._epsilon = epsilon + + self._lr_t = None + self._beta1_t = None + self._beta2_t = None + self._epsilon_t = None + + self._beta1_power = None + self._beta2_power = None + + def _create_slots(self, var_list): + first_var = min(var_list, key=lambda x: x.name) + + create_new = self._beta1_power is None + if not create_new and context.in_graph_mode(): + create_new = (self._beta1_power.graph is not first_var.graph) + + if create_new: + with ops.colocate_with(first_var): + self._beta1_power = variable_scope.variable(self._beta1, name="beta1_power", trainable=False) + self._beta2_power = variable_scope.variable(self._beta2, name="beta2_power", trainable=False) + # Create slots for the first and second moments. + for v in var_list: + self._zeros_slot(v, "m", self._name) + self._zeros_slot(v, "v", self._name) + self._zeros_slot(v, "vhat", self._name) + + def _prepare(self): + self._lr_t = ops.convert_to_tensor(self._lr) + self._beta1_t = ops.convert_to_tensor(self._beta1) + self._beta2_t = ops.convert_to_tensor(self._beta2) + self._epsilon_t = ops.convert_to_tensor(self._epsilon) + + def _apply_dense(self, grad, var): + beta1_power = math_ops.cast(self._beta1_power, var.dtype.base_dtype) + beta2_power = math_ops.cast(self._beta2_power, var.dtype.base_dtype) + lr_t = math_ops.cast(self._lr_t, var.dtype.base_dtype) + beta1_t = math_ops.cast(self._beta1_t, var.dtype.base_dtype) + beta2_t = math_ops.cast(self._beta2_t, var.dtype.base_dtype) + epsilon_t = math_ops.cast(self._epsilon_t, var.dtype.base_dtype) + + lr = (lr_t * math_ops.sqrt(1 - beta2_power) / (1 - beta1_power)) + + # m_t = beta1 * m + (1 - beta1) * g_t + m = self.get_slot(var, "m") + m_scaled_g_values = grad * (1 - beta1_t) + m_t = state_ops.assign(m, beta1_t * m + m_scaled_g_values, use_locking=self._use_locking) + + # v_t = beta2 * v + (1 - beta2) * (g_t * g_t) + v = self.get_slot(var, "v") + v_scaled_g_values = (grad * grad) * (1 - beta2_t) + v_t = state_ops.assign(v, beta2_t * v + v_scaled_g_values, use_locking=self._use_locking) + + # amsgrad + vhat = self.get_slot(var, "vhat") + vhat_t = state_ops.assign(vhat, math_ops.maximum(v_t, vhat)) + v_sqrt = math_ops.sqrt(vhat_t) + + var_update = state_ops.assign_sub(var, lr * m_t / (v_sqrt + epsilon_t), use_locking=self._use_locking) + return control_flow_ops.group(*[var_update, m_t, v_t, vhat_t]) + + def _resource_apply_dense(self, grad, var): + var = var.handle + beta1_power = math_ops.cast(self._beta1_power, grad.dtype.base_dtype) + beta2_power = math_ops.cast(self._beta2_power, grad.dtype.base_dtype) + lr_t = math_ops.cast(self._lr_t, grad.dtype.base_dtype) + beta1_t = math_ops.cast(self._beta1_t, grad.dtype.base_dtype) + beta2_t = math_ops.cast(self._beta2_t, grad.dtype.base_dtype) + epsilon_t = math_ops.cast(self._epsilon_t, grad.dtype.base_dtype) + + lr = (lr_t * math_ops.sqrt(1 - beta2_power) / (1 - beta1_power)) + + # m_t = beta1 * m + (1 - beta1) * g_t + m = self.get_slot(var, "m").handle + m_scaled_g_values = grad * (1 - beta1_t) + m_t = state_ops.assign(m, beta1_t * m + m_scaled_g_values, use_locking=self._use_locking) + + # v_t = beta2 * v + (1 - beta2) * (g_t * g_t) + v = self.get_slot(var, "v").handle + v_scaled_g_values = (grad * grad) * (1 - beta2_t) + v_t = state_ops.assign(v, beta2_t * v + v_scaled_g_values, use_locking=self._use_locking) + + # amsgrad + vhat = self.get_slot(var, "vhat").handle + vhat_t = state_ops.assign(vhat, math_ops.maximum(v_t, vhat)) + v_sqrt = math_ops.sqrt(vhat_t) + + var_update = state_ops.assign_sub(var, lr * m_t / (v_sqrt + epsilon_t), use_locking=self._use_locking) + return control_flow_ops.group(*[var_update, m_t, v_t, vhat_t]) + + def _apply_sparse_shared(self, grad, var, indices, scatter_add): + beta1_power = math_ops.cast(self._beta1_power, var.dtype.base_dtype) + beta2_power = math_ops.cast(self._beta2_power, var.dtype.base_dtype) + lr_t = math_ops.cast(self._lr_t, var.dtype.base_dtype) + beta1_t = math_ops.cast(self._beta1_t, var.dtype.base_dtype) + beta2_t = math_ops.cast(self._beta2_t, var.dtype.base_dtype) + epsilon_t = math_ops.cast(self._epsilon_t, var.dtype.base_dtype) + + lr = (lr_t * math_ops.sqrt(1 - beta2_power) / (1 - beta1_power)) + + # m_t = beta1 * m + (1 - beta1) * g_t + m = self.get_slot(var, "m") + m_scaled_g_values = grad * (1 - beta1_t) + m_t = state_ops.assign(m, m * beta1_t, use_locking=self._use_locking) + with ops.control_dependencies([m_t]): + m_t = scatter_add(m, indices, m_scaled_g_values) + + # v_t = beta2 * v + (1 - beta2) * (g_t * g_t) + v = self.get_slot(var, "v") + v_scaled_g_values = (grad * grad) * (1 - beta2_t) + v_t = state_ops.assign(v, v * beta2_t, use_locking=self._use_locking) + with ops.control_dependencies([v_t]): + v_t = scatter_add(v, indices, v_scaled_g_values) + + # amsgrad + vhat = self.get_slot(var, "vhat") + vhat_t = state_ops.assign(vhat, math_ops.maximum(v_t, vhat)) + v_sqrt = math_ops.sqrt(vhat_t) + var_update = state_ops.assign_sub(var, lr * m_t / (v_sqrt + epsilon_t), use_locking=self._use_locking) + return control_flow_ops.group(*[var_update, m_t, v_t, vhat_t]) + + def _apply_sparse(self, grad, var): + return self._apply_sparse_shared( + grad.values, + var, + grad.indices, + lambda x, i, v: state_ops. + scatter_add( # pylint: disable=g-long-lambda + x, i, v, use_locking=self._use_locking + ) + ) + + def _resource_scatter_add(self, x, i, v): + with ops.control_dependencies([resource_variable_ops.resource_scatter_add(x.handle, i, v)]): + return x.value() + + def _resource_apply_sparse(self, grad, var, indices): + return self._apply_sparse_shared(grad, var, indices, self._resource_scatter_add) + + def _finish(self, update_ops, name_scope): + # Update the power accumulators. + with ops.control_dependencies(update_ops): + with ops.colocate_with(self._beta1_power): + update_beta1 = self._beta1_power.assign( + self._beta1_power * self._beta1_t, use_locking=self._use_locking + ) + update_beta2 = self._beta2_power.assign( + self._beta2_power * self._beta2_t, use_locking=self._use_locking + ) + return control_flow_ops.group(*update_ops + [update_beta1, update_beta2], name=name_scope) diff --git a/tensorlayer/optimizers/dragon_optimizers.py b/tensorlayer/optimizers/dragon_optimizers.py new file mode 100644 index 0000000..523e785 --- /dev/null +++ b/tensorlayer/optimizers/dragon_optimizers.py @@ -0,0 +1,56 @@ +from __future__ import absolute_import, division, print_function +import dragon as dg + +__all__ = ['Adadelta', 'Adagrad', 'Adam', 'Admax', 'Ftrl', 'Nadam', 'RMSprop', 'SGD', 'Momentum', 'Lamb', 'LARS'] + +# Add module aliases + + +# learning_rate=0.001, rho=0.95, epsilon=1e-07, name='Adadelta' +def Adadelta(**kwargs): + raise NotImplementedError('Adadelta optimizer function not implemented') + + +# learning_rate=0.001, initial_accumulator_value=0.1, epsilon=1e-07,name='Adagrad' +def Adagrad(**kwargs): + raise NotImplementedError('Adagrad optimizer function not implemented') + + +# learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, amsgrad=False,name='Adam' +Adam = dg.optimizers.Adam + + +# learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, name='Adamax' +def Admax(**kwargs): + raise NotImplementedError('Admax optimizer function not implemented') + + +# learning_rate=0.001, learning_rate_power=-0.5, initial_accumulator_value=0.1, +# l1_regularization_strength=0.0, l2_regularization_strength=0.0, name='Ftrl',l2_shrinkage_regularization_strength=0.0 +def Ftrl(**kwargs): + raise NotImplementedError('Ftrl optimizer function not implemented') + + +# learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, name='Nadam', +def Nadam(**kwargs): + raise NotImplementedError('Nadam optimizer function not implemented') + + +# learning_rate=0.001, rho=0.9, momentum=0.0, epsilon=1e-07, centered=False,name='RMSprop' +RMSprop = dg.optimizers.RMSprop + +# learning_rate=0.01, momentum=0.0, nesterov=False, name='SGD' +SGD = dg.optimizers.SGD + + +# learning_rate, momentum, use_locking=False, name='Momentum', use_nesterov=False +def Momentum(**kwargs): + raise NotImplementedError('Momentum optimizer function not implemented') + + +def Lamb(**kwargs): + raise NotImplementedError('Lamb optimizer function not implemented') + + +def LARS(**kwargs): + raise NotImplementedError('LARS optimizer function not implemented') diff --git a/tensorlayer/optimizers/load_optimizers_backend.py b/tensorlayer/optimizers/load_optimizers_backend.py new file mode 100644 index 0000000..31a905a --- /dev/null +++ b/tensorlayer/optimizers/load_optimizers_backend.py @@ -0,0 +1,16 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function +from tensorlayer.backend.ops.load_backend import BACKEND + +if BACKEND == 'tensorflow': + from .tensorflow_optimizers import * +elif BACKEND == 'mindspore': + from .mindspore_optimizers import * +elif BACKEND == 'dragon': + from .dragon_optimizers import * +elif BACKEND == 'paddle': + from .paddle_optimizers import * +else: + raise NotImplementedError("This backend is not supported") diff --git a/tensorlayer/optimizers/mindspore_optimizers.py b/tensorlayer/optimizers/mindspore_optimizers.py new file mode 100644 index 0000000..659a749 --- /dev/null +++ b/tensorlayer/optimizers/mindspore_optimizers.py @@ -0,0 +1,158 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function +from mindspore.nn import optim as optimizer +import mindspore as ms +from mindspore.nn import Cell + +__all__ = ['Adadelta', 'Adagrad', 'Adam', 'Admax', 'Ftrl', 'Nadam', 'RMSprop', 'SGD', 'Momentum', 'Lamb', 'LARS'] + + +class Adadelta(Cell): + + def __init__(self): + pass + + def app_gradients(self): + raise Exception('Adadelta optimizer function not implemented') + + +class Adagrad(Cell): + + def __init__(self): + pass + + def app_gradients(self): + raise Exception('Adagrad optimizer function not implemented') + + +class Adam(Cell): + + def __init__( + self, + learning_rate=0.001, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-8, + ): + self.adam = optimizer.Adam + self.learn_rate = learning_rate + self.beta_1 = beta_1 + self.beta_2 = beta_2 + self.epsilon = epsilon + + def apply_gradients(self, grads_and_vars): + grads, vars = list(zip(*grads_and_vars)) + optimizer_adam = self.adam( + vars, learning_rate=self.learn_rate, beta1=self.beta_1, beta2=self.beta_2, eps=self.epsilon + ) + optimizer_adam(grads) + + +class Admax(Cell): + + def __init__(self): + pass + + def app_gradients(self): + raise Exception('Admax optimizer function not implemented') + + +class Ftrl(Cell): + + def __init__(self): + pass + + def app_gradients(self): + raise Exception('Ftrl optimizer function not implemented') + + +class Nadam(Cell): + + def __init__(self): + pass + + def app_gradients(self): + raise Exception('Nadam optimizer function not implemented') + + +class RMSprop(Cell): + + def __init__(self): + pass + + def app_gradients(self): + raise Exception('RMSprop optimizer function not implemented') + + +class RMSprop(Cell): + + def __init__(self): + pass + + def app_gradients(self): + raise Exception('RMSprop optimizer function not implemented') + + +class SGD(Cell): + + def __init__(self, learning_rate, momentum): + self.sgd = optimizer.SGD + self.learn_rate = learning_rate + self.momentum = momentum + + def apply_gradients(self, grads_and_vars): + grads, vars = list(zip(*grads_and_vars)) + optimizer_sgd = self.sgd(vars, learning_rate=self.learn_rate, momentum=self.momentum) + optimizer_sgd(grads) + + +class Momentum(Cell): + + def __init__(self, learning_rate, momentum): + self.mom = optimizer.Momentum + self.learn_rate = learning_rate + self.momentum = momentum + + def apply_gradients(self, grads_and_vars, **kwargs): + grads, vars = list(zip(*grads_and_vars)) + optimizer_mom = self.mom(vars, learning_rate=self.learn_rate, momentum=self.momentum, **kwargs) + optimizer_mom(grads) + + +class Lamb(Cell): + + def __init__( + self, decay_steps, warmup_steps=0, start_learning_rate=0.1, end_learning_rate=0.0001, power=1.0, beta1=0.9, + beta2=0.999, eps=1e-06, weight_decay=0.0 + ): + self.lamb = optimizer.Lamb + self.decay_steps = decay_steps + self.warmup_steps = warmup_steps + self.start_learning_rate = start_learning_rate + self.end_learning_rate = end_learning_rate + self.power = power + self.beta1 = beta1 + self.beta2 = beta2 + self.eps = eps + self.weight_decay = weight_decay + + def apply_gradients(self, grads_and_vars): + grads, vars = list(zip(*grads_and_vars)) + optimizer_lamb = self.lamb( + params=vars, decay_steps=self.decay_steps, warmup_steps=self.warmup_steps, + start_learning_rate=self.start_learning_rate, end_learning_rate=self.end_learning_rate, power=self.power, + beta1=self.beta1, beta2=self.beta2, eps=self.eps, weight_decay=self.weight_decay + ) + optimizer_lamb(grads) + + +class LARS(object): + + def __init__(self, optimizer, **kwargs): + self.lars = ms.nn.LARS(optimizer=optimizer, **kwargs) + + def apply_gradients(self, grads_and_vars): + grads, _ = list(zip(*grads_and_vars)) + self.lars(grads) diff --git a/tensorlayer/optimizers/paddle_optimizers.py b/tensorlayer/optimizers/paddle_optimizers.py new file mode 100644 index 0000000..cbc1c2a --- /dev/null +++ b/tensorlayer/optimizers/paddle_optimizers.py @@ -0,0 +1,44 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function + +__all__ = ['Adadelta', 'Adagrad', 'Adam', 'Admax', 'Ftrl', 'Nadam', 'RMSprop', 'SGD', 'Momentum', 'Lamb', 'LARS'] + +# Add module aliases + +# learning_rate=0.001, rho=0.95, epsilon=1e-07, name='Adadelta' +Adadelta = None + +# learning_rate=0.001, initial_accumulator_value=0.1, epsilon=1e-07,name='Adagrad' +Adagrad = None + +# learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, amsgrad=False,name='Adam' +Adam = None + +# learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, name='Adamax' +Admax = None + +# learning_rate=0.001, learning_rate_power=-0.5, initial_accumulator_value=0.1, +# l1_regularization_strength=0.0, l2_regularization_strength=0.0, name='Ftrl',l2_shrinkage_regularization_strength=0.0 +Ftrl = None + +# learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, name='Nadam', +Nadam = None + +# learning_rate=0.001, rho=0.9, momentum=0.0, epsilon=1e-07, centered=False,name='RMSprop' +RMSprop = None + +# learning_rate=0.01, momentum=0.0, nesterov=False, name='SGD' +SGD = None + +# learning_rate, momentum, use_locking=False, name='Momentum', use_nesterov=False +Momentum = None + + +def Lamb(**kwargs): + raise Exception('Lamb optimizer function not implemented') + + +def LARS(**kwargs): + raise Exception('LARS optimizer function not implemented') diff --git a/tensorlayer/optimizers/tensorflow_optimizers.py b/tensorlayer/optimizers/tensorflow_optimizers.py new file mode 100644 index 0000000..0cae4cc --- /dev/null +++ b/tensorlayer/optimizers/tensorflow_optimizers.py @@ -0,0 +1,45 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function +import tensorflow as tf + +__all__ = ['Adadelta', 'Adagrad', 'Adam', 'Admax', 'Ftrl', 'Nadam', 'RMSprop', 'SGD', 'Momentum', 'Lamb', 'LARS'] + +# Add module aliases + +# learning_rate=0.001, rho=0.95, epsilon=1e-07, name='Adadelta' +Adadelta = tf.optimizers.Adadelta + +# learning_rate=0.001, initial_accumulator_value=0.1, epsilon=1e-07,name='Adagrad' +Adagrad = tf.optimizers.Adagrad + +# learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, amsgrad=False,name='Adam' +Adam = tf.optimizers.Adam + +# learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, name='Adamax' +Admax = tf.optimizers.Adamax + +# learning_rate=0.001, learning_rate_power=-0.5, initial_accumulator_value=0.1, +# l1_regularization_strength=0.0, l2_regularization_strength=0.0, name='Ftrl',l2_shrinkage_regularization_strength=0.0 +Ftrl = tf.optimizers.Ftrl + +# learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, name='Nadam', +Nadam = tf.optimizers.Nadam + +# learning_rate=0.001, rho=0.9, momentum=0.0, epsilon=1e-07, centered=False,name='RMSprop' +RMSprop = tf.optimizers.RMSprop + +# learning_rate=0.01, momentum=0.0, nesterov=False, name='SGD' +SGD = tf.optimizers.SGD + +# learning_rate, momentum, use_locking=False, name='Momentum', use_nesterov=False +Momentum = tf.compat.v1.train.MomentumOptimizer + + +def Lamb(**kwargs): + raise Exception('Lamb optimizer function not implemented') + + +def LARS(**kwargs): + raise Exception('LARS optimizer function not implemented') diff --git a/tensorlayer/package_info.py b/tensorlayer/package_info.py new file mode 100644 index 0000000..de5a884 --- /dev/null +++ b/tensorlayer/package_info.py @@ -0,0 +1,24 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +"""Deep learning and Reinforcement learning library for Researchers and Engineers.""" + +MAJOR = 2 +MINOR = 2 +PATCH = 0 +PRE_RELEASE = '' +# Use the following formatting: (major, minor, patch, prerelease) +VERSION = (MAJOR, MINOR, PATCH, PRE_RELEASE) + +__shortversion__ = '.'.join(map(str, VERSION[:3])) +__version__ = '.'.join(map(str, VERSION[:3])) + ''.join(VERSION[3:]) + +__package_name__ = 'tensorlayer' +__contact_names__ = 'TensorLayer Contributors' +__contact_emails__ = 'tensorlayer@gmail.com' +__homepage__ = 'http://tensorlayer.readthedocs.io/en/latest/' +__repository_url__ = 'https://github.com/tensorlayer/tensorlayer' +__download_url__ = 'https://github.com/tensorlayer/tensorlayer' +__description__ = 'High Level Tensorflow Deep Learning Library for Researcher and Engineer.' +__license__ = 'apache' +__keywords__ = 'deep learning, machine learning, computer vision, nlp, ' +__keywords__ += 'supervised learning, unsupervised learning, reinforcement learning, tensorflow' diff --git a/tensorlayer/prepro.py b/tensorlayer/prepro.py new file mode 100644 index 0000000..def0199 --- /dev/null +++ b/tensorlayer/prepro.py @@ -0,0 +1,4114 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import copy +import math +import random +import threading +import time + +import numpy as np +import PIL +import scipy +import scipy.ndimage as ndi +import skimage +from scipy import linalg +from scipy.ndimage.filters import gaussian_filter +from scipy.ndimage.interpolation import map_coordinates +from six.moves import range +from skimage import exposure, transform +from skimage.morphology import binary_dilation as _binary_dilation +from skimage.morphology import binary_erosion as _binary_erosion +from skimage.morphology import disk +from skimage.morphology import erosion as _erosion +from skimage.transform import resize + +import tensorlayer as tl +from tensorlayer.lazy_imports import LazyImport + +cv2 = LazyImport("cv2") + +# linalg https://docs.scipy.org/doc/scipy/reference/linalg.html +# ndimage https://docs.scipy.org/doc/scipy/reference/ndimage.html + +__all__ = [ + 'threading_data', + 'affine_rotation_matrix', + 'affine_horizontal_flip_matrix', + 'affine_shift_matrix', + 'affine_shear_matrix', + 'affine_zoom_matrix', + 'affine_respective_zoom_matrix', + 'transform_matrix_offset_center', + 'affine_transform', + 'affine_transform_cv2', + 'affine_transform_keypoints', + 'projective_transform_by_points', + 'rotation', + 'rotation_multi', + 'crop', + 'crop_multi', + 'flip_axis', + 'flip_axis_multi', + 'shift', + 'shift_multi', + 'shear', + 'shear_multi', + 'shear2', + 'shear_multi2', + 'swirl', + 'swirl_multi', + 'elastic_transform', + 'elastic_transform_multi', + 'zoom', + 'respective_zoom', + 'zoom_multi', + 'brightness', + 'brightness_multi', + 'illumination', + 'rgb_to_hsv', + 'hsv_to_rgb', + 'adjust_hue', + 'imresize', + 'pixel_value_scale', + 'samplewise_norm', + 'featurewise_norm', + 'get_zca_whitening_principal_components_img', + 'zca_whitening', + 'channel_shift', + 'channel_shift_multi', + 'drop', + 'array_to_img', + 'find_contours', + 'pt2map', + 'binary_dilation', + 'dilation', + 'binary_erosion', + 'erosion', + 'obj_box_coords_rescale', + 'obj_box_coord_rescale', + 'obj_box_coord_scale_to_pixelunit', + 'obj_box_coord_centroid_to_upleft_butright', + 'obj_box_coord_upleft_butright_to_centroid', + 'obj_box_coord_centroid_to_upleft', + 'obj_box_coord_upleft_to_centroid', + 'parse_darknet_ann_str_to_list', + 'parse_darknet_ann_list_to_cls_box', + 'obj_box_left_right_flip', + 'obj_box_imresize', + 'obj_box_crop', + 'obj_box_shift', + 'obj_box_zoom', + 'pad_sequences', + 'remove_pad_sequences', + 'process_sequences', + 'sequences_add_start_id', + 'sequences_add_end_id', + 'sequences_add_end_id_after_pad', + 'sequences_get_mask', + 'keypoint_random_crop', + 'keypoint_resize_random_crop', + 'keypoint_random_rotate', + 'keypoint_random_flip', + 'keypoint_random_resize', + 'keypoint_random_resize_shortestedge', +] + + +def threading_data(data=None, fn=None, thread_count=None, **kwargs): + """Process a batch of data by given function by threading. + + Usually be used for data augmentation. + + Parameters + ----------- + data : numpy.array or others + The data to be processed. + thread_count : int + The number of threads to use. + fn : function + The function for data processing. + more args : the args for `fn` + Ssee Examples below. + + Examples + -------- + Process images. + + >>> images, _, _, _ = tl.files.load_cifar10_dataset(shape=(-1, 32, 32, 3)) + >>> images = tl.prepro.threading_data(images[0:32], tl.prepro.zoom, zoom_range=[0.5, 1]) + + Customized image preprocessing function. + + >>> def distort_img(x): + >>> x = tl.prepro.flip_axis(x, axis=0, is_random=True) + >>> x = tl.prepro.flip_axis(x, axis=1, is_random=True) + >>> x = tl.prepro.crop(x, 100, 100, is_random=True) + >>> return x + >>> images = tl.prepro.threading_data(images, distort_img) + + Process images and masks together (Usually be used for image segmentation). + + >>> X, Y --> [batch_size, row, col, 1] + >>> data = tl.prepro.threading_data([_ for _ in zip(X, Y)], tl.prepro.zoom_multi, zoom_range=[0.5, 1], is_random=True) + data --> [batch_size, 2, row, col, 1] + >>> X_, Y_ = data.transpose((1,0,2,3,4)) + X_, Y_ --> [batch_size, row, col, 1] + >>> tl.vis.save_image(X_, 'images.png') + >>> tl.vis.save_image(Y_, 'masks.png') + + Process images and masks together by using ``thread_count``. + + >>> X, Y --> [batch_size, row, col, 1] + >>> data = tl.prepro.threading_data(X, tl.prepro.zoom_multi, 8, zoom_range=[0.5, 1], is_random=True) + data --> [batch_size, 2, row, col, 1] + >>> X_, Y_ = data.transpose((1,0,2,3,4)) + X_, Y_ --> [batch_size, row, col, 1] + >>> tl.vis.save_image(X_, 'after.png') + >>> tl.vis.save_image(Y_, 'before.png') + + Customized function for processing images and masks together. + + >>> def distort_img(data): + >>> x, y = data + >>> x, y = tl.prepro.flip_axis_multi([x, y], axis=0, is_random=True) + >>> x, y = tl.prepro.flip_axis_multi([x, y], axis=1, is_random=True) + >>> x, y = tl.prepro.crop_multi([x, y], 100, 100, is_random=True) + >>> return x, y + + >>> X, Y --> [batch_size, row, col, channel] + >>> data = tl.prepro.threading_data([_ for _ in zip(X, Y)], distort_img) + >>> X_, Y_ = data.transpose((1,0,2,3,4)) + + Returns + ------- + list or numpyarray + The processed results. + + References + ---------- + - `python queue `__ + - `run with limited queue `__ + + """ + + def apply_fn(results, i, data, kwargs): + results[i] = fn(data, **kwargs) + + if thread_count is None: + results = [None] * len(data) + threads = [] + # for i in range(len(data)): + # t = threading.Thread(name='threading_and_return', target=apply_fn, args=(results, i, data[i], kwargs)) + for i, d in enumerate(data): + t = threading.Thread(name='threading_and_return', target=apply_fn, args=(results, i, d, kwargs)) + t.start() + threads.append(t) + else: + divs = np.linspace(0, len(data), thread_count + 1) + divs = np.round(divs).astype(int) + results = [None] * thread_count + threads = [] + for i in range(thread_count): + t = threading.Thread( + name='threading_and_return', target=apply_fn, args=(results, i, data[divs[i]:divs[i + 1]], kwargs) + ) + t.start() + threads.append(t) + + for t in threads: + t.join() + + if thread_count is None: + try: + return np.asarray(results) + except Exception: + return results + else: + return np.concatenate(results) + + +def affine_rotation_matrix(angle=(-20, 20)): + """Create an affine transform matrix for image rotation. + NOTE: In OpenCV, x is width and y is height. + + Parameters + ----------- + angle : int/float or tuple of two int/float + Degree to rotate, usually -180 ~ 180. + - int/float, a fixed angle. + - tuple of 2 floats/ints, randomly sample a value as the angle between these 2 values. + + Returns + ------- + numpy.array + An affine transform matrix. + + """ + if isinstance(angle, tuple): + theta = np.pi / 180 * np.random.uniform(angle[0], angle[1]) + else: + theta = np.pi / 180 * angle + rotation_matrix = np.array([[np.cos(theta), np.sin(theta), 0], \ + [-np.sin(theta), np.cos(theta), 0], \ + [0, 0, 1]]) + return rotation_matrix + + +def affine_horizontal_flip_matrix(prob=0.5): + """Create an affine transformation matrix for image horizontal flipping. + NOTE: In OpenCV, x is width and y is height. + + Parameters + ---------- + prob : float + Probability to flip the image. 1.0 means always flip. + + Returns + ------- + numpy.array + An affine transform matrix. + + """ + factor = np.random.uniform(0, 1) + if prob >= factor: + filp_matrix = np.array([[ -1. , 0., 0. ], \ + [ 0., 1., 0. ], \ + [ 0., 0., 1. ]]) + return filp_matrix + else: + filp_matrix = np.array([[ 1. , 0., 0. ], \ + [ 0., 1., 0. ], \ + [ 0., 0., 1. ]]) + return filp_matrix + + +def affine_vertical_flip_matrix(prob=0.5): + """Create an affine transformation for image vertical flipping. + NOTE: In OpenCV, x is width and y is height. + + Parameters + ---------- + prob : float + Probability to flip the image. 1.0 means always flip. + + Returns + ------- + numpy.array + An affine transform matrix. + + """ + factor = np.random.uniform(0, 1) + if prob >= factor: + filp_matrix = np.array([[ 1. , 0., 0. ], \ + [ 0., -1., 0. ], \ + [ 0., 0., 1. ]]) + return filp_matrix + else: + filp_matrix = np.array([[ 1. , 0., 0. ], \ + [ 0., 1., 0. ], \ + [ 0., 0., 1. ]]) + return filp_matrix + + +def affine_shift_matrix(wrg=(-0.1, 0.1), hrg=(-0.1, 0.1), w=200, h=200): + """Create an affine transform matrix for image shifting. + NOTE: In OpenCV, x is width and y is height. + + Parameters + ----------- + wrg : float or tuple of floats + Range to shift on width axis, -1 ~ 1. + - float, a fixed distance. + - tuple of 2 floats, randomly sample a value as the distance between these 2 values. + hrg : float or tuple of floats + Range to shift on height axis, -1 ~ 1. + - float, a fixed distance. + - tuple of 2 floats, randomly sample a value as the distance between these 2 values. + w, h : int + The width and height of the image. + + Returns + ------- + numpy.array + An affine transform matrix. + + """ + if isinstance(wrg, tuple): + tx = np.random.uniform(wrg[0], wrg[1]) * w + else: + tx = wrg * w + if isinstance(hrg, tuple): + ty = np.random.uniform(hrg[0], hrg[1]) * h + else: + ty = hrg * h + shift_matrix = np.array([[1, 0, tx], \ + [0, 1, ty], \ + [0, 0, 1]]) + return shift_matrix + + +def affine_shear_matrix(x_shear=(-0.1, 0.1), y_shear=(-0.1, 0.1)): + """Create affine transform matrix for image shearing. + NOTE: In OpenCV, x is width and y is height. + + Parameters + ----------- + shear : tuple of two floats + Percentage of shears for width and height directions. + + Returns + ------- + numpy.array + An affine transform matrix. + + """ + # if len(shear) != 2: + # raise AssertionError( + # "shear should be tuple of 2 floats, or you want to use tl.prepro.shear rather than tl.prepro.shear2 ?" + # ) + # if isinstance(shear, tuple): + # shear = list(shear) + # if is_random: + # shear[0] = np.random.uniform(-shear[0], shear[0]) + # shear[1] = np.random.uniform(-shear[1], shear[1]) + if isinstance(x_shear, tuple): + x_shear = np.random.uniform(x_shear[0], x_shear[1]) + if isinstance(y_shear, tuple): + y_shear = np.random.uniform(y_shear[0], y_shear[1]) + + shear_matrix = np.array([[1, x_shear, 0], \ + [y_shear, 1, 0], \ + [0, 0, 1]]) + return shear_matrix + + +def affine_zoom_matrix(zoom_range=(0.8, 1.1)): + """Create an affine transform matrix for zooming/scaling an image's height and width. + OpenCV format, x is width. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + zoom_range : float or tuple of 2 floats + The zooming/scaling ratio, greater than 1 means larger. + - float, a fixed ratio. + - tuple of 2 floats, randomly sample a value as the ratio between these 2 values. + + Returns + ------- + numpy.array + An affine transform matrix. + + """ + + if isinstance(zoom_range, (float, int)): + scale = zoom_range + elif isinstance(zoom_range, tuple): + scale = np.random.uniform(zoom_range[0], zoom_range[1]) + else: + raise Exception("zoom_range: float or tuple of 2 floats") + + zoom_matrix = np.array([[scale, 0, 0], \ + [0, scale, 0], \ + [0, 0, 1]]) + return zoom_matrix + + +def affine_respective_zoom_matrix(w_range=0.8, h_range=1.1): + """Get affine transform matrix for zooming/scaling that height and width are changed independently. + OpenCV format, x is width. + + Parameters + ----------- + w_range : float or tuple of 2 floats + The zooming/scaling ratio of width, greater than 1 means larger. + - float, a fixed ratio. + - tuple of 2 floats, randomly sample a value as the ratio between 2 values. + h_range : float or tuple of 2 floats + The zooming/scaling ratio of height, greater than 1 means larger. + - float, a fixed ratio. + - tuple of 2 floats, randomly sample a value as the ratio between 2 values. + + Returns + ------- + numpy.array + An affine transform matrix. + + """ + + if isinstance(h_range, (float, int)): + zy = h_range + elif isinstance(h_range, tuple): + zy = np.random.uniform(h_range[0], h_range[1]) + else: + raise Exception("h_range: float or tuple of 2 floats") + + if isinstance(w_range, (float, int)): + zx = w_range + elif isinstance(w_range, tuple): + zx = np.random.uniform(w_range[0], w_range[1]) + else: + raise Exception("w_range: float or tuple of 2 floats") + + zoom_matrix = np.array([[zx, 0, 0], \ + [0, zy, 0], \ + [0, 0, 1]]) + return zoom_matrix + + +# affine transform +def transform_matrix_offset_center(matrix, y, x): + """Convert the matrix from Cartesian coordinates (the origin in the middle of image) to Image coordinates (the origin on the top-left of image). + + Parameters + ---------- + matrix : numpy.array + Transform matrix. + x and y : 2 int + Size of image. + + Returns + ------- + numpy.array + The transform matrix. + + Examples + -------- + - See ``tl.prepro.rotation``, ``tl.prepro.shear``, ``tl.prepro.zoom``. + """ + o_x = (x - 1) / 2.0 + o_y = (y - 1) / 2.0 + offset_matrix = np.array([[1, 0, o_x], [0, 1, o_y], [0, 0, 1]]) + reset_matrix = np.array([[1, 0, -o_x], [0, 1, -o_y], [0, 0, 1]]) + transform_matrix = np.dot(np.dot(offset_matrix, matrix), reset_matrix) + return transform_matrix + + +def affine_transform(x, transform_matrix, channel_index=2, fill_mode='nearest', cval=0., order=1): + """Return transformed images by given an affine matrix in Scipy format (x is height). + + Parameters + ---------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + transform_matrix : numpy.array + Transform matrix (offset center), can be generated by ``transform_matrix_offset_center`` + channel_index : int + Index of channel, default 2. + fill_mode : str + Method to fill missing pixel, default `nearest`, more options `constant`, `reflect` or `wrap`, see `scipy ndimage affine_transform `__ + cval : float + Value used for points outside the boundaries of the input if mode='constant'. Default is 0.0 + order : int + The order of interpolation. The order has to be in the range 0-5: + - 0 Nearest-neighbor + - 1 Bi-linear (default) + - 2 Bi-quadratic + - 3 Bi-cubic + - 4 Bi-quartic + - 5 Bi-quintic + - `scipy ndimage affine_transform `__ + + Returns + ------- + numpy.array + A processed image. + + Examples + -------- + >>> M_shear = tl.prepro.affine_shear_matrix(intensity=0.2, is_random=False) + >>> M_zoom = tl.prepro.affine_zoom_matrix(zoom_range=0.8) + >>> M_combined = M_shear.dot(M_zoom) + >>> transform_matrix = tl.prepro.transform_matrix_offset_center(M_combined, h, w) + >>> result = tl.prepro.affine_transform(image, transform_matrix) + + """ + # transform_matrix = transform_matrix_offset_center() + # asdihasid + # asd + + x = np.rollaxis(x, channel_index, 0) + final_affine_matrix = transform_matrix[:2, :2] + final_offset = transform_matrix[:2, 2] + channel_images = [ + ndi.interpolation.affine_transform( + x_channel, final_affine_matrix, final_offset, order=order, mode=fill_mode, cval=cval + ) for x_channel in x + ] + x = np.stack(channel_images, axis=0) + x = np.rollaxis(x, 0, channel_index + 1) + return x + + +apply_transform = affine_transform + + +def affine_transform_cv2(x, transform_matrix, flags=None, border_mode='constant'): + """Return transformed images by given an affine matrix in OpenCV format (x is width). (Powered by OpenCV2, faster than ``tl.prepro.affine_transform``) + + Parameters + ---------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + transform_matrix : numpy.array + A transform matrix, OpenCV format. + border_mode : str + - `constant`, pad the image with a constant value (i.e. black or 0) + - `replicate`, the row or column at the very edge of the original is replicated to the extra border. + + Examples + -------- + >>> M_shear = tl.prepro.affine_shear_matrix(intensity=0.2, is_random=False) + >>> M_zoom = tl.prepro.affine_zoom_matrix(zoom_range=0.8) + >>> M_combined = M_shear.dot(M_zoom) + >>> result = tl.prepro.affine_transform_cv2(image, M_combined) + """ + rows, cols = x.shape[0], x.shape[1] + if flags is None: + flags = cv2.INTER_AREA + if border_mode is 'constant': + border_mode = cv2.BORDER_CONSTANT + elif border_mode is 'replicate': + border_mode = cv2.BORDER_REPLICATE + else: + raise Exception("unsupport border_mode, check cv.BORDER_ for more details.") + return cv2.warpAffine(x, transform_matrix[0:2,:], \ + (cols,rows), flags=flags, borderMode=border_mode) + + +def affine_transform_keypoints(coords_list, transform_matrix): + """Transform keypoint coordinates according to a given affine transform matrix. + OpenCV format, x is width. + + Note that, for pose estimation task, flipping requires maintaining the left and right body information. + We should not flip the left and right body, so please use ``tl.prepro.keypoint_random_flip``. + + Parameters + ----------- + coords_list : list of list of tuple/list + The coordinates + e.g., the keypoint coordinates of every person in an image. + transform_matrix : numpy.array + Transform matrix, OpenCV format. + + Examples + --------- + >>> # 1. get all affine transform matrices + >>> M_rotate = tl.prepro.affine_rotation_matrix(angle=20) + >>> M_flip = tl.prepro.affine_horizontal_flip_matrix(prob=1) + >>> # 2. combine all affine transform matrices to one matrix + >>> M_combined = dot(M_flip).dot(M_rotate) + >>> # 3. transfrom the matrix from Cartesian coordinate (the origin in the middle of image) + >>> # to Image coordinate (the origin on the top-left of image) + >>> transform_matrix = tl.prepro.transform_matrix_offset_center(M_combined, x=w, y=h) + >>> # 4. then we can transfrom the image once for all transformations + >>> result = tl.prepro.affine_transform_cv2(image, transform_matrix) # 76 times faster + >>> # 5. transform keypoint coordinates + >>> coords = [[(50, 100), (100, 100), (100, 50), (200, 200)], [(250, 50), (200, 50), (200, 100)]] + >>> coords_result = tl.prepro.affine_transform_keypoints(coords, transform_matrix) + """ + coords_result_list = [] + for coords in coords_list: + coords = np.asarray(coords) + coords = coords.transpose([1, 0]) + coords = np.insert(coords, 2, 1, axis=0) + # print(coords) + # print(transform_matrix) + coords_result = np.matmul(transform_matrix, coords) + coords_result = coords_result[0:2, :].transpose([1, 0]) + coords_result_list.append(coords_result) + return coords_result_list + + +def projective_transform_by_points( + x, src, dst, map_args=None, output_shape=None, order=1, mode='constant', cval=0.0, clip=True, preserve_range=False +): + """Projective transform by given coordinates, usually 4 coordinates. + + see `scikit-image `__. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + src : list or numpy + The original coordinates, usually 4 coordinates of (width, height). + dst : list or numpy + The coordinates after transformation, the number of coordinates is the same with src. + map_args : dictionary or None + Keyword arguments passed to inverse map. + output_shape : tuple of 2 int + Shape of the output image generated. By default the shape of the input image is preserved. Note that, even for multi-band images, only rows and columns need to be specified. + order : int + The order of interpolation. The order has to be in the range 0-5: + - 0 Nearest-neighbor + - 1 Bi-linear (default) + - 2 Bi-quadratic + - 3 Bi-cubic + - 4 Bi-quartic + - 5 Bi-quintic + mode : str + One of `constant` (default), `edge`, `symmetric`, `reflect` or `wrap`. + Points outside the boundaries of the input are filled according to the given mode. Modes match the behaviour of numpy.pad. + cval : float + Used in conjunction with mode `constant`, the value outside the image boundaries. + clip : boolean + Whether to clip the output to the range of values of the input image. This is enabled by default, since higher order interpolation may produce values outside the given input range. + preserve_range : boolean + Whether to keep the original range of values. Otherwise, the input image is converted according to the conventions of img_as_float. + + Returns + ------- + numpy.array + A processed image. + + Examples + -------- + Assume X is an image from CIFAR-10, i.e. shape == (32, 32, 3) + + >>> src = [[0,0],[0,32],[32,0],[32,32]] # [w, h] + >>> dst = [[10,10],[0,32],[32,0],[32,32]] + >>> x = tl.prepro.projective_transform_by_points(X, src, dst) + + References + ----------- + - `scikit-image : geometric transformations `__ + - `scikit-image : examples `__ + + """ + if map_args is None: + map_args = {} + # if type(src) is list: + if isinstance(src, list): # convert to numpy + src = np.array(src) + # if type(dst) is list: + if isinstance(dst, list): + dst = np.array(dst) + if np.max(x) > 1: # convert to [0, 1] + x = x / 255 + + m = transform.ProjectiveTransform() + m.estimate(dst, src) + warped = transform.warp( + x, m, map_args=map_args, output_shape=output_shape, order=order, mode=mode, cval=cval, clip=clip, + preserve_range=preserve_range + ) + return warped + + +# rotate +def rotation( + x, rg=20, is_random=False, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', cval=0., order=1 +): + """Rotate an image randomly or non-randomly. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + rg : int or float + Degree to rotate, usually 0 ~ 180. + is_random : boolean + If True, randomly rotate. Default is False + row_index col_index and channel_index : int + Index of row, col and channel, default (0, 1, 2), for theano (1, 2, 0). + fill_mode : str + Method to fill missing pixel, default `nearest`, more options `constant`, `reflect` or `wrap`, see `scipy ndimage affine_transform `__ + cval : float + Value used for points outside the boundaries of the input if mode=`constant`. Default is 0.0 + order : int + The order of interpolation. The order has to be in the range 0-5. See ``tl.prepro.affine_transform`` and `scipy ndimage affine_transform `__ + + Returns + ------- + numpy.array + A processed image. + + Examples + --------- + >>> x --> [row, col, 1] + >>> x = tl.prepro.rotation(x, rg=40, is_random=False) + >>> tl.vis.save_image(x, 'im.png') + + """ + if is_random: + theta = np.pi / 180 * np.random.uniform(-rg, rg) + else: + theta = np.pi / 180 * rg + rotation_matrix = np.array([[np.cos(theta), -np.sin(theta), 0], [np.sin(theta), np.cos(theta), 0], [0, 0, 1]]) + + h, w = x.shape[row_index], x.shape[col_index] + transform_matrix = transform_matrix_offset_center(rotation_matrix, h, w) + x = affine_transform(x, transform_matrix, channel_index, fill_mode, cval, order) + return x + + +def rotation_multi( + x, rg=20, is_random=False, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', cval=0., order=1 +): + """Rotate multiple images with the same arguments, randomly or non-randomly. + Usually be used for image segmentation which x=[X, Y], X and Y should be matched. + + Parameters + ----------- + x : list of numpy.array + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.rotation``. + + Returns + ------- + numpy.array + A list of processed images. + + Examples + -------- + >>> x, y --> [row, col, 1] greyscale + >>> x, y = tl.prepro.rotation_multi([x, y], rg=90, is_random=False) + + """ + if is_random: + theta = np.pi / 180 * np.random.uniform(-rg, rg) + else: + theta = np.pi / 180 * rg + rotation_matrix = np.array([[np.cos(theta), -np.sin(theta), 0], [np.sin(theta), np.cos(theta), 0], [0, 0, 1]]) + + h, w = x[0].shape[row_index], x[0].shape[col_index] + transform_matrix = transform_matrix_offset_center(rotation_matrix, h, w) + results = [] + for data in x: + results.append(affine_transform(data, transform_matrix, channel_index, fill_mode, cval, order)) + return np.asarray(results) + + +# crop +def crop(x, wrg, hrg, is_random=False, row_index=0, col_index=1): + """Randomly or centrally crop an image. + + Parameters + ---------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + wrg : int + Size of width. + hrg : int + Size of height. + is_random : boolean, + If True, randomly crop, else central crop. Default is False. + row_index: int + index of row. + col_index: int + index of column. + + Returns + ------- + numpy.array + A processed image. + + """ + h, w = x.shape[row_index], x.shape[col_index] + + if (h < hrg) or (w < wrg): + raise AssertionError("The size of cropping should smaller than or equal to the original image") + + if is_random: + h_offset = int(np.random.uniform(0, h - hrg)) + w_offset = int(np.random.uniform(0, w - wrg)) + # tl.logging.info(h_offset, w_offset, x[h_offset: hrg+h_offset ,w_offset: wrg+w_offset].shape) + return x[h_offset:hrg + h_offset, w_offset:wrg + w_offset] + else: # central crop + h_offset = int(np.floor((h - hrg) / 2.)) + w_offset = int(np.floor((w - wrg) / 2.)) + h_end = h_offset + hrg + w_end = w_offset + wrg + return x[h_offset:h_end, w_offset:w_end] + # old implementation + # h_offset = (h - hrg)/2 + # w_offset = (w - wrg)/2 + # tl.logging.info(x[h_offset: h-h_offset ,w_offset: w-w_offset].shape) + # return x[h_offset: h-h_offset ,w_offset: w-w_offset] + # central crop + + +def crop_multi(x, wrg, hrg, is_random=False, row_index=0, col_index=1): + """Randomly or centrally crop multiple images. + + Parameters + ---------- + x : list of numpy.array + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.crop``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + h, w = x[0].shape[row_index], x[0].shape[col_index] + + if (h < hrg) or (w < wrg): + raise AssertionError("The size of cropping should smaller than or equal to the original image") + + if is_random: + h_offset = int(np.random.uniform(0, h - hrg)) + w_offset = int(np.random.uniform(0, w - wrg)) + results = [] + for data in x: + results.append(data[h_offset:hrg + h_offset, w_offset:wrg + w_offset]) + return np.asarray(results) + else: + # central crop + h_offset = int(np.floor((h - hrg) / 2.)) + w_offset = int(np.floor((w - wrg) / 2.)) + results = [] + for data in x: + results.append(data[h_offset:h - h_offset, w_offset:w - w_offset]) + return np.asarray(results) + + +# flip +def flip_axis(x, axis=1, is_random=False): + """Flip the axis of an image, such as flip left and right, up and down, randomly or non-randomly, + + Parameters + ---------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + axis : int + Which axis to flip. + - 0, flip up and down + - 1, flip left and right + - 2, flip channel + is_random : boolean + If True, randomly flip. Default is False. + + Returns + ------- + numpy.array + A processed image. + + """ + if is_random: + factor = np.random.uniform(-1, 1) + if factor > 0: + x = np.asarray(x).swapaxes(axis, 0) + x = x[::-1, ...] + x = x.swapaxes(0, axis) + return x + else: + return x + else: + x = np.asarray(x).swapaxes(axis, 0) + x = x[::-1, ...] + x = x.swapaxes(0, axis) + return x + + +def flip_axis_multi(x, axis, is_random=False): + """Flip the axises of multiple images together, such as flip left and right, up and down, randomly or non-randomly, + + Parameters + ----------- + x : list of numpy.array + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.flip_axis``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + if is_random: + factor = np.random.uniform(-1, 1) + if factor > 0: + # x = np.asarray(x).swapaxes(axis, 0) + # x = x[::-1, ...] + # x = x.swapaxes(0, axis) + # return x + results = [] + for data in x: + data = np.asarray(data).swapaxes(axis, 0) + data = data[::-1, ...] + data = data.swapaxes(0, axis) + results.append(data) + return np.asarray(results) + else: + return np.asarray(x) + else: + # x = np.asarray(x).swapaxes(axis, 0) + # x = x[::-1, ...] + # x = x.swapaxes(0, axis) + # return x + results = [] + for data in x: + data = np.asarray(data).swapaxes(axis, 0) + data = data[::-1, ...] + data = data.swapaxes(0, axis) + results.append(data) + return np.asarray(results) + + +# shift +def shift( + x, wrg=0.1, hrg=0.1, is_random=False, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', cval=0., + order=1 +): + """Shift an image randomly or non-randomly. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + wrg : float + Percentage of shift in axis x, usually -0.25 ~ 0.25. + hrg : float + Percentage of shift in axis y, usually -0.25 ~ 0.25. + is_random : boolean + If True, randomly shift. Default is False. + row_index col_index and channel_index : int + Index of row, col and channel, default (0, 1, 2), for theano (1, 2, 0). + fill_mode : str + Method to fill missing pixel, default `nearest`, more options `constant`, `reflect` or `wrap`, see `scipy ndimage affine_transform `__ + cval : float + Value used for points outside the boundaries of the input if mode='constant'. Default is 0.0. + order : int + The order of interpolation. The order has to be in the range 0-5. See ``tl.prepro.affine_transform`` and `scipy ndimage affine_transform `__ + + Returns + ------- + numpy.array + A processed image. + + """ + h, w = x.shape[row_index], x.shape[col_index] + if is_random: + tx = np.random.uniform(-hrg, hrg) * h + ty = np.random.uniform(-wrg, wrg) * w + else: + tx, ty = hrg * h, wrg * w + translation_matrix = np.array([[1, 0, tx], [0, 1, ty], [0, 0, 1]]) + + transform_matrix = translation_matrix # no need to do offset + x = affine_transform(x, transform_matrix, channel_index, fill_mode, cval, order) + return x + + +def shift_multi( + x, wrg=0.1, hrg=0.1, is_random=False, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', cval=0., + order=1 +): + """Shift images with the same arguments, randomly or non-randomly. + Usually be used for image segmentation which x=[X, Y], X and Y should be matched. + + Parameters + ----------- + x : list of numpy.array + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.shift``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + h, w = x[0].shape[row_index], x[0].shape[col_index] + if is_random: + tx = np.random.uniform(-hrg, hrg) * h + ty = np.random.uniform(-wrg, wrg) * w + else: + tx, ty = hrg * h, wrg * w + translation_matrix = np.array([[1, 0, tx], [0, 1, ty], [0, 0, 1]]) + + transform_matrix = translation_matrix # no need to do offset + results = [] + for data in x: + results.append(affine_transform(data, transform_matrix, channel_index, fill_mode, cval, order)) + return np.asarray(results) + + +# shear +def shear( + x, intensity=0.1, is_random=False, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', cval=0., order=1 +): + """Shear an image randomly or non-randomly. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + intensity : float + Percentage of shear, usually -0.5 ~ 0.5 (is_random==True), 0 ~ 0.5 (is_random==False), + you can have a quick try by shear(X, 1). + is_random : boolean + If True, randomly shear. Default is False. + row_index col_index and channel_index : int + Index of row, col and channel, default (0, 1, 2), for theano (1, 2, 0). + fill_mode : str + Method to fill missing pixel, default `nearest`, more options `constant`, `reflect` or `wrap`, see and `scipy ndimage affine_transform `__ + cval : float + Value used for points outside the boundaries of the input if mode='constant'. Default is 0.0. + order : int + The order of interpolation. The order has to be in the range 0-5. See ``tl.prepro.affine_transform`` and `scipy ndimage affine_transform `__ + + Returns + ------- + numpy.array + A processed image. + + References + ----------- + - `Affine transformation `__ + + """ + if is_random: + shear = np.random.uniform(-intensity, intensity) + else: + shear = intensity + shear_matrix = np.array([[1, -np.sin(shear), 0], [0, np.cos(shear), 0], [0, 0, 1]]) + + h, w = x.shape[row_index], x.shape[col_index] + transform_matrix = transform_matrix_offset_center(shear_matrix, h, w) + x = affine_transform(x, transform_matrix, channel_index, fill_mode, cval, order) + return x + + +def shear_multi( + x, intensity=0.1, is_random=False, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', cval=0., order=1 +): + """Shear images with the same arguments, randomly or non-randomly. + Usually be used for image segmentation which x=[X, Y], X and Y should be matched. + + Parameters + ----------- + x : list of numpy.array + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.shear``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + if is_random: + shear = np.random.uniform(-intensity, intensity) + else: + shear = intensity + shear_matrix = np.array([[1, -np.sin(shear), 0], [0, np.cos(shear), 0], [0, 0, 1]]) + + h, w = x[0].shape[row_index], x[0].shape[col_index] + transform_matrix = transform_matrix_offset_center(shear_matrix, h, w) + results = [] + for data in x: + results.append(affine_transform(data, transform_matrix, channel_index, fill_mode, cval, order)) + return np.asarray(results) + + +def shear2( + x, shear=(0.1, 0.1), is_random=False, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', cval=0., + order=1 +): + """Shear an image randomly or non-randomly. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + shear : tuple of two floats + Percentage of shear for height and width direction (0, 1). + is_random : boolean + If True, randomly shear. Default is False. + row_index col_index and channel_index : int + Index of row, col and channel, default (0, 1, 2), for theano (1, 2, 0). + fill_mode : str + Method to fill missing pixel, default `nearest`, more options `constant`, `reflect` or `wrap`, see `scipy ndimage affine_transform `__ + cval : float + Value used for points outside the boundaries of the input if mode='constant'. Default is 0.0. + order : int + The order of interpolation. The order has to be in the range 0-5. See ``tl.prepro.affine_transform`` and `scipy ndimage affine_transform `__ + + Returns + ------- + numpy.array + A processed image. + + References + ----------- + - `Affine transformation `__ + + """ + if len(shear) != 2: + raise AssertionError( + "shear should be tuple of 2 floats, or you want to use tl.prepro.shear rather than tl.prepro.shear2 ?" + ) + if isinstance(shear, tuple): + shear = list(shear) + if is_random: + shear[0] = np.random.uniform(-shear[0], shear[0]) + shear[1] = np.random.uniform(-shear[1], shear[1]) + + shear_matrix = np.array([[1, shear[0], 0], \ + [shear[1], 1, 0], \ + [0, 0, 1]]) + + h, w = x.shape[row_index], x.shape[col_index] + transform_matrix = transform_matrix_offset_center(shear_matrix, h, w) + x = affine_transform(x, transform_matrix, channel_index, fill_mode, cval, order) + return x + + +def shear_multi2( + x, shear=(0.1, 0.1), is_random=False, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', cval=0., + order=1 +): + """Shear images with the same arguments, randomly or non-randomly. + Usually be used for image segmentation which x=[X, Y], X and Y should be matched. + + Parameters + ----------- + x : list of numpy.array + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.shear2``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + if len(shear) != 2: + raise AssertionError( + "shear should be tuple of 2 floats, or you want to use tl.prepro.shear_multi rather than tl.prepro.shear_multi2 ?" + ) + if isinstance(shear, tuple): + shear = list(shear) + if is_random: + shear[0] = np.random.uniform(-shear[0], shear[0]) + shear[1] = np.random.uniform(-shear[1], shear[1]) + + shear_matrix = np.array([[1, shear[0], 0], [shear[1], 1, 0], [0, 0, 1]]) + + h, w = x[0].shape[row_index], x[0].shape[col_index] + transform_matrix = transform_matrix_offset_center(shear_matrix, h, w) + results = [] + for data in x: + results.append(affine_transform(data, transform_matrix, channel_index, fill_mode, cval, order)) + return np.asarray(results) + + +# swirl +def swirl( + x, center=None, strength=1, radius=100, rotation=0, output_shape=None, order=1, mode='constant', cval=0, clip=True, + preserve_range=False, is_random=False +): + """Swirl an image randomly or non-randomly, see `scikit-image swirl API `__ + and `example `__. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + center : tuple or 2 int or None + Center coordinate of transformation (optional). + strength : float + The amount of swirling applied. + radius : float + The extent of the swirl in pixels. The effect dies out rapidly beyond radius. + rotation : float + Additional rotation applied to the image, usually [0, 360], relates to center. + output_shape : tuple of 2 int or None + Shape of the output image generated (height, width). By default the shape of the input image is preserved. + order : int, optional + The order of the spline interpolation, default is 1. The order has to be in the range 0-5. See skimage.transform.warp for detail. + mode : str + One of `constant` (default), `edge`, `symmetric` `reflect` and `wrap`. + Points outside the boundaries of the input are filled according to the given mode, with `constant` used as the default. Modes match the behaviour of numpy.pad. + cval : float + Used in conjunction with mode `constant`, the value outside the image boundaries. + clip : boolean + Whether to clip the output to the range of values of the input image. This is enabled by default, since higher order interpolation may produce values outside the given input range. + preserve_range : boolean + Whether to keep the original range of values. Otherwise, the input image is converted according to the conventions of img_as_float. + is_random : boolean, + If True, random swirl. Default is False. + - random center = [(0 ~ x.shape[0]), (0 ~ x.shape[1])] + - random strength = [0, strength] + - random radius = [1e-10, radius] + - random rotation = [-rotation, rotation] + + Returns + ------- + numpy.array + A processed image. + + Examples + --------- + >>> x --> [row, col, 1] greyscale + >>> x = tl.prepro.swirl(x, strength=4, radius=100) + + """ + if radius == 0: + raise AssertionError("Invalid radius value") + + rotation = np.pi / 180 * rotation + if is_random: + center_h = int(np.random.uniform(0, x.shape[0])) + center_w = int(np.random.uniform(0, x.shape[1])) + center = (center_h, center_w) + strength = np.random.uniform(0, strength) + radius = np.random.uniform(1e-10, radius) + rotation = np.random.uniform(-rotation, rotation) + + max_v = np.max(x) + if max_v > 1: # Note: the input of this fn should be [-1, 1], rescale is required. + x = x / max_v + swirled = skimage.transform.swirl( + x, center=center, strength=strength, radius=radius, rotation=rotation, output_shape=output_shape, order=order, + mode=mode, cval=cval, clip=clip, preserve_range=preserve_range + ) + if max_v > 1: + swirled = swirled * max_v + return swirled + + +def swirl_multi( + x, center=None, strength=1, radius=100, rotation=0, output_shape=None, order=1, mode='constant', cval=0, clip=True, + preserve_range=False, is_random=False +): + """Swirl multiple images with the same arguments, randomly or non-randomly. + Usually be used for image segmentation which x=[X, Y], X and Y should be matched. + + Parameters + ----------- + x : list of numpy.array + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.swirl``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + if radius == 0: + raise AssertionError("Invalid radius value") + + rotation = np.pi / 180 * rotation + if is_random: + center_h = int(np.random.uniform(0, x[0].shape[0])) + center_w = int(np.random.uniform(0, x[0].shape[1])) + center = (center_h, center_w) + strength = np.random.uniform(0, strength) + radius = np.random.uniform(1e-10, radius) + rotation = np.random.uniform(-rotation, rotation) + + results = [] + for data in x: + max_v = np.max(data) + if max_v > 1: # Note: the input of this fn should be [-1, 1], rescale is required. + data = data / max_v + swirled = skimage.transform.swirl( + data, center=center, strength=strength, radius=radius, rotation=rotation, output_shape=output_shape, + order=order, mode=mode, cval=cval, clip=clip, preserve_range=preserve_range + ) + if max_v > 1: + swirled = swirled * max_v + results.append(swirled) + return np.asarray(results) + + +# elastic_transform +def elastic_transform(x, alpha, sigma, mode="constant", cval=0, is_random=False): + """Elastic transformation for image as described in `[Simard2003] `__. + + Parameters + ----------- + x : numpy.array + A greyscale image. + alpha : float + Alpha value for elastic transformation. + sigma : float or sequence of float + The smaller the sigma, the more transformation. Standard deviation for Gaussian kernel. The standard deviations of the Gaussian filter are given for each axis as a sequence, or as a single number, in which case it is equal for all axes. + mode : str + See `scipy.ndimage.filters.gaussian_filter `__. Default is `constant`. + cval : float, + Used in conjunction with `mode` of `constant`, the value outside the image boundaries. + is_random : boolean + Default is False. + + Returns + ------- + numpy.array + A processed image. + + Examples + --------- + >>> x = tl.prepro.elastic_transform(x, alpha=x.shape[1]*3, sigma=x.shape[1]*0.07) + + References + ------------ + - `Github `__. + - `Kaggle `__ + + """ + if is_random is False: + random_state = np.random.RandomState(None) + else: + random_state = np.random.RandomState(int(time.time())) + # + is_3d = False + if len(x.shape) == 3 and x.shape[-1] == 1: + x = x[:, :, 0] + is_3d = True + elif len(x.shape) == 3 and x.shape[-1] != 1: + raise Exception("Only support greyscale image") + + if len(x.shape) != 2: + raise AssertionError("input should be grey-scale image") + + shape = x.shape + + dx = gaussian_filter((random_state.rand(*shape) * 2 - 1), sigma, mode=mode, cval=cval) * alpha + dy = gaussian_filter((random_state.rand(*shape) * 2 - 1), sigma, mode=mode, cval=cval) * alpha + + x_, y_ = np.meshgrid(np.arange(shape[0]), np.arange(shape[1]), indexing='ij') + indices = np.reshape(x_ + dx, (-1, 1)), np.reshape(y_ + dy, (-1, 1)) + if is_3d: + return map_coordinates(x, indices, order=1).reshape((shape[0], shape[1], 1)) + else: + return map_coordinates(x, indices, order=1).reshape(shape) + + +def elastic_transform_multi(x, alpha, sigma, mode="constant", cval=0, is_random=False): + """Elastic transformation for images as described in `[Simard2003] `__. + + Parameters + ----------- + x : list of numpy.array + List of greyscale images. + others : args + See ``tl.prepro.elastic_transform``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + if is_random is False: + random_state = np.random.RandomState(None) + else: + random_state = np.random.RandomState(int(time.time())) + + shape = x[0].shape + if len(shape) == 3: + shape = (shape[0], shape[1]) + new_shape = random_state.rand(*shape) + + results = [] + for data in x: + is_3d = False + if len(data.shape) == 3 and data.shape[-1] == 1: + data = data[:, :, 0] + is_3d = True + elif len(data.shape) == 3 and data.shape[-1] != 1: + raise Exception("Only support greyscale image") + + if len(data.shape) != 2: + raise AssertionError("input should be grey-scale image") + + dx = gaussian_filter((new_shape * 2 - 1), sigma, mode=mode, cval=cval) * alpha + dy = gaussian_filter((new_shape * 2 - 1), sigma, mode=mode, cval=cval) * alpha + + x_, y_ = np.meshgrid(np.arange(shape[0]), np.arange(shape[1]), indexing='ij') + indices = np.reshape(x_ + dx, (-1, 1)), np.reshape(y_ + dy, (-1, 1)) + # tl.logging.info(data.shape) + if is_3d: + results.append(map_coordinates(data, indices, order=1).reshape((shape[0], shape[1], 1))) + else: + results.append(map_coordinates(data, indices, order=1).reshape(shape)) + return np.asarray(results) + + +# zoom +def zoom(x, zoom_range=(0.9, 1.1), flags=None, border_mode='constant'): + """Zooming/Scaling a single image that height and width are changed together. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + zoom_range : float or tuple of 2 floats + The zooming/scaling ratio, greater than 1 means larger. + - float, a fixed ratio. + - tuple of 2 floats, randomly sample a value as the ratio between 2 values. + border_mode : str + - `constant`, pad the image with a constant value (i.e. black or 0) + - `replicate`, the row or column at the very edge of the original is replicated to the extra border. + + Returns + ------- + numpy.array + A processed image. + + """ + zoom_matrix = affine_zoom_matrix(zoom_range=zoom_range) + h, w = x.shape[0], x.shape[1] + transform_matrix = transform_matrix_offset_center(zoom_matrix, h, w) + x = affine_transform_cv2(x, transform_matrix, flags=flags, border_mode=border_mode) + return x + + +def respective_zoom(x, h_range=(0.9, 1.1), w_range=(0.9, 1.1), flags=None, border_mode='constant'): + """Zooming/Scaling a single image that height and width are changed independently. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + h_range : float or tuple of 2 floats + The zooming/scaling ratio of height, greater than 1 means larger. + - float, a fixed ratio. + - tuple of 2 floats, randomly sample a value as the ratio between 2 values. + w_range : float or tuple of 2 floats + The zooming/scaling ratio of width, greater than 1 means larger. + - float, a fixed ratio. + - tuple of 2 floats, randomly sample a value as the ratio between 2 values. + border_mode : str + - `constant`, pad the image with a constant value (i.e. black or 0) + - `replicate`, the row or column at the very edge of the original is replicated to the extra border. + + Returns + ------- + numpy.array + A processed image. + + """ + zoom_matrix = affine_respective_zoom_matrix(h_range=h_range, w_range=w_range) + h, w = x.shape[0], x.shape[1] + transform_matrix = transform_matrix_offset_center(zoom_matrix, h, w) + x = affine_transform_cv2( + x, transform_matrix, flags=flags, border_mode=border_mode + ) #affine_transform(x, transform_matrix, channel_index, fill_mode, cval, order) + return x + + +def zoom_multi(x, zoom_range=(0.9, 1.1), flags=None, border_mode='constant'): + """Zoom in and out of images with the same arguments, randomly or non-randomly. + Usually be used for image segmentation which x=[X, Y], X and Y should be matched. + + Parameters + ----------- + x : list of numpy.array + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.zoom``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + + zoom_matrix = affine_zoom_matrix(zoom_range=zoom_range) + results = [] + for img in x: + h, w = x.shape[0], x.shape[1] + transform_matrix = transform_matrix_offset_center(zoom_matrix, h, w) + results.append(affine_transform_cv2(x, transform_matrix, flags=flags, border_mode=border_mode)) + return results + + +# image = tf.image.random_brightness(image, max_delta=32. / 255.) +# image = tf.image.random_saturation(image, lower=0.5, upper=1.5) +# image = tf.image.random_hue(image, max_delta=0.032) +# image = tf.image.random_contrast(image, lower=0.5, upper=1.5) + + +def brightness(x, gamma=1, gain=1, is_random=False): + """Change the brightness of a single image, randomly or non-randomly. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + gamma : float + Non negative real number. Default value is 1. + - Small than 1 means brighter. + - If `is_random` is True, gamma in a range of (1-gamma, 1+gamma). + gain : float + The constant multiplier. Default value is 1. + is_random : boolean + If True, randomly change brightness. Default is False. + + Returns + ------- + numpy.array + A processed image. + + References + ----------- + - `skimage.exposure.adjust_gamma `__ + - `chinese blog `__ + + """ + if is_random: + gamma = np.random.uniform(1 - gamma, 1 + gamma) + x = exposure.adjust_gamma(x, gamma, gain) + return x + + +def brightness_multi(x, gamma=1, gain=1, is_random=False): + """Change the brightness of multiply images, randomly or non-randomly. + Usually be used for image segmentation which x=[X, Y], X and Y should be matched. + + Parameters + ----------- + x : list of numpyarray + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.brightness``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + if is_random: + gamma = np.random.uniform(1 - gamma, 1 + gamma) + + results = [] + for data in x: + results.append(exposure.adjust_gamma(data, gamma, gain)) + return np.asarray(results) + + +def illumination(x, gamma=1., contrast=1., saturation=1., is_random=False): + """Perform illumination augmentation for a single image, randomly or non-randomly. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + gamma : float + Change brightness (the same with ``tl.prepro.brightness``) + - if is_random=False, one float number, small than one means brighter, greater than one means darker. + - if is_random=True, tuple of two float numbers, (min, max). + contrast : float + Change contrast. + - if is_random=False, one float number, small than one means blur. + - if is_random=True, tuple of two float numbers, (min, max). + saturation : float + Change saturation. + - if is_random=False, one float number, small than one means unsaturation. + - if is_random=True, tuple of two float numbers, (min, max). + is_random : boolean + If True, randomly change illumination. Default is False. + + Returns + ------- + numpy.array + A processed image. + + Examples + --------- + Random + + >>> x = tl.prepro.illumination(x, gamma=(0.5, 5.0), contrast=(0.3, 1.0), saturation=(0.7, 1.0), is_random=True) + + Non-random + + >>> x = tl.prepro.illumination(x, 0.5, 0.6, 0.8, is_random=False) + + """ + if is_random: + if not (len(gamma) == len(contrast) == len(saturation) == 2): + raise AssertionError("if is_random = True, the arguments are (min, max)") + + ## random change brightness # small --> brighter + illum_settings = np.random.randint(0, 3) # 0-brighter, 1-darker, 2 keep normal + + if illum_settings == 0: # brighter + gamma = np.random.uniform(gamma[0], 1.0) # (.5, 1.0) + elif illum_settings == 1: # darker + gamma = np.random.uniform(1.0, gamma[1]) # (1.0, 5.0) + else: + gamma = 1 + im_ = brightness(x, gamma=gamma, gain=1, is_random=False) + + # tl.logging.info("using contrast and saturation") + image = PIL.Image.fromarray(im_) # array -> PIL + contrast_adjust = PIL.ImageEnhance.Contrast(image) + image = contrast_adjust.enhance(np.random.uniform(contrast[0], contrast[1])) #0.3,0.9)) + + saturation_adjust = PIL.ImageEnhance.Color(image) + image = saturation_adjust.enhance(np.random.uniform(saturation[0], saturation[1])) # (0.7,1.0)) + im_ = np.array(image) # PIL -> array + else: + im_ = brightness(x, gamma=gamma, gain=1, is_random=False) + image = PIL.Image.fromarray(im_) # array -> PIL + contrast_adjust = PIL.ImageEnhance.Contrast(image) + image = contrast_adjust.enhance(contrast) + + saturation_adjust = PIL.ImageEnhance.Color(image) + image = saturation_adjust.enhance(saturation) + im_ = np.array(image) # PIL -> array + return np.asarray(im_) + + +def rgb_to_hsv(rgb): + """Input RGB image [0~255] return HSV image [0~1]. + + Parameters + ------------ + rgb : numpy.array + An image with values between 0 and 255. + + Returns + ------- + numpy.array + A processed image. + + """ + # Translated from source of colorsys.rgb_to_hsv + # r,g,b should be a numpy arrays with values between 0 and 255 + # rgb_to_hsv returns an array of floats between 0.0 and 1.0. + rgb = rgb.astype('float') + hsv = np.zeros_like(rgb) + # in case an RGBA array was passed, just copy the A channel + hsv[..., 3:] = rgb[..., 3:] + r, g, b = rgb[..., 0], rgb[..., 1], rgb[..., 2] + maxc = np.max(rgb[..., :3], axis=-1) + minc = np.min(rgb[..., :3], axis=-1) + hsv[..., 2] = maxc + mask = maxc != minc + hsv[mask, 1] = (maxc - minc)[mask] / maxc[mask] + rc = np.zeros_like(r) + gc = np.zeros_like(g) + bc = np.zeros_like(b) + rc[mask] = (maxc - r)[mask] / (maxc - minc)[mask] + gc[mask] = (maxc - g)[mask] / (maxc - minc)[mask] + bc[mask] = (maxc - b)[mask] / (maxc - minc)[mask] + hsv[..., 0] = np.select([r == maxc, g == maxc], [bc - gc, 2.0 + rc - bc], default=4.0 + gc - rc) + hsv[..., 0] = (hsv[..., 0] / 6.0) % 1.0 + return hsv + + +def hsv_to_rgb(hsv): + """Input HSV image [0~1] return RGB image [0~255]. + + Parameters + ------------- + hsv : numpy.array + An image with values between 0.0 and 1.0 + + Returns + ------- + numpy.array + A processed image. + """ + # Translated from source of colorsys.hsv_to_rgb + # h,s should be a numpy arrays with values between 0.0 and 1.0 + # v should be a numpy array with values between 0.0 and 255.0 + # hsv_to_rgb returns an array of uints between 0 and 255. + rgb = np.empty_like(hsv) + rgb[..., 3:] = hsv[..., 3:] + h, s, v = hsv[..., 0], hsv[..., 1], hsv[..., 2] + i = (h * 6.0).astype('uint8') + f = (h * 6.0) - i + p = v * (1.0 - s) + q = v * (1.0 - s * f) + t = v * (1.0 - s * (1.0 - f)) + i = i % 6 + conditions = [s == 0.0, i == 1, i == 2, i == 3, i == 4, i == 5] + rgb[..., 0] = np.select(conditions, [v, q, p, p, t, v], default=v) + rgb[..., 1] = np.select(conditions, [v, v, v, q, p, p], default=t) + rgb[..., 2] = np.select(conditions, [v, p, t, v, v, q], default=p) + return rgb.astype('uint8') + + +def adjust_hue(im, hout=0.66, is_offset=True, is_clip=True, is_random=False): + """Adjust hue of an RGB image. + + This is a convenience method that converts an RGB image to float representation, converts it to HSV, add an offset to the hue channel, converts back to RGB and then back to the original data type. + For TF, see `tf.image.adjust_hue `__.and `tf.image.random_hue `__. + + Parameters + ----------- + im : numpy.array + An image with values between 0 and 255. + hout : float + The scale value for adjusting hue. + - If is_offset is False, set all hue values to this value. 0 is red; 0.33 is green; 0.66 is blue. + - If is_offset is True, add this value as the offset to the hue channel. + is_offset : boolean + Whether `hout` is added on HSV as offset or not. Default is True. + is_clip : boolean + If HSV value smaller than 0, set to 0. Default is True. + is_random : boolean + If True, randomly change hue. Default is False. + + Returns + ------- + numpy.array + A processed image. + + Examples + --------- + Random, add a random value between -0.2 and 0.2 as the offset to every hue values. + + >>> im_hue = tl.prepro.adjust_hue(image, hout=0.2, is_offset=True, is_random=False) + + Non-random, make all hue to green. + + >>> im_green = tl.prepro.adjust_hue(image, hout=0.66, is_offset=False, is_random=False) + + References + ----------- + - `tf.image.random_hue `__. + - `tf.image.adjust_hue `__. + - `StackOverflow: Changing image hue with python PIL `__. + + """ + hsv = rgb_to_hsv(im) + if is_random: + hout = np.random.uniform(-hout, hout) + + if is_offset: + hsv[..., 0] += hout + else: + hsv[..., 0] = hout + + if is_clip: + hsv[..., 0] = np.clip(hsv[..., 0], 0, np.inf) # Hao : can remove green dots + + rgb = hsv_to_rgb(hsv) + return rgb + + +# # contrast +# def constant(x, cutoff=0.5, gain=10, inv=False, is_random=False): +# # TODO +# x = exposure.adjust_sigmoid(x, cutoff=cutoff, gain=gain, inv=inv) +# return x +# +# def constant_multi(): +# #TODO +# pass + + +def imresize(x, size=None, interp='bicubic', mode=None): + """Resize an image by given output size and method. + + Warning, this function will rescale the value to [0, 255]. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + size : list of 2 int or None + For height and width. + interp : str + Interpolation method for re-sizing (`nearest`, `lanczos`, `bilinear`, `bicubic` (default) or `cubic`). + mode : str + The PIL image mode (`P`, `L`, etc.) to convert image before resizing. + + Returns + ------- + numpy.array + A processed image. + + References + ------------ + - `scipy.misc.imresize `__ + + """ + if size is None: + size = [100, 100] + + if x.shape[-1] == 1: + # greyscale + # x = scipy.misc.imresize(x[:, :, 0], size, interp=interp, mode=mode) + x = resize(x[:, :, 0], size) + return x[:, :, np.newaxis] + else: + # rgb, bgr, rgba + return resize(x, output_shape=size) + # return scipy.misc.imresize(x, size, interp=interp, mode=mode) + + +# value scale +def pixel_value_scale(im, val=0.9, clip=None, is_random=False): + """Scales each value in the pixels of the image. + + Parameters + ----------- + im : numpy.array + An image. + val : float + The scale value for changing pixel value. + - If is_random=False, multiply this value with all pixels. + - If is_random=True, multiply a value between [1-val, 1+val] with all pixels. + clip : tuple of 2 numbers + The minimum and maximum value. + is_random : boolean + If True, see ``val``. + + Returns + ------- + numpy.array + A processed image. + + Examples + ---------- + Random + + >>> im = pixel_value_scale(im, 0.1, [0, 255], is_random=True) + + Non-random + + >>> im = pixel_value_scale(im, 0.9, [0, 255], is_random=False) + + """ + + clip = clip if clip is not None else (-np.inf, np.inf) + + if is_random: + scale = 1 + np.random.uniform(-val, val) + im = im * scale + else: + im = im * val + + if len(clip) == 2: + im = np.clip(im, clip[0], clip[1]) + else: + raise Exception("clip : tuple of 2 numbers") + + return im + + +# normailization +def samplewise_norm( + x, rescale=None, samplewise_center=False, samplewise_std_normalization=False, channel_index=2, epsilon=1e-7 +): + """Normalize an image by rescale, samplewise centering and samplewise centering in order. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + rescale : float + Rescaling factor. If None or 0, no rescaling is applied, otherwise we multiply the data by the value provided (before applying any other transformation) + samplewise_center : boolean + If True, set each sample mean to 0. + samplewise_std_normalization : boolean + If True, divide each input by its std. + epsilon : float + A small position value for dividing standard deviation. + + Returns + ------- + numpy.array + A processed image. + + Examples + -------- + >>> x = samplewise_norm(x, samplewise_center=True, samplewise_std_normalization=True) + >>> print(x.shape, np.mean(x), np.std(x)) + (160, 176, 1), 0.0, 1.0 + + Notes + ------ + When samplewise_center and samplewise_std_normalization are True. + - For greyscale image, every pixels are subtracted and divided by the mean and std of whole image. + - For RGB image, every pixels are subtracted and divided by the mean and std of this pixel i.e. the mean and std of a pixel is 0 and 1. + + """ + if rescale: + x *= rescale + + if x.shape[channel_index] == 1: + # greyscale + if samplewise_center: + x = x - np.mean(x) + if samplewise_std_normalization: + x = x / np.std(x) + return x + elif x.shape[channel_index] == 3: + # rgb + if samplewise_center: + x = x - np.mean(x, axis=channel_index, keepdims=True) + if samplewise_std_normalization: + x = x / (np.std(x, axis=channel_index, keepdims=True) + epsilon) + return x + else: + raise Exception("Unsupported channels %d" % x.shape[channel_index]) + + +def featurewise_norm(x, mean=None, std=None, epsilon=1e-7): + """Normalize every pixels by the same given mean and std, which are usually + compute from all examples. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + mean : float + Value for subtraction. + std : float + Value for division. + epsilon : float + A small position value for dividing standard deviation. + + Returns + ------- + numpy.array + A processed image. + + """ + if mean: + x = x - mean + if std: + x = x / (std + epsilon) + return x + + +# whitening +def get_zca_whitening_principal_components_img(X): + """Return the ZCA whitening principal components matrix. + + Parameters + ----------- + x : numpy.array + Batch of images with dimension of [n_example, row, col, channel] (default). + + Returns + ------- + numpy.array + A processed image. + + """ + flatX = np.reshape(X, (X.shape[0], X.shape[1] * X.shape[2] * X.shape[3])) + tl.logging.info("zca : computing sigma ..") + sigma = np.dot(flatX.T, flatX) / flatX.shape[0] + tl.logging.info("zca : computing U, S and V ..") + U, S, _ = linalg.svd(sigma) # USV + tl.logging.info("zca : computing principal components ..") + principal_components = np.dot(np.dot(U, np.diag(1. / np.sqrt(S + 10e-7))), U.T) + return principal_components + + +def zca_whitening(x, principal_components): + """Apply ZCA whitening on an image by given principal components matrix. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + principal_components : matrix + Matrix from ``get_zca_whitening_principal_components_img``. + + Returns + ------- + numpy.array + A processed image. + + """ + flatx = np.reshape(x, (x.size)) + # tl.logging.info(principal_components.shape, x.shape) # ((28160, 28160), (160, 176, 1)) + # flatx = np.reshape(x, (x.shape)) + # flatx = np.reshape(x, (x.shape[0], )) + # tl.logging.info(flatx.shape) # (160, 176, 1) + whitex = np.dot(flatx, principal_components) + x = np.reshape(whitex, (x.shape[0], x.shape[1], x.shape[2])) + return x + + +# developing +# def barrel_transform(x, intensity): +# # https://github.com/fchollet/keras/blob/master/keras/preprocessing/image.py +# # TODO +# pass +# +# def barrel_transform_multi(x, intensity): +# # https://github.com/fchollet/keras/blob/master/keras/preprocessing/image.py +# # TODO +# pass + + +# channel shift +def channel_shift(x, intensity, is_random=False, channel_index=2): + """Shift the channels of an image, randomly or non-randomly, see `numpy.rollaxis `__. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] (default). + intensity : float + Intensity of shifting. + is_random : boolean + If True, randomly shift. Default is False. + channel_index : int + Index of channel. Default is 2. + + Returns + ------- + numpy.array + A processed image. + + """ + if is_random: + factor = np.random.uniform(-intensity, intensity) + else: + factor = intensity + x = np.rollaxis(x, channel_index, 0) + min_x, max_x = np.min(x), np.max(x) + channel_images = [np.clip(x_channel + factor, min_x, max_x) for x_channel in x] + x = np.stack(channel_images, axis=0) + x = np.rollaxis(x, 0, channel_index + 1) + return x + # x = np.rollaxis(x, channel_index, 0) + # min_x, max_x = np.min(x), np.max(x) + # channel_images = [np.clip(x_channel + np.random.uniform(-intensity, intensity), min_x, max_x) + # for x_channel in x] + # x = np.stack(channel_images, axis=0) + # x = np.rollaxis(x, 0, channel_index+1) + # return x + + +def channel_shift_multi(x, intensity, is_random=False, channel_index=2): + """Shift the channels of images with the same arguments, randomly or non-randomly, see `numpy.rollaxis `__. + Usually be used for image segmentation which x=[X, Y], X and Y should be matched. + + Parameters + ----------- + x : list of numpy.array + List of images with dimension of [n_images, row, col, channel] (default). + others : args + See ``tl.prepro.channel_shift``. + + Returns + ------- + numpy.array + A list of processed images. + + """ + if is_random: + factor = np.random.uniform(-intensity, intensity) + else: + factor = intensity + + results = [] + for data in x: + data = np.rollaxis(data, channel_index, 0) + min_x, max_x = np.min(data), np.max(data) + channel_images = [np.clip(x_channel + factor, min_x, max_x) for x_channel in x] + data = np.stack(channel_images, axis=0) + data = np.rollaxis(x, 0, channel_index + 1) + results.append(data) + return np.asarray(results) + + +# noise +def drop(x, keep=0.5): + """Randomly set some pixels to zero by a given keeping probability. + + Parameters + ----------- + x : numpy.array + An image with dimension of [row, col, channel] or [row, col]. + keep : float + The keeping probability (0, 1), the lower more values will be set to zero. + + Returns + ------- + numpy.array + A processed image. + + """ + if len(x.shape) == 3: + if x.shape[-1] == 3: # color + img_size = x.shape + mask = np.random.binomial(n=1, p=keep, size=x.shape[:-1]) + for i in range(3): + x[:, :, i] = np.multiply(x[:, :, i], mask) + elif x.shape[-1] == 1: # greyscale image + img_size = x.shape + x = np.multiply(x, np.random.binomial(n=1, p=keep, size=img_size)) + else: + raise Exception("Unsupported shape {}".format(x.shape)) + elif len(x.shape) == 2 or 1: # greyscale matrix (image) or vector + img_size = x.shape + x = np.multiply(x, np.random.binomial(n=1, p=keep, size=img_size)) + else: + raise Exception("Unsupported shape {}".format(x.shape)) + return x + + +# x = np.asarray([[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10]]) +# x = np.asarray([x,x,x,x,x,x]) +# x.shape = 10, 4, 3 +# tl.logging.info(x) +# # exit() +# tl.logging.info(x.shape) +# # exit() +# tl.logging.info(drop(x, keep=1.)) +# exit() + + +# Numpy and PIL +def array_to_img(x, dim_ordering=(0, 1, 2), scale=True): + """Converts a numpy array to PIL image object (uint8 format). + + Parameters + ---------- + x : numpy.array + An image with dimension of 3 and channels of 1 or 3. + dim_ordering : tuple of 3 int + Index of row, col and channel, default (0, 1, 2), for theano (1, 2, 0). + scale : boolean + If True, converts image to [0, 255] from any range of value like [-1, 2]. Default is True. + + Returns + ------- + PIL.image + An image. + + References + ----------- + `PIL Image.fromarray `__ + + """ + # if dim_ordering == 'default': + # dim_ordering = K.image_dim_ordering() + # if dim_ordering == 'th': # theano + # x = x.transpose(1, 2, 0) + + x = x.transpose(dim_ordering) + + if scale: + x += max(-np.min(x), 0) + x_max = np.max(x) + if x_max != 0: + # tl.logging.info(x_max) + # x /= x_max + x = x / x_max + x *= 255 + + if x.shape[2] == 3: + # RGB + return PIL.Image.fromarray(x.astype('uint8'), 'RGB') + + elif x.shape[2] == 1: + # grayscale + return PIL.Image.fromarray(x[:, :, 0].astype('uint8'), 'L') + + else: + raise Exception('Unsupported channel number: ', x.shape[2]) + + +def find_contours(x, level=0.8, fully_connected='low', positive_orientation='low'): + """Find iso-valued contours in a 2D array for a given level value, returns list of (n, 2)-ndarrays + see `skimage.measure.find_contours `__. + + Parameters + ------------ + x : 2D ndarray of double. + Input data in which to find contours. + level : float + Value along which to find contours in the array. + fully_connected : str + Either `low` or `high`. Indicates whether array elements below the given level value are to be considered fully-connected (and hence elements above the value will only be face connected), or vice-versa. (See notes below for details.) + positive_orientation : str + Either `low` or `high`. Indicates whether the output contours will produce positively-oriented polygons around islands of low- or high-valued elements. If `low` then contours will wind counter-clockwise around elements below the iso-value. Alternately, this means that low-valued elements are always on the left of the contour. + + Returns + -------- + list of (n,2)-ndarrays + Each contour is an ndarray of shape (n, 2), consisting of n (row, column) coordinates along the contour. + + """ + return skimage.measure.find_contours( + x, level, fully_connected=fully_connected, positive_orientation=positive_orientation + ) + + +def pt2map(list_points=None, size=(100, 100), val=1): + """Inputs a list of points, return a 2D image. + + Parameters + -------------- + list_points : list of 2 int + [[x, y], [x, y]..] for point coordinates. + size : tuple of 2 int + (w, h) for output size. + val : float or int + For the contour value. + + Returns + ------- + numpy.array + An image. + + """ + if list_points is None: + raise Exception("list_points : list of 2 int") + i_m = np.zeros(size) + if len(list_points) == 0: + return i_m + for xx in list_points: + for x in xx: + # tl.logging.info(x) + i_m[int(np.round(x[0]))][int(np.round(x[1]))] = val + return i_m + + +def binary_dilation(x, radius=3): + """Return fast binary morphological dilation of an image. + see `skimage.morphology.binary_dilation `__. + + Parameters + ----------- + x : 2D array + A binary image. + radius : int + For the radius of mask. + + Returns + ------- + numpy.array + A processed binary image. + + """ + mask = disk(radius) + x = _binary_dilation(x, selem=mask) + + return x + + +def dilation(x, radius=3): + """Return greyscale morphological dilation of an image, + see `skimage.morphology.dilation `__. + + Parameters + ----------- + x : 2D array + An greyscale image. + radius : int + For the radius of mask. + + Returns + ------- + numpy.array + A processed greyscale image. + + """ + mask = disk(radius) + x = dilation(x, selem=mask) + + return x + + +def binary_erosion(x, radius=3): + """Return binary morphological erosion of an image, + see `skimage.morphology.binary_erosion `__. + + Parameters + ----------- + x : 2D array + A binary image. + radius : int + For the radius of mask. + + Returns + ------- + numpy.array + A processed binary image. + + """ + mask = disk(radius) + x = _binary_erosion(x, selem=mask) + return x + + +def erosion(x, radius=3): + """Return greyscale morphological erosion of an image, + see `skimage.morphology.erosion `__. + + Parameters + ----------- + x : 2D array + A greyscale image. + radius : int + For the radius of mask. + + Returns + ------- + numpy.array + A processed greyscale image. + + """ + mask = disk(radius) + x = _erosion(x, selem=mask) + return x + + +def obj_box_coords_rescale(coords=None, shape=None): + """Scale down a list of coordinates from pixel unit to the ratio of image size i.e. in the range of [0, 1]. + + Parameters + ------------ + coords : list of list of 4 ints or None + For coordinates of more than one images .e.g.[[x, y, w, h], [x, y, w, h], ...]. + shape : list of 2 int or None + 【height, width]. + + Returns + ------- + list of list of 4 numbers + A list of new bounding boxes. + + + Examples + --------- + >>> coords = obj_box_coords_rescale(coords=[[30, 40, 50, 50], [10, 10, 20, 20]], shape=[100, 100]) + >>> print(coords) + [[0.3, 0.4, 0.5, 0.5], [0.1, 0.1, 0.2, 0.2]] + >>> coords = obj_box_coords_rescale(coords=[[30, 40, 50, 50]], shape=[50, 100]) + >>> print(coords) + [[0.3, 0.8, 0.5, 1.0]] + >>> coords = obj_box_coords_rescale(coords=[[30, 40, 50, 50]], shape=[100, 200]) + >>> print(coords) + [[0.15, 0.4, 0.25, 0.5]] + + Returns + ------- + list of 4 numbers + New coordinates. + + """ + if coords is None: + coords = [] + if shape is None: + shape = [100, 200] + + imh, imw = shape[0], shape[1] + imh = imh * 1.0 # * 1.0 for python2 : force division to be float point + imw = imw * 1.0 + coords_new = list() + for coord in coords: + + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x, y, w, h]") + + x = coord[0] / imw + y = coord[1] / imh + w = coord[2] / imw + h = coord[3] / imh + coords_new.append([x, y, w, h]) + return coords_new + + +def obj_box_coord_rescale(coord=None, shape=None): + """Scale down one coordinates from pixel unit to the ratio of image size i.e. in the range of [0, 1]. + It is the reverse process of ``obj_box_coord_scale_to_pixelunit``. + + Parameters + ------------ + coords : list of 4 int or None + One coordinates of one image e.g. [x, y, w, h]. + shape : list of 2 int or None + For [height, width]. + + Returns + ------- + list of 4 numbers + New bounding box. + + Examples + --------- + >>> coord = tl.prepro.obj_box_coord_rescale(coord=[30, 40, 50, 50], shape=[100, 100]) + [0.3, 0.4, 0.5, 0.5] + + """ + if coord is None: + coord = [] + if shape is None: + shape = [100, 200] + + return obj_box_coords_rescale(coords=[coord], shape=shape)[0] + + +def obj_box_coord_scale_to_pixelunit(coord, shape=None): + """Convert one coordinate [x, y, w (or x2), h (or y2)] in ratio format to image coordinate format. + It is the reverse process of ``obj_box_coord_rescale``. + + Parameters + ----------- + coord : list of 4 float + One coordinate of one image [x, y, w (or x2), h (or y2)] in ratio format, i.e value range [0~1]. + shape : tuple of 2 or None + For [height, width]. + + Returns + ------- + list of 4 numbers + New bounding box. + + Examples + --------- + >>> x, y, x2, y2 = tl.prepro.obj_box_coord_scale_to_pixelunit([0.2, 0.3, 0.5, 0.7], shape=(100, 200, 3)) + [40, 30, 100, 70] + + """ + if shape is None: + shape = [100, 100] + + imh, imw = shape[0:2] + x = int(coord[0] * imw) + x2 = int(coord[2] * imw) + y = int(coord[1] * imh) + y2 = int(coord[3] * imh) + return [x, y, x2, y2] + + +# coords = obj_box_coords_rescale(coords=[[30, 40, 50, 50], [10, 10, 20, 20]], shape=[100, 100]) +# tl.logging.info(coords) +# # [[0.3, 0.4, 0.5, 0.5], [0.1, 0.1, 0.2, 0.2]] +# coords = obj_box_coords_rescale(coords=[[30, 40, 50, 50]], shape=[50, 100]) +# tl.logging.info(coords) +# # [[0.3, 0.8, 0.5, 1.0]] +# coords = obj_box_coords_rescale(coords=[[30, 40, 50, 50]], shape=[100, 200]) +# tl.logging.info(coords) +# # [[0.15, 0.4, 0.25, 0.5]] +# exit() + + +def obj_box_coord_centroid_to_upleft_butright(coord, to_int=False): + """Convert one coordinate [x_center, y_center, w, h] to [x1, y1, x2, y2] in up-left and botton-right format. + + Parameters + ------------ + coord : list of 4 int/float + One coordinate. + to_int : boolean + Whether to convert output as integer. + + Returns + ------- + list of 4 numbers + New bounding box. + + Examples + --------- + >>> coord = obj_box_coord_centroid_to_upleft_butright([30, 40, 20, 20]) + [20, 30, 40, 50] + + """ + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x, y, w, h]") + + x_center, y_center, w, h = coord + x = x_center - w / 2. + y = y_center - h / 2. + x2 = x + w + y2 = y + h + if to_int: + return [int(x), int(y), int(x2), int(y2)] + else: + return [x, y, x2, y2] + + +# coord = obj_box_coord_centroid_to_upleft_butright([30, 40, 20, 20]) +# tl.logging.info(coord) [20, 30, 40, 50] +# exit() + + +def obj_box_coord_upleft_butright_to_centroid(coord): + """Convert one coordinate [x1, y1, x2, y2] to [x_center, y_center, w, h]. + It is the reverse process of ``obj_box_coord_centroid_to_upleft_butright``. + + Parameters + ------------ + coord : list of 4 int/float + One coordinate. + + Returns + ------- + list of 4 numbers + New bounding box. + + """ + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x1, y1, x2, y2]") + x1, y1, x2, y2 = coord + w = x2 - x1 + h = y2 - y1 + x_c = x1 + w / 2. + y_c = y1 + h / 2. + return [x_c, y_c, w, h] + + +def obj_box_coord_centroid_to_upleft(coord): + """Convert one coordinate [x_center, y_center, w, h] to [x, y, w, h]. + It is the reverse process of ``obj_box_coord_upleft_to_centroid``. + + Parameters + ------------ + coord : list of 4 int/float + One coordinate. + + Returns + ------- + list of 4 numbers + New bounding box. + + """ + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x, y, w, h]") + + x_center, y_center, w, h = coord + x = x_center - w / 2. + y = y_center - h / 2. + return [x, y, w, h] + + +def obj_box_coord_upleft_to_centroid(coord): + """Convert one coordinate [x, y, w, h] to [x_center, y_center, w, h]. + It is the reverse process of ``obj_box_coord_centroid_to_upleft``. + + Parameters + ------------ + coord : list of 4 int/float + One coordinate. + + Returns + ------- + list of 4 numbers + New bounding box. + + """ + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x, y, w, h]") + + x, y, w, h = coord + x_center = x + w / 2. + y_center = y + h / 2. + return [x_center, y_center, w, h] + + +def parse_darknet_ann_str_to_list(annotations): + r"""Input string format of class, x, y, w, h, return list of list format. + + Parameters + ----------- + annotations : str + The annotations in darkent format "class, x, y, w, h ...." seperated by "\\n". + + Returns + ------- + list of list of 4 numbers + List of bounding box. + + """ + annotations = annotations.split("\n") + ann = [] + for a in annotations: + a = a.split() + if len(a) == 5: + for i, _v in enumerate(a): + if i == 0: + a[i] = int(a[i]) + else: + a[i] = float(a[i]) + ann.append(a) + return ann + + +def parse_darknet_ann_list_to_cls_box(annotations): + """Parse darknet annotation format into two lists for class and bounding box. + + Input list of [[class, x, y, w, h], ...], return two list of [class ...] and [[x, y, w, h], ...]. + + Parameters + ------------ + annotations : list of list + A list of class and bounding boxes of images e.g. [[class, x, y, w, h], ...] + + Returns + ------- + list of int + List of class labels. + + list of list of 4 numbers + List of bounding box. + + """ + class_list = [] + bbox_list = [] + for ann in annotations: + class_list.append(ann[0]) + bbox_list.append(ann[1:]) + return class_list, bbox_list + + +def obj_box_horizontal_flip(im, coords=None, is_rescale=False, is_center=False, is_random=False): + """Left-right flip the image and coordinates for object detection. + + Parameters + ---------- + im : numpy.array + An image with dimension of [row, col, channel] (default). + coords : list of list of 4 int/float or None + Coordinates [[x, y, w, h], [x, y, w, h], ...]. + is_rescale : boolean + Set to True, if the input coordinates are rescaled to [0, 1]. Default is False. + is_center : boolean + Set to True, if the x and y of coordinates are the centroid (i.e. darknet format). Default is False. + is_random : boolean + If True, randomly flip. Default is False. + + Returns + ------- + numpy.array + A processed image + list of list of 4 numbers + A list of new bounding boxes. + + Examples + -------- + >>> im = np.zeros([80, 100]) # as an image with shape width=100, height=80 + >>> im, coords = obj_box_left_right_flip(im, coords=[[0.2, 0.4, 0.3, 0.3], [0.1, 0.5, 0.2, 0.3]], is_rescale=True, is_center=True, is_random=False) + >>> print(coords) + [[0.8, 0.4, 0.3, 0.3], [0.9, 0.5, 0.2, 0.3]] + >>> im, coords = obj_box_left_right_flip(im, coords=[[0.2, 0.4, 0.3, 0.3]], is_rescale=True, is_center=False, is_random=False) + >>> print(coords) + [[0.5, 0.4, 0.3, 0.3]] + >>> im, coords = obj_box_left_right_flip(im, coords=[[20, 40, 30, 30]], is_rescale=False, is_center=True, is_random=False) + >>> print(coords) + [[80, 40, 30, 30]] + >>> im, coords = obj_box_left_right_flip(im, coords=[[20, 40, 30, 30]], is_rescale=False, is_center=False, is_random=False) + >>> print(coords) + [[50, 40, 30, 30]] + + """ + if coords is None: + coords = [] + + def _flip(im, coords): + im = flip_axis(im, axis=1, is_random=False) + coords_new = list() + + for coord in coords: + + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x, y, w, h]") + + if is_rescale: + if is_center: + # x_center' = 1 - x + x = 1. - coord[0] + else: + # x_center' = 1 - x - w + x = 1. - coord[0] - coord[2] + else: + if is_center: + # x' = im.width - x + x = im.shape[1] - coord[0] + else: + # x' = im.width - x - w + x = im.shape[1] - coord[0] - coord[2] + coords_new.append([x, coord[1], coord[2], coord[3]]) + return im, coords_new + + if is_random: + factor = np.random.uniform(-1, 1) + if factor > 0: + return _flip(im, coords) + else: + return im, coords + else: + return _flip(im, coords) + + +obj_box_left_right_flip = obj_box_horizontal_flip + +# im = np.zeros([80, 100]) # as an image with shape width=100, height=80 +# im, coords = obj_box_left_right_flip(im, coords=[[0.2, 0.4, 0.3, 0.3], [0.1, 0.5, 0.2, 0.3]], is_rescale=True, is_center=True, is_random=False) +# tl.logging.info(coords) +# # [[0.8, 0.4, 0.3, 0.3], [0.9, 0.5, 0.2, 0.3]] +# im, coords = obj_box_left_right_flip(im, coords=[[0.2, 0.4, 0.3, 0.3]], is_rescale=True, is_center=False, is_random=False) +# tl.logging.info(coords) +# # [[0.5, 0.4, 0.3, 0.3]] +# im, coords = obj_box_left_right_flip(im, coords=[[20, 40, 30, 30]], is_rescale=False, is_center=True, is_random=False) +# tl.logging.info(coords) +# # [[80, 40, 30, 30]] +# im, coords = obj_box_left_right_flip(im, coords=[[20, 40, 30, 30]], is_rescale=False, is_center=False, is_random=False) +# tl.logging.info(coords) +# # [[50, 40, 30, 30]] +# exit() + + +def obj_box_imresize(im, coords=None, size=None, interp='bicubic', mode=None, is_rescale=False): + """Resize an image, and compute the new bounding box coordinates. + + Parameters + ------------- + im : numpy.array + An image with dimension of [row, col, channel] (default). + coords : list of list of 4 int/float or None + Coordinates [[x, y, w, h], [x, y, w, h], ...] + size interp and mode : args + See ``tl.prepro.imresize``. + is_rescale : boolean + Set to True, if the input coordinates are rescaled to [0, 1], then return the original coordinates. Default is False. + + Returns + ------- + numpy.array + A processed image + list of list of 4 numbers + A list of new bounding boxes. + + Examples + -------- + >>> im = np.zeros([80, 100, 3]) # as an image with shape width=100, height=80 + >>> _, coords = obj_box_imresize(im, coords=[[20, 40, 30, 30], [10, 20, 20, 20]], size=[160, 200], is_rescale=False) + >>> print(coords) + [[40, 80, 60, 60], [20, 40, 40, 40]] + >>> _, coords = obj_box_imresize(im, coords=[[20, 40, 30, 30]], size=[40, 100], is_rescale=False) + >>> print(coords) + [[20, 20, 30, 15]] + >>> _, coords = obj_box_imresize(im, coords=[[20, 40, 30, 30]], size=[60, 150], is_rescale=False) + >>> print(coords) + [[30, 30, 45, 22]] + >>> im2, coords = obj_box_imresize(im, coords=[[0.2, 0.4, 0.3, 0.3]], size=[160, 200], is_rescale=True) + >>> print(coords, im2.shape) + [[0.2, 0.4, 0.3, 0.3]] (160, 200, 3) + + """ + if coords is None: + coords = [] + if size is None: + size = [100, 100] + + imh, imw = im.shape[0:2] + imh = imh * 1.0 # * 1.0 for python2 : force division to be float point + imw = imw * 1.0 + im = imresize(im, size=size, interp=interp, mode=mode) + + if is_rescale is False: + coords_new = list() + + for coord in coords: + + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x, y, w, h]") + + # x' = x * (imw'/imw) + x = int(coord[0] * (size[1] / imw)) + # y' = y * (imh'/imh) + # tl.logging.info('>>', coord[1], size[0], imh) + y = int(coord[1] * (size[0] / imh)) + # w' = w * (imw'/imw) + w = int(coord[2] * (size[1] / imw)) + # h' = h * (imh'/imh) + h = int(coord[3] * (size[0] / imh)) + coords_new.append([x, y, w, h]) + return im, coords_new + else: + return im, coords + + +# im = np.zeros([80, 100, 3]) # as an image with shape width=100, height=80 +# _, coords = obj_box_imresize(im, coords=[[20, 40, 30, 30], [10, 20, 20, 20]], size=[160, 200], is_rescale=False) +# tl.logging.info(coords) +# # [[40, 80, 60, 60], [20, 40, 40, 40]] +# _, coords = obj_box_imresize(im, coords=[[20, 40, 30, 30]], size=[40, 100], is_rescale=False) +# tl.logging.info(coords) +# # [20, 20, 30, 15] +# _, coords = obj_box_imresize(im, coords=[[20, 40, 30, 30]], size=[60, 150], is_rescale=False) +# tl.logging.info(coords) +# # [30, 30, 45, 22] +# im2, coords = obj_box_imresize(im, coords=[[0.2, 0.4, 0.3, 0.3]], size=[160, 200], is_rescale=True) +# tl.logging.info(coords, im2.shape) +# # [0.2, 0.4, 0.3, 0.3] (160, 200, 3) +# exit() + + +def obj_box_crop( + im, classes=None, coords=None, wrg=100, hrg=100, is_rescale=False, is_center=False, is_random=False, thresh_wh=0.02, + thresh_wh2=12. +): + """Randomly or centrally crop an image, and compute the new bounding box coordinates. + Objects outside the cropped image will be removed. + + Parameters + ----------- + im : numpy.array + An image with dimension of [row, col, channel] (default). + classes : list of int or None + Class IDs. + coords : list of list of 4 int/float or None + Coordinates [[x, y, w, h], [x, y, w, h], ...] + wrg hrg and is_random : args + See ``tl.prepro.crop``. + is_rescale : boolean + Set to True, if the input coordinates are rescaled to [0, 1]. Default is False. + is_center : boolean, default False + Set to True, if the x and y of coordinates are the centroid (i.e. darknet format). Default is False. + thresh_wh : float + Threshold, remove the box if its ratio of width(height) to image size less than the threshold. + thresh_wh2 : float + Threshold, remove the box if its ratio of width to height or vice verse higher than the threshold. + + Returns + ------- + numpy.array + A processed image + list of int + A list of classes + list of list of 4 numbers + A list of new bounding boxes. + + """ + if classes is None: + classes = [] + if coords is None: + coords = [] + + h, w = im.shape[0], im.shape[1] + + if (h <= hrg) or (w <= wrg): + raise AssertionError("The size of cropping should smaller than the original image") + + if is_random: + h_offset = int(np.random.uniform(0, h - hrg) - 1) + w_offset = int(np.random.uniform(0, w - wrg) - 1) + h_end = hrg + h_offset + w_end = wrg + w_offset + im_new = im[h_offset:h_end, w_offset:w_end] + else: # central crop + h_offset = int(np.floor((h - hrg) / 2.)) + w_offset = int(np.floor((w - wrg) / 2.)) + h_end = h_offset + hrg + w_end = w_offset + wrg + im_new = im[h_offset:h_end, w_offset:w_end] + + # w + # _____________________________ + # | h/w offset | + # | ------- | + # h | | | | + # | | | | + # | ------- | + # | h/w end | + # |___________________________| + + def _get_coord(coord): + """Input pixel-unit [x, y, w, h] format, then make sure [x, y] it is the up-left coordinates, + before getting the new coordinates. + Boxes outsides the cropped image will be removed. + + """ + if is_center: + coord = obj_box_coord_centroid_to_upleft(coord) + + ##======= pixel unit format and upleft, w, h ==========## + + # x = np.clip( coord[0] - w_offset, 0, w_end - w_offset) + # y = np.clip( coord[1] - h_offset, 0, h_end - h_offset) + # w = np.clip( coord[2] , 0, w_end - w_offset) + # h = np.clip( coord[3] , 0, h_end - h_offset) + + x = coord[0] - w_offset + y = coord[1] - h_offset + w = coord[2] + h = coord[3] + + if x < 0: + if x + w <= 0: + return None + w = w + x + x = 0 + elif x > im_new.shape[1]: # object outside the cropped image + return None + + if y < 0: + if y + h <= 0: + return None + h = h + y + y = 0 + elif y > im_new.shape[0]: # object outside the cropped image + return None + + if (x is not None) and (x + w > im_new.shape[1]): # box outside the cropped image + w = im_new.shape[1] - x + + if (y is not None) and (y + h > im_new.shape[0]): # box outside the cropped image + h = im_new.shape[0] - y + + if (w / (h + 1.) > thresh_wh2) or (h / (w + 1.) > thresh_wh2): # object shape strange: too narrow + # tl.logging.info('xx', w, h) + return None + + if (w / (im_new.shape[1] * 1.) < thresh_wh) or (h / (im_new.shape[0] * 1.) < + thresh_wh): # object shape strange: too narrow + # tl.logging.info('yy', w, im_new.shape[1], h, im_new.shape[0]) + return None + + coord = [x, y, w, h] + + ## convert back if input format is center. + if is_center: + coord = obj_box_coord_upleft_to_centroid(coord) + + return coord + + coords_new = list() + classes_new = list() + for i, _ in enumerate(coords): + coord = coords[i] + + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x, y, w, h]") + + if is_rescale: + # for scaled coord, upscaled before process and scale back in the end. + coord = obj_box_coord_scale_to_pixelunit(coord, im.shape) + coord = _get_coord(coord) + if coord is not None: + coord = obj_box_coord_rescale(coord, im_new.shape) + coords_new.append(coord) + classes_new.append(classes[i]) + else: + coord = _get_coord(coord) + if coord is not None: + coords_new.append(coord) + classes_new.append(classes[i]) + return im_new, classes_new, coords_new + + +def obj_box_shift( + im, classes=None, coords=None, wrg=0.1, hrg=0.1, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', + cval=0., order=1, is_rescale=False, is_center=False, is_random=False, thresh_wh=0.02, thresh_wh2=12. +): + """Shift an image randomly or non-randomly, and compute the new bounding box coordinates. + Objects outside the cropped image will be removed. + + Parameters + ----------- + im : numpy.array + An image with dimension of [row, col, channel] (default). + classes : list of int or None + Class IDs. + coords : list of list of 4 int/float or None + Coordinates [[x, y, w, h], [x, y, w, h], ...] + wrg, hrg row_index col_index channel_index is_random fill_mode cval and order : see ``tl.prepro.shift``. + is_rescale : boolean + Set to True, if the input coordinates are rescaled to [0, 1]. Default is False. + is_center : boolean + Set to True, if the x and y of coordinates are the centroid (i.e. darknet format). Default is False. + thresh_wh : float + Threshold, remove the box if its ratio of width(height) to image size less than the threshold. + thresh_wh2 : float + Threshold, remove the box if its ratio of width to height or vice verse higher than the threshold. + + + Returns + ------- + numpy.array + A processed image + list of int + A list of classes + list of list of 4 numbers + A list of new bounding boxes. + + """ + if classes is None: + classes = [] + if coords is None: + coords = [] + + imh, imw = im.shape[row_index], im.shape[col_index] + + if (hrg >= 1.0) and (hrg <= 0.) and (wrg >= 1.0) and (wrg <= 0.): + raise AssertionError("shift range should be (0, 1)") + + if is_random: + tx = np.random.uniform(-hrg, hrg) * imh + ty = np.random.uniform(-wrg, wrg) * imw + else: + tx, ty = hrg * imh, wrg * imw + translation_matrix = np.array([[1, 0, tx], [0, 1, ty], [0, 0, 1]]) + + transform_matrix = translation_matrix # no need to do offset + im_new = affine_transform(im, transform_matrix, channel_index, fill_mode, cval, order) + + # modified from obj_box_crop + def _get_coord(coord): + """Input pixel-unit [x, y, w, h] format, then make sure [x, y] it is the up-left coordinates, + before getting the new coordinates. + Boxes outsides the cropped image will be removed. + + """ + if is_center: + coord = obj_box_coord_centroid_to_upleft(coord) + + ##======= pixel unit format and upleft, w, h ==========## + x = coord[0] - ty # only change this + y = coord[1] - tx # only change this + w = coord[2] + h = coord[3] + + if x < 0: + if x + w <= 0: + return None + w = w + x + x = 0 + elif x > im_new.shape[1]: # object outside the cropped image + return None + + if y < 0: + if y + h <= 0: + return None + h = h + y + y = 0 + elif y > im_new.shape[0]: # object outside the cropped image + return None + + if (x is not None) and (x + w > im_new.shape[1]): # box outside the cropped image + w = im_new.shape[1] - x + + if (y is not None) and (y + h > im_new.shape[0]): # box outside the cropped image + h = im_new.shape[0] - y + + if (w / (h + 1.) > thresh_wh2) or (h / (w + 1.) > thresh_wh2): # object shape strange: too narrow + # tl.logging.info('xx', w, h) + return None + + if (w / (im_new.shape[1] * 1.) < thresh_wh) or (h / (im_new.shape[0] * 1.) < + thresh_wh): # object shape strange: too narrow + # tl.logging.info('yy', w, im_new.shape[1], h, im_new.shape[0]) + return None + + coord = [x, y, w, h] + + ## convert back if input format is center. + if is_center: + coord = obj_box_coord_upleft_to_centroid(coord) + + return coord + + coords_new = list() + classes_new = list() + for i, _ in enumerate(coords): + coord = coords[i] + + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x, y, w, h]") + + if is_rescale: + # for scaled coord, upscaled before process and scale back in the end. + coord = obj_box_coord_scale_to_pixelunit(coord, im.shape) + coord = _get_coord(coord) + if coord is not None: + coord = obj_box_coord_rescale(coord, im_new.shape) + coords_new.append(coord) + classes_new.append(classes[i]) + else: + coord = _get_coord(coord) + if coord is not None: + coords_new.append(coord) + classes_new.append(classes[i]) + return im_new, classes_new, coords_new + + +def obj_box_zoom( + im, classes=None, coords=None, zoom_range=(0.9, 1.1), row_index=0, col_index=1, channel_index=2, + fill_mode='nearest', cval=0., order=1, is_rescale=False, is_center=False, is_random=False, thresh_wh=0.02, + thresh_wh2=12. +): + """Zoom in and out of a single image, randomly or non-randomly, and compute the new bounding box coordinates. + Objects outside the cropped image will be removed. + + Parameters + ----------- + im : numpy.array + An image with dimension of [row, col, channel] (default). + classes : list of int or None + Class IDs. + coords : list of list of 4 int/float or None + Coordinates [[x, y, w, h], [x, y, w, h], ...]. + zoom_range row_index col_index channel_index is_random fill_mode cval and order : see ``tl.prepro.zoom``. + is_rescale : boolean + Set to True, if the input coordinates are rescaled to [0, 1]. Default is False. + is_center : boolean + Set to True, if the x and y of coordinates are the centroid. (i.e. darknet format). Default is False. + thresh_wh : float + Threshold, remove the box if its ratio of width(height) to image size less than the threshold. + thresh_wh2 : float + Threshold, remove the box if its ratio of width to height or vice verse higher than the threshold. + + Returns + ------- + numpy.array + A processed image + list of int + A list of classes + list of list of 4 numbers + A list of new bounding boxes. + + """ + if classes is None: + classes = [] + if coords is None: + coords = [] + + if len(zoom_range) != 2: + raise Exception('zoom_range should be a tuple or list of two floats. ' 'Received arg: ', zoom_range) + if is_random: + if zoom_range[0] == 1 and zoom_range[1] == 1: + zx, zy = 1, 1 + tl.logging.info(" random_zoom : not zoom in/out") + else: + zx, zy = np.random.uniform(zoom_range[0], zoom_range[1], 2) + else: + zx, zy = zoom_range + # tl.logging.info(zx, zy) + zoom_matrix = np.array([[zx, 0, 0], [0, zy, 0], [0, 0, 1]]) + + h, w = im.shape[row_index], im.shape[col_index] + transform_matrix = transform_matrix_offset_center(zoom_matrix, h, w) + im_new = affine_transform(im, transform_matrix, channel_index, fill_mode, cval, order) + + # modified from obj_box_crop + def _get_coord(coord): + """Input pixel-unit [x, y, w, h] format, then make sure [x, y] it is the up-left coordinates, + before getting the new coordinates. + Boxes outsides the cropped image will be removed. + + """ + if is_center: + coord = obj_box_coord_centroid_to_upleft(coord) + + # ======= pixel unit format and upleft, w, h ========== + x = (coord[0] - im.shape[1] / 2) / zy + im.shape[1] / 2 # only change this + y = (coord[1] - im.shape[0] / 2) / zx + im.shape[0] / 2 # only change this + w = coord[2] / zy # only change this + h = coord[3] / zx # only change thisS + + if x < 0: + if x + w <= 0: + return None + w = w + x + x = 0 + elif x > im_new.shape[1]: # object outside the cropped image + return None + + if y < 0: + if y + h <= 0: + return None + h = h + y + y = 0 + elif y > im_new.shape[0]: # object outside the cropped image + return None + + if (x is not None) and (x + w > im_new.shape[1]): # box outside the cropped image + w = im_new.shape[1] - x + + if (y is not None) and (y + h > im_new.shape[0]): # box outside the cropped image + h = im_new.shape[0] - y + + if (w / (h + 1.) > thresh_wh2) or (h / (w + 1.) > thresh_wh2): # object shape strange: too narrow + # tl.logging.info('xx', w, h) + return None + + if (w / (im_new.shape[1] * 1.) < thresh_wh) or (h / (im_new.shape[0] * 1.) < + thresh_wh): # object shape strange: too narrow + # tl.logging.info('yy', w, im_new.shape[1], h, im_new.shape[0]) + return None + + coord = [x, y, w, h] + + # convert back if input format is center. + if is_center: + coord = obj_box_coord_upleft_to_centroid(coord) + + return coord + + coords_new = list() + classes_new = list() + for i, _ in enumerate(coords): + coord = coords[i] + + if len(coord) != 4: + raise AssertionError("coordinate should be 4 values : [x, y, w, h]") + + if is_rescale: + # for scaled coord, upscaled before process and scale back in the end. + coord = obj_box_coord_scale_to_pixelunit(coord, im.shape) + coord = _get_coord(coord) + if coord is not None: + coord = obj_box_coord_rescale(coord, im_new.shape) + coords_new.append(coord) + classes_new.append(classes[i]) + else: + coord = _get_coord(coord) + if coord is not None: + coords_new.append(coord) + classes_new.append(classes[i]) + return im_new, classes_new, coords_new + + +def pad_sequences(sequences, maxlen=None, dtype='int32', padding='post', truncating='pre', value=0.): + """Pads each sequence to the same length: + the length of the longest sequence. + If maxlen is provided, any sequence longer + than maxlen is truncated to maxlen. + Truncation happens off either the beginning (default) or + the end of the sequence. + Supports post-padding and pre-padding (default). + + Parameters + ---------- + sequences : list of list of int + All sequences where each row is a sequence. + maxlen : int + Maximum length. + dtype : numpy.dtype or str + Data type to cast the resulting sequence. + padding : str + Either 'pre' or 'post', pad either before or after each sequence. + truncating : str + Either 'pre' or 'post', remove values from sequences larger than maxlen either in the beginning or in the end of the sequence + value : float + Value to pad the sequences to the desired value. + + Returns + ---------- + x : numpy.array + With dimensions (number_of_sequences, maxlen) + + Examples + ---------- + >>> sequences = [[1,1,1,1,1],[2,2,2],[3,3]] + >>> sequences = pad_sequences(sequences, maxlen=None, dtype='int32', + ... padding='post', truncating='pre', value=0.) + [[1 1 1 1 1] + [2 2 2 0 0] + [3 3 0 0 0]] + + """ + lengths = [len(s) for s in sequences] + + nb_samples = len(sequences) + if maxlen is None: + maxlen = np.max(lengths) + + # take the sample shape from the first non empty sequence + # checking for consistency in the main loop below. + sample_shape = tuple() + for s in sequences: + if len(s) > 0: + sample_shape = np.asarray(s).shape[1:] + break + + x = (np.ones((nb_samples, maxlen) + sample_shape) * value).astype(dtype) + for idx, s in enumerate(sequences): + if len(s) == 0: + continue # empty list was found + if truncating == 'pre': + trunc = s[-maxlen:] + elif truncating == 'post': + trunc = s[:maxlen] + else: + raise ValueError('Truncating type "%s" not understood' % truncating) + + # check `trunc` has expected shape + trunc = np.asarray(trunc, dtype=dtype) + if trunc.shape[1:] != sample_shape: + raise ValueError( + 'Shape of sample %s of sequence at position %s is different from expected shape %s' % + (trunc.shape[1:], idx, sample_shape) + ) + + if padding == 'post': + x[idx, :len(trunc)] = trunc + elif padding == 'pre': + x[idx, -len(trunc):] = trunc + else: + raise ValueError('Padding type "%s" not understood' % padding) + return x.tolist() + + +def remove_pad_sequences(sequences, pad_id=0): + """Remove padding. + + Parameters + ----------- + sequences : list of list of int + All sequences where each row is a sequence. + pad_id : int + The pad ID. + + Returns + ---------- + list of list of int + The processed sequences. + + Examples + ---------- + >>> sequences = [[2,3,4,0,0], [5,1,2,3,4,0,0,0], [4,5,0,2,4,0,0,0]] + >>> print(remove_pad_sequences(sequences, pad_id=0)) + [[2, 3, 4], [5, 1, 2, 3, 4], [4, 5, 0, 2, 4]] + + """ + sequences_out = copy.deepcopy(sequences) + + for i, _ in enumerate(sequences): + # for j in range(len(sequences[i])): + # if sequences[i][j] == pad_id: + # sequences_out[i] = sequences_out[i][:j] + # break + for j in range(1, len(sequences[i])): + if sequences[i][-j] != pad_id: + sequences_out[i] = sequences_out[i][0:-j + 1] + break + + return sequences_out + + +def process_sequences(sequences, end_id=0, pad_val=0, is_shorten=True, remain_end_id=False): + """Set all tokens(ids) after END token to the padding value, and then shorten (option) it to the maximum sequence length in this batch. + + Parameters + ----------- + sequences : list of list of int + All sequences where each row is a sequence. + end_id : int + The special token for END. + pad_val : int + Replace the `end_id` and the IDs after `end_id` to this value. + is_shorten : boolean + Shorten the sequences. Default is True. + remain_end_id : boolean + Keep an `end_id` in the end. Default is False. + + Returns + ---------- + list of list of int + The processed sequences. + + Examples + --------- + >>> sentences_ids = [[4, 3, 5, 3, 2, 2, 2, 2], <-- end_id is 2 + ... [5, 3, 9, 4, 9, 2, 2, 3]] <-- end_id is 2 + >>> sentences_ids = precess_sequences(sentences_ids, end_id=vocab.end_id, pad_val=0, is_shorten=True) + [[4, 3, 5, 3, 0], [5, 3, 9, 4, 9]] + + """ + max_length = 0 + for _, seq in enumerate(sequences): + is_end = False + for i_w, n in enumerate(seq): + if n == end_id and is_end == False: # 1st time to see end_id + is_end = True + if max_length < i_w: + max_length = i_w + if remain_end_id is False: + seq[i_w] = pad_val # set end_id to pad_val + elif is_end ==True: + seq[i_w] = pad_val + + if remain_end_id is True: + max_length += 1 + if is_shorten: + for i, seq in enumerate(sequences): + sequences[i] = seq[:max_length] + return sequences + + +def sequences_add_start_id(sequences, start_id=0, remove_last=False): + """Add special start token(id) in the beginning of each sequence. + + Parameters + ------------ + sequences : list of list of int + All sequences where each row is a sequence. + start_id : int + The start ID. + remove_last : boolean + Remove the last value of each sequences. Usually be used for removing the end ID. + + Returns + ---------- + list of list of int + The processed sequences. + + Examples + --------- + >>> sentences_ids = [[4,3,5,3,2,2,2,2], [5,3,9,4,9,2,2,3]] + >>> sentences_ids = sequences_add_start_id(sentences_ids, start_id=2) + [[2, 4, 3, 5, 3, 2, 2, 2, 2], [2, 5, 3, 9, 4, 9, 2, 2, 3]] + >>> sentences_ids = sequences_add_start_id(sentences_ids, start_id=2, remove_last=True) + [[2, 4, 3, 5, 3, 2, 2, 2], [2, 5, 3, 9, 4, 9, 2, 2]] + + For Seq2seq + + >>> input = [a, b, c] + >>> target = [x, y, z] + >>> decode_seq = [start_id, a, b] <-- sequences_add_start_id(input, start_id, True) + + """ + sequences_out = [[] for _ in range(len(sequences))] #[[]] * len(sequences) + for i, _ in enumerate(sequences): + if remove_last: + sequences_out[i] = [start_id] + sequences[i][:-1] + else: + sequences_out[i] = [start_id] + sequences[i] + return sequences_out + + +def sequences_add_end_id(sequences, end_id=888): + """Add special end token(id) in the end of each sequence. + + Parameters + ----------- + sequences : list of list of int + All sequences where each row is a sequence. + end_id : int + The end ID. + + Returns + ---------- + list of list of int + The processed sequences. + + Examples + --------- + >>> sequences = [[1,2,3],[4,5,6,7]] + >>> print(sequences_add_end_id(sequences, end_id=999)) + [[1, 2, 3, 999], [4, 5, 6, 999]] + + """ + sequences_out = [[] for _ in range(len(sequences))] #[[]] * len(sequences) + for i, _ in enumerate(sequences): + sequences_out[i] = sequences[i] + [end_id] + return sequences_out + + +def sequences_add_end_id_after_pad(sequences, end_id=888, pad_id=0): + """Add special end token(id) in the end of each sequence. + + Parameters + ----------- + sequences : list of list of int + All sequences where each row is a sequence. + end_id : int + The end ID. + pad_id : int + The pad ID. + + Returns + ---------- + list of list of int + The processed sequences. + + Examples + --------- + >>> sequences = [[1,2,0,0], [1,2,3,0], [1,2,3,4]] + >>> print(sequences_add_end_id_after_pad(sequences, end_id=99, pad_id=0)) + [[1, 2, 99, 0], [1, 2, 3, 99], [1, 2, 3, 4]] + + """ + # sequences_out = [[] for _ in range(len(sequences))]#[[]] * len(sequences) + + sequences_out = copy.deepcopy(sequences) + # # add a pad to all + # for i in range(len(sequences)): + # for j in range(len(sequences[i])): + # sequences_out[i].append(pad_id) + # # pad -- > end + # max_len = 0 + + for i, v in enumerate(sequences): + for j, _v2 in enumerate(v): + if sequences[i][j] == pad_id: + sequences_out[i][j] = end_id + # if j > max_len: + # max_len = j + break + + # # remove pad if too long + # for i in range(len(sequences)): + # for j in range(len(sequences[i])): + # sequences_out[i] = sequences_out[i][:max_len+1] + return sequences_out + + +def sequences_get_mask(sequences, pad_val=0): + """Return mask for sequences. + + Parameters + ----------- + sequences : list of list of int + All sequences where each row is a sequence. + pad_val : int + The pad value. + + Returns + ---------- + list of list of int + The mask. + + Examples + --------- + >>> sentences_ids = [[4, 0, 5, 3, 0, 0], + ... [5, 3, 9, 4, 9, 0]] + >>> mask = sequences_get_mask(sentences_ids, pad_val=0) + [[1 1 1 1 0 0] + [1 1 1 1 1 0]] + + """ + mask = np.ones_like(sequences) + for i, seq in enumerate(sequences): + for i_w in reversed(range(len(seq))): + if seq[i_w] == pad_val: + mask[i, i_w] = 0 + else: + break # <-- exit the for loop, prepcess next sequence + return mask + + +def keypoint_random_crop(image, annos, mask=None, size=(368, 368)): + """Randomly crop an image and corresponding keypoints without influence scales, given by ``keypoint_random_resize_shortestedge``. + + Parameters + ----------- + image : 3 channel image + The given image for augmentation. + annos : list of list of floats + The keypoints annotation of people. + mask : single channel image or None + The mask if available. + size : tuple of int + The size of returned image. + + Returns + ---------- + preprocessed image, annotation, mask + + """ + + _target_height = size[0] + _target_width = size[1] + target_size = (_target_width, _target_height) + + if len(np.shape(image)) == 2: + image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) + height, width, _ = np.shape(image) + + for _ in range(50): + x = random.randrange(0, width - target_size[0]) if width > target_size[0] else 0 + y = random.randrange(0, height - target_size[1]) if height > target_size[1] else 0 + + # check whether any face is inside the box to generate a reasonably-balanced datasets + for joint in annos: + if x <= joint[0][0] < x + target_size[0] and y <= joint[0][1] < y + target_size[1]: + break + + def pose_crop(image, annos, mask, x, y, w, h): # TODO : speed up with affine transform + # adjust image + target_size = (w, h) + + img = image + resized = img[y:y + target_size[1], x:x + target_size[0], :] + resized_mask = mask[y:y + target_size[1], x:x + target_size[0]] + # adjust meta data + adjust_joint_list = [] + for joint in annos: + adjust_joint = [] + for point in joint: + if point[0] < -10 or point[1] < -10: + adjust_joint.append((-1000, -1000)) + continue + new_x, new_y = point[0] - x, point[1] - y + # should not crop outside the image + if new_x > w - 1 or new_y > h - 1: + adjust_joint.append((-1000, -1000)) + continue + adjust_joint.append((new_x, new_y)) + adjust_joint_list.append(adjust_joint) + + return resized, adjust_joint_list, resized_mask + + return pose_crop(image, annos, mask, x, y, target_size[0], target_size[1]) + + +def keypoint_resize_random_crop(image, annos, mask=None, size=(368, 368)): + """Reszie the image to make either its width or height equals to the given sizes. + Then randomly crop image without influence scales. + Resize the image match with the minimum size before cropping, this API will change the zoom scale of object. + + Parameters + ----------- + image : 3 channel image + The given image for augmentation. + annos : list of list of floats + The keypoints annotation of people. + mask : single channel image or None + The mask if available. + size : tuple of int + The size (height, width) of returned image. + + Returns + ---------- + preprocessed image, annos, mask + + """ + + if len(np.shape(image)) == 2: + image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) + + def resize_image(image, annos, mask, target_width, target_height): + """Reszie image + + Parameters + ----------- + image : 3 channel image + The given image. + annos : list of list of floats + Keypoints of people + mask : single channel image or None + The mask if available. + target_width : int + Expected width of returned image. + target_height : int + Expected height of returned image. + + Returns + ---------- + preprocessed input image, annos, mask + + """ + y, x, _ = np.shape(image) + + ratio_y = target_height / y + ratio_x = target_width / x + + new_joints = [] + # update meta + for people in annos: + new_keypoints = [] + for keypoints in people: + if keypoints[0] < 0 or keypoints[1] < 0: + new_keypoints.append((-1000, -1000)) + continue + pts = (int(keypoints[0] * ratio_x + 0.5), int(keypoints[1] * ratio_y + 0.5)) + if pts[0] > target_width - 1 or pts[1] > target_height - 1: + new_keypoints.append((-1000, -1000)) + continue + + new_keypoints.append(pts) + new_joints.append(new_keypoints) + annos = new_joints + + new_image = cv2.resize(image, (target_width, target_height), interpolation=cv2.INTER_AREA) + if mask is not None: + new_mask = cv2.resize(mask, (target_width, target_height), interpolation=cv2.INTER_AREA) + return new_image, annos, new_mask + else: + return new_image, annos, None + + _target_height = size[0] + _target_width = size[1] + + if len(np.shape(image)) == 2: + image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) + input_height, input_width, _ = np.shape(image) + + vertical_ratio = _target_height / input_height + horizontal_ratio = _target_width / input_width + + rescale_ratio = max(vertical_ratio, horizontal_ratio) + + image, annos, mask = resize_image( + image, annos, mask, round(input_width * rescale_ratio), round(input_height * rescale_ratio) + ) + + # At this point we should have input image which matches at least target + # height or target width, while the other dimensions larger than target. + new_height, new_width, _ = np.shape(image) + + if new_height > _target_height: + crop_range_y = np.random.randint(0, new_height - _target_height) + image = image[crop_range_y:crop_range_y + _target_height, :, :] + if mask is not None: + mask = mask[crop_range_y:crop_range_y + _target_height, :] + new_joints = [] + + for people in annos: # TODO : speed up with affine transform + new_keypoints = [] + for keypoints in people: + + # case orginal points are not usable + if keypoints[1] >= crop_range_y and keypoints[1] <= crop_range_y + _target_height - 1: + pts = (int(keypoints[0]), int(keypoints[1] - crop_range_y)) + else: + pts = (-1000, -1000) + new_keypoints.append(pts) + + new_joints.append(new_keypoints) + annos = new_joints + + elif new_width > _target_width: + crop_range_x = np.random.randint(0, new_width - _target_width) + image = image[:, crop_range_x:crop_range_x + _target_width, :] + if mask is not None: + mask = mask[:, crop_range_x:crop_range_x + _target_width] + new_joints = [] + + for people in annos: + new_keypoints = [] + for keypoints in people: + + # case orginal points are not usable + if keypoints[0] >= crop_range_x and keypoints[0] <= crop_range_x + _target_width - 1: + pts = (int(keypoints[0] - crop_range_x), int(keypoints[1])) + else: + pts = (-1000, -1000) + new_keypoints.append(pts) + + new_joints.append(new_keypoints) + annos = new_joints + + if mask is not None: + return image, annos, mask + else: + return image, annos, None + + +def keypoint_random_rotate(image, annos, mask=None, rg=15.): + """Rotate an image and corresponding keypoints. + + Parameters + ----------- + image : 3 channel image + The given image for augmentation. + annos : list of list of floats + The keypoints annotation of people. + mask : single channel image or None + The mask if available. + rg : int or float + Degree to rotate, usually 0 ~ 180. + + Returns + ---------- + preprocessed image, annos, mask + + """ + + def _rotate_coord(shape, newxy, point, angle): + angle = -1 * angle / 180.0 * math.pi + ox, oy = shape + px, py = point + ox /= 2 + oy /= 2 + qx = math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy) + qy = math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy) + new_x, new_y = newxy + qx += ox - new_x + qy += oy - new_y + return int(qx + 0.5), int(qy + 0.5) + + def _largest_rotated_rect(w, h, angle): + """ + Get largest rectangle after rotation. + http://stackoverflow.com/questions/16702966/rotate-image-and-crop-out-black-borders + """ + angle = angle / 180.0 * math.pi + if w <= 0 or h <= 0: + return 0, 0 + + width_is_longer = w >= h + side_long, side_short = (w, h) if width_is_longer else (h, w) + + # since the solutions for angle, -angle and 180-angle are all the same, + # if suffices to look at the first quadrant and the absolute values of sin,cos: + sin_a, cos_a = abs(math.sin(angle)), abs(math.cos(angle)) + if side_short <= 2. * sin_a * cos_a * side_long: + # half constrained case: two crop corners touch the longer side, + # the other two corners are on the mid-line parallel to the longer line + x = 0.5 * side_short + wr, hr = (x / sin_a, x / cos_a) if width_is_longer else (x / cos_a, x / sin_a) + else: + # fully constrained case: crop touches all 4 sides + cos_2a = cos_a * cos_a - sin_a * sin_a + wr, hr = (w * cos_a - h * sin_a) / cos_2a, (h * cos_a - w * sin_a) / cos_2a + return int(np.round(wr)), int(np.round(hr)) + + img_shape = np.shape(image) + height = img_shape[0] + width = img_shape[1] + deg = np.random.uniform(-rg, rg) + + img = image + center = (img.shape[1] * 0.5, img.shape[0] * 0.5) # x, y + rot_m = cv2.getRotationMatrix2D((int(center[0]), int(center[1])), deg, 1) + ret = cv2.warpAffine(img, rot_m, img.shape[1::-1], flags=cv2.INTER_AREA, borderMode=cv2.BORDER_CONSTANT) + if img.ndim == 3 and ret.ndim == 2: + ret = ret[:, :, np.newaxis] + neww, newh = _largest_rotated_rect(ret.shape[1], ret.shape[0], deg) + neww = min(neww, ret.shape[1]) + newh = min(newh, ret.shape[0]) + newx = int(center[0] - neww * 0.5) + newy = int(center[1] - newh * 0.5) + # print(ret.shape, deg, newx, newy, neww, newh) + img = ret[newy:newy + newh, newx:newx + neww] + # adjust meta data + adjust_joint_list = [] + for joint in annos: # TODO : speed up with affine transform + adjust_joint = [] + for point in joint: + if point[0] < -100 or point[1] < -100: + adjust_joint.append((-1000, -1000)) + continue + + x, y = _rotate_coord((width, height), (newx, newy), point, deg) + + if x > neww - 1 or y > newh - 1: + adjust_joint.append((-1000, -1000)) + continue + if x < 0 or y < 0: + adjust_joint.append((-1000, -1000)) + continue + + adjust_joint.append((x, y)) + adjust_joint_list.append(adjust_joint) + joint_list = adjust_joint_list + + if mask is not None: + msk = mask + center = (msk.shape[1] * 0.5, msk.shape[0] * 0.5) # x, y + rot_m = cv2.getRotationMatrix2D((int(center[0]), int(center[1])), deg, 1) + ret = cv2.warpAffine(msk, rot_m, msk.shape[1::-1], flags=cv2.INTER_AREA, borderMode=cv2.BORDER_CONSTANT) + if msk.ndim == 3 and msk.ndim == 2: + ret = ret[:, :, np.newaxis] + neww, newh = _largest_rotated_rect(ret.shape[1], ret.shape[0], deg) + neww = min(neww, ret.shape[1]) + newh = min(newh, ret.shape[0]) + newx = int(center[0] - neww * 0.5) + newy = int(center[1] - newh * 0.5) + # print(ret.shape, deg, newx, newy, neww, newh) + msk = ret[newy:newy + newh, newx:newx + neww] + return img, joint_list, msk + else: + return img, joint_list, None + + +def keypoint_random_flip( + image, annos, mask=None, prob=0.5, flip_list=(0, 1, 5, 6, 7, 2, 3, 4, 11, 12, 13, 8, 9, 10, 15, 14, 17, 16, 18) +): + """Flip an image and corresponding keypoints. + + Parameters + ----------- + image : 3 channel image + The given image for augmentation. + annos : list of list of floats + The keypoints annotation of people. + mask : single channel image or None + The mask if available. + prob : float, 0 to 1 + The probability to flip the image, if 1, always flip the image. + flip_list : tuple of int + Denotes how the keypoints number be changed after flipping which is required for pose estimation task. + The left and right body should be maintained rather than switch. + (Default COCO format). + Set to an empty tuple if you don't need to maintain left and right information. + + Returns + ---------- + preprocessed image, annos, mask + + """ + + _prob = np.random.uniform(0, 1.0) + if _prob < prob: + return image, annos, mask + + _, width, _ = np.shape(image) + image = cv2.flip(image, 1) + mask = cv2.flip(mask, 1) + new_joints = [] + for people in annos: # TODO : speed up with affine transform + new_keypoints = [] + for k in flip_list: + point = people[k] + if point[0] < 0 or point[1] < 0: + new_keypoints.append((-1000, -1000)) + continue + if point[0] > image.shape[1] - 1 or point[1] > image.shape[0] - 1: + new_keypoints.append((-1000, -1000)) + continue + if (width - point[0]) > image.shape[1] - 1: + new_keypoints.append((-1000, -1000)) + continue + new_keypoints.append((width - point[0], point[1])) + new_joints.append(new_keypoints) + annos = new_joints + + return image, annos, mask + + +def keypoint_random_resize(image, annos, mask=None, zoom_range=(0.8, 1.2)): + """Randomly resize an image and corresponding keypoints. + The height and width of image will be changed independently, so the scale will be changed. + + Parameters + ----------- + image : 3 channel image + The given image for augmentation. + annos : list of list of floats + The keypoints annotation of people. + mask : single channel image or None + The mask if available. + zoom_range : tuple of two floats + The minimum and maximum factor to zoom in or out, e.g (0.5, 1) means zoom out 1~2 times. + + Returns + ---------- + preprocessed image, annos, mask + + """ + height = image.shape[0] + width = image.shape[1] + _min, _max = zoom_range + scalew = np.random.uniform(_min, _max) + scaleh = np.random.uniform(_min, _max) + + neww = int(width * scalew) + newh = int(height * scaleh) + + dst = cv2.resize(image, (neww, newh), interpolation=cv2.INTER_AREA) + if mask is not None: + mask = cv2.resize(mask, (neww, newh), interpolation=cv2.INTER_AREA) + # adjust meta data + adjust_joint_list = [] + for joint in annos: # TODO : speed up with affine transform + adjust_joint = [] + for point in joint: + if point[0] < -100 or point[1] < -100: + adjust_joint.append((-1000, -1000)) + continue + adjust_joint.append((int(point[0] * scalew + 0.5), int(point[1] * scaleh + 0.5))) + adjust_joint_list.append(adjust_joint) + if mask is not None: + return dst, adjust_joint_list, mask + else: + return dst, adjust_joint_list, None + + +def keypoint_random_resize_shortestedge( + image, annos, mask=None, min_size=(368, 368), zoom_range=(0.8, 1.2), pad_val=(0, 0, np.random.uniform(0.0, 1.0)) +): + """Randomly resize an image and corresponding keypoints based on shorter edgeself. + If the resized image is smaller than `min_size`, uses padding to make shape matchs `min_size`. + The height and width of image will be changed together, the scale would not be changed. + + Parameters + ----------- + image : 3 channel image + The given image for augmentation. + annos : list of list of floats + The keypoints annotation of people. + mask : single channel image or None + The mask if available. + min_size : tuple of two int + The minimum size of height and width. + zoom_range : tuple of two floats + The minimum and maximum factor to zoom in or out, e.g (0.5, 1) means zoom out 1~2 times. + pad_val : int/float, or tuple of int or random function + The three padding values for RGB channels respectively. + + Returns + ---------- + preprocessed image, annos, mask + + """ + + _target_height = min_size[0] + _target_width = min_size[1] + + if len(np.shape(image)) == 2: + image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) + height, width, _ = np.shape(image) + + ratio_w = _target_width / width + ratio_h = _target_height / height + ratio = min(ratio_w, ratio_h) + target_size = int(min(width * ratio + 0.5, height * ratio + 0.5)) + random_target = np.random.uniform(zoom_range[0], zoom_range[1]) + target_size = int(target_size * random_target) + + # target_size = int(min(_network_w, _network_h) * random.uniform(0.7, 1.5)) + + def pose_resize_shortestedge(image, annos, mask, target_size): + """ """ + # _target_height = 368 + # _target_width = 368 + # img = image + height, width, _ = np.shape(image) + + # adjust image + scale = target_size / min(height, width) + if height < width: + newh, neww = target_size, int(scale * width + 0.5) + else: + newh, neww = int(scale * height + 0.5), target_size + + dst = cv2.resize(image, (neww, newh), interpolation=cv2.INTER_AREA) + mask = cv2.resize(mask, (neww, newh), interpolation=cv2.INTER_AREA) + pw = ph = 0 + if neww < _target_width or newh < _target_height: + pw = max(0, (_target_width - neww) // 2) + ph = max(0, (_target_height - newh) // 2) + mw = (_target_width - neww) % 2 + mh = (_target_height - newh) % 2 + # color = np.random.uniform(0.0, 1.0) + dst = cv2.copyMakeBorder(dst, ph, ph + mh, pw, pw + mw, cv2.BORDER_CONSTANT, value=pad_val) #(0, 0, color)) + if mask is not None: + mask = cv2.copyMakeBorder(mask, ph, ph + mh, pw, pw + mw, cv2.BORDER_CONSTANT, value=1) + # adjust meta data + adjust_joint_list = [] + for joint in annos: # TODO : speed up with affine transform + adjust_joint = [] + for point in joint: + if point[0] < -100 or point[1] < -100: + adjust_joint.append((-1000, -1000)) + continue + # if point[0] <= 0 or point[1] <= 0 or int(point[0]*scale+0.5) > neww or int(point[1]*scale+0.5) > newh: + # adjust_joint.append((-1, -1)) + # continue + adjust_joint.append((int(point[0] * scale + 0.5) + pw, int(point[1] * scale + 0.5) + ph)) + adjust_joint_list.append(adjust_joint) + if mask is not None: + return dst, adjust_joint_list, mask + else: + return dst, adjust_joint_list, None + + return pose_resize_shortestedge(image, annos, mask, target_size) diff --git a/tensorlayer/rein.py b/tensorlayer/rein.py new file mode 100644 index 0000000..bd884d5 --- /dev/null +++ b/tensorlayer/rein.py @@ -0,0 +1,159 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import numpy as np +import tensorflow as tf +from six.moves import xrange + +__all__ = [ + 'discount_episode_rewards', + 'cross_entropy_reward_loss', + 'log_weight', + 'choice_action_by_probs', +] + + +def discount_episode_rewards(rewards=None, gamma=0.99, mode=0): + """Take 1D float array of rewards and compute discounted rewards for an + episode. When encount a non-zero value, consider as the end a of an episode. + + Parameters + ---------- + rewards : list + List of rewards + gamma : float + Discounted factor + mode : int + Mode for computing the discount rewards. + - If mode == 0, reset the discount process when encount a non-zero reward (Ping-pong game). + - If mode == 1, would not reset the discount process. + + Returns + -------- + list of float + The discounted rewards. + + Examples + ---------- + >>> rewards = np.asarray([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]) + >>> gamma = 0.9 + >>> discount_rewards = tl.rein.discount_episode_rewards(rewards, gamma) + >>> print(discount_rewards) + [ 0.72899997 0.81 0.89999998 1. 0.72899997 0.81 + 0.89999998 1. 0.72899997 0.81 0.89999998 1. ] + >>> discount_rewards = tl.rein.discount_episode_rewards(rewards, gamma, mode=1) + >>> print(discount_rewards) + [ 1.52110755 1.69011939 1.87791049 2.08656716 1.20729685 1.34144104 + 1.49048996 1.65610003 0.72899997 0.81 0.89999998 1. ] + + """ + if rewards is None: + raise Exception("rewards should be a list") + discounted_r = np.zeros_like(rewards, dtype=np.float32) + running_add = 0 + for t in reversed(xrange(0, rewards.size)): + if mode == 0: + if rewards[t] != 0: running_add = 0 + + running_add = running_add * gamma + rewards[t] + discounted_r[t] = running_add + return discounted_r + + +def cross_entropy_reward_loss(logits, actions, rewards, name=None): + """Calculate the loss for Policy Gradient Network. + + Parameters + ---------- + logits : tensor + The network outputs without softmax. This function implements softmax inside. + actions : tensor or placeholder + The agent actions. + rewards : tensor or placeholder + The rewards. + + Returns + -------- + Tensor + The TensorFlow loss function. + + Examples + ---------- + >>> states_batch_pl = tf.placeholder(tf.float32, shape=[None, D]) + >>> network = InputLayer(states_batch_pl, name='input') + >>> network = DenseLayer(network, n_units=H, act=tf.ops.relu, name='relu1') + >>> network = DenseLayer(network, n_units=3, name='out') + >>> probs = network.outputs + >>> sampling_prob = tf.ops.softmax(probs) + >>> actions_batch_pl = tf.placeholder(tf.int32, shape=[None]) + >>> discount_rewards_batch_pl = tf.placeholder(tf.float32, shape=[None]) + >>> loss = tl.rein.cross_entropy_reward_loss(probs, actions_batch_pl, discount_rewards_batch_pl) + >>> train_op = tf.train.RMSPropOptimizer(learning_rate, decay_rate).minimize(loss) + + """ + cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=actions, logits=logits, name=name) + + return tf.reduce_sum(tf.multiply(cross_entropy, rewards)) + + +def log_weight(probs, weights, name='log_weight'): + """Log weight. + + Parameters + ----------- + probs : tensor + If it is a network output, usually we should scale it to [0, 1] via softmax. + weights : tensor + The weights. + + Returns + -------- + Tensor + The Tensor after appling the log weighted expression. + + """ + with tf.variable_scope(name): + exp_v = tf.reduce_mean(tf.log(probs) * weights) + return exp_v + + +def choice_action_by_probs(probs=(0.5, 0.5), action_list=None): + """Choice and return an an action by given the action probability distribution. + + Parameters + ------------ + probs : list of float. + The probability distribution of all actions. + action_list : None or a list of int or others + A list of action in integer, string or others. If None, returns an integer range between 0 and len(probs)-1. + + Returns + -------- + float int or str + The chosen action. + + Examples + ---------- + >>> for _ in range(5): + >>> a = choice_action_by_probs([0.2, 0.4, 0.4]) + >>> print(a) + 0 + 1 + 1 + 2 + 1 + >>> for _ in range(3): + >>> a = choice_action_by_probs([0.5, 0.5], ['a', 'b']) + >>> print(a) + a + b + b + + """ + if action_list is None: + n_action = len(probs) + action_list = np.arange(n_action) + else: + if len(action_list) != len(probs): + raise Exception("number of actions should equal to number of probabilities.") + return np.random.choice(action_list, p=probs) diff --git a/tensorlayer/utils.py b/tensorlayer/utils.py new file mode 100644 index 0000000..508beb7 --- /dev/null +++ b/tensorlayer/utils.py @@ -0,0 +1,683 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os +import random +import subprocess +import sys +import time +from collections import Counter +from sys import exit as _exit +from sys import platform as _platform + +import numpy as np +import tensorflow as tf +from sklearn.metrics import accuracy_score, confusion_matrix, f1_score + +import tensorlayer as tl + +__all__ = [ + 'fit', 'test', 'predict', 'evaluation', 'dict_to_one', 'flatten_list', 'class_balancing_oversample', + 'get_random_int', 'list_string_to_dict', 'exit_tensorflow', 'open_tensorboard', 'clear_all_placeholder_variables', + 'set_gpu_fraction', 'train_epoch', 'run_epoch' +] + + +def fit( + network, train_op, cost, X_train, y_train, acc=None, batch_size=100, n_epoch=100, print_freq=5, X_val=None, + y_val=None, eval_train=True, tensorboard_dir=None, tensorboard_epoch_freq=5, tensorboard_weight_histograms=True, + tensorboard_graph_vis=True +): + """Training a given non time-series network by the given cost function, training data, batch_size, n_epoch etc. + + - MNIST example click `here `_. + - In order to control the training details, the authors HIGHLY recommend ``tl.iterate`` see two MNIST examples `1 `_, `2 `_. + + Parameters + ---------- + network : TensorLayer Model + the network to be trained. + train_op : TensorFlow optimizer + The optimizer for training e.g. tf.optimizers.Adam(). + cost : TensorLayer or TensorFlow loss function + Metric for loss function, e.g tl.cost.cross_entropy. + X_train : numpy.array + The input of training data + y_train : numpy.array + The target of training data + acc : TensorFlow/numpy expression or None + Metric for accuracy or others. If None, would not print the information. + batch_size : int + The batch size for training and evaluating. + n_epoch : int + The number of training epochs. + print_freq : int + Print the training information every ``print_freq`` epochs. + X_val : numpy.array or None + The input of validation data. If None, would not perform validation. + y_val : numpy.array or None + The target of validation data. If None, would not perform validation. + eval_train : boolean + Whether to evaluate the model during training. + If X_val and y_val are not None, it reflects whether to evaluate the model on training data. + tensorboard_dir : string + path to log dir, if set, summary data will be stored to the tensorboard_dir/ directory for visualization with tensorboard. (default None) + tensorboard_epoch_freq : int + How many epochs between storing tensorboard checkpoint for visualization to log/ directory (default 5). + tensorboard_weight_histograms : boolean + If True updates tensorboard data in the logs/ directory for visualization + of the weight histograms every tensorboard_epoch_freq epoch (default True). + tensorboard_graph_vis : boolean + If True stores the graph in the tensorboard summaries saved to log/ (default True). + + Examples + -------- + See `tutorial_mnist_simple.py `_ + + >>> tl.utils.fit(network, train_op=tf.optimizers.Adam(learning_rate=0.0001), + ... cost=tl.cost.cross_entropy, X_train=X_train, y_train=y_train, acc=acc, + ... batch_size=64, n_epoch=20, _val=X_val, y_val=y_val, eval_train=True) + >>> tl.utils.fit(network, train_op, cost, X_train, y_train, + ... acc=acc, batch_size=500, n_epoch=200, print_freq=5, + ... X_val=X_val, y_val=y_val, eval_train=False, tensorboard=True) + + Notes + -------- + 'tensorboard_weight_histograms' and 'tensorboard_weight_histograms' are not supported now. + + """ + if X_train.shape[0] < batch_size: + raise AssertionError("Number of training examples should be bigger than the batch size") + + if tensorboard_dir is not None: + tl.logging.info("Setting up tensorboard ...") + #Set up tensorboard summaries and saver + tl.files.exists_or_mkdir(tensorboard_dir) + + #Only write summaries for more recent TensorFlow versions + if hasattr(tf, 'summary') and hasattr(tf.summary, 'create_file_writer'): + train_writer = tf.summary.create_file_writer(tensorboard_dir + '/train') + val_writer = tf.summary.create_file_writer(tensorboard_dir + '/validation') + if tensorboard_graph_vis: + # FIXME : not sure how to add tl network graph + pass + else: + train_writer = None + val_writer = None + + tl.logging.info("Finished! use `tensorboard --logdir=%s/` to start tensorboard" % tensorboard_dir) + + tl.logging.info("Start training the network ...") + start_time_begin = time.time() + for epoch in range(n_epoch): + start_time = time.time() + loss_ep, _, __ = train_epoch(network, X_train, y_train, cost=cost, train_op=train_op, batch_size=batch_size) + + train_loss, train_acc = None, None + val_loss, val_acc = None, None + if tensorboard_dir is not None and hasattr(tf, 'summary'): + if epoch + 1 == 1 or (epoch + 1) % tensorboard_epoch_freq == 0: + if eval_train is True: + train_loss, train_acc, _ = run_epoch( + network, X_train, y_train, cost=cost, acc=acc, batch_size=batch_size + ) + with train_writer.as_default(): + tf.compat.v2.summary.scalar('loss', train_loss, step=epoch) + if acc is not None: + tf.summary.scalar('acc', train_acc, step=epoch) + # FIXME : there seems to be an internal error in Tensorboard (misuse of tf.name_scope) + # if tensorboard_weight_histograms is not None: + # for param in network.all_weights: + # tf.summary.histogram(param.name, param, step=epoch) + + if (X_val is not None) and (y_val is not None): + val_loss, val_acc, _ = run_epoch(network, X_val, y_val, cost=cost, acc=acc, batch_size=batch_size) + with val_writer.as_default(): + tf.summary.scalar('loss', val_loss, step=epoch) + if acc is not None: + tf.summary.scalar('acc', val_acc, step=epoch) + # FIXME : there seems to be an internal error in Tensorboard (misuse of tf.name_scope) + # if tensorboard_weight_histograms is not None: + # for param in network.all_weights: + # tf.summary.histogram(param.name, param, step=epoch) + + if epoch + 1 == 1 or (epoch + 1) % print_freq == 0: + if (X_val is not None) and (y_val is not None): + tl.logging.info("Epoch %d of %d took %fs" % (epoch + 1, n_epoch, time.time() - start_time)) + if eval_train is True: + if train_loss is None: + train_loss, train_acc, _ = run_epoch( + network, X_train, y_train, cost=cost, acc=acc, batch_size=batch_size + ) + tl.logging.info(" train loss: %f" % train_loss) + if acc is not None: + tl.logging.info(" train acc: %f" % train_acc) + if val_loss is None: + val_loss, val_acc, _ = run_epoch(network, X_val, y_val, cost=cost, acc=acc, batch_size=batch_size) + + # tl.logging.info(" val loss: %f" % val_loss) + + if acc is not None: + pass + # tl.logging.info(" val acc: %f" % val_acc) + else: + tl.logging.info( + "Epoch %d of %d took %fs, loss %f" % (epoch + 1, n_epoch, time.time() - start_time, loss_ep) + ) + tl.logging.info("Total training time: %fs" % (time.time() - start_time_begin)) + + +def test(network, acc, X_test, y_test, batch_size, cost=None): + """ + Test a given non time-series network by the given test data and metric. + + Parameters + ---------- + network : TensorLayer Model + The network. + acc : TensorFlow/numpy expression or None + Metric for accuracy or others. + - If None, would not print the information. + X_test : numpy.array + The input of testing data. + y_test : numpy array + The target of testing data + batch_size : int or None + The batch size for testing, when dataset is large, we should use minibatche for testing; + if dataset is small, we can set it to None. + cost : TensorLayer or TensorFlow loss function + Metric for loss function, e.g tl.cost.cross_entropy. If None, would not print the information. + + Examples + -------- + See `tutorial_mnist_simple.py `_ + + >>> def acc(_logits, y_batch): + ... return np.mean(np.equal(np.argmax(_logits, 1), y_batch)) + >>> tl.utils.test(network, acc, X_test, y_test, batch_size=None, cost=tl.cost.cross_entropy) + + """ + tl.logging.info('Start testing the network ...') + network.eval() + if batch_size is None: + y_pred = network(X_test) + if cost is not None: + test_loss = cost(y_pred, y_test) + # tl.logging.info(" test loss: %f" % test_loss) + test_acc = acc(y_pred, y_test) + # tl.logging.info(" test acc: %f" % (test_acc / test_acc)) + return test_acc + else: + test_loss, test_acc, n_batch = run_epoch( + network, X_test, y_test, cost=cost, acc=acc, batch_size=batch_size, shuffle=False + ) + if cost is not None: + tl.logging.info(" test loss: %f" % test_loss) + tl.logging.info(" test acc: %f" % test_acc) + return test_acc + + +def predict(network, X, batch_size=None): + """ + Return the predict results of given non time-series network. + + Parameters + ---------- + network : TensorLayer Model + The network. + X : numpy.array + The inputs. + batch_size : int or None + The batch size for prediction, when dataset is large, we should use minibatche for prediction; + if dataset is small, we can set it to None. + + Examples + -------- + See `tutorial_mnist_simple.py `_ + + >>> _logits = tl.utils.predict(network, X_test) + >>> y_pred = np.argmax(_logits, 1) + + """ + network.eval() + if batch_size is None: + y_pred = network(X) + return y_pred + else: + result = None + for X_a, _ in tl.iterate.minibatches(X, X, batch_size, shuffle=False): + result_a = network(X_a) + if result is None: + result = result_a + else: + result = np.concatenate((result, result_a)) + if result is None: + if len(X) % batch_size == 0: + result_a = network(X[-(len(X) % batch_size):, :]) + result = result_a + else: + if len(X) != len(result) and len(X) % batch_size != 0: + result_a = network(X[-(len(X) % batch_size):, :]) + result = np.concatenate((result, result_a)) + return result + + +## Evaluation +def evaluation(y_test=None, y_predict=None, n_classes=None): + """ + Input the predicted results, targets results and + the number of class, return the confusion matrix, F1-score of each class, + accuracy and macro F1-score. + + Parameters + ---------- + y_test : list + The target results + y_predict : list + The predicted results + n_classes : int + The number of classes + + Examples + -------- + >>> c_mat, f1, acc, f1_macro = tl.utils.evaluation(y_test, y_predict, n_classes) + + """ + c_mat = confusion_matrix(y_test, y_predict, labels=[x for x in range(n_classes)]) + f1 = f1_score(y_test, y_predict, average=None, labels=[x for x in range(n_classes)]) + f1_macro = f1_score(y_test, y_predict, average='macro') + acc = accuracy_score(y_test, y_predict) + tl.logging.info('confusion matrix: \n%s' % c_mat) + tl.logging.info('f1-score : %s' % f1) + tl.logging.info('f1-score(macro) : %f' % f1_macro) # same output with > f1_score(y_true, y_pred, average='macro') + tl.logging.info('accuracy-score : %f' % acc) + return c_mat, f1, acc, f1_macro + + +def dict_to_one(dp_dict): + """Input a dictionary, return a dictionary that all items are set to one. + + Used for disable dropout, dropconnect layer and so on. + + Parameters + ---------- + dp_dict : dictionary + The dictionary contains key and number, e.g. keeping probabilities. + + """ + return {x: 1 for x in dp_dict} + + +def flatten_list(list_of_list): + """Input a list of list, return a list that all items are in a list. + + Parameters + ---------- + list_of_list : a list of list + + Examples + -------- + >>> tl.utils.flatten_list([[1, 2, 3],[4, 5],[6]]) + [1, 2, 3, 4, 5, 6] + + """ + return sum(list_of_list, []) + + +def class_balancing_oversample(X_train=None, y_train=None, printable=True): + """Input the features and labels, return the features and labels after oversampling. + + Parameters + ---------- + X_train : numpy.array + The inputs. + y_train : numpy.array + The targets. + + Examples + -------- + One X + + >>> X_train, y_train = class_balancing_oversample(X_train, y_train, printable=True) + + Two X + + >>> X, y = tl.utils.class_balancing_oversample(X_train=np.hstack((X1, X2)), y_train=y, printable=False) + >>> X1 = X[:, 0:5] + >>> X2 = X[:, 5:] + + """ + # ======== Classes balancing + if printable: + tl.logging.info("Classes balancing for training examples...") + + c = Counter(y_train) + + if printable: + tl.logging.info('the occurrence number of each stage: %s' % c.most_common()) + tl.logging.info('the least stage is Label %s have %s instances' % c.most_common()[-1]) + tl.logging.info('the most stage is Label %s have %s instances' % c.most_common(1)[0]) + + most_num = c.most_common(1)[0][1] + + if printable: + tl.logging.info('most num is %d, all classes tend to be this num' % most_num) + + locations = {} + number = {} + + for lab, num in c.most_common(): # find the index from y_train + number[lab] = num + locations[lab] = np.where(np.array(y_train) == lab)[0] + if printable: + tl.logging.info('convert list(np.array) to dict format') + X = {} # convert list to dict + for lab, num in number.items(): + X[lab] = X_train[locations[lab]] + + # oversampling + if printable: + tl.logging.info('start oversampling') + for key in X: + temp = X[key] + while True: + if len(X[key]) >= most_num: + break + X[key] = np.vstack((X[key], temp)) + if printable: + tl.logging.info('first features of label 0 > %d' % len(X[0][0])) + tl.logging.info('the occurrence num of each stage after oversampling') + for key in X: + tl.logging.info("%s %d" % (key, len(X[key]))) + if printable: + tl.logging.info('make each stage have same num of instances') + for key in X: + X[key] = X[key][0:most_num, :] + tl.logging.info("%s %d" % (key, len(X[key]))) + + # convert dict to list + if printable: + tl.logging.info('convert from dict to list format') + y_train = [] + X_train = np.empty(shape=(0, len(X[0][0]))) + for key in X: + X_train = np.vstack((X_train, X[key])) + y_train.extend([key for i in range(len(X[key]))]) + # tl.logging.info(len(X_train), len(y_train)) + c = Counter(y_train) + if printable: + tl.logging.info('the occurrence number of each stage after oversampling: %s' % c.most_common()) + # ================ End of Classes balancing + return X_train, y_train + + +## Random +def get_random_int(min_v=0, max_v=10, number=5, seed=None): + """Return a list of random integer by the given range and quantity. + + Parameters + ----------- + min_v : number + The minimum value. + max_v : number + The maximum value. + number : int + Number of value. + seed : int or None + The seed for random. + + Examples + --------- + >>> r = get_random_int(min_v=0, max_v=10, number=5) + [10, 2, 3, 3, 7] + + """ + rnd = random.Random() + if seed: + rnd = random.Random(seed) + # return [random.randint(min,max) for p in range(0, number)] + return [rnd.randint(min_v, max_v) for p in range(0, number)] + + +def list_string_to_dict(string): + """Inputs ``['a', 'b', 'c']``, returns ``{'a': 0, 'b': 1, 'c': 2}``.""" + dictionary = {} + for idx, c in enumerate(string): + dictionary.update({c: idx}) + return dictionary + + +def exit_tensorflow(port=6006): + """Close TensorBoard and Nvidia-process if available. + + Parameters + ---------- + port : int + TensorBoard port you want to close, `6006` as default. + + """ + text = "[TL] Close tensorboard and nvidia-process if available" + text2 = "[TL] Close tensorboard and nvidia-process not yet supported by this function (tl.ops.exit_tf) on " + + if _platform == "linux" or _platform == "linux2": + tl.logging.info('linux: %s' % text) + os.system('nvidia-smi') + os.system('fuser ' + str(port) + '/tcp -k') # kill tensorboard 6006 + os.system("nvidia-smi | grep python |awk '{print $3}'|xargs kill") # kill all nvidia-smi python process + _exit() + + elif _platform == "darwin": + tl.logging.info('OS X: %s' % text) + subprocess.Popen( + "lsof -i tcp:" + str(port) + " | grep -v PID | awk '{print $2}' | xargs kill", shell=True + ) # kill tensorboard + elif _platform == "win32": + raise NotImplementedError("this function is not supported on the Windows platform") + + else: + tl.logging.info(text2 + _platform) + + +def open_tensorboard(log_dir='/tmp/tensorflow', port=6006): + """Open Tensorboard. + + Parameters + ---------- + log_dir : str + Directory where your tensorboard logs are saved + port : int + TensorBoard port you want to open, 6006 is tensorboard default + + """ + text = "[TL] Open tensorboard, go to localhost:" + str(port) + " to access" + text2 = " not yet supported by this function (tl.ops.open_tb)" + + if not tl.files.exists_or_mkdir(log_dir, verbose=False): + tl.logging.info("[TL] Log reportory was created at %s" % log_dir) + + if _platform == "linux" or _platform == "linux2": + tl.logging.info('linux: %s' % text) + subprocess.Popen( + sys.prefix + " | python -m tensorflow.tensorboard --logdir=" + log_dir + " --port=" + str(port), shell=True + ) # open tensorboard in localhost:6006/ or whatever port you chose + elif _platform == "darwin": + tl.logging.info('OS X: %s' % text) + subprocess.Popen( + sys.prefix + " | python -m tensorflow.tensorboard --logdir=" + log_dir + " --port=" + str(port), shell=True + ) # open tensorboard in localhost:6006/ or whatever port you chose + elif _platform == "win32": + raise NotImplementedError("this function is not supported on the Windows platform") + else: + tl.logging.info(_platform + text2) + + +def clear_all_placeholder_variables(printable=True): + """Clears all the placeholder variables of keep prob, + including keeping probabilities of all dropout, denoising, dropconnect etc. + + Parameters + ---------- + printable : boolean + If True, print all deleted variables. + + """ + tl.logging.info('clear all .....................................') + gl = globals().copy() + for var in gl: + if var[0] == '_': continue + if 'func' in str(globals()[var]): continue + if 'module' in str(globals()[var]): continue + if 'class' in str(globals()[var]): continue + + if printable: + tl.logging.info(" clear_all ------- %s" % str(globals()[var])) + + del globals()[var] + + +def set_gpu_fraction(gpu_fraction=0.3): + """Set the GPU memory fraction for the application. + + Parameters + ---------- + gpu_fraction : None or float + Fraction of GPU memory, (0 ~ 1]. If None, allow gpu memory growth. + + References + ---------- + - `TensorFlow using GPU `__ + + """ + if gpu_fraction is None: + tl.logging.info("[TL]: ALLOW GPU MEM GROWTH") + tf.config.gpu.set_per_process_memory_growth(True) + else: + tl.logging.info("[TL]: GPU MEM Fraction %f" % gpu_fraction) + tf.config.gpu.set_per_process_memory_fraction(0.4) + # gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_fraction) + # sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) + # return sess + + +def train_epoch( + network, X, y, cost, train_op=tf.optimizers.Adam(learning_rate=0.0001), acc=None, batch_size=100, shuffle=True +): + """Training a given non time-series network by the given cost function, training data, batch_size etc. + for one epoch. + + Parameters + ---------- + network : TensorLayer Model + the network to be trained. + X : numpy.array + The input of training data + y : numpy.array + The target of training data + cost : TensorLayer or TensorFlow loss function + Metric for loss function, e.g tl.cost.cross_entropy. + train_op : TensorFlow optimizer + The optimizer for training e.g. tf.optimizers.Adam(). + acc : TensorFlow/numpy expression or None + Metric for accuracy or others. If None, would not print the information. + batch_size : int + The batch size for training and evaluating. + shuffle : boolean + Indicating whether to shuffle the dataset in training. + + Returns + ------- + loss_ep : Tensor. Average loss of this epoch. + acc_ep : Tensor or None. Average accuracy(metric) of this epoch. None if acc is not given. + n_step : int. Number of iterations taken in this epoch. + + """ + network.train() + loss_ep = 0 + acc_ep = 0 + n_step = 0 + for X_batch, y_batch in tl.iterate.minibatches(X, y, batch_size, shuffle=shuffle): + _loss, _acc = _train_step(network, X_batch, y_batch, cost=cost, train_op=train_op, acc=acc) + + loss_ep += _loss + if acc is not None: + acc_ep += _acc + n_step += 1 + + loss_ep = loss_ep / n_step + acc_ep = acc_ep / n_step if acc is not None else None + + return loss_ep, acc_ep, n_step + + +def run_epoch(network, X, y, cost=None, acc=None, batch_size=100, shuffle=False): + """Run a given non time-series network by the given cost function, test data, batch_size etc. + for one epoch. + + Parameters + ---------- + network : TensorLayer Model + the network to be trained. + X : numpy.array + The input of training data + y : numpy.array + The target of training data + cost : TensorLayer or TensorFlow loss function + Metric for loss function, e.g tl.cost.cross_entropy. + acc : TensorFlow/numpy expression or None + Metric for accuracy or others. If None, would not print the information. + batch_size : int + The batch size for training and evaluating. + shuffle : boolean + Indicating whether to shuffle the dataset in training. + + Returns + ------- + loss_ep : Tensor. Average loss of this epoch. None if 'cost' is not given. + acc_ep : Tensor. Average accuracy(metric) of this epoch. None if 'acc' is not given. + n_step : int. Number of iterations taken in this epoch. + """ + network.eval() + loss_ep = 0 + acc_ep = 0 + n_step = 0 + for X_batch, y_batch in tl.iterate.minibatches(X, y, batch_size, shuffle=shuffle): + _loss, _acc = _run_step(network, X_batch, y_batch, cost=cost, acc=acc) + if cost is not None: + loss_ep += _loss + if acc is not None: + acc_ep += _acc + n_step += 1 + + loss_ep = loss_ep / n_step if cost is not None else None + acc_ep = acc_ep / n_step if acc is not None else None + + return loss_ep, acc_ep, n_step + + +@tf.function +def _train_step(network, X_batch, y_batch, cost, train_op=tf.optimizers.Adam(learning_rate=0.0001), acc=None): + """Train for one step""" + with tf.GradientTape() as tape: + y_pred = network(X_batch) + _loss = cost(y_pred, y_batch) + + grad = tape.gradient(_loss, network.trainable_weights) + train_op.apply_gradients(zip(grad, network.trainable_weights)) + + if acc is not None: + _acc = acc(y_pred, y_batch) + return _loss, _acc + else: + return _loss, None + + +# @tf.function # FIXME : enable tf.function will cause some bugs in numpy, need fixing +def _run_step(network, X_batch, y_batch, cost=None, acc=None): + """Run for one step""" + y_pred = network(X_batch) + _loss, _acc = None, None + if cost is not None: + _loss = cost(y_pred, y_batch) + if acc is not None: + _acc = acc(y_pred, y_batch) + return _loss, _acc diff --git a/tensorlayer/visualize.py b/tensorlayer/visualize.py new file mode 100644 index 0000000..72c1b18 --- /dev/null +++ b/tensorlayer/visualize.py @@ -0,0 +1,664 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import os + +import imageio +import numpy as np + +import tensorlayer as tl +from tensorlayer.lazy_imports import LazyImport + +cv2 = LazyImport("cv2") + +# Uncomment the following line if you got: _tkinter.TclError: no display name and no $DISPLAY environment variable +# import matplotlib +# matplotlib.use('Agg') + +__all__ = [ + 'read_image', + 'read_images', + 'save_image', + 'save_images', + 'draw_boxes_and_labels_to_image', + 'draw_mpii_people_to_image', + 'frame', + 'CNN2d', + 'images2d', + 'tsne_embedding', + 'draw_weights', + 'W', +] + + +def read_image(image, path=''): + """Read one image. + + Parameters + ----------- + image : str + The image file name. + path : str + The image folder path. + + Returns + ------- + numpy.array + The image. + + """ + return imageio.imread(os.path.join(path, image)) + + +def read_images(img_list, path='', n_threads=10, printable=True): + """Returns all images in list by given path and name of each image file. + + Parameters + ------------- + img_list : list of str + The image file names. + path : str + The image folder path. + n_threads : int + The number of threads to read image. + printable : boolean + Whether to print information when reading images. + + Returns + ------- + list of numpy.array + The images. + + """ + imgs = [] + for idx in range(0, len(img_list), n_threads): + b_imgs_list = img_list[idx:idx + n_threads] + b_imgs = tl.prepro.threading_data(b_imgs_list, fn=read_image, path=path) + # tl.logging.info(b_imgs.shape) + imgs.extend(b_imgs) + if printable: + tl.logging.info('read %d from %s' % (len(imgs), path)) + return imgs + + +def save_image(image, image_path='_temp.png'): + """Save a image. + + Parameters + ----------- + image : numpy array + [w, h, c] + image_path : str + path + + """ + try: # RGB + imageio.imwrite(image_path, image) + except Exception: # Greyscale + imageio.imwrite(image_path, image[:, :, 0]) + + +def save_images(images, size, image_path='_temp.png'): + """Save multiple images into one single image. + + Parameters + ----------- + images : numpy array + (batch, w, h, c) + size : list of 2 ints + row and column number. + number of images should be equal or less than size[0] * size[1] + image_path : str + save path + + Examples + --------- + >>> import numpy as np + >>> import tensorlayer as tl + >>> images = np.random.rand(64, 100, 100, 3) + >>> tl.visualize.save_images(images, [8, 8], 'temp.png') + + """ + if len(images.shape) == 3: # Greyscale [batch, h, w] --> [batch, h, w, 1] + images = images[:, :, :, np.newaxis] + + def merge(images, size): + h, w = images.shape[1], images.shape[2] + img = np.zeros((h * size[0], w * size[1], 3), dtype=images.dtype) + for idx, image in enumerate(images): + i = idx % size[1] + j = idx // size[1] + img[j * h:j * h + h, i * w:i * w + w, :] = image + return img + + def imsave(images, size, path): + if np.max(images) <= 1 and (-1 <= np.min(images) < 0): + images = ((images + 1) * 127.5).astype(np.uint8) + elif np.max(images) <= 1 and np.min(images) >= 0: + images = (images * 255).astype(np.uint8) + + return imageio.imwrite(path, merge(images, size)) + + if len(images) > size[0] * size[1]: + raise AssertionError("number of images should be equal or less than size[0] * size[1] {}".format(len(images))) + + return imsave(images, size, image_path) + + +def draw_boxes_and_labels_to_image( + image, classes, coords, scores, classes_list, is_center=True, is_rescale=True, save_name=None +): + """Draw bboxes and class labels on image. Return or save the image with bboxes, example in the docs of ``tl.prepro``. + + Parameters + ----------- + image : numpy.array + The RGB image [height, width, channel]. + classes : list of int + A list of class ID (int). + coords : list of int + A list of list for coordinates. + - Should be [x, y, x2, y2] (up-left and botton-right format) + - If [x_center, y_center, w, h] (set is_center to True). + scores : list of float + A list of score (float). (Optional) + classes_list : list of str + for converting ID to string on image. + is_center : boolean + Whether the coordinates is [x_center, y_center, w, h] + - If coordinates are [x_center, y_center, w, h], set it to True for converting it to [x, y, x2, y2] (up-left and botton-right) internally. + - If coordinates are [x1, x2, y1, y2], set it to False. + is_rescale : boolean + Whether to rescale the coordinates from pixel-unit format to ratio format. + - If True, the input coordinates are the portion of width and high, this API will scale the coordinates to pixel unit internally. + - If False, feed the coordinates with pixel unit format. + save_name : None or str + The name of image file (i.e. image.png), if None, not to save image. + + Returns + ------- + numpy.array + The saved image. + + References + ----------- + - OpenCV rectangle and putText. + - `scikit-image `__. + + """ + if len(coords) != len(classes): + raise AssertionError("number of coordinates and classes are equal") + + if len(scores) > 0 and len(scores) != len(classes): + raise AssertionError("number of scores and classes are equal") + + # don't change the original image, and avoid error https://stackoverflow.com/questions/30249053/python-opencv-drawing-errors-after-manipulating-array-with-numpy + image = image.copy() + + imh, imw = image.shape[0:2] + thick = int((imh + imw) // 430) + + for i, _v in enumerate(coords): + if is_center: + x, y, x2, y2 = tl.prepro.obj_box_coord_centroid_to_upleft_butright(coords[i]) + else: + x, y, x2, y2 = coords[i] + + if is_rescale: # scale back to pixel unit if the coords are the portion of width and high + x, y, x2, y2 = tl.prepro.obj_box_coord_scale_to_pixelunit([x, y, x2, y2], (imh, imw)) + + cv2.rectangle( + image, + (int(x), int(y)), + (int(x2), int(y2)), # up-left and botton-right + [0, 255, 0], + thick + ) + + cv2.putText( + image, + classes_list[classes[i]] + ((" %.2f" % (scores[i])) if (len(scores) != 0) else " "), + (int(x), int(y)), # button left + 0, + 1.5e-3 * imh, # bigger = larger font + [0, 0, 256], # self.meta['colors'][max_indx], + int(thick / 2) + 1 + ) # bold + + if save_name is not None: + # cv2.imwrite('_my.png', image) + save_image(image, save_name) + # if len(coords) == 0: + # tl.logging.info("draw_boxes_and_labels_to_image: no bboxes exist, cannot draw !") + return image + + +def draw_mpii_pose_to_image(image, poses, save_name='image.png'): + """Draw people(s) into image using MPII dataset format as input, return or save the result image. + + This is an experimental API, can be changed in the future. + + Parameters + ----------- + image : numpy.array + The RGB image [height, width, channel]. + poses : list of dict + The people(s) annotation in MPII format, see ``tl.files.load_mpii_pose_dataset``. + save_name : None or str + The name of image file (i.e. image.png), if None, not to save image. + + Returns + -------- + numpy.array + The saved image. + + Examples + -------- + >>> import pprint + >>> import tensorlayer as tl + >>> img_train_list, ann_train_list, img_test_list, ann_test_list = tl.files.load_mpii_pose_dataset() + >>> image = tl.vis.read_image(img_train_list[0]) + >>> tl.vis.draw_mpii_pose_to_image(image, ann_train_list[0], 'image.png') + >>> pprint.pprint(ann_train_list[0]) + + References + ----------- + - `MPII Keyponts and ID `__ + """ + # import skimage + # don't change the original image, and avoid error https://stackoverflow.com/questions/30249053/python-opencv-drawing-errors-after-manipulating-array-with-numpy + image = image.copy() + + imh, imw = image.shape[0:2] + thick = int((imh + imw) // 430) + # radius = int(image.shape[1] / 500) + 1 + radius = int(thick * 1.5) + + if image.max() < 1: + image = image * 255 + + for people in poses: + # Pose Keyponts + joint_pos = people['joint_pos'] + # draw sketch + # joint id (0 - r ankle, 1 - r knee, 2 - r hip, 3 - l hip, 4 - l knee, + # 5 - l ankle, 6 - pelvis, 7 - thorax, 8 - upper neck, + # 9 - head top, 10 - r wrist, 11 - r elbow, 12 - r shoulder, + # 13 - l shoulder, 14 - l elbow, 15 - l wrist) + # + # 9 + # 8 + # 12 ** 7 ** 13 + # * * * + # 11 * 14 + # * * * + # 10 2 * 6 * 3 15 + # * * + # 1 4 + # * * + # 0 5 + + lines = [ + [(0, 1), [100, 255, 100]], + [(1, 2), [50, 255, 50]], + [(2, 6), [0, 255, 0]], # right leg + [(3, 4), [100, 100, 255]], + [(4, 5), [50, 50, 255]], + [(6, 3), [0, 0, 255]], # left leg + [(6, 7), [255, 255, 100]], + [(7, 8), [255, 150, 50]], # body + [(8, 9), [255, 200, 100]], # head + [(10, 11), [255, 100, 255]], + [(11, 12), [255, 50, 255]], + [(12, 8), [255, 0, 255]], # right hand + [(8, 13), [0, 255, 255]], + [(13, 14), [100, 255, 255]], + [(14, 15), [200, 255, 255]] # left hand + ] + for line in lines: + start, end = line[0] + if (start in joint_pos) and (end in joint_pos): + cv2.line( + image, + (int(joint_pos[start][0]), int(joint_pos[start][1])), + (int(joint_pos[end][0]), int(joint_pos[end][1])), # up-left and botton-right + line[1], + thick + ) + # rr, cc, val = skimage.draw.line_aa(int(joint_pos[start][1]), int(joint_pos[start][0]), int(joint_pos[end][1]), int(joint_pos[end][0])) + # image[rr, cc] = line[1] + # draw circles + for pos in joint_pos.items(): + _, pos_loc = pos # pos_id, pos_loc + pos_loc = (int(pos_loc[0]), int(pos_loc[1])) + cv2.circle(image, center=pos_loc, radius=radius, color=(200, 200, 200), thickness=-1) + # rr, cc = skimage.draw.circle(int(pos_loc[1]), int(pos_loc[0]), radius) + # image[rr, cc] = [0, 255, 0] + + # Head + head_rect = people['head_rect'] + if head_rect: # if head exists + cv2.rectangle( + image, + (int(head_rect[0]), int(head_rect[1])), + (int(head_rect[2]), int(head_rect[3])), # up-left and botton-right + [0, 180, 0], + thick + ) + + if save_name is not None: + # cv2.imwrite(save_name, image) + save_image(image, save_name) + return image + + +draw_mpii_people_to_image = draw_mpii_pose_to_image + + +def frame(I=None, second=5, saveable=True, name='frame', cmap=None, fig_idx=12836): + """Display a frame. Make sure OpenAI Gym render() is disable before using it. + + Parameters + ---------- + I : numpy.array + The image. + second : int + The display second(s) for the image(s), if saveable is False. + saveable : boolean + Save or plot the figure. + name : str + A name to save the image, if saveable is True. + cmap : None or str + 'gray' for greyscale, None for default, etc. + fig_idx : int + matplotlib figure index. + + Examples + -------- + >>> env = gym.make("Pong-v0") + >>> observation = env.reset() + >>> tl.visualize.frame(observation) + + """ + import matplotlib.pyplot as plt + if saveable is False: + plt.ion() + plt.figure(fig_idx) # show all feature images + + if len(I.shape) and I.shape[-1] == 1: # (10,10,1) --> (10,10) + I = I[:, :, 0] + + plt.imshow(I, cmap) + plt.title(name) + # plt.gca().xaxis.set_major_locator(plt.NullLocator()) # distable tick + # plt.gca().yaxis.set_major_locator(plt.NullLocator()) + + if saveable: + plt.savefig(name + '.pdf', format='pdf') + else: + plt.draw() + plt.pause(second) + + +def CNN2d(CNN=None, second=10, saveable=True, name='cnn', fig_idx=3119362): + """Display a group of RGB or Greyscale CNN masks. + + Parameters + ---------- + CNN : numpy.array + The image. e.g: 64 5x5 RGB images can be (5, 5, 3, 64). + second : int + The display second(s) for the image(s), if saveable is False. + saveable : boolean + Save or plot the figure. + name : str + A name to save the image, if saveable is True. + fig_idx : int + The matplotlib figure index. + + Examples + -------- + >>> tl.visualize.CNN2d(network.all_params[0].eval(), second=10, saveable=True, name='cnn1_mnist', fig_idx=2012) + + """ + import matplotlib.pyplot as plt + # tl.logging.info(CNN.shape) # (5, 5, 3, 64) + # exit() + n_mask = CNN.shape[3] + n_row = CNN.shape[0] + n_col = CNN.shape[1] + n_color = CNN.shape[2] + row = int(np.sqrt(n_mask)) + col = int(np.ceil(n_mask / row)) + plt.ion() # active mode + fig = plt.figure(fig_idx) + count = 1 + for _ir in range(1, row + 1): + for _ic in range(1, col + 1): + if count > n_mask: + break + fig.add_subplot(col, row, count) + # tl.logging.info(CNN[:,:,:,count-1].shape, n_row, n_col) # (5, 1, 32) 5 5 + # exit() + # plt.imshow( + # np.reshape(CNN[count-1,:,:,:], (n_row, n_col)), + # cmap='gray', interpolation="nearest") # theano + if n_color == 1: + plt.imshow(np.reshape(CNN[:, :, :, count - 1], (n_row, n_col)), cmap='gray', interpolation="nearest") + elif n_color == 3: + plt.imshow( + np.reshape(CNN[:, :, :, count - 1], (n_row, n_col, n_color)), cmap='gray', interpolation="nearest" + ) + else: + raise Exception("Unknown n_color") + plt.gca().xaxis.set_major_locator(plt.NullLocator()) # distable tick + plt.gca().yaxis.set_major_locator(plt.NullLocator()) + count = count + 1 + if saveable: + plt.savefig(name + '.pdf', format='pdf') + else: + plt.draw() + plt.pause(second) + + +def images2d(images=None, second=10, saveable=True, name='images', dtype=None, fig_idx=3119362): + """Display a group of RGB or Greyscale images. + + Parameters + ---------- + images : numpy.array + The images. + second : int + The display second(s) for the image(s), if saveable is False. + saveable : boolean + Save or plot the figure. + name : str + A name to save the image, if saveable is True. + dtype : None or numpy data type + The data type for displaying the images. + fig_idx : int + matplotlib figure index. + + Examples + -------- + >>> X_train, y_train, X_test, y_test = tl.files.load_cifar10_dataset(shape=(-1, 32, 32, 3), plotable=False) + >>> tl.visualize.images2d(X_train[0:100,:,:,:], second=10, saveable=False, name='cifar10', dtype=np.uint8, fig_idx=20212) + + """ + import matplotlib.pyplot as plt + # tl.logging.info(images.shape) # (50000, 32, 32, 3) + # exit() + if dtype: + images = np.asarray(images, dtype=dtype) + n_mask = images.shape[0] + n_row = images.shape[1] + n_col = images.shape[2] + n_color = images.shape[3] + row = int(np.sqrt(n_mask)) + col = int(np.ceil(n_mask / row)) + plt.ion() # active mode + fig = plt.figure(fig_idx) + count = 1 + for _ir in range(1, row + 1): + for _ic in range(1, col + 1): + if count > n_mask: + break + fig.add_subplot(col, row, count) + # tl.logging.info(images[:,:,:,count-1].shape, n_row, n_col) # (5, 1, 32) 5 5 + # plt.imshow( + # np.reshape(images[count-1,:,:,:], (n_row, n_col)), + # cmap='gray', interpolation="nearest") # theano + if n_color == 1: + plt.imshow(np.reshape(images[count - 1, :, :], (n_row, n_col)), cmap='gray', interpolation="nearest") + # plt.title(name) + elif n_color == 3: + plt.imshow(images[count - 1, :, :], cmap='gray', interpolation="nearest") + # plt.title(name) + else: + raise Exception("Unknown n_color") + plt.gca().xaxis.set_major_locator(plt.NullLocator()) # distable tick + plt.gca().yaxis.set_major_locator(plt.NullLocator()) + count = count + 1 + if saveable: + plt.savefig(name + '.pdf', format='pdf') + else: + plt.draw() + plt.pause(second) + + +def tsne_embedding(embeddings, reverse_dictionary, plot_only=500, second=5, saveable=False, name='tsne', fig_idx=9862): + """Visualize the embeddings by using t-SNE. + + Parameters + ---------- + embeddings : numpy.array + The embedding matrix. + reverse_dictionary : dictionary + id_to_word, mapping id to unique word. + plot_only : int + The number of examples to plot, choice the most common words. + second : int + The display second(s) for the image(s), if saveable is False. + saveable : boolean + Save or plot the figure. + name : str + A name to save the image, if saveable is True. + fig_idx : int + matplotlib figure index. + + Examples + -------- + >>> see 'tutorial_word2vec_basic.py' + >>> final_embeddings = normalized_embeddings.eval() + >>> tl.visualize.tsne_embedding(final_embeddings, labels, reverse_dictionary, + ... plot_only=500, second=5, saveable=False, name='tsne') + + """ + import matplotlib.pyplot as plt + + def plot_with_labels(low_dim_embs, labels, figsize=(18, 18), second=5, saveable=True, name='tsne', fig_idx=9862): + + if low_dim_embs.shape[0] < len(labels): + raise AssertionError("More labels than embeddings") + + if saveable is False: + plt.ion() + plt.figure(fig_idx) + + plt.figure(figsize=figsize) # in inches + + for i, label in enumerate(labels): + x, y = low_dim_embs[i, :] + plt.scatter(x, y) + plt.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points', ha='right', va='bottom') + + if saveable: + plt.savefig(name + '.pdf', format='pdf') + else: + plt.draw() + plt.pause(second) + + try: + from sklearn.manifold import TSNE + from six.moves import xrange + + tsne = TSNE(perplexity=30, n_components=2, init='pca', n_iter=5000) + # plot_only = 500 + low_dim_embs = tsne.fit_transform(embeddings[:plot_only, :]) + labels = [reverse_dictionary[i] for i in xrange(plot_only)] + plot_with_labels(low_dim_embs, labels, second=second, saveable=saveable, name=name, fig_idx=fig_idx) + + except ImportError: + _err = "Please install sklearn and matplotlib to visualize embeddings." + tl.logging.error(_err) + raise ImportError(_err) + + +def draw_weights(W=None, second=10, saveable=True, shape=None, name='mnist', fig_idx=2396512): + """Visualize every columns of the weight matrix to a group of Greyscale img. + + Parameters + ---------- + W : numpy.array + The weight matrix + second : int + The display second(s) for the image(s), if saveable is False. + saveable : boolean + Save or plot the figure. + shape : a list with 2 int or None + The shape of feature image, MNIST is [28, 80]. + name : a string + A name to save the image, if saveable is True. + fig_idx : int + matplotlib figure index. + + Examples + -------- + >>> tl.visualize.draw_weights(network.all_params[0].eval(), second=10, saveable=True, name='weight_of_1st_layer', fig_idx=2012) + + """ + if shape is None: + shape = [28, 28] + + import matplotlib.pyplot as plt + if saveable is False: + plt.ion() + fig = plt.figure(fig_idx) # show all feature images + n_units = W.shape[1] + + num_r = int(np.sqrt(n_units)) # 每行显示的个数 若25个hidden unit -> 每行显示5个 + num_c = int(np.ceil(n_units / num_r)) + count = int(1) + for _row in range(1, num_r + 1): + for _col in range(1, num_c + 1): + if count > n_units: + break + fig.add_subplot(num_r, num_c, count) + # ------------------------------------------------------------ + # plt.imshow(np.reshape(W[:,count-1],(28,28)), cmap='gray') + # ------------------------------------------------------------ + feature = W[:, count - 1] / np.sqrt((W[:, count - 1]**2).sum()) + # feature[feature<0.0001] = 0 # value threshold + # if count == 1 or count == 2: + # print(np.mean(feature)) + # if np.std(feature) < 0.03: # condition threshold + # feature = np.zeros_like(feature) + # if np.mean(feature) < -0.015: # condition threshold + # feature = np.zeros_like(feature) + plt.imshow( + np.reshape(feature, (shape[0], shape[1])), cmap='gray', interpolation="nearest" + ) # , vmin=np.min(feature), vmax=np.max(feature)) + # plt.title(name) + # ------------------------------------------------------------ + # plt.imshow(np.reshape(W[:,count-1] ,(np.sqrt(size),np.sqrt(size))), cmap='gray', interpolation="nearest") + plt.gca().xaxis.set_major_locator(plt.NullLocator()) # distable tick + plt.gca().yaxis.set_major_locator(plt.NullLocator()) + count = count + 1 + if saveable: + plt.savefig(name + '.pdf', format='pdf') + else: + plt.draw() + plt.pause(second) + + +W = draw_weights diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/model_basic.h5 b/tests/files/model_basic.h5 new file mode 100644 index 0000000000000000000000000000000000000000..7d7be22ff5453a5d65d42017d19a587c5ca5a5cf GIT binary patch literal 282704 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

    X*WiqS>`Ny=+Anv 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\{{)1 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 z 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 j{nvi3Kla-{>3`ggD=_-b{{` 0.7 + + for epoch in range(n_epoch): ## iterate the dataset n_epoch times + print("epoch = ", epoch) + + for X_batch, y_batch in tl.iterate.minibatches(X_train, y_train, batch_size, shuffle=True): + MLP.train() # enable dropout + + with tf.GradientTape() as tape: + ## compute outputs + _logits = MLP(X_batch) # alternatively, you can use MLP(x, is_train=True) and remove MLP.train() + ## compute loss and update model + _loss = tl.cost.cross_entropy(_logits, y_batch, name='train_loss') + + grad = tape.gradient(_loss, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + + MLP.save("MLP.hdf5") + + +def create_base_network(input_shape): + '''Base network to be shared (eq. to feature extraction). + ''' + input = Input(shape=input_shape) + x = Flatten()(input) + x = Dense(128, act=tf.nn.relu)(x) + x = Dropout(0.9)(x) + x = Dense(128, act=tf.nn.relu)(x) + x = Dropout(0.9)(x) + x = Dense(128, act=tf.nn.relu)(x) + return Model(input, x) + + +def get_siamese_network(input_shape): + """Create siamese network with shared base network as layer + """ + base_layer = create_base_network(input_shape).as_layer() + + ni_1 = Input(input_shape) + ni_2 = Input(input_shape) + nn_1 = base_layer(ni_1) + nn_2 = base_layer(ni_2) + return Model(inputs=[ni_1, ni_2], outputs=[nn_1, nn_2]) + + +class Reuse_ModelLayer_test(CustomTestCase): + + @classmethod + def setUpClass(cls): + print("##### begin testing save_graph, load_graph, including ModelLayer and reuse #####") + + def test_save(self): + input_shape = (None, 784) + M1 = get_siamese_network(input_shape) + print("Model config = \n", M1.config) + print("Model = \n", M1) + M1.save(filepath="siamese.hdf5", save_weights=False) + M2 = Model.load(filepath="siamese.hdf5", load_weights=False) + + M1_config = RemoveDateInConfig(M1.config) + M2_config = RemoveDateInConfig(M2.config) + + self.assertEqual(M1_config, M2_config) + + +class Vgg_LayerList_test(CustomTestCase): + + @classmethod + def setUpClass(cls): + print("##### begin testing save_graph, load_graph, including LayerList #####") + + def test_save(self): + M1 = tl.models.vgg16(mode='static') + print("Model config = \n", M1.config) + print("Model = \n", M1) + M1.save(filepath="vgg.hdf5", save_weights=False) + M2 = Model.load(filepath="vgg.hdf5", load_weights=False) + + M1_config = RemoveDateInConfig(M1.config) + M2_config = RemoveDateInConfig(M2.config) + + self.assertEqual(M1_config, M2_config) + + +class List_inputs_outputs_test(CustomTestCase): + + @classmethod + def setUpClass(cls): + print("##### begin testing model with list inputs and outputs #####") + + def test_list_inputs_outputs(self): + ni_1 = Input(shape=[4, 16]) + ni_2 = Input(shape=[4, 32]) + a_1 = Dense(80)(ni_1) + b_1 = Dense(160)(ni_2) + concat = Concat()([a_1, b_1]) + a_2 = Dense(10)(concat) + b_2 = Dense(20)(concat) + + M1 = Model(inputs=[ni_1, ni_2], outputs=[a_2, b_2]) + print("Model config = \n", M1.config) + print("Model = \n", M1) + M1.save(filepath="list.hdf5", save_weights=False) + M2 = Model.load(filepath="list.hdf5", load_weights=False) + + M1_config = RemoveDateInConfig(M1.config) + M2_config = RemoveDateInConfig(M2.config) + + self.assertEqual(M1_config, M2_config) + + +class Lambda_layer_test(CustomTestCase): + + @classmethod + def setUpClass(cls): + print("##### begin testing lambda layer #####") + + def test_lambda_layer_no_para_no_args(self): + x = tl.layers.Input([8, 3], name='input') + y = tl.layers.Lambda(lambda x: 2 * x, name='lambda')(x) + M1 = tl.models.Model(x, y) + M1.save("lambda_no_para_no_args.hdf5") + M2 = tl.models.Model.load("lambda_no_para_no_args.hdf5") + print(M1) + print(M2) + M1.eval() + M2.eval() + npInput = np.zeros((8, 3)) + 3 + output1 = M1(npInput).numpy() + output2 = M1(npInput).numpy() + + M1_config = RemoveDateInConfig(M1.config) + M2_config = RemoveDateInConfig(M2.config) + + self.assertEqual((output1 == output2).all(), True) + self.assertEqual(M1_config, M2_config) + + def test_lambda_layer_no_para_with_args(self): + + def customize_func(x, foo=42): # x is the inputs, foo is an argument + return foo * x + + x = tl.layers.Input([8, 3], name='input') + y = tl.layers.Lambda(customize_func, fn_args={'foo': 3}, name='lambda')(x) + M1 = tl.models.Model(x, y) + M1.save("lambda_no_para_with_args.hdf5") + M2 = tl.models.Model.load("lambda_no_para_with_args.hdf5") + print(M1) + print(M2) + M1.eval() + M2.eval() + npInput = np.zeros((8, 3)) + 3 + output1 = M1(npInput).numpy() + output2 = M2(npInput).numpy() + + M1_config = RemoveDateInConfig(M1.config) + M2_config = RemoveDateInConfig(M2.config) + + self.assertEqual((output1 == output2).all(), True) + self.assertEqual((output1 == (np.zeros((8, 3)) + 9)).all(), True) + self.assertEqual(M1_config, M2_config) + + def test_lambda_layer_keras_model(self): + input_shape = [100, 5] + in_2 = tl.layers.Input(input_shape, name='input') + layers = [ + tf.keras.layers.Dense(10, activation=tf.nn.relu), + tf.keras.layers.Dense(5, activation=tf.nn.sigmoid), + tf.keras.layers.Dense(1, activation=tf.nn.relu) + ] + perceptron = tf.keras.Sequential(layers) + # in order to compile keras model and get trainable_variables of the keras model + _ = perceptron(np.random.random(input_shape).astype(np.float32)) + plambdalayer = tl.layers.Lambda(perceptron, perceptron.trainable_variables)(in_2) + M2 = tl.models.Model(inputs=in_2, outputs=plambdalayer) + + M2.save('M2_keras.hdf5') + M4 = Model.load('M2_keras.hdf5') + + M2.eval() + M4.eval() + npInput = np.zeros(input_shape) + 3 + output2 = M2(npInput).numpy() + output4 = M4(npInput).numpy() + + M2_config = RemoveDateInConfig(M2.config) + M4_config = RemoveDateInConfig(M4.config) + + self.assertEqual((output2 == output4).all(), True) + self.assertEqual(M2_config, M4_config) + + ori_weights = M4.all_weights + ori_val = ori_weights[1].numpy() + modify_val = np.zeros_like(ori_val) + 10 + M4.all_weights[1].assign(modify_val) + M4 = Model.load('M2_keras.hdf5') + + self.assertLess(np.max(np.abs(ori_val - M4.all_weights[1].numpy())), 1e-7) + + def test_lambda_layer_keras_layer(self): + input_shape = [100, 5] + in_1 = tl.layers.Input(input_shape, name='input') + denselayer = tf.keras.layers.Dense(10, activation=tf.nn.relu) + # in order to compile keras model and get trainable_variables of the keras model + _ = denselayer(np.random.random(input_shape).astype(np.float32)) + dlambdalayer = tl.layers.Lambda(denselayer, denselayer.trainable_variables)(in_1) + M1 = tl.models.Model(inputs=in_1, outputs=dlambdalayer) + + M1.save('M1_keras.hdf5') + M3 = Model.load('M1_keras.hdf5') + + M1.eval() + M3.eval() + npInput = np.zeros(input_shape) + 3 + output1 = M1(npInput).numpy() + output3 = M3(npInput).numpy() + + M1_config = RemoveDateInConfig(M1.config) + M3_config = RemoveDateInConfig(M3.config) + + self.assertEqual((output1 == output3).all(), True) + self.assertEqual(M1_config, M3_config) + + ori_weights = M3.all_weights + ori_val = ori_weights[1].numpy() + modify_val = np.zeros_like(ori_val) + 10 + M3.all_weights[1].assign(modify_val) + M3 = Model.load('M1_keras.hdf5') + + self.assertLess(np.max(np.abs(ori_val - M3.all_weights[1].numpy())), 1e-7) + + +class ElementWise_lambda_test(CustomTestCase): + + @classmethod + def setUpClass(cls): + print("##### begin testing elementwise lambda layer #####") + + def test_elementwise_no_para_with_args(self): + # z = mean + noise * tf.exp(std * 0.5) + foo + def func(noise, mean, std, foo=42): + return mean + noise * tf.exp(std * 0.5) + foo + + noise = tl.layers.Input([100, 1]) + mean = tl.layers.Input([100, 1]) + std = tl.layers.Input([100, 1]) + out = tl.layers.ElementwiseLambda(fn=func, fn_args={'foo': 84}, name='elementwiselambda')([noise, mean, std]) + M1 = Model(inputs=[noise, mean, std], outputs=out) + M1.save("elementwise_npwa.hdf5") + M2 = Model.load("elementwise_npwa.hdf5") + + M1.eval() + M2.eval() + ipt = [np.zeros((100, 1)) + 11, np.zeros((100, 1)) + 21, np.zeros((100, 1)) + 31] + output1 = M1(ipt).numpy() + output2 = M2(ipt).numpy() + + M1_config = RemoveDateInConfig(M1.config) + M2_config = RemoveDateInConfig(M2.config) + + self.assertEqual((output1 == output2).all(), True) + self.assertEqual(M1_config, M2_config) + + def test_elementwise_no_para_no_args(self): + # z = mean + noise * tf.exp(std * 0.5) + foo + def func(noise, mean, std, foo=42): + return mean + noise * tf.exp(std * 0.5) + foo + + noise = tl.layers.Input([100, 1]) + mean = tl.layers.Input([100, 1]) + std = tl.layers.Input([100, 1]) + out = tl.layers.ElementwiseLambda(fn=func, name='elementwiselambda')([noise, mean, std]) + M1 = Model(inputs=[noise, mean, std], outputs=out) + M1.save("elementwise_npna.hdf5") + M2 = Model.load("elementwise_npna.hdf5") + + M1.eval() + M2.eval() + ipt = [np.zeros((100, 1)) + 11, np.zeros((100, 1)) + 21, np.zeros((100, 1)) + 31] + output1 = M1(ipt).numpy() + output2 = M2(ipt).numpy() + + M1_config = RemoveDateInConfig(M1.config) + M2_config = RemoveDateInConfig(M2.config) + + self.assertEqual((output1 == output2).all(), True) + self.assertEqual(M1_config, M2_config) + + def test_elementwise_lambda_func(self): + # z = mean + noise * tf.exp(std * 0.5) + noise = tl.layers.Input([100, 1]) + mean = tl.layers.Input([100, 1]) + std = tl.layers.Input([100, 1]) + out = tl.layers.ElementwiseLambda(fn=lambda x, y, z: x + y * tf.exp(z * 0.5), + name='elementwiselambda')([noise, mean, std]) + M1 = Model(inputs=[noise, mean, std], outputs=out) + M1.save("elementwise_lambda.hdf5") + M2 = Model.load("elementwise_lambda.hdf5") + + M1.eval() + M2.eval() + ipt = [ + (np.zeros((100, 1)) + 11).astype(np.float32), (np.zeros((100, 1)) + 21).astype(np.float32), + (np.zeros((100, 1)) + 31).astype(np.float32) + ] + output1 = M1(ipt).numpy() + output2 = M2(ipt).numpy() + + M1_config = RemoveDateInConfig(M1.config) + M2_config = RemoveDateInConfig(M2.config) + + self.assertEqual((output1 == output2).all(), True) + self.assertEqual(M1_config, M2_config) + + # # ElementwiseLambda does not support keras layer/model func yet + # def test_elementwise_keras_model(self): + # kerasinput1 = tf.keras.layers.Input(shape=(100, )) + # kerasinput2 = tf.keras.layers.Input(shape=(100, )) + # kerasconcate = tf.keras.layers.concatenate(inputs=[kerasinput1, kerasinput2]) + # kerasmodel = tf.keras.models.Model(inputs=[kerasinput1, kerasinput2], outputs=kerasconcate) + # _ = kerasmodel([np.random.random([100,]).astype(np.float32), np.random.random([100,]).astype(np.float32)]) + # + # input1 = tl.layers.Input([100, 1]) + # input2 = tl.layers.Input([100, 1]) + # out = tl.layers.ElementwiseLambda(fn=kerasmodel, name='elementwiselambda')([input1, input2]) + # M1 = Model(inputs=[input1, input2], outputs=out) + # M1.save("elementwise_keras_model.hdf5") + # M2 = Model.load("elementwise_keras_model.hdf5") + # + # M1.eval() + # M2.eval() + # ipt = [np.zeros((100, 1)) + 11, np.zeros((100, 1)) + 21, np.zeros((100, 1)) + 31] + # output1 = M1(ipt).numpy() + # output2 = M2(ipt).numpy() + # + # M1_config = RemoveDateInConfig(M1.config) + # M2_config = RemoveDateInConfig(M2.config) + # + # self.assertEqual((output1 == output2).all(), True) + # self.assertEqual(M1_config, M2_config) + + +class basic_dynamic_model(Model): + + def __init__(self): + super(basic_dynamic_model, self).__init__() + self.conv1 = Conv2d(16, (5, 5), (1, 1), padding='SAME', act=tf.nn.relu, in_channels=3, name="conv1") + self.pool1 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool1') + + self.conv2 = Conv2d(16, (5, 5), (1, 1), padding='SAME', act=tf.nn.relu, in_channels=16, name="conv2") + self.pool2 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool2') + + self.flatten = Flatten(name='flatten') + self.dense1 = Dense(100, act=None, in_channels=576, name="dense1") + self.dense2 = Dense(10, act=None, in_channels=100, name="dense2") + + def forward(self, x): + x = self.conv1(x) + x = self.pool1(x) + x = self.conv2(x) + x = self.pool2(x) + x = self.flatten(x) + x = self.dense1(x) + x = self.dense2(x) + return x + + +class Dynamic_config_test(CustomTestCase): + + @classmethod + def setUpClass(cls): + print("##### begin testing exception in dynamic mode #####") + + def test_dynamic_config(self): + M1 = basic_dynamic_model() + print(M1.config) + for layer in M1.all_layers: + print(layer.config) + + +class Exception_test(CustomTestCase): + + @classmethod + def setUpClass(cls): + print("##### begin testing exception in dynamic mode #####") + + def test_exception(self): + M1 = basic_dynamic_model() + try: + M1.save("dynamic.hdf5", save_weights=False) + except Exception as e: + self.assertIsInstance(e, RuntimeError) + print(e) + + M2 = basic_static_model() + M2.save("basic_static_mode.hdf5", save_weights=False) + try: + M3 = Model.load("basic_static_mode.hdf5") + except Exception as e: + self.assertIsInstance(e, RuntimeError) + print(e) + + +if __name__ == '__main__': + + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/models/test_seq2seq_model.py b/tests/models/test_seq2seq_model.py new file mode 100644 index 0000000..d77aa47 --- /dev/null +++ b/tests/models/test_seq2seq_model.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import numpy as np +import tensorflow as tf +import tensorlayer as tl +from tqdm import tqdm +from sklearn.utils import shuffle +from tensorlayer.models.seq2seq import Seq2seq +from tests.utils import CustomTestCase +from tensorlayer.cost import cross_entropy_seq + + +class Model_SEQ2SEQ_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + cls.batch_size = 16 + + cls.vocab_size = 20 + cls.embedding_size = 32 + cls.dec_seq_length = 5 + cls.trainX = np.random.randint(20, size=(50, 6)) + cls.trainY = np.random.randint(20, size=(50, cls.dec_seq_length + 1)) + cls.trainY[:, 0] = 0 # start_token == 0 + + # Parameters + cls.src_len = len(cls.trainX) + cls.tgt_len = len(cls.trainY) + + assert cls.src_len == cls.tgt_len + + cls.num_epochs = 100 + cls.n_step = cls.src_len // cls.batch_size + + @classmethod + def tearDownClass(cls): + pass + + def test_basic_simpleSeq2Seq(self): + model_ = Seq2seq( + decoder_seq_length=5, + cell_enc=tf.keras.layers.GRUCell, + cell_dec=tf.keras.layers.GRUCell, + n_layer=3, + n_units=128, + embedding_layer=tl.layers.Embedding(vocabulary_size=self.vocab_size, embedding_size=self.embedding_size), + ) + + optimizer = tf.optimizers.Adam(learning_rate=0.001) + + for epoch in range(self.num_epochs): + model_.train() + trainX, trainY = shuffle(self.trainX, self.trainY) + total_loss, n_iter = 0, 0 + for X, Y in tqdm(tl.iterate.minibatches(inputs=trainX, targets=trainY, batch_size=self.batch_size, + shuffle=False), total=self.n_step, + desc='Epoch[{}/{}]'.format(epoch + 1, self.num_epochs), leave=False): + + dec_seq = Y[:, :-1] + target_seq = Y[:, 1:] + + with tf.GradientTape() as tape: + ## compute outputs + output = model_(inputs=[X, dec_seq]) + + output = tf.reshape(output, [-1, self.vocab_size]) + + loss = cross_entropy_seq(logits=output, target_seqs=target_seq) + + grad = tape.gradient(loss, model_.all_weights) + optimizer.apply_gradients(zip(grad, model_.all_weights)) + + total_loss += loss + n_iter += 1 + + model_.eval() + test_sample = trainX[0:2, :].tolist() + + top_n = 1 + for i in range(top_n): + prediction = model_([test_sample], seq_length=self.dec_seq_length, start_token=0, top_n=1) + print("Prediction: >>>>> ", prediction, "\n Target: >>>>> ", trainY[0:2, 1:], "\n\n") + + # printing average loss after every epoch + print('Epoch [{}/{}]: loss {:.4f}'.format(epoch + 1, self.num_epochs, total_loss / n_iter)) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/models/test_seq2seq_with_attention.py b/tests/models/test_seq2seq_with_attention.py new file mode 100644 index 0000000..d7dbeae --- /dev/null +++ b/tests/models/test_seq2seq_with_attention.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import numpy as np +import tensorflow as tf +import tensorlayer as tl +from tqdm import tqdm +from sklearn.utils import shuffle +from tensorlayer.models.seq2seq_with_attention import Seq2seqLuongAttention +from tests.utils import CustomTestCase +from tensorlayer.cost import cross_entropy_seq + + +class Model_SEQ2SEQ_WITH_ATTENTION_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + cls.batch_size = 16 + + cls.vocab_size = 200 + cls.embedding_size = 32 + cls.dec_seq_length = 5 + cls.pure_time = np.linspace(-1, 1, 21) + cls.pure_signal = 100 * np.sin(cls.pure_time) + cls.dataset = np.zeros((100, 21)) + for i in range(100): + noise = 100 + 1 * np.random.normal(0, 1, cls.pure_signal.shape) + cls.dataset[i] = cls.pure_signal + noise + cls.dataset = cls.dataset.astype(int) + np.random.shuffle(cls.dataset) + cls.trainX = cls.dataset[:80, :15] + cls.trainY = cls.dataset[:80, 15:] + cls.testX = cls.dataset[80:, :15] + cls.testY = cls.dataset[80:, 15:] + + cls.trainY[:, 0] = 0 # start_token == 0 + cls.testY[:, 0] = 0 # start_token == 0 + + # Parameters + cls.src_len = len(cls.trainX) + cls.tgt_len = len(cls.trainY) + + assert cls.src_len == cls.tgt_len + + cls.num_epochs = 500 + cls.n_step = cls.src_len // cls.batch_size + + @classmethod + def tearDownClass(cls): + pass + + def test_basic_simpleSeq2Seq(self): + + model_ = Seq2seqLuongAttention( + hidden_size=128, cell=tf.keras.layers.SimpleRNNCell, + embedding_layer=tl.layers.Embedding(vocabulary_size=self.vocab_size, + embedding_size=self.embedding_size), method='dot' + ) + optimizer = tf.optimizers.Adam(learning_rate=0.001) + + for epoch in range(self.num_epochs): + model_.train() + trainX, trainY = shuffle(self.trainX, self.trainY) + total_loss, n_iter = 0, 0 + for X, Y in tqdm(tl.iterate.minibatches(inputs=trainX, targets=trainY, batch_size=self.batch_size, + shuffle=False), total=self.n_step, + desc='Epoch[{}/{}]'.format(epoch + 1, self.num_epochs), leave=False): + dec_seq = Y[:, :-1] + target_seq = Y[:, 1:] + + with tf.GradientTape() as tape: + ## compute outputs + output = model_(inputs=[X, dec_seq]) + # print(output) + output = tf.reshape(output, [-1, self.vocab_size]) + + loss = cross_entropy_seq(logits=output, target_seqs=target_seq) + grad = tape.gradient(loss, model_.trainable_weights) + optimizer.apply_gradients(zip(grad, model_.trainable_weights)) + + total_loss += loss + n_iter += 1 + + model_.eval() + test_sample = self.testX[:5, :].tolist() # Can't capture the sequence. + top_n = 1 + for i in range(top_n): + prediction = model_([test_sample], seq_length=self.dec_seq_length, sos=0) + print("Prediction: >>>>> ", prediction, "\n Target: >>>>> ", self.testY[:5, 1:], "\n\n") + + # printing average loss after every epoch + print('Epoch [{}/{}]: loss {:.4f}'.format(epoch + 1, self.num_epochs, total_loss / n_iter)) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/pending/__init__.py b/tests/pending/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/pending/test_array_ops.py b/tests/pending/test_array_ops.py new file mode 100644 index 0000000..56b80d4 --- /dev/null +++ b/tests/pending/test_array_ops.py @@ -0,0 +1,244 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +import numpy as np + +from tests.utils import CustomTestCase + + +class Array_Op_Alphas_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + b1 = tl.alphas([4, 3, 2, 1], 0.5431) + b2 = tl.alphas([4, 3, 2], 5) + b3 = tl.alphas([1, 2, 3, 4], -5) + b4 = tl.alphas([2, 3, 4], True) + + with tf.Session() as sess: + cls._b1, cls._b2, cls._b3, cls._b4 = sess.run([b1, b2, b3, b4]) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_b1(self): + self.assertEqual(self._b1.shape, (4, 3, 2, 1)) + + b1 = np.array( + [ + [ + [ + [0.5431], + [0.5431], + ], + [ + [0.5431], + [0.5431], + ], + [ + [0.5431], + [0.5431], + ], + ], [ + [ + [0.5431], + [0.5431], + ], + [ + [0.5431], + [0.5431], + ], + [ + [0.5431], + [0.5431], + ], + ], [ + [ + [0.5431], + [0.5431], + ], + [ + [0.5431], + [0.5431], + ], + [ + [0.5431], + [0.5431], + ], + ], [ + [ + [0.5431], + [0.5431], + ], + [ + [0.5431], + [0.5431], + ], + [ + [0.5431], + [0.5431], + ], + ] + ] + ) + + np.array_equal(self._b1, b1) + + def test_b2(self): + self.assertEqual(self._b2.shape, (4, 3, 2)) + + b2 = np.array( + [ + [ + [ + 5, + 5, + ], + [ + 5, + 5, + ], + [ + 5, + 5, + ], + ], [ + [ + 5, + 5, + ], + [ + 5, + 5, + ], + [ + 5, + 5, + ], + ], [ + [ + 5, + 5, + ], + [ + 5, + 5, + ], + [ + 5, + 5, + ], + ], [ + [ + 5, + 5, + ], + [ + 5, + 5, + ], + [ + 5, + 5, + ], + ] + ] + ) + + np.array_equal(self._b2, b2) + + def test_b3(self): + self.assertEqual(self._b3.shape, (1, 2, 3, 4)) + + b3 = np.array( + [ + [ + [[-5, -5, -5, -5], [-5, -5, -5, -5], [-5, -5, -5, -5]], + [[-5, -5, -5, -5], [-5, -5, -5, -5], [-5, -5, -5, -5]], + ] + ] + ) + + np.array_equal(self._b3, b3) + + def test_b4(self): + self.assertEqual(self._b4.shape, (2, 3, 4)) + + b4 = np.array( + [ + [[True, True, True, True], [True, True, True, True], [True, True, True, True]], + [[True, True, True, True], [True, True, True, True], [True, True, True, True]], + ] + ) + + np.array_equal(self._b4, b4) + + +class Array_Op_Alphas_Like_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + a = tf.constant([[[4, 5, 6], [1, 2, 3]], [[4, 5, 6], [1, 2, 3]]]) + + b1 = tl.alphas_like(a, 0.5431) + b2 = tl.alphas_like(a, 5) + b3 = tl.alphas_like(a, -5) + b4 = tl.alphas_like(a, True) + + with tf.Session() as sess: + cls._b1, cls._b2, cls._b3, cls._b4 = sess.run([b1, b2, b3, b4]) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_b1(self): + self.assertEqual(self._b1.shape, (2, 2, 3)) + + b1 = np.array( + [ + [[0.5431, 0.5431, 0.5431], [0.5431, 0.5431, 0.5431]], + [[0.5431, 0.5431, 0.5431], [0.5431, 0.5431, 0.5431]] + ] + ) + + np.array_equal(self._b1, b1) + + def test_b2(self): + self.assertEqual(self._b2.shape, (2, 2, 3)) + + b2 = np.array([[[5, 5, 5], [5, 5, 5]], [[5, 5, 5], [5, 5, 5]]]) + + np.array_equal(self._b2, b2) + + def test_b3(self): + self.assertEqual(self._b3.shape, (2, 2, 3)) + + b3 = np.array([[[-5, -5, -5], [-5, -5, -5]], [[-5, -5, -5], [-5, -5, -5]]]) + + np.array_equal(self._b3, b3) + + def test_b4(self): + self.assertEqual(self._b4.shape, (2, 2, 3)) + + b4 = np.array([[[True, True, True], [True, True, True]], [[True, True, True], [True, True, True]]]) + + np.array_equal(self._b4, b4) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_decorators.py b/tests/pending/test_decorators.py new file mode 100644 index 0000000..cc88785 --- /dev/null +++ b/tests/pending/test_decorators.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tensorlayer.decorators import private_method + +from tests.utils import CustomTestCase + + +class Layer_Pooling_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + class MyClass(object): + + @private_method + def _private_func(self): + tl.logging.debug("I am private") + + def public_func(self): + tl.logging.debug("I am public and calling now the private func") + self._private_func() + + cls.my_object = MyClass() + + def test_call_from_public_method(self): + with self.assertNotRaises(RuntimeError): + self.my_object.public_func() + + def test_call_private_method(self): + with self.assertRaises(RuntimeError): + self.my_object._private_func() + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_documentation.py b/tests/pending/test_documentation.py new file mode 100644 index 0000000..211142e --- /dev/null +++ b/tests/pending/test_documentation.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +from sphinx.application import Sphinx + + +class DocTest(unittest.TestCase): + source_dir = u'docs/' + config_dir = u'docs/' + output_dir = u'docs/test_build' + doctree_dir = u'docs/test_build/doctrees' + + all_files = True + + @classmethod + def setUpClass(cls): + os.environ["SPHINXBUILD"] = "1" + + def test_html_documentation(self): + app = Sphinx( + self.source_dir, + self.config_dir, + self.output_dir, + self.doctree_dir, + buildername='html', + warningiserror=True, + ) + app.build(force_all=self.all_files) + # TODO: additional checks here if needed + + def test_text_documentation(self): + # The same, but with different buildername + app = Sphinx( + self.source_dir, + self.config_dir, + self.output_dir, + self.doctree_dir, + buildername='text', + warningiserror=False, + ) + app.build(force_all=self.all_files) + # TODO: additional checks if needed + + def tearDown(self): + # TODO: clean up the output directory + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/pending/test_layers_basic.py b/tests/pending/test_layers_basic.py new file mode 100644 index 0000000..2771f96 --- /dev/null +++ b/tests/pending/test_layers_basic.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Layer_Basic_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + x = tf.placeholder(tf.float32, [None, 100]) + + n = tl.layers.InputLayer(x, name='in') + n = tl.layers.DenseLayer(n, n_units=80, name='d1') + n = tl.layers.DenseLayer(n, n_units=80, name='d2') + + n.print_layers() + n.print_params(False) + + n2 = n[:, :30] + n2.print_layers() + + cls.n_params = n.count_params() + cls.all_layers = n.all_layers + cls.all_params = n.all_params + cls.shape_n = n.outputs.get_shape().as_list() + + cls.shape_n2 = n2.outputs.get_shape().as_list() + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_n_params(self): + self.assertEqual(self.n_params, 14560) + + def test_shape_n(self): + self.assertEqual(self.shape_n[-1], 80) + + def test_all_layers(self): + self.assertEqual(len(self.all_layers), 3) + + def test_all_params(self): + self.assertEqual(len(self.all_params), 4) + + def test_shape_n2(self): + self.assertEqual(self.shape_n2[-1], 30) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_layers_flow_control.py b/tests/pending/test_layers_flow_control.py new file mode 100644 index 0000000..d86eb21 --- /dev/null +++ b/tests/pending/test_layers_flow_control.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Layer_Flow_Control_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + x = tf.placeholder(tf.float32, shape=(None, 784), name='x') + + # define the network + net_in = tl.layers.InputLayer(x, name='in') + net_in = tl.layers.DropoutLayer(net_in, keep=0.8, name='in/drop') + # net 0 + net_0 = tl.layers.DenseLayer(net_in, n_units=800, act=tf.nn.relu, name='net0/relu1') + net_0 = tl.layers.DropoutLayer(net_0, keep=0.5, name='net0/drop1') + net_0 = tl.layers.DenseLayer(net_0, n_units=800, act=tf.nn.relu, name='net0/relu2') + # net 1 + net_1 = tl.layers.DenseLayer(net_in, n_units=800, act=tf.nn.relu, name='net1/relu1') + net_1 = tl.layers.DropoutLayer(net_1, keep=0.8, name='net1/drop1') + net_1 = tl.layers.DenseLayer(net_1, n_units=800, act=tf.nn.relu, name='net1/relu2') + net_1 = tl.layers.DropoutLayer(net_1, keep=0.8, name='net1/drop2') + net_1 = tl.layers.DenseLayer(net_1, n_units=800, act=tf.nn.relu, name='net1/relu3') + # multiplexer + net_mux = tl.layers.MultiplexerLayer(layers=[net_0, net_1], name='mux') + network = tl.layers.ReshapeLayer(net_mux, shape=(-1, 800), name='reshape') + network = tl.layers.DropoutLayer(network, keep=0.5, name='drop3') + # output layer + network = tl.layers.DenseLayer(network, n_units=10, name='output') + + network.print_layers() + network.print_params(False) + + cls.net_shape = network.outputs.get_shape().as_list() + cls.net_layers = network.all_layers + cls.net_params = network.all_params + cls.net_all_drop = network.all_drop + cls.net_n_params = network.count_params() + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_net_shape(self): + self.assertEqual(self.net_shape[-1], 10) + + def test_net_layers(self): + self.assertEqual(len(self.net_layers), 14) + + def test_net_params(self): + self.assertEqual(len(self.net_params), 12) + + def test_net_all_drop(self): + self.assertEqual(len(self.net_all_drop), 5) + + def test_net_n_params(self): + self.assertEqual(self.net_n_params, 3186410) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_layers_importer.py b/tests/pending/test_layers_importer.py new file mode 100644 index 0000000..1c1321a --- /dev/null +++ b/tests/pending/test_layers_importer.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf + +from tensorflow.contrib.slim.python.slim.nets.inception_v3 import inception_v3 +from tensorflow.contrib.slim.python.slim.nets.inception_v3 import inception_v3_arg_scope + +slim = tf.contrib.slim +keras = tf.keras + +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Layer_Importer_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + cls.net_in = dict() + + # ============================= # + # LambdaLayer + # ============================= # + x = tf.placeholder(tf.float32, shape=[None, 784]) + cls.net_in["lambda"] = tl.layers.InputLayer(x, name='input') + + # ============================= # + # SlimNetsLayer + # ============================= # + x = tf.placeholder(tf.float32, shape=[None, 299, 299, 3]) + cls.net_in["slim"] = tl.layers.InputLayer(x, name='input_layer') + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_lambda_layer(self): + + def keras_block(x): + x = keras.layers.Dropout(0.8)(x) + x = keras.layers.Dense(100, activation='relu')(x) + # x = keras.layers.Dropout(0.8)(x) + # x = keras.layers.Dense(100, activation='relu')(x) + x = keras.layers.Dropout(0.5)(x) + logits = keras.layers.Dense(10, activation='linear')(x) + + return logits + + with self.assertNotRaises(Exception): + tl.layers.LambdaLayer(self.net_in["lambda"], fn=keras_block, name='keras') + + def test_slim_layer(self): + + with self.assertNotRaises(Exception): + with slim.arg_scope(inception_v3_arg_scope()): + # Alternatively, you should implement inception_v3 without TensorLayer as follow. + # logits, end_points = inception_v3(X, num_classes=1001, + # is_training=False) + tl.layers.SlimNetsLayer( + self.net_in["slim"], + slim_layer=inception_v3, + slim_args={ + 'num_classes': 1001, + 'is_training': False, + # 'dropout_keep_prob' : 0.8, # for training + # 'min_depth' : 16, + # 'depth_multiplier' : 1.0, + # 'prediction_fn' : slim.softmax, + # 'spatial_squeeze' : True, + # 'reuse' : None, + # 'scope' : 'InceptionV3' + }, + name='InceptionV3' # <-- the name should be the same with the ckpt model + ) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_layers_normalization.py b/tests/pending/test_layers_normalization.py new file mode 100644 index 0000000..d0891ab --- /dev/null +++ b/tests/pending/test_layers_normalization.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +def model(x, is_train=True, reuse=False): + with tf.variable_scope("model", reuse=reuse): + n = tl.layers.InputLayer(x, name='in') + n = tl.layers.Conv2d(n, n_filter=80, name='conv2d_1') + n = tl.layers.BatchNormLayer(n, is_train=is_train, name='norm_batch') + n = tl.layers.Conv2d(n, n_filter=80, name='conv2d_2') + n = tl.layers.LocalResponseNormLayer(n, name='norm_local') + n = tl.layers.LayerNormLayer(n, reuse=reuse, name='norm_layer') + n = tl.layers.InstanceNormLayer(n, name='norm_instance') + # n = tl.layers.GroupNormLayer(n, groups=40, name='groupnorm') + n.outputs = tf.reshape(n.outputs, [-1, 80, 100, 100]) + n = tl.layers.GroupNormLayer(n, groups=40, data_format='channels_first', name='groupnorm') + n.outputs = tf.reshape(n.outputs, [-1, 100, 100, 80]) + n = tl.layers.SwitchNormLayer(n, name='switchnorm') + n = tl.layers.QuanConv2dWithBN(n, n_filter=3, is_train=is_train, name='quan_cnn_with_bn') + n = tl.layers.FlattenLayer(n, name='flatten') + n = tl.layers.QuanDenseLayerWithBN(n, n_units=10, name='quan_dense_with_bn') + return n + + +class Layer_Normalization_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + x = tf.placeholder(tf.float32, [None, 100, 100, 3]) + + net_train = model(x, is_train=True, reuse=False) + net_eval = model(x, is_train=False, reuse=True) + + net_train.print_layers() + net_train.print_params(False) + + cls.data = dict() + cls.data["train_network"] = dict() + cls.data["eval_network"] = dict() + + cls.data["train_network"]["layers"] = net_train.all_layers + cls.data["eval_network"]["layers"] = net_eval.all_layers + + cls.data["train_network"]["params"] = net_train.all_params + + cls.data["train_network"]["n_params"] = net_train.count_params() + + print(net_train.count_params()) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_all_layers(self): + self.assertEqual(len(self.data["train_network"]["layers"]), 12) + self.assertEqual(len(self.data["eval_network"]["layers"]), 12) + + def test_all_params(self): + self.assertEqual(len(self.data["train_network"]["params"]), 28) + + def test_n_params(self): + self.assertEqual(self.data["train_network"]["n_params"], 363098) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_layers_padding.py b/tests/pending/test_layers_padding.py new file mode 100644 index 0000000..ab6f6b5 --- /dev/null +++ b/tests/pending/test_layers_padding.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Layer_Padding_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + ## 1D + x = tf.placeholder(tf.float32, (None, 100, 1)) + n = tl.layers.InputLayer(x) + + n1 = tl.layers.ZeroPad1d(n, padding=1) + n2 = tl.layers.ZeroPad1d(n, padding=(2, 3)) + + n1.print_layers() + n2.print_layers() + + cls.n1_shape = n1.outputs.get_shape().as_list() + cls.n2_shape = n2.outputs.get_shape().as_list() + + ## 2D + x = tf.placeholder(tf.float32, (None, 100, 100, 3)) + n = tl.layers.InputLayer(x) + + n3 = tl.layers.ZeroPad2d(n, padding=2) + n4 = tl.layers.ZeroPad2d(n, padding=(2, 3)) + n5 = tl.layers.ZeroPad2d(n, padding=((3, 3), (4, 4))) + + n3.print_layers() + n4.print_layers() + n5.print_layers() + + cls.n3_shape = n3.outputs.get_shape().as_list() + cls.n4_shape = n4.outputs.get_shape().as_list() + cls.n5_shape = n5.outputs.get_shape().as_list() + + ## 3D + x = tf.placeholder(tf.float32, (None, 100, 100, 100, 3)) + n = tl.layers.InputLayer(x) + + n6 = tl.layers.ZeroPad3d(n, padding=2) + n7 = tl.layers.ZeroPad3d(n, padding=(2, 3, 4)) + n8 = tl.layers.ZeroPad3d(n, padding=((3, 3), (4, 4), (5, 5))) + + n6.print_layers() + n7.print_layers() + n8.print_layers() + + cls.n6_shape = n6.outputs.get_shape().as_list() + cls.n7_shape = n7.outputs.get_shape().as_list() + cls.n8_shape = n8.outputs.get_shape().as_list() + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_n1_shape(self): + self.assertEqual(self.n1_shape[1:], [102, 1]) + + def test_n2_shape(self): + self.assertEqual(self.n2_shape[1:], [105, 1]) + + def test_n3_shape(self): + self.assertEqual(self.n3_shape[1:], [104, 104, 3]) + + def test_n4_shape(self): + self.assertEqual(self.n4_shape[1:], [104, 106, 3]) + + def test_n5_shape(self): + self.assertEqual(self.n5_shape[1:], [106, 108, 3]) + + def test_n6_shape(self): + self.assertEqual(self.n6_shape[1:], [104, 104, 104, 3]) + + def test_n7_shape(self): + self.assertEqual(self.n7_shape[1:], [104, 106, 108, 3]) + + def test_n8_shape(self): + self.assertEqual(self.n8_shape[1:], [106, 108, 110, 3]) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_layers_spatial_transformer.py b/tests/pending/test_layers_spatial_transformer.py new file mode 100644 index 0000000..4c6d81b --- /dev/null +++ b/tests/pending/test_layers_spatial_transformer.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +def model(x, is_train, reuse): + with tf.variable_scope("STN", reuse=reuse): + nin = tl.layers.InputLayer(x, name='in') + ## 1. Localisation network + # use MLP as the localisation net + nt = tl.layers.FlattenLayer(nin, name='flatten') + nt = tl.layers.DenseLayer(nt, n_units=20, act=tf.nn.tanh, name='dense1') + nt = tl.layers.DropoutLayer(nt, keep=0.8, is_fix=True, is_train=is_train, name='drop1') + # you can also use CNN instead for MLP as the localisation net + # nt = Conv2d(nin, 16, (3, 3), (2, 2), act=tf.ops.relu, padding='SAME', name='tc1') + # nt = Conv2d(nt, 8, (3, 3), (2, 2), act=tf.ops.relu, padding='SAME', name='tc2') + ## 2. Spatial transformer module (sampler) + n = tl.layers.SpatialTransformer2dAffineLayer(nin, theta_layer=nt, out_size=(40, 40), name='spatial') + s = n + ## 3. Classifier + n = tl.layers.Conv2d( + n, n_filter=16, filter_size=(3, 3), strides=(2, 2), act=tf.nn.relu, padding='SAME', name='conv1' + ) + + n = tl.layers.Conv2d( + n, n_filter=16, filter_size=(3, 3), strides=(2, 2), act=tf.nn.relu, padding='SAME', name='conv2' + ) + n = tl.layers.FlattenLayer(n, name='flatten2') + n = tl.layers.DenseLayer(n, n_units=1024, act=tf.nn.relu, name='out1') + n = tl.layers.DenseLayer(n, n_units=10, name='out2') + return n, s + + +class Layer_Spatial_Transformer_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + cls.x = tf.placeholder(tf.float32, shape=[None, 28, 28, 1]) + + net, s = model(cls.x, is_train=True, reuse=False) + + net.print_layers() + net.print_params(False) + + cls.s_shape = s.outputs.get_shape().as_list() + cls.net_layers = net.all_layers + cls.net_params = net.all_params + cls.net_n_params = net.count_params() + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_reuse(self): + + with self.assertNotRaises(Exception): + _, _ = model(self.x, is_train=True, reuse=True) + + def test_net_shape(self): + self.assertEqual(self.s_shape[1:], [40, 40, 1]) + + def test_net_layers(self): + self.assertEqual(len(self.net_layers), 10) + + def test_net_params(self): + self.assertEqual(len(self.net_params), 12) + + def test_net_n_params(self): + self.assertEqual(self.net_n_params, 1667980) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_layers_stack.py b/tests/pending/test_layers_stack.py new file mode 100644 index 0000000..0745a83 --- /dev/null +++ b/tests/pending/test_layers_stack.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Layer_Stack_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + x = tf.placeholder(tf.float32, shape=[None, 30]) + net_in = tl.layers.InputLayer(x, name='input') + + net_d1 = tl.layers.DenseLayer(net_in, n_units=10, name='dense1') + net_d2 = tl.layers.DenseLayer(net_in, n_units=10, name='dense2') + net_d3 = tl.layers.DenseLayer(net_in, n_units=10, name='dense3') + + cls.net_stack = tl.layers.StackLayer([net_d1, net_d2, net_d3], axis=1, name='stack') + + cls.net_stack.print_layers() + cls.net_stack.print_params(False) + + cls.net_unstack = tl.layers.UnStackLayer(cls.net_stack, axis=1, name='unstack') + + cls.net_unstack.print_layers() + cls.net_unstack.print_params(False) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_StackLayer(self): + self.assertEqual(self.net_stack.outputs.get_shape().as_list()[-1], 10) + self.assertEqual(len(self.net_stack.all_layers), 5) + self.assertEqual(len(self.net_stack.all_params), 6) + self.assertEqual(self.net_stack.count_params(), 930) + + def test_UnStackLayer(self): + + for n in self.net_unstack.outputs: + shape = n.outputs.get_shape().as_list() + + self.assertEqual(shape[-1], 10) + self.assertEqual(len(n.all_layers), 5) + self.assertEqual(len(n.all_params), 6) + self.assertEqual(n.count_params(), 930) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_layers_super_resolution.py b/tests/pending/test_layers_super_resolution.py new file mode 100644 index 0000000..9b359cb --- /dev/null +++ b/tests/pending/test_layers_super_resolution.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Layer_Super_Resolution_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + t_signal = tf.placeholder('float32', [10, 100, 4], name='x') + n = tl.layers.InputLayer(t_signal, name='in') + n = tl.layers.Conv1d(n, n_filter=32, filter_size=3, stride=1, padding='SAME', name='conv1d') + net1 = tl.layers.SubpixelConv1d(n, scale=2, name='subpixel') + + net1.print_layers() + net1.print_params(False) + + cls.net1_shape = net1.outputs.get_shape().as_list() + cls.net1_layers = net1.all_layers + cls.net1_params = net1.all_params + cls.net1_n_params = net1.count_params() + + ## 2D + x = tf.placeholder('float32', [10, 100, 100, 3], name='x') + n = tl.layers.InputLayer(x, name='in') + n = tl.layers.Conv2d(n, n_filter=32, filter_size=(3, 2), strides=(1, 1), padding='SAME', name='conv2d') + net2 = tl.layers.SubpixelConv2d(n, scale=2, name='subpixel2d') + + net2.print_layers() + net2.print_params(False) + + cls.net2_shape = net2.outputs.get_shape().as_list() + cls.net2_layers = net2.all_layers + cls.net2_params = net2.all_params + cls.net2_n_params = net2.count_params() + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_net1_shape(self): + self.assertEqual(self.net1_shape, [10, 200, 16]) + self.assertEqual(len(self.net1_layers), 3) + self.assertEqual(len(self.net1_params), 2) + self.assertEqual(self.net1_n_params, 416) + + def test_net2_shape(self): + self.assertEqual(self.net2_shape, [10, 200, 200, 8]) + self.assertEqual(len(self.net2_layers), 3) + self.assertEqual(len(self.net2_params), 2) + self.assertEqual(self.net2_n_params, 608) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_layers_time_distributed.py b/tests/pending/test_layers_time_distributed.py new file mode 100644 index 0000000..a97c511 --- /dev/null +++ b/tests/pending/test_layers_time_distributed.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +def model(x, is_train=True, reuse=False, name_scope="env1"): + with tf.variable_scope(name_scope, reuse=reuse): + net = tl.layers.InputLayer(x, name='input') + net = tl.layers.TimeDistributedLayer( + net, layer_class=tl.layers.DenseLayer, args={ + 'n_units': 50, + 'name': 'dense' + }, name='time_dense' + ) + return net + + +class Layer_Time_Distributed_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + batch_size = 32 + timestep = 20 + input_dim = 100 + + cls.x = tf.placeholder(dtype=tf.float32, shape=[batch_size, timestep, input_dim], name="encode_seqs") + net = model(cls.x, is_train=True, reuse=False) + + cls.net_shape = net.outputs.get_shape().as_list() + cls.n_params = net.count_params() + net.print_params(False) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_net_shape(self): + self.assertEqual(self.net_shape, [32, 20, 50]) + + def test_net_n_params(self): + self.assertEqual(self.n_params, 5050) + + def test_reuse(self): + + with self.assertNotRaises(Exception): + model(self.x, is_train=True, reuse=False, name_scope="env2") + model(self.x, is_train=False, reuse=True, name_scope="env2") + + with self.assertRaises(Exception): + model(self.x, is_train=True, reuse=False) # Already defined model with the same var_scope + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_logging.py b/tests/pending/test_logging.py new file mode 100644 index 0000000..fffdf7c --- /dev/null +++ b/tests/pending/test_logging.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class TL_Logger_Test(CustomTestCase): + + def test_debug(self): + with self.assertNotRaises(Exception): + tl.logging.debug("This is a debug message") + + def test_error(self): + with self.assertNotRaises(Exception): + tl.logging.error("This is an error message") + + def test_fatal(self): + with self.assertNotRaises(Exception): + tl.logging.fatal("This is a fatal error message") + + def test_info(self): + with self.assertNotRaises(Exception): + tl.logging.info("This is an information message") + + def test_warn(self): + with self.assertNotRaises(Exception): + tl.logging.warn("This is a warning message") + + def test_set_verbosity(self): + with self.assertNotRaises(Exception): + tl.logging.set_verbosity(tl.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.INFO) + tl.logging.set_verbosity(tl.logging.WARN) + tl.logging.set_verbosity(tl.logging.ERROR) + tl.logging.set_verbosity(tl.logging.FATAL) + + def test_get_verbosity(self): + with self.assertNotRaises(Exception): + tl.logging.get_verbosity() + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_logging_hyperdash.py b/tests/pending/test_logging_hyperdash.py new file mode 100644 index 0000000..c39e661 --- /dev/null +++ b/tests/pending/test_logging_hyperdash.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +import time + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tensorlayer.logging.contrib import hyperdash as hd + +from tests.utils import CustomTestCase + + +class TL_Logger_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + cls.apikey = os.getenv('HYPERDASH_APIKEY', "test_api_key") + + def test_apikey_unset(self): + + with self.assertRaises(ValueError): + hd.HyperDashHandler.reset_apikey() + hd.HyperDashHandler.get_apikey() + + def test_apikey_set(self): + + with self.assertNotRaises(ValueError): + hd.HyperDashHandler.set_apikey(self.apikey) + hd.HyperDashHandler.get_apikey() + + def test_monitor(self): + + with self.assertNotRaises(Exception): + + hd.HyperDashHandler.set_apikey(self.apikey) + + @hd.monitor("TRAVIS 1 - dogs vs. cats") + def train_dogs_vs_cats(exp=None): + + # Record the value of hyperparameter gamma for this experiment + lr = exp.param("learning rate", 0.005) + tl.logging.debug("Learning Rate: %f" % lr) + + for epoch, accuracy in enumerate([10, 30, 50, 70, 80, 90, 95, 100]): + tl.logging.debug("Epoch %d - Accuracy %d%%" % (epoch + 1, accuracy)) + + # Record a numerical performance metric + exp.metric(name="accuracy", value=accuracy) + + time.sleep(0.1) + + train_dogs_vs_cats() + + def test_monitor_variant(self): + + with self.assertNotRaises(Exception): + + @hd.monitor("TRAVIS 2 - dogs vs. cats", api_key=self.apikey) + def train_dogs_vs_cats(exp=None): + + # Record the value of hyperparameter gamma for this experiment + lr = exp.param("learning rate", 0.005) + tl.logging.debug("Learning Rate: %f" % lr) + + for epoch, accuracy in enumerate([10, 30, 50, 70, 80, 90, 95, 100]): + tl.logging.debug("Epoch %d - Accuracy %d%%" % (epoch + 1, accuracy)) + + # Record a numerical performance metric + exp.metric(name="accuracy", value=accuracy) + + time.sleep(0.1) + + train_dogs_vs_cats() + + def test_Experiment(self): + + hd.HyperDashHandler.set_apikey(self.apikey) + + with self.assertNotRaises(Exception): + + def train_dogs_vs_cats(): + + # Create an experiment with a model name, then autostart + exp = hd.Experiment("TRAVIS 3 - dogs vs. cats") + + # Record the value of hyperparameter gamma for this experiment + lr = exp.param("learning rate", 0.005) + tl.logging.debug("Learning Rate: %f" % lr) + + for epoch, accuracy in enumerate([10, 30, 50, 70, 80, 90, 95, 100]): + tl.logging.debug("Epoch %d - Accuracy %d%%" % (epoch + 1, accuracy)) + + # Record a numerical performance metric + exp.metric(name="accuracy", value=accuracy) + + time.sleep(0.1) + + # Cleanup and mark that the experiment successfully completed + exp.end() + + train_dogs_vs_cats() + + def test_Experiment_variant(self): + + with self.assertNotRaises(Exception): + + def train_dogs_vs_cats(): + + # Create an experiment with a model name, then autostart + exp = hd.Experiment("TRAVIS 4 - dogs vs. cats", api_key=self.apikey) + + # Record the value of hyperparameter gamma for this experiment + lr = exp.param("learning rate", 0.005) + tl.logging.debug("Learning Rate: %f" % lr) + + for epoch, accuracy in enumerate([10, 30, 50, 70, 80, 90, 95, 100]): + tl.logging.debug("Epoch %d - Accuracy %d%%" % (epoch + 1, accuracy)) + + # Record a numerical performance metric + exp.metric(name="accuracy", value=accuracy) + + time.sleep(0.1) + + # Cleanup and mark that the experiment successfully completed + exp.end() + + train_dogs_vs_cats() + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_mnist_simple.py b/tests/pending/test_mnist_simple.py new file mode 100644 index 0000000..ec14c39 --- /dev/null +++ b/tests/pending/test_mnist_simple.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Simple_MNIST_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + # define placeholders + cls.x = tf.placeholder(tf.float32, shape=[None, 784], name='x') + cls.y_ = tf.placeholder(tf.int64, shape=[None], name='y_') + + # define the network + network = tl.layers.InputLayer(cls.x, name='input') + network = tl.layers.DropoutLayer(network, keep=0.8, name='drop1') + network = tl.layers.DenseLayer(network, n_units=100, act=tf.nn.relu, name='relu1') + network = tl.layers.DropoutLayer(network, keep=0.8, name='drop2') + network = tl.layers.DenseLayer(network, n_units=100, act=tf.nn.relu, name='relu2') + network = tl.layers.DropoutLayer(network, keep=0.8, name='drop3') + + # the softmax is implemented internally in tl.cost.cross_entropy(y, y_) to + # speed up computation, so we use identity here. + # see tf.ops.sparse_softmax_cross_entropy_with_logits() + cls.network = tl.layers.DenseLayer(network, n_units=10, name='output') + + # define cost function and metric. + y = cls.network.outputs + cls.cost = tl.cost.cross_entropy(y, cls.y_, name='cost') + + correct_prediction = tf.equal(tf.argmax(y, 1), cls.y_) + + cls.acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) + # y_op = tf.argmax(tf.ops.softmax(y), 1) + + # define the optimizer + train_params = cls.network.trainable_weights + cls.train_op = tf.train.AdamOptimizer(learning_rate=0.0001).minimize(cls.cost, var_list=train_params) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_reuse_vgg(self): + + # prepare data + X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_mnist_dataset(shape=(-1, 784)) + + # for fashion_MNIST dataset test + # X_train, y_train, X_val, y_val, X_test, y_test = tl.files.load_fashion_mnist_dataset(shape=(-1, 784)) + + with self.assertNotRaises(Exception): + with tf.Session() as sess: + + # initialize all variables in the session + tl.layers.initialize_global_variables(sess) + + # print network information + self.network.print_params() + self.network.print_layers() + + # train the network + tl.utils.fit( + sess, self.network, self.train_op, self.cost, X_train, y_train, self.x, self.y_, acc=self.acc, + batch_size=500, n_epoch=1, print_freq=1, X_val=X_val, y_val=y_val, eval_train=False + ) + + # evaluation + tl.utils.test( + sess, self.network, self.acc, X_test, y_test, self.x, self.y_, batch_size=None, cost=self.cost + ) + + # save the network to .npz file + tl.files.save_npz(self.network.all_params, name='model.npz') + sess.close() + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_models.py b/tests/pending/test_models.py new file mode 100644 index 0000000..ecaf036 --- /dev/null +++ b/tests/pending/test_models.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class VGG_Model_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + with tf.Graph().as_default(): + # - Classify ImageNet classes with VGG16, see `tutorial_models_vgg16.py __` + x = tf.placeholder(tf.float32, [None, 224, 224, 3]) + # get the whole model + vgg1 = tl.models.VGG16(x) + # restore pre-trained VGG parameters + # sess = tf.InteractiveSession() + # vgg.restore_params(sess) + # use for inferencing + # probs = tf.ops.softmax(vgg1.outputs) + + cls.vgg1_layers = vgg1.all_layers + cls.vgg1_params = vgg1.all_params + + with tf.Graph().as_default(): + # - Extract features with VGG16 and Train a classifier with 100 classes + x = tf.placeholder(tf.float32, [None, 224, 224, 3]) + # get VGG without the last layer + vgg2 = tl.models.VGG16(x, end_with='fc2_relu') + + cls.vgg2_layers = vgg2.all_layers + cls.vgg2_params = vgg2.all_params + + print("TYPE:", type(vgg2)) + + # add one more layer + _ = tl.layers.DenseLayer(vgg2, n_units=100, name='out') + # initialize all parameters + # sess = tf.InteractiveSession() + # tl.layers.initialize_global_variables(sess) + # restore pre-trained VGG parameters + # vgg.restore_params(sess) + # train your own classifier (only update the last layer) + + cls.vgg2_train_params = tl.layers.get_variables_with_name('out') + + with tf.Graph().as_default() as graph: + # - Reuse model + x = tf.placeholder(tf.float32, [None, 224, 224, 3]) + # get VGG without the last layer + vgg3 = tl.models.VGG16(x, end_with='fc2_relu') + # reuse the parameters of vgg1 with different input + # restore pre-trained VGG parameters (as they share parameters, we don’t need to restore vgg2) + # sess = tf.InteractiveSession() + # vgg1.restore_params(sess) + + cls.vgg3_layers = vgg3.all_layers + cls.vgg3_params = vgg3.all_params + cls.vgg3_graph = graph + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_vgg1_layers(self): + self.assertEqual(len(self.vgg1_layers), 23) + + def test_vgg2_layers(self): + self.assertEqual(len(self.vgg2_layers), 22) + + def test_vgg3_layers(self): + self.assertEqual(len(self.vgg3_layers), 22) + + def test_vgg1_params(self): + self.assertEqual(len(self.vgg1_params), 32) + + def test_vgg2_params(self): + self.assertEqual(len(self.vgg2_params), 30) + + def test_vgg3_params(self): + self.assertEqual(len(self.vgg3_params), 30) + + def test_vgg2_train_params(self): + self.assertEqual(len(self.vgg2_train_params), 2) + + def test_reuse_vgg(self): + + with self.assertNotRaises(Exception): + with self.vgg3_graph.as_default(): + x = tf.placeholder(tf.float32, [None, 224, 224, 3]) + _ = tl.models.VGG16(x, end_with='fc2_relu', reuse=True) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_optimizer_amsgrad.py b/tests/pending/test_optimizer_amsgrad.py new file mode 100644 index 0000000..0ceb8b3 --- /dev/null +++ b/tests/pending/test_optimizer_amsgrad.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Layer_Pooling_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + cls.x = tf.placeholder(tf.float32, shape=[None, 784], name='x') + cls.y_ = tf.placeholder(tf.int64, shape=[None], name='y_') + + # define the network + cls.network = tl.layers.InputLayer(cls.x, name='input') + cls.network = tl.layers.DropoutLayer(cls.network, keep=0.8, name='drop1') + cls.network = tl.layers.DenseLayer(cls.network, 800, tf.nn.relu, name='relu1') + cls.network = tl.layers.DropoutLayer(cls.network, keep=0.5, name='drop2') + cls.network = tl.layers.DenseLayer(cls.network, 800, tf.nn.relu, name='relu2') + cls.network = tl.layers.DropoutLayer(cls.network, keep=0.5, name='drop3') + + cls.network = tl.layers.DenseLayer(cls.network, n_units=10, name='output') + + # define cost function and metric. + cls.y = cls.network.outputs + cls.cost = tl.cost.cross_entropy(cls.y, cls.y_, name='cost') + + correct_prediction = tf.equal(tf.argmax(cls.y, 1), cls.y_) + + cls.acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) + + # define the optimizer + train_params = cls.network.all_params + optimizer = tl.optimizers.AMSGrad(learning_rate=1e-4, beta1=0.9, beta2=0.999, epsilon=1e-8) + cls.train_op = optimizer.minimize(cls.cost, var_list=train_params) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_training(self): + + with self.assertNotRaises(Exception): + + X_train, y_train, X_val, y_val, _, _ = tl.files.load_mnist_dataset(shape=(-1, 784)) + + with tf.Session() as sess: + # initialize all variables in the session + tl.layers.initialize_global_variables(sess) + + # print network information + self.network.print_params() + self.network.print_layers() + + # train the network + tl.utils.fit( + sess, self.network, self.train_op, self.cost, X_train, y_train, self.x, self.y_, acc=self.acc, + batch_size=500, n_epoch=1, print_freq=1, X_val=X_val, y_val=y_val, eval_train=False + ) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_pydocstyle.py b/tests/pending/test_pydocstyle.py new file mode 100644 index 0000000..b93bf74 --- /dev/null +++ b/tests/pending/test_pydocstyle.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +from tests.utils import list_all_py_files + +from pydocstyle.checker import check +from pydocstyle.checker import violations + +registry = violations.ErrorRegistry + + +def lookup_error_params(code): + for group in registry.groups: + for error_params in group.errors: + if error_params.code == code: + return error_params + + +class PyDOC_Style_Test(unittest.TestCase): + + @classmethod + def setUpClass(cls): + + cls.violations = list() + + # TODO: fix all violations to make it empty + _disabled_checks = [ + 'D205', # 1 blank line required between summary line and description + 'D102', # Missing docstring in public method + 'D400', # First line should end with a period + 'D100', # Missing docstring in public module + 'D107', # Missing docstring in __init__ + 'D103', # Missing docstring in public function + 'D401', # First line should be in imperative mood + 'D101', # Missing docstring in public class + 'D413', # Missing blank line after last section + 'D105', # Missing docstring in magic method + 'D104', # Missing docstring in public package + 'D302', # Use u"""for Unicode docstrings + + # Rules that has conflict with yapf + 'D202', # No blank lines allowed after function docstring + ] + + for filename in list_all_py_files(): + print(filename) + for err in check([filename]): + if not err.code in _disabled_checks: + cls.violations.append(err) + + def test_violations(self): + if self.violations: + counts = dict() + + for err in self.violations: + counts[err.code] = counts.get(err.code, 0) + 1 + print(err) + + for n, code in sorted([(n, code) for code, n in counts.items()], reverse=True): + p = lookup_error_params(code) + print('%s %8d %s' % (code, n, p.short_desc)) + + raise Exception('PyDoc Coding Style: %d violations have been found' % (len(self.violations))) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/pending/test_reuse_mlp.py b/tests/pending/test_reuse_mlp.py new file mode 100644 index 0000000..3ca435b --- /dev/null +++ b/tests/pending/test_reuse_mlp.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +# define the network +def mlp(x, is_train=True, reuse=False): + with tf.variable_scope("MLP", reuse=reuse): + tl.layers.set_name_reuse(reuse) # print warning + network = tl.layers.InputLayer(x, name='input') + network = tl.layers.DropoutLayer(network, keep=0.8, is_fix=True, is_train=is_train, name='drop1') + network = tl.layers.DenseLayer(network, n_units=800, act=tf.nn.relu, name='relu1') + network = tl.layers.DropoutLayer(network, keep=0.5, is_fix=True, is_train=is_train, name='drop2') + network = tl.layers.DenseLayer(network, n_units=800, act=tf.nn.relu, name='relu2') + network = tl.layers.DropoutLayer(network, keep=0.5, is_fix=True, is_train=is_train, name='drop3') + network = tl.layers.DenseLayer(network, n_units=10, name='output') + return network + + +class MLP_Reuse_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + # define placeholder + cls.x = tf.placeholder(tf.float32, shape=[None, 784], name='x') + + # define inferences + mlp(cls.x, is_train=True, reuse=False) + mlp(cls.x, is_train=False, reuse=True) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_reuse(self): + + with self.assertRaises(Exception): + mlp(self.x, is_train=False, reuse=False) # Already defined model with the same var_scope + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_tf_layers.py b/tests/pending/test_tf_layers.py new file mode 100644 index 0000000..dc04a06 --- /dev/null +++ b/tests/pending/test_tf_layers.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Layer_Convolution_1D_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + def get_network_1d(inputs, reuse=False): + + with tf.variable_scope("1D_network", reuse=reuse): + net = tl.layers.InputLayer(inputs) + + net1 = tl.layers.Conv1d(net, name="Conv1d") # 2 params + net2 = tl.layers.SeparableConv1d(net1, name="SeparableConv1d") # 3 params + net3 = tl.layers.MaxPool1d(net2, (1, ), name="MaxPool1d") # 0 params + net4 = tl.layers.MeanPool1d(net3, (1, ), name="MeanPool1d") # 0 params + + # HAO Test + net5 = tl.layers.Conv1d(net4, name="Conv1d1") # 2 params + net6 = tl.layers.SeparableConv1d(net5, name="SeparableConv1d1") # 3 params + net7 = tl.layers.SeparableConv1d(net6, name="SeparableConv1d2") # 3 params + + return [net, net1, net2, net3, net4, net5, net6, net7] + + input_pl_train = tf.placeholder(tf.float32, [None, 32, 3]) + input_plh_test = tf.placeholder(tf.float32, [None, 32, 3]) + + cls.network_1 = get_network_1d(input_pl_train, reuse=False) + cls.network_2 = get_network_1d(input_plh_test, reuse=True) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_layer_net0(self): + self.assertEqual(len(self.network_1[0].all_params), 0) + self.assertEqual(len(self.network_2[0].all_params), 0) + + def test_layer_net1(self): + self.assertEqual(len(self.network_1[1].all_params), 2) + self.assertEqual(len(self.network_2[1].all_params), 2) + + def test_layer_net2(self): + self.assertEqual(len(self.network_1[2].all_params), 5) + self.assertEqual(len(self.network_2[2].all_params), 5) + + def test_layer_net3(self): + self.assertEqual(len(self.network_1[3].all_params), 5) + self.assertEqual(len(self.network_2[3].all_params), 5) + + def test_layer_net4(self): + self.assertEqual(len(self.network_1[4].all_params), 5) + self.assertEqual(len(self.network_2[4].all_params), 5) + + def test_layer_net5(self): + self.assertEqual(len(self.network_1[5].all_params), 7) + self.assertEqual(len(self.network_2[5].all_params), 7) + + def test_layer_net6(self): + self.assertEqual(len(self.network_1[6].all_params), 10) + self.assertEqual(len(self.network_2[6].all_params), 10) + + def test_layer_net7(self): + self.assertEqual(len(self.network_1[7].all_params), 13) + self.assertEqual(len(self.network_2[7].all_params), 13) + + +class Layer_Convolution_2D_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + def get_network_2d(inputs, reuse=False): + + with tf.variable_scope("2D_network", reuse=reuse): + net = tl.layers.InputLayer(inputs) + + net1 = tl.layers.Conv2d(net, name="Conv2d") # 2 params + net2 = tl.layers.DeConv2d(net1, name="DeConv2d") # 2 params + net3 = tl.layers.SeparableConv2d(net2, name="SeparableConv2d") # 3 params + net4 = tl.layers.MaxPool2d(net3, (1, 1), name="MaxPool2d") # 0 params + net5 = tl.layers.MeanPool2d(net4, (1, 1), name="MeanPool2d") # 0 params + + # HAO Test + net6 = tl.layers.Conv2d(net5, name="Conv2d1") # 2 params + net7 = tl.layers.DeConv2d(net6, name="DeConv2d1") # 2 params + net8 = tl.layers.DeConv2d(net7, name="DeConv2d2") # 2 params + net9 = tl.layers.SeparableConv2d(net8, name="SeparableConv2d1") # 3 params + + return [net, net1, net2, net3, net4, net5, net6, net7, net8, net9] + + input_pl_train = tf.placeholder(tf.float32, [None, 32, 32, 3]) + input_plh_test = tf.placeholder(tf.float32, [None, 32, 32, 3]) + + cls.network_1 = get_network_2d(input_pl_train, reuse=False) + cls.network_2 = get_network_2d(input_plh_test, reuse=True) + + def test_layer_net0(self): + self.assertEqual(len(self.network_1[0].all_params), 0) + self.assertEqual(len(self.network_2[0].all_params), 0) + + def test_layer_net1(self): + self.assertEqual(len(self.network_1[1].all_params), 2) + self.assertEqual(len(self.network_2[1].all_params), 2) + + def test_layer_net2(self): + self.assertEqual(len(self.network_1[2].all_params), 4) + self.assertEqual(len(self.network_2[2].all_params), 4) + + def test_layer_net3(self): + self.assertEqual(len(self.network_1[3].all_params), 7) + self.assertEqual(len(self.network_2[3].all_params), 7) + + def test_layer_net4(self): + self.assertEqual(len(self.network_1[4].all_params), 7) + self.assertEqual(len(self.network_2[4].all_params), 7) + + def test_layer_net5(self): + self.assertEqual(len(self.network_1[5].all_params), 7) + self.assertEqual(len(self.network_2[5].all_params), 7) + + def test_layer_net6(self): + self.assertEqual(len(self.network_1[6].all_params), 9) + self.assertEqual(len(self.network_2[6].all_params), 9) + + def test_layer_net7(self): + self.assertEqual(len(self.network_1[7].all_params), 11) + self.assertEqual(len(self.network_2[7].all_params), 11) + + def test_layer_net8(self): + self.assertEqual(len(self.network_1[8].all_params), 13) + self.assertEqual(len(self.network_2[8].all_params), 13) + + def test_layer_net9(self): + self.assertEqual(len(self.network_1[9].all_params), 16) + self.assertEqual(len(self.network_2[9].all_params), 16) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + +class Layer_Convolution_3D_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + def get_network_3d(inputs, reuse=False): + + with tf.variable_scope("3D_network", reuse=reuse): + net = tl.layers.InputLayer(inputs) + + net1 = tl.layers.Conv3dLayer( + net, shape=(2, 2, 2, 3, 32), strides=(1, 2, 2, 2, 1), name="Conv3dLayer" + ) # 2 params + net2 = tl.layers.DeConv3d(net1, name="DeConv3d") # 2 params + net3 = tl.layers.MaxPool3d(net2, (1, 1, 1), name="MaxPool3d") # 0 params + net4 = tl.layers.MeanPool3d(net3, (1, 1, 1), name="MeanPool3d") # 0 params + + # HAO Test + net5 = tl.layers.DeConv3d(net4, name="DeConv3d1") # 2 params + + return [net, net1, net2, net3, net4, net5] + + input_pl_train = tf.placeholder(tf.float32, [None, 32, 32, 32, 3]) + input_plh_test = tf.placeholder(tf.float32, [None, 32, 32, 32, 3]) + + cls.network_1 = get_network_3d(input_pl_train, reuse=False) + cls.network_2 = get_network_3d(input_plh_test, reuse=True) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_layer_net0(self): + self.assertEqual(len(self.network_1[0].all_params), 0) + self.assertEqual(len(self.network_2[0].all_params), 0) + + def test_layer_net1(self): + self.assertEqual(len(self.network_1[1].all_params), 2) + self.assertEqual(len(self.network_2[1].all_params), 2) + + def test_layer_net2(self): + self.assertEqual(len(self.network_1[2].all_params), 4) + self.assertEqual(len(self.network_2[2].all_params), 4) + + def test_layer_net3(self): + self.assertEqual(len(self.network_1[3].all_params), 4) + self.assertEqual(len(self.network_2[3].all_params), 4) + + def test_layer_net4(self): + self.assertEqual(len(self.network_1[4].all_params), 4) + self.assertEqual(len(self.network_2[4].all_params), 4) + + def test_layer_net5(self): + self.assertEqual(len(self.network_1[5].all_params), 6) + self.assertEqual(len(self.network_2[5].all_params), 6) + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_timeout.py b/tests/pending/test_timeout.py new file mode 100644 index 0000000..9b5dda6 --- /dev/null +++ b/tests/pending/test_timeout.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import time + +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import WindowsError +from tests.utils import TimeoutError + +from tests.utils import TimeoutContext +from tests.utils import CustomTestCase + +from tests.utils.custom_networks import InceptionV4_Network + +if os.getenv("TRAVIS", None) is not None: + NETWORK_CREATION_TIMEOUT = 120 # Seconds before timeout +else: + NETWORK_CREATION_TIMEOUT = 40 # Seconds before timeout + +###################################################################################### +# # +# UNITTEST TIMEOUT # +# # +###################################################################################### + + +class Layer_Timeoutt_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + ####################################################################### + #### ============= Placeholders Declaration ============= #### + ####################################################################### + + cls.input_plh = tf.placeholder(tf.float32, [None, 299, 299, 3], name='input_placeholder') + + ####################################################################### + #### ============= Model Declaration ============= #### + ####################################################################### + + cls.inception_v4_net = InceptionV4_Network(include_FC_head=True, flatten_output=False) + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_timeout_not_reuse(self): + + with self.assertNotRaises(TimeoutError): + try: + with TimeoutContext(NETWORK_CREATION_TIMEOUT): + start_time = time.time() + + _ = self.inception_v4_net(self.input_plh, reuse=False, is_train=False) + + tl.logging.info("Seconds Elapsed [Not Reused]: %d" % int(time.time() - start_time)) + + except WindowsError: + tl.logging.warning("This unittest can not run on Windows") + + def test_timeout_reuse(self): + + with self.assertNotRaises(TimeoutError): + try: + with TimeoutContext(NETWORK_CREATION_TIMEOUT): + start_time = time.time() + + _ = self.inception_v4_net(self.input_plh, reuse=True, is_train=False) + + tl.logging.info("Seconds Elapsed [Reused Model]: %d" % int(time.time() - start_time)) + + except WindowsError: + tl.logging.warning("This unittest can not run on Windows") + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_utils_predict.py b/tests/pending/test_utils_predict.py new file mode 100644 index 0000000..ec751e2 --- /dev/null +++ b/tests/pending/test_utils_predict.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import numpy as np + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Util_Predict_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + cls.x1 = tf.placeholder(tf.float32, [None, 5, 5, 3]) + cls.x2 = tf.placeholder(tf.float32, [8, 5, 5, 3]) + cls.X1 = np.ones([127, 5, 5, 3]) + cls.X2 = np.ones([7, 5, 5, 3]) + cls.batch_size = 8 + + @classmethod + def tearDownClass(cls): + tf.reset_default_graph() + + def test_case1(self): + with self.assertNotRaises(Exception): + with tf.Session() as sess: + n = tl.layers.InputLayer(self.x1) + y = n.outputs + y_op = tf.nn.softmax(y) + tl.utils.predict(sess, n, self.X1, self.x1, y_op, batch_size=self.batch_size) + sess.close() + + def test_case2(self): + with self.assertRaises(Exception): + with tf.Session() as sess: + n = tl.layers.InputLayer(self.x2) + y = n.outputs + y_op = tf.nn.softmax(y) + tl.utils.predict(sess, n, self.X2, self.x2, y_op, batch_size=self.batch_size) + sess.close() + + +if __name__ == '__main__': + + tf.logging.set_verbosity(tf.logging.DEBUG) + tl.logging.set_verbosity(tl.logging.DEBUG) + + unittest.main() diff --git a/tests/pending/test_yapf_format.py b/tests/pending/test_yapf_format.py new file mode 100644 index 0000000..05ff6f6 --- /dev/null +++ b/tests/pending/test_yapf_format.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +import unittest + +from tests.utils import list_all_py_files +from tests.utils import CustomTestCase + +from yapf.yapflib.yapf_api import FormatCode + + +def _read_utf_8_file(filename): + if sys.version_info.major == 2: ## Python 2 specific + with open(filename, 'rb') as f: + return unicode(f.read(), 'utf-8') + else: + with open(filename, encoding='utf-8') as f: + return f.read() + + +class YAPF_Style_Test(CustomTestCase): + + @classmethod + def setUpClass(cls): + + cls.badly_formatted_files = list() + cls.files_2_test = list_all_py_files() + + def test_files_format(self): + + for file in list_all_py_files(): + + try: + + print(file) + code = _read_utf_8_file(file) + + # https://pypi.python.org/pypi/yapf/0.20.2#example-as-a-module + diff, changed = FormatCode(code, filename=file, style_config='setup.cfg', print_diff=True) + + if changed: + print(diff) + self.badly_formatted_files.append(file) + except Exception as e: + print("Error while processing file: `%s`\n" "Error: %s" % (file, str(e))) + + with self.assertNotRaises(Exception): + + str_err = "" + + if self.badly_formatted_files: + for filename in self.badly_formatted_files: + str_err += 'yapf -i --style=setup.cfg %s\n' % filename + + str_err = "\n======================================================================================\n" \ + "Bad Coding Style: %d file(s) need to be formatted, run the following commands to fix: \n%s" \ + "======================================================================================" % ( + len(self.badly_formatted_files), str_err) + + raise Exception(str_err) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/performance_test/__init__.py b/tests/performance_test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/performance_test/vgg/README.md b/tests/performance_test/vgg/README.md new file mode 100644 index 0000000..62b0fa8 --- /dev/null +++ b/tests/performance_test/vgg/README.md @@ -0,0 +1,34 @@ +# Performance Test (VGG16) + +### Introduction + +This test compares performance of the following libraries: + +1. TensorLayer v. 2.0 +2. TensorFlow ([tf.keras](https://www.tensorflow.org/api_docs/python/tf/keras)) v. 2.0.0-alpha +3. [Keras](https://keras.io/) v. 2.2.4 + + + +### With GPU + +__Hardware:__ + +- CPU: Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz 40 core +- GPU: TITAN Xp + +__Experiment Settings:__ +- Model: [VGG16](http://www.robots.ox.ac.uk/~vgg/research/very_deep/) +- Batch size: 32 +- Number of iterations: 300 + +__Results:__ + +| Mode | Lib | Data Format | Max GPU Memory Usage(MB) |Max CPU Memory Usage(MB) | Avg CPU Memory Usage(MB) | Runtime (sec) | +| :-------: | :-------------: | :-----------: | :-----------------: | :-----------------: | :-----------------: | :-----------: | +| AutoGraph | TensorFlow 2.0 | channel last | 11833 | 2161 | 2136 | 74 | +| | Tensorlayer 2.0 | channel last | 11833 | 2187 | 2169 | 76 | +| Graph | Keras | channel last | 8677 | 2580 | 2576 | 101 | +| Eager | TensorFlow 2.0 | channel last | 8723 | 2052 | 2024 | 97 | +| | TensorLayer 2.0 | channel last | 8723 | 2010 | 2007 | 95 | + diff --git a/tests/performance_test/vgg/__init__.py b/tests/performance_test/vgg/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/performance_test/vgg/exp_config.py b/tests/performance_test/vgg/exp_config.py new file mode 100644 index 0000000..53ffe35 --- /dev/null +++ b/tests/performance_test/vgg/exp_config.py @@ -0,0 +1,16 @@ +import numpy as np + + +def random_input_generator(num, batchsize=32, format='NHWC'): + input_shape = (batchsize, 224, 224, 3) if format == 'NHWC' else (batchsize, 3, 224, 224) + rng = np.random.RandomState(1234) + for i in range(num): + x = rng.uniform(0.0, 1.0, size=input_shape).astype(np.float32) + y = rng.randint(0, 1000, size=(batchsize, )) + yield (x, y) + + +MONITOR_INTERVAL = 50 +NUM_ITERS = 300 +BATCH_SIZE = 32 +LERANING_RATE = 0.0001 diff --git a/tests/performance_test/vgg/keras_test.py b/tests/performance_test/vgg/keras_test.py new file mode 100644 index 0000000..4b77cbe --- /dev/null +++ b/tests/performance_test/vgg/keras_test.py @@ -0,0 +1,66 @@ +import time +import os +import psutil +import keras +from keras.applications.vgg16 import VGG16 +from keras.backend.tensorflow_backend import set_session +from keras.utils import to_categorical +import tensorflow as tf +from exp_config import random_input_generator, MONITOR_INTERVAL, NUM_ITERS, BATCH_SIZE, LERANING_RATE + +config = tf.ConfigProto() +config.gpu_options.allow_growth = True +sess = tf.Session(config=config) +set_session(sess) + +# get the whole model +vgg = VGG16(weights=None) + +# system monitor +info = psutil.virtual_memory() +monitor_interval = MONITOR_INTERVAL +avg_mem_usage = 0 +max_mem_usage = 0 +count = 0 +total_time = 0 + +# training setting +num_iter = NUM_ITERS +batch_size = BATCH_SIZE +vgg.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adam(lr=LERANING_RATE)) + +# data generator +gen = random_input_generator(num_iter, batch_size) + +# begin training + +for idx, data in enumerate(gen): + x_batch = data[0] + y_batch = to_categorical(data[1], num_classes=1000) + + start_time = time.time() + + # forward + backward + vgg.train_on_batch(x_batch, y_batch) + + end_time = time.time() + consume_time = end_time - start_time + total_time += consume_time + + if idx % monitor_interval == 0: + cur_usage = psutil.Process(os.getpid()).memory_info().rss + max_mem_usage = max(cur_usage, max_mem_usage) + avg_mem_usage += cur_usage + count += 1 + print( + "[*] {} iteration: memory usage {:.2f}MB, consume time {:.4f}s".format( + idx, cur_usage / (1024 * 1024), consume_time + ) + ) + +print('consumed time:', total_time) + +avg_mem_usage = avg_mem_usage / count / (1024 * 1024) +max_mem_usage = max_mem_usage / (1024 * 1024) +print('average memory usage: {:.2f}MB'.format(avg_mem_usage)) +print('maximum memory usage: {:.2f}MB'.format(max_mem_usage)) diff --git a/tests/performance_test/vgg/pytorch_test.py b/tests/performance_test/vgg/pytorch_test.py new file mode 100644 index 0000000..a81aa0b --- /dev/null +++ b/tests/performance_test/vgg/pytorch_test.py @@ -0,0 +1,75 @@ +import torch +import torch.nn.functional as F +import torch.optim as optim +from torchvision.models import vgg16 +import time +import os +import psutil +import numpy as np +from exp_config import random_input_generator, MONITOR_INTERVAL, NUM_ITERS, BATCH_SIZE, LERANING_RATE + +# set gpu_id 0 +device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + +# system monitor +info = psutil.virtual_memory() +monitor_interval = MONITOR_INTERVAL +avg_mem_usage = 0 +max_mem_usage = 0 +count = 0 +total_time = 0 + +# get the whole model +vgg = vgg16() + +start_time = time.time() +vgg = vgg.to(device) +total_time += time.time() - start_time + +# training setting +num_iter = NUM_ITERS +batch_size = BATCH_SIZE +optimizer = optim.Adam(vgg.parameters(), lr=LERANING_RATE) + +# data generator +gen = random_input_generator(num_iter, batch_size, format='NCHW') + +# begin training + +for idx, data in enumerate(gen): + + start_time = time.time() + + x_batch = torch.Tensor(data[0]) + y_batch = torch.Tensor(data[1]).long() + x_batch = x_batch.to(device) + y_batch = y_batch.to(device) + + # forward + backward + outputs = vgg(x_batch) + loss = F.cross_entropy(outputs, y_batch) + optimizer.zero_grad() + loss.backward() + optimizer.step() + + end_time = time.time() + consume_time = end_time - start_time + total_time += consume_time + + if idx % monitor_interval == 0: + cur_usage = psutil.Process(os.getpid()).memory_info().rss + max_mem_usage = max(cur_usage, max_mem_usage) + avg_mem_usage += cur_usage + count += 1 + print( + "[*] {} iteration: memory usage {:.2f}MB, consume time {:.4f}s".format( + idx, cur_usage / (1024 * 1024), consume_time + ) + ) + +print('consumed time:', total_time) + +avg_mem_usage = avg_mem_usage / count / (1024 * 1024) +max_mem_usage = max_mem_usage / (1024 * 1024) +print('average memory usage: {:.2f}MB'.format(avg_mem_usage)) +print('maximum memory usage: {:.2f}MB'.format(max_mem_usage)) diff --git a/tests/performance_test/vgg/tf2-autograph.py b/tests/performance_test/vgg/tf2-autograph.py new file mode 100644 index 0000000..90d2ccf --- /dev/null +++ b/tests/performance_test/vgg/tf2-autograph.py @@ -0,0 +1,77 @@ +import time +import os +import psutil +from tensorflow.python.keras.applications import VGG16 +import tensorflow as tf +from exp_config import random_input_generator, MONITOR_INTERVAL, NUM_ITERS, BATCH_SIZE, LERANING_RATE + +gpus = tf.config.experimental.list_physical_devices('GPU') +if gpus: + for gpu in gpus: + tf.config.experimental.set_memory_growth(gpu, True) + +# get the whole model +vgg = VGG16(weights=None) + +# system monitor +info = psutil.virtual_memory() +monitor_interval = MONITOR_INTERVAL +avg_mem_usage = 0 +max_mem_usage = 0 +count = 0 +total_time = 0 + +# training setting +num_iter = NUM_ITERS +batch_size = BATCH_SIZE +train_weights = vgg.trainable_variables +optimizer = tf.optimizers.Adam(learning_rate=LERANING_RATE) +loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) + +# data generator +gen = random_input_generator(num_iter, batch_size) + + +# training function +@tf.function +def train_step(x_batch, y_batch): + # forward + backward + with tf.GradientTape() as tape: + ## compute outputs + _logits = vgg(x_batch, training=True) + ## compute loss and update model + _loss = loss_object(y_batch, _logits) + + grad = tape.gradient(_loss, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + + +# begin training +for idx, data in enumerate(gen): + start_time = time.time() + + x_batch = tf.convert_to_tensor(data[0]) + y_batch = tf.convert_to_tensor(data[1]) + train_step(x_batch, y_batch) + + end_time = time.time() + consume_time = end_time - start_time + total_time += consume_time + + if idx % monitor_interval == 0: + cur_usage = psutil.Process(os.getpid()).memory_info().rss + max_mem_usage = max(cur_usage, max_mem_usage) + avg_mem_usage += cur_usage + count += 1 + tf.print( + "[*] {} iteration: memory usage {:.2f}MB, consume time {:.4f}s".format( + idx, cur_usage / (1024 * 1024), consume_time + ) + ) + +print('consumed time:', total_time) + +avg_mem_usage = avg_mem_usage / count / (1024 * 1024) +max_mem_usage = max_mem_usage / (1024 * 1024) +print('average memory usage: {:.2f}MB'.format(avg_mem_usage)) +print('maximum memory usage: {:.2f}MB'.format(max_mem_usage)) diff --git a/tests/performance_test/vgg/tf2-eager.py b/tests/performance_test/vgg/tf2-eager.py new file mode 100644 index 0000000..d4c7808 --- /dev/null +++ b/tests/performance_test/vgg/tf2-eager.py @@ -0,0 +1,78 @@ +import time +import os +import psutil +from tensorflow.python.keras.applications import VGG16 +import tensorflow as tf +from exp_config import random_input_generator, MONITOR_INTERVAL, NUM_ITERS, BATCH_SIZE, LERANING_RATE + +gpus = tf.config.experimental.list_physical_devices('GPU') +if gpus: + for gpu in gpus: + tf.config.experimental.set_memory_growth(gpu, True) + +# get the whole model +vgg = VGG16(weights=None) + +# system monitor +info = psutil.virtual_memory() +monitor_interval = MONITOR_INTERVAL +avg_mem_usage = 0 +max_mem_usage = 0 +count = 0 +total_time = 0 + +# training setting +num_iter = NUM_ITERS +batch_size = BATCH_SIZE +train_weights = vgg.trainable_variables +optimizer = tf.optimizers.Adam(learning_rate=LERANING_RATE) +loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) + +# data generator +gen = random_input_generator(num_iter, batch_size) + + +# training function +def train_step(x_batch, y_batch): + # forward + backward + with tf.GradientTape() as tape: + ## compute outputs + _logits = vgg(x_batch, training=True) + ## compute loss and update model + _loss = loss_object(y_batch, _logits) + + grad = tape.gradient(_loss, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + + return _loss + + +# begin training +for idx, data in enumerate(gen): + start_time = time.time() + + x_batch = tf.convert_to_tensor(data[0]) + y_batch = tf.convert_to_tensor(data[1]) + loss = train_step(x_batch, y_batch) + + end_time = time.time() + consume_time = end_time - start_time + total_time += consume_time + + if idx % monitor_interval == 0: + cur_usage = psutil.Process(os.getpid()).memory_info().rss + max_mem_usage = max(cur_usage, max_mem_usage) + avg_mem_usage += cur_usage + count += 1 + tf.print( + "[*] {} iteration: memory usage {:.2f}MB, consume time {:.4f}s, loss {:.4f}".format( + idx, cur_usage / (1024 * 1024), consume_time, loss + ) + ) + +print('consumed time:', total_time) + +avg_mem_usage = avg_mem_usage / count / (1024 * 1024) +max_mem_usage = max_mem_usage / (1024 * 1024) +print('average memory usage: {:.2f}MB'.format(avg_mem_usage)) +print('maximum memory usage: {:.2f}MB'.format(max_mem_usage)) diff --git a/tests/performance_test/vgg/tl2-autograph.py b/tests/performance_test/vgg/tl2-autograph.py new file mode 100644 index 0000000..63f5539 --- /dev/null +++ b/tests/performance_test/vgg/tl2-autograph.py @@ -0,0 +1,79 @@ +import time +import os +import psutil +import tensorflow as tf +import tensorlayer as tl +from exp_config import random_input_generator, MONITOR_INTERVAL, NUM_ITERS, BATCH_SIZE, LERANING_RATE + +gpus = tf.config.experimental.list_physical_devices('GPU') +if gpus: + for gpu in gpus: + tf.config.experimental.set_memory_growth(gpu, True) + +tl.logging.set_verbosity(tl.logging.DEBUG) + +# get the whole model +vgg = tl.models.vgg16() + +# system monitor +info = psutil.virtual_memory() +monitor_interval = MONITOR_INTERVAL +avg_mem_usage = 0 +max_mem_usage = 0 +count = 0 +total_time = 0 + +# training setting +num_iter = NUM_ITERS +batch_size = BATCH_SIZE +train_weights = vgg.trainable_weights +optimizer = tf.optimizers.Adam(learning_rate=LERANING_RATE) +loss_object = tl.cost.cross_entropy + +# data generator +gen = random_input_generator(num_iter, batch_size) + + +# training function +@tf.function +def train_step(x_batch, y_batch): + # forward + backward + with tf.GradientTape() as tape: + ## compute outputs + _logits = vgg(x_batch) + ## compute loss and update model + _loss = loss_object(_logits, y_batch) + + grad = tape.gradient(_loss, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + + +# begin training +vgg.train() + +for idx, data in enumerate(gen): + start_time = time.time() + + train_step(data[0], data[1]) + + end_time = time.time() + consume_time = end_time - start_time + total_time += consume_time + + if idx % monitor_interval == 0: + cur_usage = psutil.Process(os.getpid()).memory_info().rss + max_mem_usage = max(cur_usage, max_mem_usage) + avg_mem_usage += cur_usage + count += 1 + tl.logging.info( + "[*] {} iteration: memory usage {:.2f}MB, consume time {:.4f}s".format( + idx, cur_usage / (1024 * 1024), consume_time + ) + ) + +print('consumed time:', total_time) + +avg_mem_usage = avg_mem_usage / count / (1024 * 1024) +max_mem_usage = max_mem_usage / (1024 * 1024) +print('average memory usage: {:.2f}MB'.format(avg_mem_usage)) +print('maximum memory usage: {:.2f}MB'.format(max_mem_usage)) diff --git a/tests/performance_test/vgg/tl2-eager.py b/tests/performance_test/vgg/tl2-eager.py new file mode 100644 index 0000000..fd2ef40 --- /dev/null +++ b/tests/performance_test/vgg/tl2-eager.py @@ -0,0 +1,79 @@ +import time +import os +import psutil +import tensorflow as tf +import tensorlayer as tl +from exp_config import random_input_generator, MONITOR_INTERVAL, NUM_ITERS, BATCH_SIZE, LERANING_RATE + +gpus = tf.config.experimental.list_physical_devices('GPU') +if gpus: + for gpu in gpus: + tf.config.experimental.set_memory_growth(gpu, True) + +tl.logging.set_verbosity(tl.logging.DEBUG) + +# get the whole model +vgg = tl.models.vgg16() + +# system monitor +info = psutil.virtual_memory() +monitor_interval = MONITOR_INTERVAL +avg_mem_usage = 0 +max_mem_usage = 0 +count = 0 +total_time = 0 + +# training setting +num_iter = NUM_ITERS +batch_size = BATCH_SIZE +train_weights = vgg.trainable_weights +optimizer = tf.optimizers.Adam(learning_rate=LERANING_RATE) +loss_object = tl.cost.cross_entropy + +# data generator +gen = random_input_generator(num_iter, batch_size) + + +# training function +def train_step(x_batch, y_batch): + # forward + backward + with tf.GradientTape() as tape: + ## compute outputs + _logits = vgg(x_batch) + ## compute loss and update model + _loss = loss_object(_logits, y_batch) + + grad = tape.gradient(_loss, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + return _loss + + +# begin training +vgg.train() + +for idx, data in enumerate(gen): + start_time = time.time() + + loss = train_step(data[0], data[1]) + + end_time = time.time() + consume_time = end_time - start_time + total_time += consume_time + + if idx % monitor_interval == 0: + cur_usage = psutil.Process(os.getpid()).memory_info().rss + max_mem_usage = max(cur_usage, max_mem_usage) + avg_mem_usage += cur_usage + count += 1 + tl.logging.info( + "[*] {} iteration: memory usage {:.2f}MB, consume time {:.4f}s, loss {:.4f}".format( + idx, cur_usage / (1024 * 1024), consume_time, loss + ) + ) + +print('consumed time:', total_time) + +avg_mem_usage = avg_mem_usage / count / (1024 * 1024) +max_mem_usage = max_mem_usage / (1024 * 1024) +print('average memory usage: {:.2f}MB'.format(avg_mem_usage)) +print('maximum memory usage: {:.2f}MB'.format(max_mem_usage)) diff --git a/tests/performance_test/vgg/tl2-static-autograph.py b/tests/performance_test/vgg/tl2-static-autograph.py new file mode 100644 index 0000000..0af20ad --- /dev/null +++ b/tests/performance_test/vgg/tl2-static-autograph.py @@ -0,0 +1,79 @@ +import time +import os +import psutil +import tensorflow as tf +import tensorlayer as tl +from exp_config import random_input_generator, MONITOR_INTERVAL, NUM_ITERS, BATCH_SIZE, LERANING_RATE + +gpus = tf.config.experimental.list_physical_devices('GPU') +if gpus: + for gpu in gpus: + tf.config.experimental.set_memory_growth(gpu, True) + +tl.logging.set_verbosity(tl.logging.DEBUG) + +# get the whole model +vgg = tl.models.vgg16(mode='static') + +# system monitor +info = psutil.virtual_memory() +monitor_interval = MONITOR_INTERVAL +avg_mem_usage = 0 +max_mem_usage = 0 +count = 0 +total_time = 0 + +# training setting +num_iter = NUM_ITERS +batch_size = BATCH_SIZE +train_weights = vgg.trainable_weights +optimizer = tf.optimizers.Adam(learning_rate=LERANING_RATE) +loss_object = tl.cost.cross_entropy + +# data generator +gen = random_input_generator(num_iter, batch_size) + + +# training function +@tf.function +def train_step(x_batch, y_batch): + # forward + backward + with tf.GradientTape() as tape: + ## compute outputs + _logits = vgg(x_batch) + ## compute loss and update model + _loss = loss_object(_logits, y_batch) + + grad = tape.gradient(_loss, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + + +# begin training +vgg.train() + +for idx, data in enumerate(gen): + start_time = time.time() + + train_step(data[0], data[1]) + + end_time = time.time() + consume_time = end_time - start_time + total_time += consume_time + + if idx % monitor_interval == 0: + cur_usage = psutil.Process(os.getpid()).memory_info().rss + max_mem_usage = max(cur_usage, max_mem_usage) + avg_mem_usage += cur_usage + count += 1 + tl.logging.info( + "[*] {} iteration: memory usage {:.2f}MB, consume time {:.4f}s".format( + idx, cur_usage / (1024 * 1024), consume_time + ) + ) + +print('consumed time:', total_time) + +avg_mem_usage = avg_mem_usage / count / (1024 * 1024) +max_mem_usage = max_mem_usage / (1024 * 1024) +print('average memory usage: {:.2f}MB'.format(avg_mem_usage)) +print('maximum memory usage: {:.2f}MB'.format(max_mem_usage)) diff --git a/tests/performance_test/vgg/tl2-static-eager.py b/tests/performance_test/vgg/tl2-static-eager.py new file mode 100644 index 0000000..b6d5287 --- /dev/null +++ b/tests/performance_test/vgg/tl2-static-eager.py @@ -0,0 +1,79 @@ +import time +import os +import psutil +import tensorflow as tf +import tensorlayer as tl +from exp_config import random_input_generator, MONITOR_INTERVAL, NUM_ITERS, BATCH_SIZE, LERANING_RATE + +gpus = tf.config.experimental.list_physical_devices('GPU') +if gpus: + for gpu in gpus: + tf.config.experimental.set_memory_growth(gpu, True) + +tl.logging.set_verbosity(tl.logging.DEBUG) + +# get the whole model +vgg = tl.models.vgg16(mode='static') + +# system monitor +info = psutil.virtual_memory() +monitor_interval = MONITOR_INTERVAL +avg_mem_usage = 0 +max_mem_usage = 0 +count = 0 +total_time = 0 + +# training setting +num_iter = NUM_ITERS +batch_size = BATCH_SIZE +train_weights = vgg.trainable_weights +optimizer = tf.optimizers.Adam(learning_rate=LERANING_RATE) +loss_object = tl.cost.cross_entropy + +# data generator +gen = random_input_generator(num_iter, batch_size) + + +# training function +def train_step(x_batch, y_batch): + # forward + backward + with tf.GradientTape() as tape: + ## compute outputs + _logits = vgg(x_batch) + ## compute loss and update model + _loss = loss_object(_logits, y_batch) + + grad = tape.gradient(_loss, train_weights) + optimizer.apply_gradients(zip(grad, train_weights)) + return _loss + + +# begin training +vgg.train() + +for idx, data in enumerate(gen): + start_time = time.time() + + loss = train_step(data[0], data[1]) + + end_time = time.time() + consume_time = end_time - start_time + total_time += consume_time + + if idx % monitor_interval == 0: + cur_usage = psutil.Process(os.getpid()).memory_info().rss + max_mem_usage = max(cur_usage, max_mem_usage) + avg_mem_usage += cur_usage + count += 1 + tl.logging.info( + "[*] {} iteration: memory usage {:.2f}MB, consume time {:.4f}s, loss {:.4f}".format( + idx, cur_usage / (1024 * 1024), consume_time, loss + ) + ) + +print('consumed time:', total_time) + +avg_mem_usage = avg_mem_usage / count / (1024 * 1024) +max_mem_usage = max_mem_usage / (1024 * 1024) +print('average memory usage: {:.2f}MB'.format(avg_mem_usage)) +print('maximum memory usage: {:.2f}MB'.format(max_mem_usage)) diff --git a/tests/test_activations.py b/tests/test_activations.py new file mode 100644 index 0000000..39097a6 --- /dev/null +++ b/tests/test_activations.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils import CustomTestCase + + +class Test_Leaky_ReLUs(CustomTestCase): + + @classmethod + def setUpClass(cls): + cls.alpha = 0.2 + + cls.vmin = 0 + cls.vmax = 10 + + @classmethod + def tearDownClass(cls): + pass + + def test_lrelu(self): + for i in range(-5, 15): + + if i > 0: + good_output = i + else: + good_output = self.alpha * i + + computed_output = tl.act.leaky_relu(float(i), alpha=self.alpha) + + self.assertAlmostEqual(computed_output.numpy(), good_output, places=5) + + net = tl.layers.Input([10, 2]) + net = tl.layers.Dense(n_units=100, act=lambda x: tl.act.lrelu(x, 0.2), name='dense')(net) + print(net) + + def test_lrelu6(self): + for i in range(-5, 15): + + if i < 0: + good_output = self.alpha * i + else: + good_output = min(6, i) + + computed_output = tl.act.leaky_relu6(float(i), alpha=self.alpha) + + self.assertAlmostEqual(computed_output.numpy(), good_output, places=5) + + net = tl.layers.Input([10, 2]) + net = tl.layers.Dense(n_units=100, act=lambda x: tl.act.leaky_relu6(x, 0.2), name='dense')(net) + print(net) + + def test_ltrelu6(self): + for i in range(-5, 15): + + if i < 0: + good_output = self.alpha * i + elif i < 6: + good_output = i + else: + good_output = 6 + (self.alpha * (i - 6)) + + computed_output = tl.act.leaky_twice_relu6(float(i), alpha_low=self.alpha, alpha_high=self.alpha) + + self.assertAlmostEqual(computed_output.numpy(), good_output, places=5) + + net = tl.layers.Input([10, 200]) + net = tl.layers.Dense(n_units=100, act=lambda x: tl.act.leaky_twice_relu6(x, 0.2, 0.2), name='dense')(net) + print(net) + + def test_ramp(self): + + for i in range(-5, 15): + + if i < self.vmin: + good_output = self.vmin + elif i > self.vmax: + good_output = self.vmax + else: + good_output = i + + computed_output = tl.act.ramp(float(i), v_min=self.vmin, v_max=self.vmax) + + self.assertAlmostEqual(computed_output.numpy(), good_output, places=5) + + def test_sign(self): + + for i in range(-5, 15): + + if i < 0: + good_output = -1 + elif i == 0: + good_output = 0 + else: + good_output = 1 + + computed_output = tl.act.sign(float(i)) + + self.assertAlmostEqual(computed_output.numpy(), good_output, places=5) + + def test_swish(self): + import numpy as np + + for i in range(-5, 15): + + good_output = i / (1 + np.math.exp(-i)) + + computed_output = tl.act.swish(float(i)) + + self.assertAlmostEqual(computed_output.numpy(), good_output, places=5) + + +if __name__ == '__main__': + + unittest.main() diff --git a/tests/test_initializers.py b/tests/test_initializers.py new file mode 100644 index 0000000..df86fd8 --- /dev/null +++ b/tests/test_initializers.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl +import numpy as np + +from tests.utils import CustomTestCase + + +class Test_Leaky_ReLUs(CustomTestCase): + + @classmethod + def setUpClass(cls): + cls.ni = tl.layers.Input(shape=[16, 10]) + cls.w_shape = (10, 5) + cls.eps = 0.0 + + @classmethod + def tearDownClass(cls): + pass + + def init_dense(self, w_init): + return tl.layers.Dense(n_units=self.w_shape[1], in_channels=self.w_shape[0], W_init=w_init) + + def test_zeros(self): + dense = self.init_dense(tl.initializers.zeros()) + self.assertEqual(np.sum(dense.all_weights[0].numpy() - np.zeros(shape=self.w_shape)), self.eps) + nn = dense(self.ni) + + def test_ones(self): + dense = self.init_dense(tl.initializers.ones()) + self.assertEqual(np.sum(dense.all_weights[0].numpy() - np.ones(shape=self.w_shape)), self.eps) + nn = dense(self.ni) + + def test_constant(self): + dense = self.init_dense(tl.initializers.constant(value=5.0)) + self.assertEqual(np.sum(dense.all_weights[0].numpy() - np.ones(shape=self.w_shape) * 5.0), self.eps) + nn = dense(self.ni) + + # test with numpy arr + arr = np.random.uniform(size=self.w_shape).astype(np.float32) + dense = self.init_dense(tl.initializers.constant(value=arr)) + self.assertEqual(np.sum(dense.all_weights[0].numpy() - arr), self.eps) + nn = dense(self.ni) + + def test_RandomUniform(self): + dense = self.init_dense(tl.initializers.random_uniform(minval=-0.1, maxval=0.1, seed=1234)) + print(dense.all_weights[0].numpy()) + nn = dense(self.ni) + + def test_RandomNormal(self): + dense = self.init_dense(tl.initializers.random_normal(mean=0.0, stddev=0.1)) + print(dense.all_weights[0].numpy()) + nn = dense(self.ni) + + def test_TruncatedNormal(self): + dense = self.init_dense(tl.initializers.truncated_normal(mean=0.0, stddev=0.1)) + print(dense.all_weights[0].numpy()) + nn = dense(self.ni) + + def test_deconv2d_bilinear_upsampling_initializer(self): + rescale_factor = 2 + imsize = 128 + num_channels = 3 + num_in_channels = 3 + num_out_channels = 3 + filter_shape = (5, 5, num_out_channels, num_in_channels) + ni = tl.layers.Input(shape=(1, imsize, imsize, num_channels)) + bilinear_init = tl.initializers.deconv2d_bilinear_upsampling_initializer(shape=filter_shape) + deconv_layer = tl.layers.DeConv2dLayer( + shape=filter_shape, outputs_shape=(1, imsize * rescale_factor, imsize * rescale_factor, num_out_channels), + strides=(1, rescale_factor, rescale_factor, 1), W_init=bilinear_init, padding='SAME', act=None, + name='g/h1/decon2d' + ) + nn = deconv_layer(ni) + + def test_config(self): + init = tl.initializers.constant(value=5.0) + new_init = tl.initializers.Constant.from_config(init.get_config()) + + +if __name__ == '__main__': + + unittest.main() diff --git a/tests/test_nlp.py b/tests/test_nlp.py new file mode 100644 index 0000000..680eeb8 --- /dev/null +++ b/tests/test_nlp.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import unittest + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tensorflow.python.platform import gfile +from tests.utils import CustomTestCase +import nltk +nltk.download('punkt') + + +class Test_Leaky_ReLUs(CustomTestCase): + + @classmethod + def setUpClass(cls): + pass + + @classmethod + def tearDownClass(cls): + pass + + def test_as_bytes(self): + origin_str = "str" + origin_bytes = b'bytes' + converted_str = tl.nlp.as_bytes(origin_str) + converted_bytes = tl.nlp.as_bytes(origin_bytes) + print('str after using as_bytes:', converted_str) + print('bytes after using as_bytes:', converted_bytes) + + def test_as_text(self): + origin_str = "str" + origin_bytes = b'bytes' + converted_str = tl.nlp.as_text(origin_str) + converted_bytes = tl.nlp.as_text(origin_bytes) + print('str after using as_text:', converted_str) + print('bytes after using as_text:', converted_bytes) + + def test_save_vocab(self): + words = tl.files.load_matt_mahoney_text8_dataset() + vocabulary_size = 50000 + data, count, dictionary, reverse_dictionary = tl.nlp.build_words_dataset(words, vocabulary_size, True) + tl.nlp.save_vocab(count, name='vocab_text8.txt') + + def test_basic_tokenizer(self): + c = "how are you?" + tokens = tl.nlp.basic_tokenizer(c) + print(tokens) + + def test_generate_skip_gram_batch(self): + data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + batch, labels, data_index = tl.nlp.generate_skip_gram_batch( + data=data, batch_size=8, num_skips=2, skip_window=1, data_index=0 + ) + print(batch) + print(labels) + + def test_process_sentence(self): + c = "how are you?" + c = tl.nlp.process_sentence(c) + print(c) + + def test_words_to_word_id(self): + words = tl.files.load_matt_mahoney_text8_dataset() + vocabulary_size = 50000 + data, count, dictionary, reverse_dictionary = tl.nlp.build_words_dataset(words, vocabulary_size, True) + ids = tl.nlp.words_to_word_ids(words, dictionary) + context = tl.nlp.word_ids_to_words(ids, reverse_dictionary) + # print(ids) + # print(context) + + +if __name__ == '__main__': + + unittest.main() diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py new file mode 100644 index 0000000..15d4814 --- /dev/null +++ b/tests/utils/__init__.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from tests.utils.custom_testcase import * +from tests.utils.list_py_files import * +from tests.utils.timeout_utils import * + +from tests.utils.custom_layers import * +from tests.utils.custom_networks import * \ No newline at end of file diff --git a/tests/utils/custom_layers/__init__.py b/tests/utils/custom_layers/__init__.py new file mode 100644 index 0000000..995a053 --- /dev/null +++ b/tests/utils/custom_layers/__init__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from tests.utils.custom_layers.basic_layers import * +from tests.utils.custom_layers.inception_blocks import * \ No newline at end of file diff --git a/tests/utils/custom_layers/basic_layers.py b/tests/utils/custom_layers/basic_layers.py new file mode 100644 index 0000000..83f320a --- /dev/null +++ b/tests/utils/custom_layers/basic_layers.py @@ -0,0 +1,136 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorflow as tf +import tensorlayer as tl + +__all__ = [ + 'activation_module', + 'conv_module', + 'dense_module', +] + + +def activation_module(layer, activation_fn, leaky_relu_alpha=0.2, name=None): + + act_name = name + "/activation" if name is not None else "activation" + + if activation_fn not in ["ReLU", "ReLU6", "Leaky_ReLU", "PReLU", "PReLU6", "PTReLU6", "CReLU", "ELU", "SELU", + "tanh", "sigmoid", "softmax", None]: + raise Exception("Unknown 'activation_fn': %s" % activation_fn) + + elif activation_fn == "ReLU": + layer = tl.layers.LambdaLayer(prev_layer=layer, fn=tf.nn.relu, name=act_name) + + elif activation_fn == "ReLU6": + layer = tl.layers.LambdaLayer(prev_layer=layer, fn=tf.nn.relu6, name=act_name) + + elif activation_fn == "Leaky_ReLU": + layer = tl.layers.LambdaLayer( + prev_layer=layer, fn=tf.nn.leaky_relu, fn_args={'alpha': leaky_relu_alpha}, name=act_name + ) + + elif activation_fn == "PReLU": + layer = tl.layers.PReluLayer(prev_layer=layer, channel_shared=False, name=act_name) + + elif activation_fn == "PReLU6": + layer = tl.layers.PRelu6Layer(prev_layer=layer, channel_shared=False, name=act_name) + + elif activation_fn == "PTReLU6": + layer = tl.layers.PTRelu6Layer(prev_layer=layer, channel_shared=False, name=act_name) + + elif activation_fn == "CReLU": + layer = tl.layers.LambdaLayer(prev_layer=layer, fn=tf.nn.crelu, name=act_name) + + elif activation_fn == "ELU": + layer = tl.layers.LambdaLayer(prev_layer=layer, fn=tf.nn.elu, name=act_name) + + elif activation_fn == "SELU": + layer = tl.layers.LambdaLayer(prev_layer=layer, fn=tf.nn.selu, name=act_name) + + elif activation_fn == "tanh": + layer = tl.layers.LambdaLayer(prev_layer=layer, fn=tf.nn.tanh, name=act_name) + + elif activation_fn == "sigmoid": + layer = tl.layers.LambdaLayer(prev_layer=layer, fn=tf.nn.sigmoid, name=act_name) + + elif activation_fn == "softmax": + layer = tl.layers.LambdaLayer(prev_layer=layer, fn=tf.nn.softmax, name=act_name) + + return layer + + +def conv_module( + prev_layer, n_out_channel, filter_size, strides, padding, is_train=True, use_batchnorm=True, activation_fn=None, + conv_init=tl.initializers.random_uniform(), + batch_norm_init=tl.initializers.truncated_normal(mean=1., + stddev=0.02), bias_init=tf.zeros_initializer(), name=None +): + + if activation_fn not in ["ReLU", "ReLU6", "Leaky_ReLU", "PReLU", "PReLU6", "PTReLU6", "CReLU", "ELU", "SELU", + "tanh", "sigmoid", "softmax", None]: + raise Exception("Unknown 'activation_fn': %s" % activation_fn) + + conv_name = 'conv2d' if name is None else name + bn_name = 'batch_norm' if name is None else name + '/BatchNorm' + + layer = tl.layers.Conv2d( + prev_layer, + n_filter=n_out_channel, + filter_size=filter_size, + strides=strides, + padding=padding, + act=None, + W_init=conv_init, + b_init=None if use_batchnorm else bias_init, # Not useful as the convolutions are batch normalized + name=conv_name + ) + + if use_batchnorm: + + layer = tl.layers.BatchNormLayer(layer, act=None, is_train=is_train, gamma_init=batch_norm_init, name=bn_name) + + logits = layer.outputs + + layer = activation_module(layer, activation_fn, name=conv_name) + + return layer, logits + + +def dense_module( + prev_layer, n_units, is_train, use_batchnorm=True, activation_fn=None, + dense_init=tl.initializers.random_uniform(), + batch_norm_init=tl.initializers.truncated_normal(mean=1., + stddev=0.02), bias_init=tf.zeros_initializer(), name=None +): + + if activation_fn not in ["ReLU", "ReLU6", "Leaky_ReLU", "PReLU", "PReLU6", "PTReLU6", "CReLU", "ELU", "SELU", + "tanh", "sigmoid", "softmax", None]: + raise Exception("Unknown 'activation_fn': %s" % activation_fn) + + # Flatten: Conv to FC + if prev_layer.outputs.get_shape().__len__() != 2: # The input dimension must be rank 2 + layer = tl.layers.FlattenLayer(prev_layer, name='flatten') + + else: + layer = prev_layer + + layer = tl.layers.DenseLayer( + layer, + n_units=n_units, + act=None, + W_init=dense_init, + b_init=None if use_batchnorm else bias_init, # Not useful as the convolutions are batch normalized + name='dense' if name is None else name + ) + + if use_batchnorm: + layer = tl.layers.BatchNormLayer( + layer, act=None, is_train=is_train, gamma_init=batch_norm_init, name='batch_norm' + ) + + logits = layer.outputs + + layer = activation_module(layer, activation_fn) + + return layer, logits diff --git a/tests/utils/custom_layers/inception_blocks.py b/tests/utils/custom_layers/inception_blocks.py new file mode 100644 index 0000000..89d2640 --- /dev/null +++ b/tests/utils/custom_layers/inception_blocks.py @@ -0,0 +1,279 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils.custom_layers.basic_layers import conv_module + +__all__ = [ + 'block_inception_a', + 'block_reduction_a', + 'block_inception_b', + 'block_reduction_b', + 'block_inception_c', + 'block_reduction_b', +] + + +def block_inception_a(inputs, scope=None, is_train=False): + """Builds Inception-A block for Inception v4 network.""" + # By default use stride=1 and SAME padding + + with tf.variable_scope(name_or_scope=scope, default_name='BlockInceptionA', values=[inputs]): + with tf.variable_scope('Branch_0'): + branch_0, _ = conv_module( + inputs, n_out_channel=96, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + with tf.variable_scope('Branch_1'): + branch_1, _ = conv_module( + inputs, n_out_channel=64, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=96, filter_size=(3, 3), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_3x3' + ) + + with tf.variable_scope('Branch_2'): + branch_2, _ = conv_module( + inputs, n_out_channel=64, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_2, _ = conv_module( + branch_2, n_out_channel=96, filter_size=(3, 3), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_3x3' + ) + + branch_2, _ = conv_module( + branch_2, n_out_channel=96, filter_size=(3, 3), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0c_3x3' + ) + + with tf.variable_scope('Branch_3'): + branch_3 = tl.layers.MeanPool2d( + inputs, filter_size=(3, 3), strides=(1, 1), padding='SAME', name='AvgPool_0a_3x3' + ) + + branch_3, _ = conv_module( + branch_3, n_out_channel=96, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_1x1' + ) + + return tl.layers.ConcatLayer([branch_0, branch_1, branch_2, branch_3], concat_dim=3, name='concat_layer') + + +def block_reduction_a(inputs, scope=None, is_train=False): + """Builds Reduction-A block for Inception v4 network.""" + # By default use stride=1 and SAME padding + + with tf.variable_scope(scope, 'BlockReductionA', [inputs]): + with tf.variable_scope('Branch_0'): + branch_0, _ = conv_module( + inputs, n_out_channel=384, filter_size=(3, 3), strides=(2, 2), padding='VALID', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_1a_3x3' + ) + + with tf.variable_scope('Branch_1'): + branch_1, _ = conv_module( + inputs, n_out_channel=192, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=224, filter_size=(3, 3), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_3x3' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=256, filter_size=(3, 3), strides=(2, 2), padding='VALID', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_1a_3x3' + ) + + with tf.variable_scope('Branch_2'): + branch_2 = tl.layers.MaxPool2d(inputs, (3, 3), strides=(2, 2), padding='VALID', name='MaxPool_1a_3x3') + + return tl.layers.ConcatLayer([branch_0, branch_1, branch_2], concat_dim=3, name='concat_layer') + + +def block_inception_b(inputs, scope=None, is_train=False): + """Builds Inception-B block for Inception v4 network.""" + # By default use stride=1 and SAME padding + + with tf.variable_scope(scope, 'BlockInceptionB', [inputs]): + with tf.variable_scope('Branch_0'): + branch_0, _ = conv_module( + inputs, n_out_channel=384, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + with tf.variable_scope('Branch_1'): + branch_1, _ = conv_module( + inputs, n_out_channel=192, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=224, filter_size=(1, 7), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_1x7' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=256, filter_size=(7, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0c_7x1' + ) + + with tf.variable_scope('Branch_2'): + branch_2, _ = conv_module( + inputs, n_out_channel=192, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_2, _ = conv_module( + branch_2, n_out_channel=192, filter_size=(7, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_7x1' + ) + + branch_2, _ = conv_module( + branch_2, n_out_channel=224, filter_size=(1, 7), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0c_1x7' + ) + + branch_2, _ = conv_module( + branch_2, n_out_channel=224, filter_size=(7, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0d_7x1' + ) + + branch_2, _ = conv_module( + branch_2, n_out_channel=256, filter_size=(1, 7), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0e_1x7' + ) + + with tf.variable_scope('Branch_3'): + branch_3 = tl.layers.MeanPool2d( + inputs, filter_size=(3, 3), strides=(1, 1), padding='SAME', name='AvgPool_0a_3x3' + ) + + branch_3, _ = conv_module( + branch_3, n_out_channel=128, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_1x1' + ) + + return tl.layers.ConcatLayer([branch_0, branch_1, branch_2, branch_3], concat_dim=3, name='concat_layer') + + +def block_reduction_b(inputs, scope=None, is_train=False): + """Builds Reduction-B block for Inception v4 network.""" + # By default use stride=1 and SAME padding + + with tf.variable_scope(scope, 'BlockReductionB', [inputs]): + with tf.variable_scope('Branch_0'): + branch_0, _ = conv_module( + inputs, n_out_channel=192, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_0, _ = conv_module( + branch_0, n_out_channel=192, filter_size=(3, 3), strides=(2, 2), padding='VALID', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_1a_3x3' + ) + + with tf.variable_scope('Branch_1'): + branch_1, _ = conv_module( + inputs, n_out_channel=256, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=256, filter_size=(1, 7), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_1x7' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=320, filter_size=(7, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0c_7x1' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=320, filter_size=(3, 3), strides=(2, 2), padding='VALID', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_1a_3x3' + ) + + with tf.variable_scope('Branch_2'): + branch_2 = tl.layers.MaxPool2d(inputs, (3, 3), strides=(2, 2), padding='VALID', name='MaxPool_1a_3x3') + + return tl.layers.ConcatLayer([branch_0, branch_1, branch_2], concat_dim=3, name='concat_layer') + + +def block_inception_c(inputs, scope=None, is_train=False): + """Builds Inception-C block for Inception v4 network.""" + # By default use stride=1 and SAME padding + + with tf.variable_scope(scope, 'BlockInceptionC', [inputs]): + with tf.variable_scope('Branch_0'): + branch_0, _ = conv_module( + inputs, n_out_channel=256, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + with tf.variable_scope('Branch_1'): + branch_1, _ = conv_module( + inputs, n_out_channel=384, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_1a, _ = conv_module( + branch_1, n_out_channel=256, filter_size=(1, 3), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_1x3' + ) + + branch_1b, _ = conv_module( + branch_1, n_out_channel=256, filter_size=(3, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0c_3x1' + ) + + branch_1 = tl.layers.ConcatLayer([branch_1a, branch_1b], concat_dim=3, name='concat_layer') + + with tf.variable_scope('Branch_2'): + branch_2, _ = conv_module( + inputs, n_out_channel=384, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_2, _ = conv_module( + branch_2, n_out_channel=448, filter_size=(3, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_3x1' + ) + + branch_2, _ = conv_module( + branch_2, n_out_channel=512, filter_size=(1, 3), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0c_1x3' + ) + + branch_2a, _ = conv_module( + branch_2, n_out_channel=256, filter_size=(1, 3), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0d_1x3' + ) + + branch_2b, _ = conv_module( + branch_2, n_out_channel=256, filter_size=(3, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0e_3x1' + ) + + branch_2 = tl.layers.ConcatLayer([branch_2a, branch_2b], concat_dim=3, name='concat_layer') + + with tf.variable_scope('Branch_3'): + branch_3 = tl.layers.MeanPool2d( + inputs, filter_size=(3, 3), strides=(1, 1), padding='SAME', name='AvgPool_0a_3x3' + ) + + branch_3, _ = conv_module( + branch_3, n_out_channel=256, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0b_1x1' + ) + + return tl.layers.ConcatLayer([branch_0, branch_1, branch_2, branch_3], concat_dim=3, name='concat_layer') diff --git a/tests/utils/custom_networks/__init__.py b/tests/utils/custom_networks/__init__.py new file mode 100644 index 0000000..81dd159 --- /dev/null +++ b/tests/utils/custom_networks/__init__.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from tests.utils.custom_networks.inceptionv4 import * \ No newline at end of file diff --git a/tests/utils/custom_networks/inceptionv4.py b/tests/utils/custom_networks/inceptionv4.py new file mode 100644 index 0000000..bac2ae8 --- /dev/null +++ b/tests/utils/custom_networks/inceptionv4.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os + +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +import tensorflow as tf +import tensorlayer as tl + +from tests.utils.custom_layers.basic_layers import conv_module +from tests.utils.custom_layers.basic_layers import dense_module + +from tests.utils.custom_layers.inception_blocks import block_inception_a +from tests.utils.custom_layers.inception_blocks import block_inception_b +from tests.utils.custom_layers.inception_blocks import block_inception_c + +from tests.utils.custom_layers.inception_blocks import block_reduction_a +from tests.utils.custom_layers.inception_blocks import block_reduction_b + +__all__ = ['InceptionV4_Network'] + + +class InceptionV4_Network(object): + """InceptionV4 model.""" + + def __init__(self, include_FC_head=True, flatten_output=True): + + self.include_FC_head = include_FC_head + self.flatten_output = flatten_output + + def __call__(self, inputs, reuse=False, is_train=False): + + with tf.variable_scope("InceptionV4", reuse=reuse): + + preprocessed = inputs + + with tf.variable_scope("preprocessing"): + + max_val = tf.reduce_max(preprocessed) + min_val = tf.reduce_min(preprocessed) + + need_int_rescale = tf.logical_and(tf.greater(max_val, 1.0), tf.greater_equal(min_val, 0.0)) + + need_float_rescale = tf.logical_and(tf.less_equal(max_val, 1.0), tf.greater_equal(min_val, 0.0)) + + preprocessed = tf.cond( + pred=need_int_rescale, true_fn=lambda: tf.subtract(tf.divide(preprocessed, 127.5), 1.0), + false_fn=lambda: preprocessed + ) + + preprocessed = tf.cond( + pred=need_float_rescale, true_fn=lambda: tf.multiply(tf.subtract(preprocessed, 0.5), 2.0), + false_fn=lambda: preprocessed + ) + + # Input Layers + input_layer = tl.layers.InputLayer(preprocessed, name='input') + + # 299 x 299 x 3 + net, _ = conv_module( + input_layer, n_out_channel=32, filter_size=(3, 3), strides=(2, 2), padding='VALID', + batch_norm_init=None, is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_1a_3x3' + ) + + # 149 x 149 x 32 + net, _ = conv_module( + net, n_out_channel=32, filter_size=(3, 3), strides=(1, 1), padding='VALID', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_2a_3x3' + ) + + # 147 x 147 x 32 + net, _ = conv_module( + net, n_out_channel=64, filter_size=(3, 3), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_2b_3x3' + ) + + # 147 x 147 x 64 + with tf.variable_scope('Mixed_3a'): + with tf.variable_scope('Branch_0'): + branch_0 = tl.layers.MaxPool2d(net, (3, 3), strides=(2, 2), padding='VALID', name='MaxPool_0a_3x3') + + with tf.variable_scope('Branch_1'): + branch_1, _ = conv_module( + net, n_out_channel=96, filter_size=(3, 3), strides=(2, 2), padding='VALID', + batch_norm_init=None, is_train=is_train, use_batchnorm=True, activation_fn='ReLU', + name='Conv2d_0a_3x3' + ) + + net = tl.layers.ConcatLayer([branch_0, branch_1], concat_dim=3) + + # 73 x 73 x 160 + with tf.variable_scope('Mixed_4a'): + with tf.variable_scope('Branch_0'): + branch_0, _ = conv_module( + net, n_out_channel=64, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_0, _ = conv_module( + branch_0, n_out_channel=96, filter_size=(3, 3), strides=(1, 1), padding='VALID', + batch_norm_init=None, is_train=is_train, use_batchnorm=True, activation_fn='ReLU', + name='Conv2d_1a_3x3' + ) + + with tf.variable_scope('Branch_1'): + branch_1, _ = conv_module( + net, n_out_channel=64, filter_size=(1, 1), strides=(1, 1), padding='SAME', batch_norm_init=None, + is_train=is_train, use_batchnorm=True, activation_fn='ReLU', name='Conv2d_0a_1x1' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=64, filter_size=(1, 7), strides=(1, 1), padding='SAME', + batch_norm_init=None, is_train=is_train, use_batchnorm=True, activation_fn='ReLU', + name='Conv2d_0b_1x7' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=64, filter_size=(7, 1), strides=(1, 1), padding='SAME', + batch_norm_init=None, is_train=is_train, use_batchnorm=True, activation_fn='ReLU', + name='Conv2d_0c_7x1' + ) + + branch_1, _ = conv_module( + branch_1, n_out_channel=96, filter_size=(3, 3), strides=(1, 1), padding='VALID', + batch_norm_init=None, is_train=is_train, use_batchnorm=True, activation_fn='ReLU', + name='Conv2d_1a_3x3' + ) + + net = tl.layers.ConcatLayer([branch_0, branch_1], concat_dim=3) + + # 71 x 71 x 192 + with tf.variable_scope('Mixed_5a'): + with tf.variable_scope('Branch_0'): + # 299 x 299 x 3 + branch_0, _ = conv_module( + net, n_out_channel=192, filter_size=(3, 3), strides=(2, 2), padding='VALID', + batch_norm_init=None, is_train=is_train, use_batchnorm=True, activation_fn='ReLU', + name='Conv2d_1a_3x3' + ) + + with tf.variable_scope('Branch_1'): + branch_1 = tl.layers.MaxPool2d(net, (3, 3), strides=(2, 2), padding='VALID', name='MaxPool_1a_3x3') + + net = tl.layers.ConcatLayer([branch_0, branch_1], concat_dim=3) + + # 35 x 35 x 384 + # 4 x Inception-A blocks + for idx in range(4): + block_scope = 'Mixed_5' + chr(ord('b') + idx) + net = block_inception_a(net, scope=block_scope, is_train=is_train) + + # 35 x 35 x 384 + # Reduction-A block + net = block_reduction_a(net, scope='Mixed_6a', is_train=is_train) + + # 17 x 17 x 1024 + # 7 x Inception-B blocks + for idx in range(7): + block_scope = 'Mixed_6' + chr(ord('b') + idx) + net = block_inception_b(net, scope=block_scope, is_train=is_train) + + # 17 x 17 x 1024 + # Reduction-B block + net = block_reduction_b(net, scope='Mixed_7a', is_train=is_train) + + # 8 x 8 x 1536 + # 3 x Inception-C blocks + for idx in range(3): + block_scope = 'Mixed_7' + chr(ord('b') + idx) + net = block_inception_c(net, scope=block_scope, is_train=is_train) + + if self.flatten_output and not self.include_FC_head: + net = tl.layers.FlattenLayer(net, name='flatten') + + if self.include_FC_head: + with tf.variable_scope("Logits", reuse=reuse): + + # 8 x 8 x 1536 + net = tl.layers.MeanPool2d( + net, filter_size=net.outputs.get_shape()[1:3], strides=(1, 1), padding='VALID', + name='AvgPool_1a' + ) + + # 1 x 1 x 1536 + net = tl.layers.DropoutLayer(net, keep=0.8, is_fix=True, is_train=is_train, name='Dropout_1b') + net = tl.layers.FlattenLayer(net, name='PreLogitsFlatten') + + # 1536 + net, _ = dense_module( + net, n_units=1001, activation_fn="softmax", use_batchnorm=False, batch_norm_init=None, + is_train=is_train, name="Logits" + ) + + return net diff --git a/tests/utils/custom_testcase.py b/tests/utils/custom_testcase.py new file mode 100644 index 0000000..a67f413 --- /dev/null +++ b/tests/utils/custom_testcase.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import unittest +from contextlib import contextmanager + +__all__ = [ + 'CustomTestCase', +] + + +class CustomTestCase(unittest.TestCase): + + @contextmanager + def assertNotRaises(self, exc_type): + try: + yield None + except exc_type: + raise self.failureException('{} raised'.format(exc_type.__name__)) diff --git a/tests/utils/list_py_files.py b/tests/utils/list_py_files.py new file mode 100644 index 0000000..4cc08c1 --- /dev/null +++ b/tests/utils/list_py_files.py @@ -0,0 +1,26 @@ +import os + +__all__ = [ + 'list_all_py_files', +] + +_excludes = [ + 'tensorlayer/db.py', +] + + +def _list_py_files(root): + for root, _dirs, files in os.walk(root): + if root.find('third_party') != -1: + continue + for file in files: + if file.endswith('.py'): + yield os.path.join(root, file) + + +def list_all_py_files(): + dirs = ['tensorlayer', 'tests', 'example'] + for d in dirs: + for filename in _list_py_files(d): + if filename not in _excludes: + yield filename diff --git a/tests/utils/timeout_utils.py b/tests/utils/timeout_utils.py new file mode 100644 index 0000000..6a155a5 --- /dev/null +++ b/tests/utils/timeout_utils.py @@ -0,0 +1,36 @@ +import platform + +if platform.system() != "Windows": + import signal +else: + signal = None + +__all__ = ['TimeoutError', 'WindowsError', 'TimeoutContext'] + + +class TimeoutError(Exception): + pass + + +class WindowsError(Exception): + pass + + +class TimeoutContext(): + """Timeout class using ALARM signal.""" + + def __init__(self, sec): + self.sec = sec + + def __enter__(self): + if signal is None: + raise WindowsError("Windows is not supported for this test") + + signal.signal(signal.SIGALRM, self.raise_timeout) + signal.alarm(self.sec) + + def __exit__(self, *args): + signal.alarm(0) # disable alarm + + def raise_timeout(self, *args): + raise TimeoutError("A timeout error have been raised.") diff --git a/tl b/tl new file mode 100644 index 0000000..3c5a78a --- /dev/null +++ b/tl @@ -0,0 +1,13 @@ +#!/bin/bash + +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located +done +DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +export PYTHONPATH="${DIR}/src:${PYTHONPATH}" + +python3 -m tensorlayer.cli "$@"

  • L;QcPO#Vj1+d6yv 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 M{d@wkN^g<$cX%^b4gdfE literal 0 HcmV?d00001 diff --git a/docs/user/my_figs/karpathy_rnn.jpeg b/docs/user/my_figs/karpathy_rnn.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..479a1252730fa5fbeb339f496974486994773520 GIT binary patch literal 749054 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