@scrypted/libav 1.0.167 → 1.0.169
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +2 -0
- package/opus/.gitattributes +10 -0
- package/opus/.gitlab-ci.yml +122 -0
- package/opus/AUTHORS +6 -0
- package/opus/CMakeLists.txt +755 -0
- package/opus/COPYING +44 -0
- package/opus/ChangeLog +0 -0
- package/opus/LICENSE_PLEASE_READ.txt +22 -0
- package/opus/Makefile.am +497 -0
- package/opus/Makefile.mips +169 -0
- package/opus/Makefile.unix +167 -0
- package/opus/NEWS +0 -0
- package/opus/README +189 -0
- package/opus/README.draft +54 -0
- package/opus/autogen.bat +13 -0
- package/opus/autogen.sh +16 -0
- package/opus/celt/_kiss_fft_guts.h +188 -0
- package/opus/celt/arch.h +390 -0
- package/opus/celt/arm/arm2gnu.pl +353 -0
- package/opus/celt/arm/arm_celt_map.c +171 -0
- package/opus/celt/arm/armcpu.c +291 -0
- package/opus/celt/arm/armcpu.h +90 -0
- package/opus/celt/arm/armopts.s.in +37 -0
- package/opus/celt/arm/celt_fft_ne10.c +173 -0
- package/opus/celt/arm/celt_mdct_ne10.c +258 -0
- package/opus/celt/arm/celt_neon_intr.c +272 -0
- package/opus/celt/arm/celt_pitch_xcorr_arm.s +551 -0
- package/opus/celt/arm/fft_arm.h +71 -0
- package/opus/celt/arm/fixed_arm64.h +35 -0
- package/opus/celt/arm/fixed_armv4.h +80 -0
- package/opus/celt/arm/fixed_armv5e.h +151 -0
- package/opus/celt/arm/kiss_fft_armv4.h +121 -0
- package/opus/celt/arm/kiss_fft_armv5e.h +118 -0
- package/opus/celt/arm/mdct_arm.h +59 -0
- package/opus/celt/arm/meson.build +12 -0
- package/opus/celt/arm/pitch_arm.h +160 -0
- package/opus/celt/arm/pitch_neon_intr.c +288 -0
- package/opus/celt/bands.c +1686 -0
- package/opus/celt/bands.h +123 -0
- package/opus/celt/celt.c +317 -0
- package/opus/celt/celt.h +255 -0
- package/opus/celt/celt_decoder.c +1616 -0
- package/opus/celt/celt_encoder.c +2854 -0
- package/opus/celt/celt_lpc.c +364 -0
- package/opus/celt/celt_lpc.h +66 -0
- package/opus/celt/cpu_support.h +72 -0
- package/opus/celt/cwrs.c +715 -0
- package/opus/celt/cwrs.h +48 -0
- package/opus/celt/dump_modes/dump_modes.c +400 -0
- package/opus/celt/dump_modes/dump_modes_arch.h +45 -0
- package/opus/celt/dump_modes/dump_modes_arm_ne10.c +152 -0
- package/opus/celt/ecintrin.h +91 -0
- package/opus/celt/entcode.c +153 -0
- package/opus/celt/entcode.h +152 -0
- package/opus/celt/entdec.c +266 -0
- package/opus/celt/entdec.h +110 -0
- package/opus/celt/entenc.c +305 -0
- package/opus/celt/entenc.h +119 -0
- package/opus/celt/fixed_c5x.h +79 -0
- package/opus/celt/fixed_c6x.h +70 -0
- package/opus/celt/fixed_debug.h +839 -0
- package/opus/celt/fixed_generic.h +201 -0
- package/opus/celt/float_cast.h +152 -0
- package/opus/celt/kiss_fft.c +648 -0
- package/opus/celt/kiss_fft.h +217 -0
- package/opus/celt/laplace.c +235 -0
- package/opus/celt/laplace.h +57 -0
- package/opus/celt/mathops.c +217 -0
- package/opus/celt/mathops.h +479 -0
- package/opus/celt/mdct.c +372 -0
- package/opus/celt/mdct.h +115 -0
- package/opus/celt/meson.build +64 -0
- package/opus/celt/mfrngcod.h +48 -0
- package/opus/celt/mips/celt_mipsr1.h +152 -0
- package/opus/celt/mips/fixed_generic_mipsr1.h +126 -0
- package/opus/celt/mips/kiss_fft_mipsr1.h +167 -0
- package/opus/celt/mips/mdct_mipsr1.h +288 -0
- package/opus/celt/mips/pitch_mipsr1.h +161 -0
- package/opus/celt/mips/vq_mipsr1.h +116 -0
- package/opus/celt/modes.c +450 -0
- package/opus/celt/modes.h +75 -0
- package/opus/celt/opus_custom_demo.c +451 -0
- package/opus/celt/os_support.h +99 -0
- package/opus/celt/pitch.c +555 -0
- package/opus/celt/pitch.h +203 -0
- package/opus/celt/quant_bands.c +562 -0
- package/opus/celt/quant_bands.h +66 -0
- package/opus/celt/rate.c +646 -0
- package/opus/celt/rate.h +101 -0
- package/opus/celt/stack_alloc.h +185 -0
- package/opus/celt/static_modes_fixed.h +1541 -0
- package/opus/celt/static_modes_fixed_arm_ne10.h +388 -0
- package/opus/celt/static_modes_float.h +888 -0
- package/opus/celt/static_modes_float_arm_ne10.h +404 -0
- package/opus/celt/tests/meson.build +19 -0
- package/opus/celt/tests/test_unit_cwrs32.c +162 -0
- package/opus/celt/tests/test_unit_dft.c +181 -0
- package/opus/celt/tests/test_unit_entropy.c +383 -0
- package/opus/celt/tests/test_unit_laplace.c +94 -0
- package/opus/celt/tests/test_unit_mathops.c +369 -0
- package/opus/celt/tests/test_unit_mdct.c +233 -0
- package/opus/celt/tests/test_unit_rotation.c +87 -0
- package/opus/celt/tests/test_unit_types.c +50 -0
- package/opus/celt/vq.c +442 -0
- package/opus/celt/vq.h +79 -0
- package/opus/celt/x86/celt_lpc_sse.h +67 -0
- package/opus/celt/x86/celt_lpc_sse4_1.c +96 -0
- package/opus/celt/x86/pitch_avx.c +101 -0
- package/opus/celt/x86/pitch_sse.c +185 -0
- package/opus/celt/x86/pitch_sse.h +216 -0
- package/opus/celt/x86/pitch_sse2.c +95 -0
- package/opus/celt/x86/pitch_sse4_1.c +240 -0
- package/opus/celt/x86/vq_sse.h +52 -0
- package/opus/celt/x86/vq_sse2.c +217 -0
- package/opus/celt/x86/x86_arch_macros.h +47 -0
- package/opus/celt/x86/x86_celt_map.c +187 -0
- package/opus/celt/x86/x86cpu.c +184 -0
- package/opus/celt/x86/x86cpu.h +112 -0
- package/opus/celt_headers.mk +54 -0
- package/opus/celt_sources.mk +55 -0
- package/opus/cmake/CFeatureCheck.cmake +39 -0
- package/opus/cmake/OpusBuildtype.cmake +27 -0
- package/opus/cmake/OpusConfig.cmake +118 -0
- package/opus/cmake/OpusConfig.cmake.in +20 -0
- package/opus/cmake/OpusFunctions.cmake +231 -0
- package/opus/cmake/OpusPackageVersion.cmake +70 -0
- package/opus/cmake/OpusSources.cmake +71 -0
- package/opus/cmake/README.md +132 -0
- package/opus/cmake/RunTest.cmake +61 -0
- package/opus/cmake/config.h.cmake.in +1 -0
- package/opus/cmake/cpu_info_by_asm.c +31 -0
- package/opus/cmake/cpu_info_by_c.c +9 -0
- package/opus/cmake/vla.c +7 -0
- package/opus/configure.ac +1091 -0
- package/opus/dnn/LPCNet.yml +24 -0
- package/opus/dnn/README +1 -0
- package/opus/dnn/README.md +126 -0
- package/opus/dnn/adaconvtest.c +449 -0
- package/opus/dnn/arm/arm_dnn_map.c +88 -0
- package/opus/dnn/arm/dnn_arm.h +104 -0
- package/opus/dnn/arm/nnet_dotprod.c +38 -0
- package/opus/dnn/arm/nnet_neon.c +38 -0
- package/opus/dnn/burg.c +246 -0
- package/opus/dnn/burg.h +41 -0
- package/opus/dnn/common.h +56 -0
- package/opus/dnn/datasets.txt +163 -0
- package/opus/dnn/download_model.bat +9 -0
- package/opus/dnn/download_model.sh +30 -0
- package/opus/dnn/dred_coding.c +44 -0
- package/opus/dnn/dred_coding.h +36 -0
- package/opus/dnn/dred_config.h +54 -0
- package/opus/dnn/dred_decoder.c +129 -0
- package/opus/dnn/dred_decoder.h +49 -0
- package/opus/dnn/dred_encoder.c +363 -0
- package/opus/dnn/dred_encoder.h +71 -0
- package/opus/dnn/dred_rdovae.h +42 -0
- package/opus/dnn/dred_rdovae_dec.c +139 -0
- package/opus/dnn/dred_rdovae_dec.h +53 -0
- package/opus/dnn/dred_rdovae_enc.c +110 -0
- package/opus/dnn/dred_rdovae_enc.h +52 -0
- package/opus/dnn/dump_data.c +238 -0
- package/opus/dnn/dump_lpcnet_tables.c +104 -0
- package/opus/dnn/fargan.c +225 -0
- package/opus/dnn/fargan.h +68 -0
- package/opus/dnn/fargan_demo.c +217 -0
- package/opus/dnn/freq.c +328 -0
- package/opus/dnn/freq.h +61 -0
- package/opus/dnn/fwgan.c +322 -0
- package/opus/dnn/fwgan.h +83 -0
- package/opus/dnn/kiss99.c +81 -0
- package/opus/dnn/kiss99.h +46 -0
- package/opus/dnn/lossgen.c +192 -0
- package/opus/dnn/lossgen.h +55 -0
- package/opus/dnn/lossgen_demo.c +22 -0
- package/opus/dnn/lpcnet.c +283 -0
- package/opus/dnn/lpcnet.h +183 -0
- package/opus/dnn/lpcnet_enc.c +230 -0
- package/opus/dnn/lpcnet_plc.c +211 -0
- package/opus/dnn/lpcnet_private.h +90 -0
- package/opus/dnn/lpcnet_tables.c +307 -0
- package/opus/dnn/meson.build +64 -0
- package/opus/dnn/nndsp.c +416 -0
- package/opus/dnn/nndsp.h +143 -0
- package/opus/dnn/nnet.c +149 -0
- package/opus/dnn/nnet.h +163 -0
- package/opus/dnn/nnet_arch.h +247 -0
- package/opus/dnn/nnet_default.c +35 -0
- package/opus/dnn/osce.c +1419 -0
- package/opus/dnn/osce.h +84 -0
- package/opus/dnn/osce_config.h +60 -0
- package/opus/dnn/osce_features.c +454 -0
- package/opus/dnn/osce_features.h +50 -0
- package/opus/dnn/osce_structs.h +125 -0
- package/opus/dnn/parse_lpcnet_weights.c +238 -0
- package/opus/dnn/pitchdnn.c +79 -0
- package/opus/dnn/pitchdnn.h +34 -0
- package/opus/dnn/tansig_table.h +50 -0
- package/opus/dnn/test_vec.c +128 -0
- package/opus/dnn/torch/dnntools/dnntools/__init__.py +2 -0
- package/opus/dnn/torch/dnntools/dnntools/quantization/__init__.py +1 -0
- package/opus/dnn/torch/dnntools/dnntools/quantization/softquant.py +113 -0
- package/opus/dnn/torch/dnntools/dnntools/relegance/__init__.py +2 -0
- package/opus/dnn/torch/dnntools/dnntools/relegance/meta_critic.py +85 -0
- package/opus/dnn/torch/dnntools/dnntools/relegance/relegance.py +449 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/__init__.py +6 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/base_sparsifier.py +58 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/common.py +123 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/conv1d_sparsifier.py +133 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/conv_transpose1d_sparsifier.py +134 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/gru_sparsifier.py +178 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/linear_sparsifier.py +128 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/utils.py +64 -0
- package/opus/dnn/torch/dnntools/requirements.txt +1 -0
- package/opus/dnn/torch/dnntools/setup.py +48 -0
- package/opus/dnn/torch/fargan/README.md +54 -0
- package/opus/dnn/torch/fargan/adv_train_fargan.py +277 -0
- package/opus/dnn/torch/fargan/dataset.py +61 -0
- package/opus/dnn/torch/fargan/dump_fargan_weights.py +112 -0
- package/opus/dnn/torch/fargan/fargan.py +322 -0
- package/opus/dnn/torch/fargan/filters.py +46 -0
- package/opus/dnn/torch/fargan/rc.py +29 -0
- package/opus/dnn/torch/fargan/stft_loss.py +186 -0
- package/opus/dnn/torch/fargan/test_fargan.py +128 -0
- package/opus/dnn/torch/fargan/train_fargan.py +168 -0
- package/opus/dnn/torch/fwgan/dump_model_weights.py +88 -0
- package/opus/dnn/torch/fwgan/inference.py +141 -0
- package/opus/dnn/torch/fwgan/models/__init__.py +7 -0
- package/opus/dnn/torch/fwgan/models/fwgan400.py +308 -0
- package/opus/dnn/torch/fwgan/models/fwgan500.py +260 -0
- package/opus/dnn/torch/lossgen/README.md +27 -0
- package/opus/dnn/torch/lossgen/export_lossgen.py +101 -0
- package/opus/dnn/torch/lossgen/lossgen.py +29 -0
- package/opus/dnn/torch/lossgen/process_data.sh +17 -0
- package/opus/dnn/torch/lossgen/test_lossgen.py +42 -0
- package/opus/dnn/torch/lossgen/train_lossgen.py +99 -0
- package/opus/dnn/torch/lpcnet/README.md +27 -0
- package/opus/dnn/torch/lpcnet/add_dataset_config.py +77 -0
- package/opus/dnn/torch/lpcnet/data/__init__.py +1 -0
- package/opus/dnn/torch/lpcnet/data/lpcnet_dataset.py +227 -0
- package/opus/dnn/torch/lpcnet/engine/lpcnet_engine.py +141 -0
- package/opus/dnn/torch/lpcnet/make_default_setup.py +56 -0
- package/opus/dnn/torch/lpcnet/make_test_config.py +78 -0
- package/opus/dnn/torch/lpcnet/models/__init__.py +8 -0
- package/opus/dnn/torch/lpcnet/models/lpcnet.py +303 -0
- package/opus/dnn/torch/lpcnet/models/multi_rate_lpcnet.py +437 -0
- package/opus/dnn/torch/lpcnet/print_lpcnet_complexity.py +64 -0
- package/opus/dnn/torch/lpcnet/scripts/collect_multi_run_results.py +190 -0
- package/opus/dnn/torch/lpcnet/scripts/loop_run.sh +52 -0
- package/opus/dnn/torch/lpcnet/scripts/make_animation.py +67 -0
- package/opus/dnn/torch/lpcnet/scripts/modify_dataset_target.py +17 -0
- package/opus/dnn/torch/lpcnet/scripts/multi_run.sh +17 -0
- package/opus/dnn/torch/lpcnet/scripts/run_inference_test.sh +22 -0
- package/opus/dnn/torch/lpcnet/scripts/update_checkpoints.py +54 -0
- package/opus/dnn/torch/lpcnet/scripts/update_output_folder.sh +22 -0
- package/opus/dnn/torch/lpcnet/scripts/update_setups.py +57 -0
- package/opus/dnn/torch/lpcnet/test_lpcnet.py +89 -0
- package/opus/dnn/torch/lpcnet/train_lpcnet.py +272 -0
- package/opus/dnn/torch/lpcnet/utils/__init__.py +4 -0
- package/opus/dnn/torch/lpcnet/utils/data.py +141 -0
- package/opus/dnn/torch/lpcnet/utils/endoscopy.py +234 -0
- package/opus/dnn/torch/lpcnet/utils/layers/__init__.py +3 -0
- package/opus/dnn/torch/lpcnet/utils/layers/dual_fc.py +44 -0
- package/opus/dnn/torch/lpcnet/utils/layers/pcm_embeddings.py +71 -0
- package/opus/dnn/torch/lpcnet/utils/layers/subconditioner.py +497 -0
- package/opus/dnn/torch/lpcnet/utils/misc.py +65 -0
- package/opus/dnn/torch/lpcnet/utils/pcm.py +35 -0
- package/opus/dnn/torch/lpcnet/utils/sample.py +44 -0
- package/opus/dnn/torch/lpcnet/utils/sparsification/__init__.py +2 -0
- package/opus/dnn/torch/lpcnet/utils/sparsification/common.py +121 -0
- package/opus/dnn/torch/lpcnet/utils/sparsification/gru_sparsifier.py +187 -0
- package/opus/dnn/torch/lpcnet/utils/templates.py +157 -0
- package/opus/dnn/torch/lpcnet/utils/ulaw.py +58 -0
- package/opus/dnn/torch/lpcnet/utils/wav.py +43 -0
- package/opus/dnn/torch/neural-pitch/README.md +18 -0
- package/opus/dnn/torch/neural-pitch/data_augmentation.py +149 -0
- package/opus/dnn/torch/neural-pitch/download_demand.sh +43 -0
- package/opus/dnn/torch/neural-pitch/evaluation.py +349 -0
- package/opus/dnn/torch/neural-pitch/experiments.py +38 -0
- package/opus/dnn/torch/neural-pitch/export_neuralpitch_weights.py +109 -0
- package/opus/dnn/torch/neural-pitch/models.py +178 -0
- package/opus/dnn/torch/neural-pitch/neural_pitch_update.py +179 -0
- package/opus/dnn/torch/neural-pitch/ptdb_process.sh +34 -0
- package/opus/dnn/torch/neural-pitch/run_crepe.py +72 -0
- package/opus/dnn/torch/neural-pitch/training.py +162 -0
- package/opus/dnn/torch/neural-pitch/utils.py +59 -0
- package/opus/dnn/torch/osce/README.md +66 -0
- package/opus/dnn/torch/osce/adv_train_model.py +462 -0
- package/opus/dnn/torch/osce/adv_train_vocoder.py +451 -0
- package/opus/dnn/torch/osce/create_testvectors.py +165 -0
- package/opus/dnn/torch/osce/data/__init__.py +2 -0
- package/opus/dnn/torch/osce/data/lpcnet_vocoding_dataset.py +225 -0
- package/opus/dnn/torch/osce/data/silk_conversion_set.py +132 -0
- package/opus/dnn/torch/osce/data/silk_enhancement_set.py +140 -0
- package/opus/dnn/torch/osce/engine/engine.py +103 -0
- package/opus/dnn/torch/osce/engine/vocoder_engine.py +101 -0
- package/opus/dnn/torch/osce/export_model_weights.py +174 -0
- package/opus/dnn/torch/osce/losses/stft_loss.py +277 -0
- package/opus/dnn/torch/osce/losses/td_lowpass.py +34 -0
- package/opus/dnn/torch/osce/make_default_setup.py +93 -0
- package/opus/dnn/torch/osce/models/__init__.py +42 -0
- package/opus/dnn/torch/osce/models/fd_discriminator.py +974 -0
- package/opus/dnn/torch/osce/models/lace.py +190 -0
- package/opus/dnn/torch/osce/models/lavoce.py +274 -0
- package/opus/dnn/torch/osce/models/lavoce_400.py +254 -0
- package/opus/dnn/torch/osce/models/lpcnet_feature_net.py +91 -0
- package/opus/dnn/torch/osce/models/nns_base.py +69 -0
- package/opus/dnn/torch/osce/models/no_lace.py +218 -0
- package/opus/dnn/torch/osce/models/scale_embedding.py +68 -0
- package/opus/dnn/torch/osce/models/shape_up_48.py +179 -0
- package/opus/dnn/torch/osce/models/silk_feature_net.py +86 -0
- package/opus/dnn/torch/osce/models/silk_feature_net_pl.py +127 -0
- package/opus/dnn/torch/osce/requirements.txt +9 -0
- package/opus/dnn/torch/osce/resources/training_files.txt +107716 -0
- package/opus/dnn/torch/osce/resources/validation_files.txt +26929 -0
- package/opus/dnn/torch/osce/scripts/concatenator.py +85 -0
- package/opus/dnn/torch/osce/silk_16_to_48.py +28 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/commonvoice_clip_selection.py +123 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/create_input_data.sh +25 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/env.rc +7 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/evaluate.py +113 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/lace_loss_metric.py +330 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/make_boxplots.py +116 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/make_boxplots_moctest.py +109 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/make_tables.py +124 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/make_tables_moctest.py +121 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/moc.py +182 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/moc2.py +190 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/process_dataset.sh +98 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/run_nomad.py +138 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/run_osce_test.py +196 -0
- package/opus/dnn/torch/osce/stndrd/presentation/endoscopy.py +205 -0
- package/opus/dnn/torch/osce/stndrd/presentation/lace_demo.ipynb +313 -0
- package/opus/dnn/torch/osce/stndrd/presentation/linear_prediction.ipynb +320 -0
- package/opus/dnn/torch/osce/stndrd/presentation/playback.py +25 -0
- package/opus/dnn/torch/osce/stndrd/presentation/postfilter.ipynb +275 -0
- package/opus/dnn/torch/osce/stndrd/presentation/spectrogram.ipynb +173 -0
- package/opus/dnn/torch/osce/test_model.py +96 -0
- package/opus/dnn/torch/osce/test_vocoder.py +103 -0
- package/opus/dnn/torch/osce/train_model.py +307 -0
- package/opus/dnn/torch/osce/train_vocoder.py +287 -0
- package/opus/dnn/torch/osce/utils/ada_conv.py +71 -0
- package/opus/dnn/torch/osce/utils/complexity.py +8 -0
- package/opus/dnn/torch/osce/utils/endoscopy.py +205 -0
- package/opus/dnn/torch/osce/utils/layers/fir.py +27 -0
- package/opus/dnn/torch/osce/utils/layers/limited_adaptive_comb1d.py +230 -0
- package/opus/dnn/torch/osce/utils/layers/limited_adaptive_conv1d.py +200 -0
- package/opus/dnn/torch/osce/utils/layers/noise_shaper.py +100 -0
- package/opus/dnn/torch/osce/utils/layers/pitch_auto_correlator.py +84 -0
- package/opus/dnn/torch/osce/utils/layers/silk_upsampler.py +167 -0
- package/opus/dnn/torch/osce/utils/layers/td_shaper.py +145 -0
- package/opus/dnn/torch/osce/utils/lpcnet_features.py +112 -0
- package/opus/dnn/torch/osce/utils/misc.py +95 -0
- package/opus/dnn/torch/osce/utils/moc.py +153 -0
- package/opus/dnn/torch/osce/utils/pitch.py +122 -0
- package/opus/dnn/torch/osce/utils/silk_features.py +144 -0
- package/opus/dnn/torch/osce/utils/softquant.py +110 -0
- package/opus/dnn/torch/osce/utils/spec.py +210 -0
- package/opus/dnn/torch/osce/utils/templates.py +347 -0
- package/opus/dnn/torch/plc/export_plc.py +100 -0
- package/opus/dnn/torch/plc/plc.py +144 -0
- package/opus/dnn/torch/plc/plc_dataset.py +60 -0
- package/opus/dnn/torch/plc/train_plc.py +145 -0
- package/opus/dnn/torch/rdovae/README.md +55 -0
- package/opus/dnn/torch/rdovae/download_datasets.sh +6 -0
- package/opus/dnn/torch/rdovae/export_rdovae_weights.py +365 -0
- package/opus/dnn/torch/rdovae/fec_encoder.py +212 -0
- package/opus/dnn/torch/rdovae/import_rdovae_weights.py +143 -0
- package/opus/dnn/torch/rdovae/packets/__init__.py +1 -0
- package/opus/dnn/torch/rdovae/packets/fec_packets.c +142 -0
- package/opus/dnn/torch/rdovae/packets/fec_packets.h +34 -0
- package/opus/dnn/torch/rdovae/packets/fec_packets.py +108 -0
- package/opus/dnn/torch/rdovae/process_speech.sh +7 -0
- package/opus/dnn/torch/rdovae/rdovae/__init__.py +2 -0
- package/opus/dnn/torch/rdovae/rdovae/dataset.py +67 -0
- package/opus/dnn/torch/rdovae/rdovae/rdovae.py +719 -0
- package/opus/dnn/torch/rdovae/requirements.txt +4 -0
- package/opus/dnn/torch/rdovae/train_rdovae.py +278 -0
- package/opus/dnn/torch/testsuite/README.md +46 -0
- package/opus/dnn/torch/testsuite/examples/lpcnet_c_example.yml +6 -0
- package/opus/dnn/torch/testsuite/examples/lpcnet_c_plc_example.yml +5 -0
- package/opus/dnn/torch/testsuite/examples/lpcnet_torch_example.yml +5 -0
- package/opus/dnn/torch/testsuite/requirements.txt +12 -0
- package/opus/dnn/torch/testsuite/run_test.py +375 -0
- package/opus/dnn/torch/testsuite/utils/__init__.py +0 -0
- package/opus/dnn/torch/testsuite/utils/files.py +54 -0
- package/opus/dnn/torch/testsuite/utils/pesq.py +43 -0
- package/opus/dnn/torch/testsuite/utils/pitch.py +61 -0
- package/opus/dnn/torch/weight-exchange/README.md +21 -0
- package/opus/dnn/torch/weight-exchange/requirements.txt +1 -0
- package/opus/dnn/torch/weight-exchange/setup.py +48 -0
- package/opus/dnn/torch/weight-exchange/wexchange/__init__.py +30 -0
- package/opus/dnn/torch/weight-exchange/wexchange/c_export/__init__.py +31 -0
- package/opus/dnn/torch/weight-exchange/wexchange/c_export/c_writer.py +181 -0
- package/opus/dnn/torch/weight-exchange/wexchange/c_export/common.py +386 -0
- package/opus/dnn/torch/weight-exchange/wexchange/tf/__init__.py +5 -0
- package/opus/dnn/torch/weight-exchange/wexchange/tf/tf.py +188 -0
- package/opus/dnn/torch/weight-exchange/wexchange/torch/__init__.py +37 -0
- package/opus/dnn/torch/weight-exchange/wexchange/torch/torch.py +433 -0
- package/opus/dnn/training_tf2/dataloader.py +49 -0
- package/opus/dnn/training_tf2/decode_rdovae.py +111 -0
- package/opus/dnn/training_tf2/diffembed.py +49 -0
- package/opus/dnn/training_tf2/dump_lpcnet.py +388 -0
- package/opus/dnn/training_tf2/dump_plc.py +296 -0
- package/opus/dnn/training_tf2/dump_rdovae.py +306 -0
- package/opus/dnn/training_tf2/encode_rdovae.py +125 -0
- package/opus/dnn/training_tf2/fec_encoder.py +256 -0
- package/opus/dnn/training_tf2/fec_packets.c +142 -0
- package/opus/dnn/training_tf2/fec_packets.h +34 -0
- package/opus/dnn/training_tf2/fec_packets.py +108 -0
- package/opus/dnn/training_tf2/keraslayerdump.py +189 -0
- package/opus/dnn/training_tf2/lossfuncs.py +99 -0
- package/opus/dnn/training_tf2/lpcnet.py +339 -0
- package/opus/dnn/training_tf2/lpcnet_plc.py +101 -0
- package/opus/dnn/training_tf2/mdense.py +95 -0
- package/opus/dnn/training_tf2/pade.py +70 -0
- package/opus/dnn/training_tf2/parameters.py +29 -0
- package/opus/dnn/training_tf2/plc_loader.py +73 -0
- package/opus/dnn/training_tf2/rdovae.py +372 -0
- package/opus/dnn/training_tf2/rdovae_exchange.py +138 -0
- package/opus/dnn/training_tf2/rdovae_import.py +123 -0
- package/opus/dnn/training_tf2/test_lpcnet.py +120 -0
- package/opus/dnn/training_tf2/test_plc.py +92 -0
- package/opus/dnn/training_tf2/tf_funcs.py +70 -0
- package/opus/dnn/training_tf2/train_lpcnet.py +214 -0
- package/opus/dnn/training_tf2/train_plc.py +197 -0
- package/opus/dnn/training_tf2/train_rdovae.py +151 -0
- package/opus/dnn/training_tf2/ulaw.py +19 -0
- package/opus/dnn/training_tf2/uniform_noise.py +78 -0
- package/opus/dnn/vec.h +389 -0
- package/opus/dnn/vec_avx.h +884 -0
- package/opus/dnn/vec_neon.h +473 -0
- package/opus/dnn/write_lpcnet_weights.c +97 -0
- package/opus/dnn/x86/dnn_x86.h +121 -0
- package/opus/dnn/x86/nnet_avx2.c +40 -0
- package/opus/dnn/x86/nnet_sse2.c +40 -0
- package/opus/dnn/x86/nnet_sse4_1.c +40 -0
- package/opus/dnn/x86/x86_dnn_map.c +83 -0
- package/opus/doc/Doxyfile.in +340 -0
- package/opus/doc/Makefile.am +45 -0
- package/opus/doc/build_draft.sh +113 -0
- package/opus/doc/build_isobmff.sh +50 -0
- package/opus/doc/build_oggdraft.sh +52 -0
- package/opus/doc/customdoxygen.css +1011 -0
- package/opus/doc/draft-ietf-codec-oggopus.xml +1873 -0
- package/opus/doc/draft-ietf-codec-opus-update.xml +513 -0
- package/opus/doc/draft-ietf-codec-opus.xml +8276 -0
- package/opus/doc/draft-ietf-payload-rtp-opus.xml +960 -0
- package/opus/doc/footer.html +32 -0
- package/opus/doc/header.html +61 -0
- package/opus/doc/meson.build +33 -0
- package/opus/doc/opus_in_isobmff.css +60 -0
- package/opus/doc/opus_in_isobmff.html +692 -0
- package/opus/doc/opus_logo.svg +157 -0
- package/opus/doc/opus_update.patch +244 -0
- package/opus/doc/release.txt +43 -0
- package/opus/doc/trivial_example.c +171 -0
- package/opus/include/meson.build +13 -0
- package/opus/include/opus.h +1172 -0
- package/opus/include/opus_custom.h +381 -0
- package/opus/include/opus_defines.h +830 -0
- package/opus/include/opus_multistream.h +736 -0
- package/opus/include/opus_projection.h +643 -0
- package/opus/include/opus_types.h +166 -0
- package/opus/lpcnet_headers.mk +44 -0
- package/opus/lpcnet_sources.mk +44 -0
- package/opus/m4/as-gcc-inline-assembly.m4 +98 -0
- package/opus/m4/ax_add_fortify_source.m4 +53 -0
- package/opus/m4/opus-intrinsics.m4 +29 -0
- package/opus/meson/README.md +88 -0
- package/opus/meson/get-version.py +86 -0
- package/opus/meson/read-sources-list.py +28 -0
- package/opus/meson.build +745 -0
- package/opus/meson_options.txt +27 -0
- package/opus/opus-uninstalled.pc.in +12 -0
- package/opus/opus.m4 +117 -0
- package/opus/opus.pc.in +16 -0
- package/opus/opus_headers.mk +8 -0
- package/opus/opus_sources.mk +17 -0
- package/opus/releases.sha2 +85 -0
- package/opus/scripts/dump_rnn.py +57 -0
- package/opus/scripts/local_build.py +220 -0
- package/opus/scripts/rnn_train.py +67 -0
- package/opus/scripts/shrink_model.sh +7 -0
- package/opus/silk/A2NLSF.c +267 -0
- package/opus/silk/API.h +156 -0
- package/opus/silk/CNG.c +188 -0
- package/opus/silk/HP_variable_cutoff.c +77 -0
- package/opus/silk/Inlines.h +188 -0
- package/opus/silk/LPC_analysis_filter.c +111 -0
- package/opus/silk/LPC_fit.c +82 -0
- package/opus/silk/LPC_inv_pred_gain.c +141 -0
- package/opus/silk/LP_variable_cutoff.c +135 -0
- package/opus/silk/MacroCount.h +710 -0
- package/opus/silk/MacroDebug.h +945 -0
- package/opus/silk/NLSF2A.c +141 -0
- package/opus/silk/NLSF_VQ.c +76 -0
- package/opus/silk/NLSF_VQ_weights_laroia.c +80 -0
- package/opus/silk/NLSF_decode.c +93 -0
- package/opus/silk/NLSF_del_dec_quant.c +215 -0
- package/opus/silk/NLSF_encode.c +124 -0
- package/opus/silk/NLSF_stabilize.c +142 -0
- package/opus/silk/NLSF_unpack.c +55 -0
- package/opus/silk/NSQ.c +437 -0
- package/opus/silk/NSQ.h +101 -0
- package/opus/silk/NSQ_del_dec.c +733 -0
- package/opus/silk/PLC.c +493 -0
- package/opus/silk/PLC.h +65 -0
- package/opus/silk/SigProc_FIX.h +643 -0
- package/opus/silk/VAD.c +360 -0
- package/opus/silk/VQ_WMat_EC.c +131 -0
- package/opus/silk/ana_filt_bank_1.c +74 -0
- package/opus/silk/arm/LPC_inv_pred_gain_arm.h +57 -0
- package/opus/silk/arm/LPC_inv_pred_gain_neon_intr.c +288 -0
- package/opus/silk/arm/NSQ_del_dec_arm.h +100 -0
- package/opus/silk/arm/NSQ_del_dec_neon_intr.c +1138 -0
- package/opus/silk/arm/NSQ_neon.c +112 -0
- package/opus/silk/arm/NSQ_neon.h +114 -0
- package/opus/silk/arm/SigProc_FIX_armv4.h +47 -0
- package/opus/silk/arm/SigProc_FIX_armv5e.h +61 -0
- package/opus/silk/arm/arm_silk_map.c +128 -0
- package/opus/silk/arm/biquad_alt_arm.h +68 -0
- package/opus/silk/arm/biquad_alt_neon_intr.c +156 -0
- package/opus/silk/arm/macros_arm64.h +39 -0
- package/opus/silk/arm/macros_armv4.h +110 -0
- package/opus/silk/arm/macros_armv5e.h +220 -0
- package/opus/silk/biquad_alt.c +121 -0
- package/opus/silk/bwexpander.c +51 -0
- package/opus/silk/bwexpander_32.c +51 -0
- package/opus/silk/check_control_input.c +106 -0
- package/opus/silk/code_signs.c +115 -0
- package/opus/silk/control.h +161 -0
- package/opus/silk/control_SNR.c +113 -0
- package/opus/silk/control_audio_bandwidth.c +132 -0
- package/opus/silk/control_codec.c +423 -0
- package/opus/silk/debug.c +174 -0
- package/opus/silk/debug.h +267 -0
- package/opus/silk/dec_API.c +465 -0
- package/opus/silk/decode_core.c +243 -0
- package/opus/silk/decode_frame.c +169 -0
- package/opus/silk/decode_indices.c +151 -0
- package/opus/silk/decode_parameters.c +115 -0
- package/opus/silk/decode_pitch.c +77 -0
- package/opus/silk/decode_pulses.c +115 -0
- package/opus/silk/decoder_set_fs.c +108 -0
- package/opus/silk/define.h +235 -0
- package/opus/silk/enc_API.c +593 -0
- package/opus/silk/encode_indices.c +181 -0
- package/opus/silk/encode_pulses.c +206 -0
- package/opus/silk/errors.h +98 -0
- package/opus/silk/fixed/LTP_analysis_filter_FIX.c +90 -0
- package/opus/silk/fixed/LTP_scale_ctrl_FIX.c +58 -0
- package/opus/silk/fixed/apply_sine_window_FIX.c +101 -0
- package/opus/silk/fixed/arm/warped_autocorrelation_FIX_arm.h +68 -0
- package/opus/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c +265 -0
- package/opus/silk/fixed/autocorr_FIX.c +48 -0
- package/opus/silk/fixed/burg_modified_FIX.c +280 -0
- package/opus/silk/fixed/corrMatrix_FIX.c +150 -0
- package/opus/silk/fixed/encode_frame_FIX.c +444 -0
- package/opus/silk/fixed/find_LPC_FIX.c +151 -0
- package/opus/silk/fixed/find_LTP_FIX.c +99 -0
- package/opus/silk/fixed/find_pitch_lags_FIX.c +143 -0
- package/opus/silk/fixed/find_pred_coefs_FIX.c +146 -0
- package/opus/silk/fixed/k2a_FIX.c +54 -0
- package/opus/silk/fixed/k2a_Q16_FIX.c +54 -0
- package/opus/silk/fixed/main_FIX.h +244 -0
- package/opus/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h +336 -0
- package/opus/silk/fixed/mips/prefilter_FIX_mipsr1.h +184 -0
- package/opus/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h +165 -0
- package/opus/silk/fixed/noise_shape_analysis_FIX.c +407 -0
- package/opus/silk/fixed/pitch_analysis_core_FIX.c +721 -0
- package/opus/silk/fixed/process_gains_FIX.c +117 -0
- package/opus/silk/fixed/regularize_correlations_FIX.c +47 -0
- package/opus/silk/fixed/residual_energy16_FIX.c +103 -0
- package/opus/silk/fixed/residual_energy_FIX.c +98 -0
- package/opus/silk/fixed/schur64_FIX.c +93 -0
- package/opus/silk/fixed/schur_FIX.c +107 -0
- package/opus/silk/fixed/structs_FIX.h +116 -0
- package/opus/silk/fixed/vector_ops_FIX.c +102 -0
- package/opus/silk/fixed/warped_autocorrelation_FIX.c +92 -0
- package/opus/silk/fixed/x86/burg_modified_FIX_sse4_1.c +400 -0
- package/opus/silk/fixed/x86/vector_ops_FIX_sse4_1.c +93 -0
- package/opus/silk/float/LPC_analysis_filter_FLP.c +249 -0
- package/opus/silk/float/LPC_inv_pred_gain_FLP.c +73 -0
- package/opus/silk/float/LTP_analysis_filter_FLP.c +75 -0
- package/opus/silk/float/LTP_scale_ctrl_FLP.c +58 -0
- package/opus/silk/float/SigProc_FLP.h +205 -0
- package/opus/silk/float/apply_sine_window_FLP.c +81 -0
- package/opus/silk/float/autocorrelation_FLP.c +53 -0
- package/opus/silk/float/burg_modified_FLP.c +187 -0
- package/opus/silk/float/bwexpander_FLP.c +49 -0
- package/opus/silk/float/corrMatrix_FLP.c +95 -0
- package/opus/silk/float/encode_frame_FLP.c +432 -0
- package/opus/silk/float/energy_FLP.c +59 -0
- package/opus/silk/float/find_LPC_FLP.c +105 -0
- package/opus/silk/float/find_LTP_FLP.c +65 -0
- package/opus/silk/float/find_pitch_lags_FLP.c +132 -0
- package/opus/silk/float/find_pred_coefs_FLP.c +117 -0
- package/opus/silk/float/inner_product_FLP.c +59 -0
- package/opus/silk/float/k2a_FLP.c +54 -0
- package/opus/silk/float/main_FLP.h +290 -0
- package/opus/silk/float/noise_shape_analysis_FLP.c +350 -0
- package/opus/silk/float/pitch_analysis_core_FLP.c +630 -0
- package/opus/silk/float/process_gains_FLP.c +103 -0
- package/opus/silk/float/regularize_correlations_FLP.c +48 -0
- package/opus/silk/float/residual_energy_FLP.c +117 -0
- package/opus/silk/float/scale_copy_vector_FLP.c +57 -0
- package/opus/silk/float/scale_vector_FLP.c +56 -0
- package/opus/silk/float/schur_FLP.c +70 -0
- package/opus/silk/float/sort_FLP.c +83 -0
- package/opus/silk/float/structs_FLP.h +112 -0
- package/opus/silk/float/warped_autocorrelation_FLP.c +75 -0
- package/opus/silk/float/wrappers_FLP.c +209 -0
- package/opus/silk/float/x86/inner_product_FLP_avx2.c +85 -0
- package/opus/silk/gain_quant.c +142 -0
- package/opus/silk/init_decoder.c +84 -0
- package/opus/silk/init_encoder.c +68 -0
- package/opus/silk/inner_prod_aligned.c +47 -0
- package/opus/silk/interpolate.c +51 -0
- package/opus/silk/lin2log.c +46 -0
- package/opus/silk/log2lin.c +58 -0
- package/opus/silk/macros.h +151 -0
- package/opus/silk/main.h +486 -0
- package/opus/silk/meson.build +69 -0
- package/opus/silk/mips/NSQ_del_dec_mipsr1.h +410 -0
- package/opus/silk/mips/macros_mipsr1.h +92 -0
- package/opus/silk/mips/sigproc_fix_mipsr1.h +60 -0
- package/opus/silk/pitch_est_defines.h +88 -0
- package/opus/silk/pitch_est_tables.c +99 -0
- package/opus/silk/process_NLSFs.c +107 -0
- package/opus/silk/quant_LTP_gains.c +132 -0
- package/opus/silk/resampler.c +215 -0
- package/opus/silk/resampler_down2.c +74 -0
- package/opus/silk/resampler_down2_3.c +103 -0
- package/opus/silk/resampler_private.h +88 -0
- package/opus/silk/resampler_private_AR2.c +55 -0
- package/opus/silk/resampler_private_IIR_FIR.c +107 -0
- package/opus/silk/resampler_private_down_FIR.c +194 -0
- package/opus/silk/resampler_private_up2_HQ.c +113 -0
- package/opus/silk/resampler_rom.c +96 -0
- package/opus/silk/resampler_rom.h +68 -0
- package/opus/silk/resampler_structs.h +60 -0
- package/opus/silk/shell_coder.c +151 -0
- package/opus/silk/sigm_Q15.c +76 -0
- package/opus/silk/sort.c +154 -0
- package/opus/silk/stereo_LR_to_MS.c +229 -0
- package/opus/silk/stereo_MS_to_LR.c +85 -0
- package/opus/silk/stereo_decode_pred.c +73 -0
- package/opus/silk/stereo_encode_pred.c +62 -0
- package/opus/silk/stereo_find_predictor.c +79 -0
- package/opus/silk/stereo_quant_pred.c +73 -0
- package/opus/silk/structs.h +357 -0
- package/opus/silk/sum_sqr_shift.c +83 -0
- package/opus/silk/table_LSF_cos.c +70 -0
- package/opus/silk/tables.h +114 -0
- package/opus/silk/tables_LTP.c +294 -0
- package/opus/silk/tables_NLSF_CB_NB_MB.c +195 -0
- package/opus/silk/tables_NLSF_CB_WB.c +234 -0
- package/opus/silk/tables_gain.c +63 -0
- package/opus/silk/tables_other.c +124 -0
- package/opus/silk/tables_pitch_lag.c +69 -0
- package/opus/silk/tables_pulses_per_block.c +264 -0
- package/opus/silk/tests/meson.build +8 -0
- package/opus/silk/tests/test_unit_LPC_inv_pred_gain.c +130 -0
- package/opus/silk/tuning_parameters.h +155 -0
- package/opus/silk/typedef.h +81 -0
- package/opus/silk/x86/NSQ_del_dec_avx2.c +1075 -0
- package/opus/silk/x86/NSQ_del_dec_sse4_1.c +915 -0
- package/opus/silk/x86/NSQ_sse4_1.c +772 -0
- package/opus/silk/x86/SigProc_FIX_sse.h +99 -0
- package/opus/silk/x86/VAD_sse4_1.c +289 -0
- package/opus/silk/x86/VQ_WMat_EC_sse4_1.c +173 -0
- package/opus/silk/x86/main_sse.h +299 -0
- package/opus/silk/x86/x86_silk_map.c +179 -0
- package/opus/silk_headers.mk +44 -0
- package/opus/silk_sources.mk +164 -0
- package/opus/src/analysis.c +979 -0
- package/opus/src/analysis.h +103 -0
- package/opus/src/extensions.c +663 -0
- package/opus/src/mapping_matrix.c +993 -0
- package/opus/src/mapping_matrix.h +165 -0
- package/opus/src/meson.build +45 -0
- package/opus/src/mlp.c +132 -0
- package/opus/src/mlp.h +60 -0
- package/opus/src/mlp_data.c +672 -0
- package/opus/src/opus.c +362 -0
- package/opus/src/opus_compare.c +382 -0
- package/opus/src/opus_decoder.c +1579 -0
- package/opus/src/opus_demo.c +1194 -0
- package/opus/src/opus_encoder.c +3180 -0
- package/opus/src/opus_multistream.c +92 -0
- package/opus/src/opus_multistream_decoder.c +563 -0
- package/opus/src/opus_multistream_encoder.c +1321 -0
- package/opus/src/opus_private.h +263 -0
- package/opus/src/opus_projection_decoder.c +283 -0
- package/opus/src/opus_projection_encoder.c +522 -0
- package/opus/src/repacketizer.c +469 -0
- package/opus/src/repacketizer_demo.c +247 -0
- package/opus/src/tansig_table.h +45 -0
- package/opus/tar_list.txt +28 -0
- package/opus/tests/meson.build +39 -0
- package/opus/tests/opus_build_test.sh +29 -0
- package/opus/tests/opus_decode_fuzzer.c +124 -0
- package/opus/tests/opus_decode_fuzzer.options +2 -0
- package/opus/tests/opus_encode_regressions.c +1034 -0
- package/opus/tests/random_config.sh +126 -0
- package/opus/tests/run_vectors.sh +143 -0
- package/opus/tests/test_opus_api.c +1904 -0
- package/opus/tests/test_opus_common.h +86 -0
- package/opus/tests/test_opus_custom.c +694 -0
- package/opus/tests/test_opus_decode.c +481 -0
- package/opus/tests/test_opus_dred.c +107 -0
- package/opus/tests/test_opus_encode.c +738 -0
- package/opus/tests/test_opus_extensions.c +750 -0
- package/opus/tests/test_opus_padding.c +94 -0
- package/opus/tests/test_opus_projection.c +384 -0
- package/opus/training/rnn_dump.py +66 -0
- package/opus/training/rnn_train.py +177 -0
- package/opus/training/txt2hdf5.py +12 -0
- package/opus/update_version +65 -0
- package/package.json +2 -2
- package/src/build-ffmpeg-msys.sh +8 -2
- package/test.mp4 +0 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
|
|
3
|
+
@torch.no_grad()
|
|
4
|
+
def compute_optimal_scale(weight):
|
|
5
|
+
with torch.no_grad():
|
|
6
|
+
n_out, n_in = weight.shape
|
|
7
|
+
assert n_in % 4 == 0
|
|
8
|
+
if n_out % 8:
|
|
9
|
+
# add padding
|
|
10
|
+
pad = n_out - n_out % 8
|
|
11
|
+
weight = torch.cat((weight, torch.zeros((pad, n_in), dtype=weight.dtype, device=weight.device)), dim=0)
|
|
12
|
+
|
|
13
|
+
weight_max_abs, _ = torch.max(torch.abs(weight), dim=1)
|
|
14
|
+
weight_max_sum, _ = torch.max(torch.abs(weight[:, : n_in : 2] + weight[:, 1 : n_in : 2]), dim=1)
|
|
15
|
+
scale_max = weight_max_abs / 127
|
|
16
|
+
scale_sum = weight_max_sum / 129
|
|
17
|
+
|
|
18
|
+
scale = torch.maximum(scale_max, scale_sum)
|
|
19
|
+
|
|
20
|
+
return scale[:n_out]
|
|
21
|
+
|
|
22
|
+
@torch.no_grad()
|
|
23
|
+
def q_scaled_noise(module, weight):
|
|
24
|
+
if isinstance(module, torch.nn.Conv1d):
|
|
25
|
+
w = weight.permute(0, 2, 1).flatten(1)
|
|
26
|
+
noise = torch.rand_like(w) - 0.5
|
|
27
|
+
noise[w == 0] = 0 # ignore zero entries from sparsification
|
|
28
|
+
scale = compute_optimal_scale(w)
|
|
29
|
+
noise = noise * scale.unsqueeze(-1)
|
|
30
|
+
noise = noise.reshape(weight.size(0), weight.size(2), weight.size(1)).permute(0, 2, 1)
|
|
31
|
+
elif isinstance(module, torch.nn.ConvTranspose1d):
|
|
32
|
+
i, o, k = weight.shape
|
|
33
|
+
w = weight.permute(2, 1, 0).reshape(k * o, i)
|
|
34
|
+
noise = torch.rand_like(w) - 0.5
|
|
35
|
+
noise[w == 0] = 0 # ignore zero entries from sparsification
|
|
36
|
+
scale = compute_optimal_scale(w)
|
|
37
|
+
noise = noise * scale.unsqueeze(-1)
|
|
38
|
+
noise = noise.reshape(k, o, i).permute(2, 1, 0)
|
|
39
|
+
elif len(weight.shape) == 2:
|
|
40
|
+
noise = torch.rand_like(weight) - 0.5
|
|
41
|
+
noise[weight == 0] = 0 # ignore zero entries from sparsification
|
|
42
|
+
scale = compute_optimal_scale(weight)
|
|
43
|
+
noise = noise * scale.unsqueeze(-1)
|
|
44
|
+
else:
|
|
45
|
+
raise ValueError('unknown quantization setting')
|
|
46
|
+
|
|
47
|
+
return noise
|
|
48
|
+
|
|
49
|
+
class SoftQuant:
|
|
50
|
+
name: str
|
|
51
|
+
|
|
52
|
+
def __init__(self, names: str, scale: float) -> None:
|
|
53
|
+
self.names = names
|
|
54
|
+
self.quantization_noise = None
|
|
55
|
+
self.scale = scale
|
|
56
|
+
|
|
57
|
+
def __call__(self, module, inputs, *args, before=True):
|
|
58
|
+
if not module.training: return
|
|
59
|
+
|
|
60
|
+
if before:
|
|
61
|
+
self.quantization_noise = dict()
|
|
62
|
+
for name in self.names:
|
|
63
|
+
weight = getattr(module, name)
|
|
64
|
+
if self.scale is None:
|
|
65
|
+
self.quantization_noise[name] = q_scaled_noise(module, weight)
|
|
66
|
+
else:
|
|
67
|
+
self.quantization_noise[name] = \
|
|
68
|
+
self.scale * (torch.rand_like(weight) - 0.5)
|
|
69
|
+
with torch.no_grad():
|
|
70
|
+
weight.data[:] = weight + self.quantization_noise[name]
|
|
71
|
+
else:
|
|
72
|
+
for name in self.names:
|
|
73
|
+
weight = getattr(module, name)
|
|
74
|
+
with torch.no_grad():
|
|
75
|
+
weight.data[:] = weight - self.quantization_noise[name]
|
|
76
|
+
self.quantization_noise = None
|
|
77
|
+
|
|
78
|
+
def apply(module, names=['weight'], scale=None):
|
|
79
|
+
fn = SoftQuant(names, scale)
|
|
80
|
+
|
|
81
|
+
for name in names:
|
|
82
|
+
if not hasattr(module, name):
|
|
83
|
+
raise ValueError("")
|
|
84
|
+
|
|
85
|
+
fn_before = lambda *x : fn(*x, before=True)
|
|
86
|
+
fn_after = lambda *x : fn(*x, before=False)
|
|
87
|
+
setattr(fn_before, 'sqm', fn)
|
|
88
|
+
setattr(fn_after, 'sqm', fn)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
module.register_forward_pre_hook(fn_before)
|
|
92
|
+
module.register_forward_hook(fn_after)
|
|
93
|
+
|
|
94
|
+
module
|
|
95
|
+
|
|
96
|
+
return fn
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def soft_quant(module, names=['weight'], scale=None):
|
|
100
|
+
fn = SoftQuant.apply(module, names, scale)
|
|
101
|
+
return module
|
|
102
|
+
|
|
103
|
+
def remove_soft_quant(module, names=['weight']):
|
|
104
|
+
for k, hook in module._forward_pre_hooks.items():
|
|
105
|
+
if hasattr(hook, 'sqm'):
|
|
106
|
+
if isinstance(hook.sqm, SoftQuant) and hook.sqm.names == names:
|
|
107
|
+
del module._forward_pre_hooks[k]
|
|
108
|
+
for k, hook in module._forward_hooks.items():
|
|
109
|
+
if hasattr(hook, 'sqm'):
|
|
110
|
+
if isinstance(hook.sqm, SoftQuant) and hook.sqm.names == names:
|
|
111
|
+
del module._forward_hooks[k]
|
|
112
|
+
|
|
113
|
+
return module
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""
|
|
2
|
+
/* Copyright (c) 2023 Amazon
|
|
3
|
+
Written by Jan Buethe */
|
|
4
|
+
/*
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions
|
|
7
|
+
are met:
|
|
8
|
+
|
|
9
|
+
- Redistributions of source code must retain the above copyright
|
|
10
|
+
notice, this list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
13
|
+
notice, this list of conditions and the following disclaimer in the
|
|
14
|
+
documentation and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
20
|
+
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import torch
|
|
31
|
+
|
|
32
|
+
class MetaCritic():
|
|
33
|
+
def __init__(self, normalize=False, gamma=0.9, beta=0.0, joint_stats=False):
|
|
34
|
+
""" Class for assessing relevance of discriminator scores
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
gamma (float, optional): update rate for tracking discriminator stats. Defaults to 0.9.
|
|
38
|
+
beta (float, optional): Miminum confidence related threshold. Defaults to 0.0.
|
|
39
|
+
"""
|
|
40
|
+
self.normalize = normalize
|
|
41
|
+
self.gamma = gamma
|
|
42
|
+
self.beta = beta
|
|
43
|
+
self.joint_stats = joint_stats
|
|
44
|
+
|
|
45
|
+
self.disc_stats = dict()
|
|
46
|
+
|
|
47
|
+
def __call__(self, disc_id, real_scores, generated_scores):
|
|
48
|
+
""" calculates relevance from normalized scores
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
disc_id (any valid key): id for tracking discriminator statistics
|
|
52
|
+
real_scores (torch.tensor): scores for real data
|
|
53
|
+
generated_scores (torch.tensor): scores for generated data; expecting device to match real_scores.device
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
torch.tensor: output-domain relevance
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
if self.normalize:
|
|
60
|
+
real_std = torch.std(real_scores.detach()).cpu().item()
|
|
61
|
+
gen_std = torch.std(generated_scores.detach()).cpu().item()
|
|
62
|
+
std = (real_std**2 + gen_std**2) ** .5
|
|
63
|
+
mean = torch.mean(real_scores.detach()).cpu().item() - torch.mean(generated_scores.detach()).cpu().item()
|
|
64
|
+
|
|
65
|
+
key = 0 if self.joint_stats else disc_id
|
|
66
|
+
|
|
67
|
+
if key in self.disc_stats:
|
|
68
|
+
self.disc_stats[key]['std'] = self.gamma * self.disc_stats[key]['std'] + (1 - self.gamma) * std
|
|
69
|
+
self.disc_stats[key]['mean'] = self.gamma * self.disc_stats[key]['mean'] + (1 - self.gamma) * mean
|
|
70
|
+
else:
|
|
71
|
+
self.disc_stats[key] = {
|
|
72
|
+
'std': std + 1e-5,
|
|
73
|
+
'mean': mean
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
std = self.disc_stats[key]['std']
|
|
77
|
+
mean = self.disc_stats[key]['mean']
|
|
78
|
+
else:
|
|
79
|
+
mean, std = 0, 1
|
|
80
|
+
|
|
81
|
+
relevance = torch.relu((real_scores - generated_scores - mean) / std + mean - self.beta)
|
|
82
|
+
|
|
83
|
+
if False: print(f"relevance({disc_id}): {relevance.min()=} {relevance.max()=} {relevance.mean()=}")
|
|
84
|
+
|
|
85
|
+
return relevance
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
"""
|
|
2
|
+
/* Copyright (c) 2023 Amazon
|
|
3
|
+
Written by Jan Buethe */
|
|
4
|
+
/*
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions
|
|
7
|
+
are met:
|
|
8
|
+
|
|
9
|
+
- Redistributions of source code must retain the above copyright
|
|
10
|
+
notice, this list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
13
|
+
notice, this list of conditions and the following disclaimer in the
|
|
14
|
+
documentation and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
20
|
+
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import torch
|
|
31
|
+
import torch.nn.functional as F
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def view_one_hot(index, length):
|
|
35
|
+
vec = length * [1]
|
|
36
|
+
vec[index] = -1
|
|
37
|
+
return vec
|
|
38
|
+
|
|
39
|
+
def create_smoothing_kernel(widths, gamma=1.5):
|
|
40
|
+
""" creates a truncated gaussian smoothing kernel for the given widths
|
|
41
|
+
|
|
42
|
+
Parameters:
|
|
43
|
+
-----------
|
|
44
|
+
widths: list[Int] or torch.LongTensor
|
|
45
|
+
specifies the shape of the smoothing kernel, entries must be > 0.
|
|
46
|
+
|
|
47
|
+
gamma: float, optional
|
|
48
|
+
decay factor for gaussian relative to kernel size
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
--------
|
|
52
|
+
kernel: torch.FloatTensor
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
widths = torch.LongTensor(widths)
|
|
56
|
+
num_dims = len(widths)
|
|
57
|
+
|
|
58
|
+
assert(widths.min() > 0)
|
|
59
|
+
|
|
60
|
+
centers = widths.float() / 2 - 0.5
|
|
61
|
+
sigmas = gamma * (centers + 1)
|
|
62
|
+
|
|
63
|
+
vals = []
|
|
64
|
+
|
|
65
|
+
vals= [((torch.arange(widths[i]) - centers[i]) / sigmas[i]) ** 2 for i in range(num_dims)]
|
|
66
|
+
vals = sum([vals[i].view(view_one_hot(i, num_dims)) for i in range(num_dims)])
|
|
67
|
+
|
|
68
|
+
kernel = torch.exp(- vals)
|
|
69
|
+
kernel = kernel / kernel.sum()
|
|
70
|
+
|
|
71
|
+
return kernel
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def create_partition_kernel(widths, strides):
|
|
75
|
+
""" creates a partition kernel for mapping a convolutional network output back to the input domain
|
|
76
|
+
|
|
77
|
+
Given a fully convolutional network with receptive field of shape widths and the given strides, this
|
|
78
|
+
function construncts an intorpolation kernel whose tranlations by multiples of the given strides form
|
|
79
|
+
a partition of one on the input domain.
|
|
80
|
+
|
|
81
|
+
Parameter:
|
|
82
|
+
----------
|
|
83
|
+
widths: list[Int] or torch.LongTensor
|
|
84
|
+
shape of receptive field
|
|
85
|
+
|
|
86
|
+
strides: list[Int] or torch.LongTensor
|
|
87
|
+
total strides of convolutional network
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
kernel: torch.FloatTensor
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
num_dims = len(widths)
|
|
94
|
+
assert num_dims == len(strides) and num_dims in {1, 2, 3}
|
|
95
|
+
|
|
96
|
+
convs = {1 : F.conv1d, 2 : F.conv2d, 3 : F.conv3d}
|
|
97
|
+
|
|
98
|
+
widths = torch.LongTensor(widths)
|
|
99
|
+
strides = torch.LongTensor(strides)
|
|
100
|
+
|
|
101
|
+
proto_kernel = torch.ones(torch.minimum(strides, widths).tolist())
|
|
102
|
+
|
|
103
|
+
# create interpolation kernel eta
|
|
104
|
+
eta_widths = widths - strides + 1
|
|
105
|
+
if eta_widths.min() <= 0:
|
|
106
|
+
print("[create_partition_kernel] warning: receptive field does not cover input domain")
|
|
107
|
+
eta_widths = torch.maximum(eta_widths, torch.ones_like(eta_widths))
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
eta = create_smoothing_kernel(eta_widths).view(1, 1, *eta_widths.tolist())
|
|
111
|
+
|
|
112
|
+
padding = torch.repeat_interleave(eta_widths - 1, 2, 0).tolist()[::-1] # ordering of dimensions for padding and convolution functions is reversed in torch
|
|
113
|
+
padded_proto_kernel = F.pad(proto_kernel, padding)
|
|
114
|
+
padded_proto_kernel = padded_proto_kernel.view(1, 1, *padded_proto_kernel.shape)
|
|
115
|
+
kernel = convs[num_dims](padded_proto_kernel, eta)
|
|
116
|
+
|
|
117
|
+
return kernel
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def receptive_field(conv_model, input_shape, output_position):
|
|
121
|
+
""" estimates boundaries of receptive field connected to output_position via autograd
|
|
122
|
+
|
|
123
|
+
Parameters:
|
|
124
|
+
-----------
|
|
125
|
+
conv_model: nn.Module or autograd function
|
|
126
|
+
function or model implementing fully convolutional model
|
|
127
|
+
|
|
128
|
+
input_shape: List[Int]
|
|
129
|
+
input shape ignoring batch dimension, i.e. [num_channels, dim1, dim2, ...]
|
|
130
|
+
|
|
131
|
+
output_position: List[Int]
|
|
132
|
+
output position for which the receptive field is determined; the function raises an exception
|
|
133
|
+
if output_position is out of bounds for the given input_shape.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
--------
|
|
137
|
+
low: List[Int]
|
|
138
|
+
start indices of receptive field
|
|
139
|
+
|
|
140
|
+
high: List[Int]
|
|
141
|
+
stop indices of receptive field
|
|
142
|
+
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
x = torch.randn((1,) + tuple(input_shape), requires_grad=True)
|
|
146
|
+
y = conv_model(x)
|
|
147
|
+
|
|
148
|
+
# collapse channels and remove batch dimension
|
|
149
|
+
y = torch.sum(y, 1)[0]
|
|
150
|
+
|
|
151
|
+
# create mask
|
|
152
|
+
mask = torch.zeros_like(y)
|
|
153
|
+
index = [torch.tensor(i) for i in output_position]
|
|
154
|
+
try:
|
|
155
|
+
mask.index_put_(index, torch.tensor(1, dtype=mask.dtype))
|
|
156
|
+
except IndexError:
|
|
157
|
+
raise ValueError('output_position out of bounds')
|
|
158
|
+
|
|
159
|
+
(mask * y).sum().backward()
|
|
160
|
+
|
|
161
|
+
# sum over channels and remove batch dimension
|
|
162
|
+
grad = torch.sum(x.grad, dim=1)[0]
|
|
163
|
+
tmp = torch.nonzero(grad, as_tuple=True)
|
|
164
|
+
low = [t.min().item() for t in tmp]
|
|
165
|
+
high = [t.max().item() for t in tmp]
|
|
166
|
+
|
|
167
|
+
return low, high
|
|
168
|
+
|
|
169
|
+
def estimate_conv_parameters(model, num_channels, num_dims, width, max_stride=10):
|
|
170
|
+
""" attempts to estimate receptive field size, strides and left paddings for given model
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
Parameters:
|
|
174
|
+
-----------
|
|
175
|
+
model: nn.Module or autograd function
|
|
176
|
+
fully convolutional model for which parameters are estimated
|
|
177
|
+
|
|
178
|
+
num_channels: Int
|
|
179
|
+
number of input channels for model
|
|
180
|
+
|
|
181
|
+
num_dims: Int
|
|
182
|
+
number of input dimensions for model (without channel dimension)
|
|
183
|
+
|
|
184
|
+
width: Int
|
|
185
|
+
width of the input tensor (a hyper-square) on which the receptive fields are derived via autograd
|
|
186
|
+
|
|
187
|
+
max_stride: Int, optional
|
|
188
|
+
assumed maximal stride of the model for any dimension, when set too low the function may fail for
|
|
189
|
+
any value of width
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
--------
|
|
193
|
+
receptive_field_size: List[Int]
|
|
194
|
+
receptive field size in all dimension
|
|
195
|
+
|
|
196
|
+
strides: List[Int]
|
|
197
|
+
stride in all dimensions
|
|
198
|
+
|
|
199
|
+
left_paddings: List[Int]
|
|
200
|
+
left padding in all dimensions; this is relevant for aligning the receptive field on the input plane
|
|
201
|
+
|
|
202
|
+
Raises:
|
|
203
|
+
-------
|
|
204
|
+
ValueError, KeyError
|
|
205
|
+
|
|
206
|
+
"""
|
|
207
|
+
|
|
208
|
+
input_shape = [num_channels] + num_dims * [width]
|
|
209
|
+
output_position1 = num_dims * [width // (2 * max_stride)]
|
|
210
|
+
output_position2 = num_dims * [width // (2 * max_stride) + 1]
|
|
211
|
+
|
|
212
|
+
low1, high1 = receptive_field(model, input_shape, output_position1)
|
|
213
|
+
low2, high2 = receptive_field(model, input_shape, output_position2)
|
|
214
|
+
|
|
215
|
+
widths1 = [h - l + 1 for l, h in zip(low1, high1)]
|
|
216
|
+
widths2 = [h - l + 1 for l, h in zip(low2, high2)]
|
|
217
|
+
|
|
218
|
+
if not all([w1 - w2 == 0 for w1, w2 in zip(widths1, widths2)]) or not all([l1 != l2 for l1, l2 in zip(low1, low2)]):
|
|
219
|
+
raise ValueError("[estimate_strides]: widths to small to determine strides")
|
|
220
|
+
|
|
221
|
+
receptive_field_size = widths1
|
|
222
|
+
strides = [l2 - l1 for l1, l2 in zip(low1, low2)]
|
|
223
|
+
left_paddings = [s * p - l for l, s, p in zip(low1, strides, output_position1)]
|
|
224
|
+
|
|
225
|
+
return receptive_field_size, strides, left_paddings
|
|
226
|
+
|
|
227
|
+
def inspect_conv_model(model, num_channels, num_dims, max_width=10000, width_hint=None, stride_hint=None, verbose=False):
|
|
228
|
+
""" determines size of receptive field, strides and padding probabilistically
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
Parameters:
|
|
232
|
+
-----------
|
|
233
|
+
model: nn.Module or autograd function
|
|
234
|
+
fully convolutional model for which parameters are estimated
|
|
235
|
+
|
|
236
|
+
num_channels: Int
|
|
237
|
+
number of input channels for model
|
|
238
|
+
|
|
239
|
+
num_dims: Int
|
|
240
|
+
number of input dimensions for model (without channel dimension)
|
|
241
|
+
|
|
242
|
+
max_width: Int
|
|
243
|
+
maximum width of the input tensor (a hyper-square) on which the receptive fields are derived via autograd
|
|
244
|
+
|
|
245
|
+
verbose: bool, optional
|
|
246
|
+
if true, the function prints parameters for individual trials
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
--------
|
|
250
|
+
receptive_field_size: List[Int]
|
|
251
|
+
receptive field size in all dimension
|
|
252
|
+
|
|
253
|
+
strides: List[Int]
|
|
254
|
+
stride in all dimensions
|
|
255
|
+
|
|
256
|
+
left_paddings: List[Int]
|
|
257
|
+
left padding in all dimensions; this is relevant for aligning the receptive field on the input plane
|
|
258
|
+
|
|
259
|
+
Raises:
|
|
260
|
+
-------
|
|
261
|
+
ValueError
|
|
262
|
+
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
max_stride = max_width // 2
|
|
266
|
+
stride = max_stride // 100
|
|
267
|
+
width = max_width // 100
|
|
268
|
+
|
|
269
|
+
if width_hint is not None: width = 2 * width_hint
|
|
270
|
+
if stride_hint is not None: stride = stride_hint
|
|
271
|
+
|
|
272
|
+
did_it = False
|
|
273
|
+
while width < max_width and stride < max_stride:
|
|
274
|
+
try:
|
|
275
|
+
if verbose: print(f"[inspect_conv_model] trying parameters {width=}, {stride=}")
|
|
276
|
+
receptive_field_size, strides, left_paddings = estimate_conv_parameters(model, num_channels, num_dims, width, stride)
|
|
277
|
+
did_it = True
|
|
278
|
+
except:
|
|
279
|
+
pass
|
|
280
|
+
|
|
281
|
+
if did_it: break
|
|
282
|
+
|
|
283
|
+
width *= 2
|
|
284
|
+
if width >= max_width and stride < max_stride:
|
|
285
|
+
stride *= 2
|
|
286
|
+
width = 2 * stride
|
|
287
|
+
|
|
288
|
+
if not did_it:
|
|
289
|
+
raise ValueError(f'could not determine conv parameter with given max_width={max_width}')
|
|
290
|
+
|
|
291
|
+
return receptive_field_size, strides, left_paddings
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
class GradWeight(torch.autograd.Function):
|
|
295
|
+
def __init__(self):
|
|
296
|
+
super().__init__()
|
|
297
|
+
|
|
298
|
+
@staticmethod
|
|
299
|
+
def forward(ctx, x, weight):
|
|
300
|
+
ctx.save_for_backward(weight)
|
|
301
|
+
return x.clone()
|
|
302
|
+
|
|
303
|
+
@staticmethod
|
|
304
|
+
def backward(ctx, grad_output):
|
|
305
|
+
weight, = ctx.saved_tensors
|
|
306
|
+
|
|
307
|
+
grad_input = grad_output * weight
|
|
308
|
+
|
|
309
|
+
return grad_input, None
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
# API
|
|
313
|
+
|
|
314
|
+
def relegance_gradient_weighting(x, weight):
|
|
315
|
+
"""
|
|
316
|
+
|
|
317
|
+
Args:
|
|
318
|
+
x (torch.tensor): input tensor
|
|
319
|
+
weight (torch.tensor or None): weight tensor for gradients of x; if None, no gradient weighting will be applied in backward pass
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
torch.tensor: the unmodified input tensor x
|
|
323
|
+
|
|
324
|
+
Raises:
|
|
325
|
+
RuntimeError: if estimation of parameters fails due to exceeded compute budget
|
|
326
|
+
"""
|
|
327
|
+
if weight is None:
|
|
328
|
+
return x
|
|
329
|
+
else:
|
|
330
|
+
return GradWeight.apply(x, weight)
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def relegance_create_tconv_kernel(model, num_channels, num_dims, width_hint=None, stride_hint=None, verbose=False):
|
|
335
|
+
""" creates parameters for mapping back output domain relevance to input tomain
|
|
336
|
+
|
|
337
|
+
Args:
|
|
338
|
+
model (nn.Module or autograd.Function): fully convolutional model
|
|
339
|
+
num_channels (int): number of input channels to model
|
|
340
|
+
num_dims (int): number of input dimensions of model (without channel and batch dimension)
|
|
341
|
+
width_hint(int or None): optional hint at maximal width of receptive field
|
|
342
|
+
stride_hint(int or None): optional hint at maximal stride
|
|
343
|
+
|
|
344
|
+
Returns:
|
|
345
|
+
dict: contains kernel, kernel dimensions, strides and left paddings for transposed convolution
|
|
346
|
+
"""
|
|
347
|
+
|
|
348
|
+
max_width = int(100000 / (10 ** num_dims))
|
|
349
|
+
|
|
350
|
+
did_it = False
|
|
351
|
+
try:
|
|
352
|
+
receptive_field_size, strides, left_paddings = inspect_conv_model(model, num_channels, num_dims, max_width=max_width, width_hint=width_hint, stride_hint=stride_hint, verbose=verbose)
|
|
353
|
+
did_it = True
|
|
354
|
+
except:
|
|
355
|
+
# try once again with larger max_width
|
|
356
|
+
max_width *= 10
|
|
357
|
+
|
|
358
|
+
# crash if exception is raised
|
|
359
|
+
try:
|
|
360
|
+
if not did_it: receptive_field_size, strides, left_paddings = inspect_conv_model(model, num_channels, num_dims, max_width=max_width, width_hint=width_hint, stride_hint=stride_hint, verbose=verbose)
|
|
361
|
+
except:
|
|
362
|
+
raise RuntimeError("could not determine parameters within given compute budget")
|
|
363
|
+
|
|
364
|
+
partition_kernel = create_partition_kernel(receptive_field_size, strides)
|
|
365
|
+
partition_kernel = torch.repeat_interleave(partition_kernel, num_channels, 1)
|
|
366
|
+
|
|
367
|
+
tconv_parameters = {
|
|
368
|
+
'kernel': partition_kernel,
|
|
369
|
+
'receptive_field_shape': receptive_field_size,
|
|
370
|
+
'stride': strides,
|
|
371
|
+
'left_padding': left_paddings,
|
|
372
|
+
'num_dims': num_dims
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return tconv_parameters
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def relegance_map_relevance_to_input_domain(od_relevance, tconv_parameters):
|
|
380
|
+
""" maps output-domain relevance to input-domain relevance via transpose convolution
|
|
381
|
+
|
|
382
|
+
Args:
|
|
383
|
+
od_relevance (torch.tensor): output-domain relevance
|
|
384
|
+
tconv_parameters (dict): parameter dict as created by relegance_create_tconv_kernel
|
|
385
|
+
|
|
386
|
+
Returns:
|
|
387
|
+
torch.tensor: input-domain relevance. The tensor is left aligned, i.e. the all-zero index of the output corresponds to the all-zero index of the discriminator input.
|
|
388
|
+
Otherwise, the size of the output tensor does not need to match the size of the discriminator input. Use relegance_resize_relevance_to_input_size for a
|
|
389
|
+
convenient way to adjust the output to the correct size.
|
|
390
|
+
|
|
391
|
+
Raises:
|
|
392
|
+
ValueError: if number of dimensions is not supported
|
|
393
|
+
"""
|
|
394
|
+
|
|
395
|
+
kernel = tconv_parameters['kernel'].to(od_relevance.device)
|
|
396
|
+
rf_shape = tconv_parameters['receptive_field_shape']
|
|
397
|
+
stride = tconv_parameters['stride']
|
|
398
|
+
left_padding = tconv_parameters['left_padding']
|
|
399
|
+
|
|
400
|
+
num_dims = len(kernel.shape) - 2
|
|
401
|
+
|
|
402
|
+
# repeat boundary values
|
|
403
|
+
od_padding = [rf_shape[i//2] // stride[i//2] + 1 for i in range(2 * num_dims)]
|
|
404
|
+
padded_od_relevance = F.pad(od_relevance, od_padding[::-1], mode='replicate')
|
|
405
|
+
od_padding = od_padding[::2]
|
|
406
|
+
|
|
407
|
+
# apply mapping and left trimming
|
|
408
|
+
if num_dims == 1:
|
|
409
|
+
id_relevance = F.conv_transpose1d(padded_od_relevance, kernel, stride=stride)
|
|
410
|
+
id_relevance = id_relevance[..., left_padding[0] + stride[0] * od_padding[0] :]
|
|
411
|
+
elif num_dims == 2:
|
|
412
|
+
id_relevance = F.conv_transpose2d(padded_od_relevance, kernel, stride=stride)
|
|
413
|
+
id_relevance = id_relevance[..., left_padding[0] + stride[0] * od_padding[0] :, left_padding[1] + stride[1] * od_padding[1]:]
|
|
414
|
+
elif num_dims == 3:
|
|
415
|
+
id_relevance = F.conv_transpose2d(padded_od_relevance, kernel, stride=stride)
|
|
416
|
+
id_relevance = id_relevance[..., left_padding[0] + stride[0] * od_padding[0] :, left_padding[1] + stride[1] * od_padding[1]:, left_padding[2] + stride[2] * od_padding[2] :]
|
|
417
|
+
else:
|
|
418
|
+
raise ValueError(f'[relegance_map_to_input_domain] error: num_dims = {num_dims} not supported')
|
|
419
|
+
|
|
420
|
+
return id_relevance
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def relegance_resize_relevance_to_input_size(reference_input, relevance):
|
|
424
|
+
""" adjusts size of relevance tensor to reference input size
|
|
425
|
+
|
|
426
|
+
Args:
|
|
427
|
+
reference_input (torch.tensor): discriminator input tensor for reference
|
|
428
|
+
relevance (torch.tensor): input-domain relevance corresponding to input tensor reference_input
|
|
429
|
+
|
|
430
|
+
Returns:
|
|
431
|
+
torch.tensor: resized relevance
|
|
432
|
+
|
|
433
|
+
Raises:
|
|
434
|
+
ValueError: if number of dimensions is not supported
|
|
435
|
+
"""
|
|
436
|
+
resized_relevance = torch.zeros_like(reference_input)
|
|
437
|
+
|
|
438
|
+
num_dims = len(reference_input.shape) - 2
|
|
439
|
+
with torch.no_grad():
|
|
440
|
+
if num_dims == 1:
|
|
441
|
+
resized_relevance[:] = relevance[..., : min(reference_input.size(-1), relevance.size(-1))]
|
|
442
|
+
elif num_dims == 2:
|
|
443
|
+
resized_relevance[:] = relevance[..., : min(reference_input.size(-2), relevance.size(-2)), : min(reference_input.size(-1), relevance.size(-1))]
|
|
444
|
+
elif num_dims == 3:
|
|
445
|
+
resized_relevance[:] = relevance[..., : min(reference_input.size(-3), relevance.size(-3)), : min(reference_input.size(-2), relevance.size(-2)), : min(reference_input.size(-1), relevance.size(-1))]
|
|
446
|
+
else:
|
|
447
|
+
raise ValueError(f'[relegance_map_to_input_domain] error: num_dims = {num_dims} not supported')
|
|
448
|
+
|
|
449
|
+
return resized_relevance
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from .gru_sparsifier import GRUSparsifier
|
|
2
|
+
from .conv1d_sparsifier import Conv1dSparsifier
|
|
3
|
+
from .conv_transpose1d_sparsifier import ConvTranspose1dSparsifier
|
|
4
|
+
from .linear_sparsifier import LinearSparsifier
|
|
5
|
+
from .common import sparsify_matrix, calculate_gru_flops_per_step
|
|
6
|
+
from .utils import mark_for_sparsification, create_sparsifier
|