from .graphs import (
    build_wavelet_1d_2d_cnn_mlp,
    build_conv_1d_dense_net,
    build_conv_1d_vgg,
    build_mfcc_2d_conv,
    build_mfcc_2d_densenet,
)


ALL_MODELS = {
    '1': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            should_share_wavelet=True,
            n_wavelets=32,
            wavelet_range=[k for k in range(1, 33)],
            wavelet_length=8,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 8, 1, 2, 128, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 128, 'selu'),
                (4, 16, 1, 2, 256, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
            ],
            dense_structure=[
                (2048, 'selu'),
                (2048, 'selu'),
            ],
            l2_regularize=0.00001,
        ), {
            'wavelet_dropout_prob': 0.1,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.2,
        },
    ),
    '2': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            n_wavelets=32,
            wavelet_range=[4*k for k in range(1, 25)],
            wavelet_length=-1,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                # (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 8, 1, 2, 128, 'selu'),
                # (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 128, 'selu'),
                (4, 16, 1, 2, 256, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
            ],
            dense_structure=[
                (2048, 'selu'),
                (2048, 'selu'),
            ],
            should_share_wavelet=False,
            l2_regularize=0.00001,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.1,
        },
    ),
    '3': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            n_wavelets=32,
            wavelet_range=[4*k for k in range(1, 11)],
            wavelet_length=-1,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 32, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 32, 'selu'),
                (2, 8, 1, 2, 64, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, -1, 'pooling'),
            ],
            dense_structure=[
                (1024, 'selu'),
                (512, 'selu'),
            ],
            should_share_wavelet=False,
            l2_regularize=0.00001,
        ), {
            'wavelet_dropout_prob': 0.2,
            'conv_dropout_prob': 0.2,
            'dense_dropout_prob': 0.5,
        },
    ),
    '4': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            n_wavelets=16,
            wavelet_range=[4*k for k in range(1, 9)],
            wavelet_length=-1,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 32, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, -1, 'pooling'),
            ],
            dense_structure=[
                (512, 'selu'),
            ],
            should_share_wavelet=False,
            l2_regularize=0.00001,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.0,
        },
    ),
    '5': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            n_wavelets=16,
            wavelet_range=[4*k for k in range(1, 9)],
            wavelet_length=-1,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 32, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, -1, 'pooling'),
            ],
            dense_structure=[
                (512, 'selu'),
            ],
            should_share_wavelet=False,
            l2_regularize=0.00001,
        ), {
            'wavelet_dropout_prob': 0.1,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.2,
        },
    ),
    '6_dense_1d': (
        lambda input_dim, output_dim: build_conv_1d_dense_net(
            input_dim,
            output_dim,
            dense_net_structure=(
            # n_layers, n_kernels, n_compressed_kernels,
            # window_length, activation, gated, pool_length
                (4, 8, 16, 4, '', True, 2),
                (6, 16, 32, 8, '', True, 4),
                (12, 16, 32, 16, 'selu', False, 4),
                (16, 32, 64, 32, 'selu', False, 8),
            ),
            dense_structure=(
                (1024, 'selu'),
            )
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.05,
            'dense_dropout_prob': 0.1,
        },
    ),
    '7_dense_1d_121': (
        lambda input_dim, output_dim: build_conv_1d_dense_net(
            input_dim,
            output_dim,
            dense_net_structure=(
            # n_layers, n_kernels, n_compressed_kernels,
            # window_length, activation, gated, pool_length
                (6, 8, 32, 4, '', True, 2),
                (12, 16, 64, 8, '', True, 4),
                (24, 16, 64, 16, 'selu', False, 4),
                (16, 32, 128, 32, 'selu', False, 4),
            ),
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            )
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.3,
        },
    ),
    '8': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            n_wavelets=64,
            wavelet_range=[2**k for k in range(6)],
            wavelet_length=16,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 32, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 32, 'selu'),
                (2, 8, 1, 2, 64, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, -1, 'pooling'),
            ],
            dense_structure=[
                (1024, 'selu'),
                (1024, 'selu'),
            ],
            should_share_wavelet=True,
            wavelet_use_gated_activation=True,
            l2_regularize=0.00001,
        ), {
            'wavelet_dropout_prob': 0.1,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.2,
        },
    ),
    '9_dense_1d': (
        lambda input_dim, output_dim: build_conv_1d_dense_net(
            input_dim,
            output_dim,
            dense_net_structure=(
            # n_layers, n_kernels, n_compressed_kernels,
            # window_length, activation, gated, pool_length
                (2, 16, 16, 4, '', True, 2),
                (2, 16, 16, 8, 'selu', False, 2),
                (4, 16, 24, 16, 'selu', False, 2),
                (4, 16, 24, 32, 'selu', False, 2),
                (4, 16, 64, 64, 'selu', False, 2),
                (8, 32, 128, 128, 'selu', False, 2),
                (8, 32, 128, 256, 'selu', False, 4),
                (16, 128, 128, 512, 'selu', False, 4),
            ),
            dense_structure=(
                (1024, 'selu'),
                (1024, 'selu'),
            ),
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.2,
        },
    ),
    '10': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            should_share_wavelet=True,
            n_wavelets=64,
            wavelet_range=[k for k in range(1, 65)],
            wavelet_length=8,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 8, 1, 2, 128, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 128, 'selu'),
                (4, 16, 1, 2, 256, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
            ],
            dense_structure=[
                (4096, 'selu'),
                (4096, 'selu'),
            ],
            l2_regularize=0.00001,
        ), {
            'wavelet_dropout_prob': 0.1,
            'conv_dropout_prob': 0.2,
            'dense_dropout_prob': 0.3,
        },
    ),
    '11': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            should_share_wavelet=True,
            n_wavelets=64,
            wavelet_range=[k for k in range(1, 65)],
            wavelet_length=8,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 8, 1, 2, 128, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 128, 'selu'),
                (4, 16, 1, 2, 256, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
            ],
            dense_structure=[
                (4096, 'selu'),
                (4096, 'selu'),
            ],
            wavelet_use_gated_activation=True,
            l2_regularize=0.00001,
        ), {
            'wavelet_dropout_prob': 0.1,
            'conv_dropout_prob': 0.2,
            'dense_dropout_prob': 0.3,
        },
    ),
    '12_dense_1d': (
        lambda input_dim, output_dim: build_conv_1d_dense_net(
            input_dim,
            output_dim,
            dense_net_structure=(
            # n_layers, n_kernels, n_compressed_kernels,
            # window_length, activation, gated, pool_length
                (2, 16, 16, 4, '', True, 2),
                (2, 16, 16, 8, 'selu', False, 2),
                (4, 16, 24, 16, 'selu', False, 2),
                (4, 16, 24, 32, 'selu', False, 2),
                (4, 16, 64, 64, 'selu', False, 2),
                (8, 32, 128, 128, 'selu', False, 2),
                (8, 32, 128, 256, 'selu', False, 4),
                (16, 128, 128, 512, 'selu', False, 4),
            ),
            dense_structure=(
                (1024, 'selu'),
                (1024, 'selu'),
            ),
            do_global_pooling=True,
            log_epsilon=1.,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.2,
        },
    ),
    '13_dense_1d_121': (
        lambda input_dim, output_dim: build_conv_1d_dense_net(
            input_dim,
            output_dim,
            dense_net_structure=(
            # n_layers, n_kernels, n_compressed_kernels,
            # window_length, activation, gated, pool_length
                (6, 8, 32, 4, '', True, 2),
                (12, 16, 64, 8, '', True, 4),
                (24, 16, 64, 16, 'selu', False, 4),
                (16, 32, 128, 32, 'selu', False, 4),
            ),
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            log_epsilon=1.,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.3,
        },
    ),
    '14_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=32,
            num_mel_bins=64,
            conv_structure=[
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 1, 1, 32, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (5, 5, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (7, 7, 1, 1, 128, 'selu'),
                (11, 11, 1, 1, 256, 'selu'),
                (3, 3, 3, 3, -1, 'pooling'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            )
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.1,
        },
    ),
    '15_mfcc_global_pool': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=32,
            num_mel_bins=64,
            conv_structure=[
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 1, 1, 32, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (5, 5, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (7, 7, 1, 1, 128, 'selu'),
                (11, 11, 1, 1, 256, 'selu'),
                (3, 3, 3, 3, -1, 'pooling'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.1,
        },
    ),
    '16_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=64,
            num_mel_bins=128,
            conv_structure=[
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 1, 1, 32, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (5, 5, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (7, 7, 1, 1, 128, 'selu'),
                (11, 11, 1, 1, 256, 'selu'),
                (3, 3, 3, 3, -1, 'pooling'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            )
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '17_mfcc_global_pool': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=64,
            num_mel_bins=128,
            conv_structure=[
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 1, 1, 32, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (5, 5, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (7, 7, 1, 1, 128, 'selu'),
                (11, 11, 1, 1, 256, 'selu'),
                (3, 3, 3, 3, -1, 'pooling'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '18_mfcc_densenet': (
        lambda input_dim, output_dim: build_mfcc_2d_densenet(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=64,
            num_mel_bins=128,
            densenet_structure=[
            # n_layers, n_kernels, n_compressed_kernels,
            # kernel_width, kernel_height, activation, pool_length
                (6, 8, 32, 2, 2, 'selu', 2, 2),
                (12, 16, 64, 3, 3, 'selu', 2, 2),
                (24, 16, 64, 5, 5, 'selu', 2, 2),
                (16, 32, 128, 7, 7, 'selu', 2, 2),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            )
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '19_mfcc_densenet_pool': (
        lambda input_dim, output_dim: build_mfcc_2d_densenet(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=64,
            num_mel_bins=128,
            densenet_structure=[
            # n_layers, n_kernels, n_compressed_kernels,
            # kernel_width, kernel_height, activation, pool_length
                (6, 8, 32, 2, 2, 'selu', 2, 2),
                (12, 16, 64, 3, 3, 'selu', 2, 2),
                (24, 16, 128, 5, 5, 'selu', 2, 2),
                (16, 32, 256, 7, 7, 'selu', 2, 2),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '20_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=128,
            num_mel_bins=256,
            conv_structure=[
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 1, 1, 32, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (5, 5, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (7, 7, 1, 1, 128, 'selu'),
                (11, 11, 1, 1, 256, 'selu'),
                (3, 3, 3, 3, -1, 'pooling'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '21_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=128,
            num_mel_bins=128,
            conv_structure=[
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 1, 1, 32, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (5, 5, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (7, 7, 1, 1, 128, 'selu'),
                (11, 11, 1, 1, 256, 'selu'),
                (3, 3, 3, 3, -1, 'pooling'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '22_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=128,
            num_mel_bins=128,
            conv_structure=[
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 1, 1, 32, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (5, 5, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (7, 7, 1, 1, 128, 'selu'),
                (11, 11, 1, 1, 256, 'selu'),
                (3, 3, 3, 3, -1, 'pooling'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            conv_with_bias=True,
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '23_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=500,
            frame_step=100,
            n_mfccs=128,
            num_mel_bins=256,
            conv_structure=[
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 1, 1, 32, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (5, 5, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (7, 7, 1, 1, 128, 'selu'),
                (11, 11, 1, 1, 256, 'selu'),
                (3, 3, 3, 3, -1, 'pooling'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            conv_with_bias=True,
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '24_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=480,
            frame_step=160,
            n_mfccs=13,
            num_mel_bins=40,
            conv_structure=[
                (2, 2, 1, 1, 16, 'selu'),
                (2, 2, 1, 1, 16, 'selu'),
                (3, 3, 1, 1, 24, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 32, 'selu'),
                (3, 3, 1, 1, 32, 'selu'),
                (5, 5, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (7, 7, 1, 1, 64, 'selu'),
                (11, 11, 1, 1, 128, 'selu'),
                (3, 3, 3, 3, -1, 'pooling'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            conv_with_bias=True,
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '25': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            should_share_wavelet=True,
            n_wavelets=32,
            wavelet_range=[k for k in range(1, 33)],
            wavelet_length=8,
            conv_structure=[
                (2, 4, 1, 1, 16, 'selu'),
                (2, 4, 1, 1, 16, 'selu'),
                (2, 4, 1, 1, 16, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 1, 32, 'selu'),
                (2, 4, 1, 1, 32, 'selu'),
                (2, 4, 2, 2, 32, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 8, 1, 2, 64, 'selu'),
                (2, 8, 2, 2, 64, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 8, 2, 2, 128, 'selu'),
            ],
            dense_structure=[
                (2048, 'selu'),
                (2048, 'selu'),
            ],
            l2_regularize=0.00001,
            wavelet_use_gated_activation=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '26_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=64,
            num_mel_bins=64,
            conv_structure=[
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            conv_with_bias=True,
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '27_mfcc': ( # almost the same as 26_mfcc except with batch_norm
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=64,
            num_mel_bins=64,
            conv_structure=[
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            conv_with_bias=True,
            batch_norm=True,
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '28_mfcc_resnet_pool': (
        lambda input_dim, output_dim: build_mfcc_2d_densenet(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=64,
            num_mel_bins=64,
            densenet_structure=[
            # n_layers, n_kernels, n_compressed_kernels,
            # kernel_width, kernel_height, activation, pool_length
                (1, 64, None, 2, 2, 'relu', 1, 1),
                (1, 64, None, 2, 2, 'relu', 1, 1),
                (1, 64, None, 2, 2, 'relu', 1, 1),
                (1, 64, None, 2, 2, 'relu', 1, 1),
                (1, 64, None, 2, 2, 'relu', 1, 1),
                (1, 64, None, 2, 2, 'relu', 1, 1),
                (1, 64, None, 2, 2, 'relu', 2, 2),
                (1, 128, None, 3, 3, 'relu', 1, 1),
                (1, 128, None, 3, 3, 'relu', 1, 1),
                (1, 128, None, 3, 3, 'relu', 1, 1),
                (1, 128, None, 3, 3, 'relu', 1, 1),
                (1, 128, None, 3, 3, 'relu', 1, 1),
                (1, 128, None, 3, 3, 'relu', 1, 1),
                (1, 128, None, 3, 3, 'relu', 1, 1),
                (1, 128, None, 3, 3, 'relu', 2, 2),
                (1, 256, None, 3, 3, 'relu', 1, 1),
                (1, 256, None, 3, 3, 'relu', 1, 1),
                (1, 256, None, 3, 3, 'relu', 1, 1),
                (1, 256, None, 3, 3, 'relu', 1, 1),
                (1, 256, None, 3, 3, 'relu', 1, 1),
                (1, 256, None, 3, 3, 'relu', 1, 1),
                (1, 256, None, 3, 3, 'relu', 1, 1),
                (1, 256, None, 3, 3, 'relu', 2, 2),
                (1, 512, None, 3, 3, 'relu', 1, 1),
                (1, 512, None, 3, 3, 'relu', 1, 1),
                (1, 512, None, 3, 3, 'relu', 1, 1),
                (1, 512, None, 3, 3, 'relu', 1, 1),
                (1, 512, None, 3, 3, 'relu', 1, 1),
                (1, 512, None, 3, 3, 'relu', 1, 1),
                (1, 512, None, 3, 3, 'relu', 1, 1),
                (1, 512, None, 3, 3, 'relu', 2, 2),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '29': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            should_share_wavelet=True,
            n_wavelets=64,
            wavelet_range=[k for k in range(1, 17)],
            wavelet_length=8,
            conv_structure=[
                (1, 2, 1, 1, 64, 'selu'),
                (1, 2, 1, 1, 64, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 1, 128, 'selu'),
                (2, 4, 1, 1, 128, 'selu'),
                (2, 4, 1, 2, 128, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 256, 'selu'),
                (2, 4, 1, 2, 256, 'selu'),
                (2, 4, 1, 2, 256, 'selu'),
                (2, 2, 2, 2, -1, 'pooling'),
                (2, 4, 1, 2, 512, 'selu'),
                (2, 4, 1, 2, 512, 'selu'),
                (2, 4, 2, 4, 512, 'selu'),
            ],
            dense_structure=[
                (4096, 'selu'),
                (4096, 'selu'),
            ],
            l2_regularize=0.00001,
            do_global_pooling=True,
            wavelet_pool_size=2,
            batch_norm=True,
            wavelet_use_gated_activation=False
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.2,
        },
    ),
    '30_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (-1, 4, 4, 'pooling'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 2, 'selu'),
                (-1, 4, 4, 'pooling'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 2, 'selu'),
                (-1, 4, 4, 'pooling'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 2, 'selu'),
            ),
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            )
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.05,
            'dense_dropout_prob': 0.1,
        },
    ),
    '31_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (-1, 4, 4, 'pooling'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 2, 'selu'),
                (-1, 4, 4, 'pooling'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 2, 'selu'),
                (-1, 4, 4, 'pooling'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 2, 'selu'),
            ),
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            ),
            log_epsilon=1e-6,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.05,
            'dense_dropout_prob': 0.1,
        },
    ),
    '32_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (-1, 4, 4, 'pooling'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 2, 'selu'),
                (-1, 4, 4, 'pooling'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 2, 'selu'),
                (-1, 4, 4, 'pooling'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 2, 'selu'),
            ),
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            ),
            do_global_pooling=False,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.05,
            'dense_dropout_prob': 0.1,
        },
    ),
    '33_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (-1, 4, 4, 'pooling'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 2, 'selu'),
                (-1, 4, 4, 'pooling'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 2, 'selu'),
                (-1, 4, 4, 'pooling'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 2, 'selu'),
            ),
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            ),
            log_epsilon=1e-6,
            do_global_pooling=False,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.05,
            'dense_dropout_prob': 0.1,
        },
    ),
    '34_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (-1, 6, 4, 'pooling'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 2, 'selu'),
                (-1, 6, 4, 'pooling'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 2, 'selu'),
                (-1, 6, 4, 'pooling'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 2, 'selu'),
            ),
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            ),
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.05,
            'dense_dropout_prob': 0.1,
        },
    ),
    '35_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (-1, 6, 4, 'pooling'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 2, 'selu'),
                (-1, 6, 4, 'pooling'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 1, 'selu'),
                (256, 32, 2, 'selu'),
                (-1, 6, 4, 'pooling'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 1, 'selu'),
                (512, 4, 2, 'selu'),
            ),
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            ),
            do_global_pooling=False,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.05,
            'dense_dropout_prob': 0.1,
        },
    ),
    '36_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (16, 8, 1, 'selu'),
                (16, 8, 2, 'selu'),
                (16, 4, 4, 'relu'),
                (32, 8, 1, 'selu'),
                (32, 8, 1, 'selu'),
                (32, 8, 2, 'selu'),
                (32, 4, 4, 'relu'),
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (64, 16, 2, 'selu'),
                (64, 4, 4, 'relu'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 2, 'selu'),
            ),
            dense_structure=(),
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.0,
        },
    ),
    '37_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (64, 8, 1, 'selu'),
                (64, 8, 1, 'selu'),
                (64, 4, 4, 'pooling'),
                (128, 8, 1, 'selu'),
                (128, 8, 1, 'selu'),
                (128, 8, 2, 'selu'),
                (128, 4, 4, 'pooling'),
                (256, 16, 1, 'selu'),
                (256, 16, 1, 'selu'),
                (256, 16, 1, 'selu'),
                (256, 16, 2, 'selu'),
                (256, 4, 4, 'pooling'),
                (512, 16, 1, 'selu'),
                (512, 16, 1, 'selu'),
                (512, 16, 2, 'selu'),
                (512, 16, 2, 'selu'),
            ),
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            ),
            do_global_pooling=False,
            conv_with_bias=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.0,
        },
    ),
    '38_mfcc_resnet_pool': (
        lambda input_dim, output_dim: build_mfcc_2d_densenet(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=64,
            num_mel_bins=64,
            densenet_structure=[
            # n_layers, n_kernels, n_compressed_kernels,
            # kernel_width, kernel_height, activation, pool_length
                (5, 16, 32, 2, 2, 'relu', 2, 2),
                (5, 24, 48, 2, 2, 'relu', 2, 2),
                (5, 32, 64, 3, 3, 'relu', 2, 2),
                (5, 32, 64, 3, 3, 'relu', 2, 2),
                (5, 64, 128, 3, 3, 'relu', 2, 2),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            do_global_pooling=False,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '39_mfcc_resnet_pool': (
        lambda input_dim, output_dim: build_mfcc_2d_densenet(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=64,
            num_mel_bins=64,
            densenet_structure=[
            # n_layers, n_kernels, n_compressed_kernels,
            # kernel_width, kernel_height, activation, pool_length
                (5, 16, 32, 2, 2, 'relu', 2, 2),
                (5, 24, 48, 2, 2, 'relu', 2, 2),
                (5, 32, 64, 3, 3, 'relu', 2, 2),
                (5, 32, 64, 3, 3, 'relu', 2, 2),
                (5, 64, 128, 3, 3, 'relu', 1, 1),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '40_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=128,
            num_mel_bins=128,
            conv_structure=[
                (3, 3, 2, 2, 128, 'selu'),
                (1, 1, 1, 1, 64, 'selu'),
                (1, 1, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (3, 3, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, 64, 'selu'),
                (1, 1, 1, 1, 128, 'selu'),
                (1, 1, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, 128, 'selu'),
                (1, 1, 1, 1, 256, 'selu'),
                (1, 1, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (2, 2, 2, 2, 256, 'selu'),
                (1, 1, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (1, 1, 1, 1, 512, 'selu'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            conv_with_bias=True,
            batch_norm=True,
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '41_mfcc_densenet': (
        lambda input_dim, output_dim: build_mfcc_2d_densenet(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=64,
            num_mel_bins=128,
            densenet_structure=[
            # n_layers, n_kernels, n_compressed_kernels,
            # kernel_width, kernel_height, activation, pool_length
                (3, 8, 8, 2, 2, 'selu', 2, 2),
                (6, 16, 10, 3, 3, 'selu', 2, 2),
                (8, 16, 12, 3, 3, 'selu', 2, 2),
                (8, 32, 24, 3, 3, 'selu', 2, 2),
            ],
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            ),
            do_global_pooling=False,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.0,
        },
    ),
    '42_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (16, 8, 1, 'selu'),
                (16, 8, 1, 'selu'),
                (16, 4, 4, 'selu'),
                (None, None, None, 'skip'),
                (32, 8, 1, 'selu'),
                (32, 8, 1, 'selu'),
                (32, 8, 2, 'selu'),
                (32, 4, 4, 'selu'),
                (None, None, None, 'skip'),
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (64, 16, 2, 'selu'),
                (64, 4, 4, 'selu'),
                (None, None, None, 'skip'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 2, 'selu'),
                (128, 16, 2, 'selu'),
            ),
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            ),
            do_global_pooling=True,
            conv_with_bias=True,
            samplewise_norm=False,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.0,
        },
    ),
    '43_conv_1d_vgg': (
        lambda input_dim, output_dim: build_conv_1d_vgg(
            input_dim,
            output_dim,
            conv_structure=(
                (16, 8, 1, 'selu'),
                (16, 8, 1, 'selu'),
                (16, 4, 4, 'selu'),
                (None, None, None, 'skip'),
                (32, 8, 1, 'selu'),
                (32, 8, 1, 'selu'),
                (32, 8, 2, 'selu'),
                (32, 4, 4, 'selu'),
                (None, None, None, 'skip'),
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (64, 16, 1, 'selu'),
                (64, 16, 2, 'selu'),
                (64, 4, 4, 'selu'),
                (None, None, None, 'skip'),
                (128, 16, 1, 'selu'),
                (128, 16, 1, 'selu'),
                (128, 16, 2, 'selu'),
                (128, 16, 2, 'selu'),
            ),
            dense_structure=(
                (2048, 'selu'),
                (2048, 'selu'),
            ),
            do_global_pooling=True,
            conv_with_bias=True,
            samplewise_norm=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.0,
        },
    ),
    '44_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=64,
            num_mel_bins=64,
            conv_structure=[
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, 32, 'tanh'),
                (None, None, None, None, None, 'skip'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, 64, 'tanh'),
                (None, None, None, None, None, 'skip'),
                (3, 3, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (2, 2, 2, 2, 128, 'tanh'),
                (None, None, None, None, None, 'skip'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (2, 2, 2, 2, 256, 'tanh'),
                (None, None, None, None, None, 'skip'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            conv_with_bias=True,
            batch_norm=True,
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.1,
            'dense_dropout_prob': 0.1,
        },
    ),
    '45': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            should_share_wavelet=False,
            n_wavelets=32,
            wavelet_range=[2**k for k in range(9)],
            wavelet_length=16,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 8, 1, 2, 128, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 128, 'selu'),
                (4, 16, 1, 2, 256, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
            ],
            dense_structure=[
                (2048, 'selu'),
                (2048, 'selu'),
            ],
            l2_regularize=0.00001,
            do_global_pooling=True,
            batch_norm=True,
            wavelet_use_gated_activation=True,
            wavelet_pool_size=2,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.0,
        },
    ),
    '46_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=128,
            num_mel_bins=128,
            conv_structure=[
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, 64, 'selu'),
                (None, None, None, None, None, 'skip'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (2, 2, 2, 2, 128, 'selu'),
                (None, None, None, None, None, 'skip'),
                (3, 3, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (3, 3, 1, 1, 256, 'selu'),
                (2, 2, 2, 2, 256, 'selu'),
                (None, None, None, None, None, 'skip'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (2, 2, 2, 2, 512, 'selu'),
                (None, None, None, None, None, 'skip'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
                (3, 3, 1, 1, 512, 'selu'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            conv_with_bias=True,
            batch_norm=True,
            do_global_pooling=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.1,
        },
    ),
    '47_mfcc': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=64,
            num_mel_bins=64,
            conv_structure=[
                (2, 64, 1, 1, 64, 'selu'),
                (2, 64, 2, 1, 64, 'selu'),
                (3, 64, 1, 1, 128, 'selu'),
                (2, 64, 2, 1, 128, 'selu'),
                (3, 64, 2, 1, 256, 'selu'),
                (2, 64, 2, 1, 256, 'selu'),
                (3, 64, 2, 1, 512, 'selu'),
                (2, 64, 2, 1, 512, 'selu'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            conv_with_bias=True,
            batch_norm=True,
            do_global_pooling=False,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.1,
        },
    ),
    '48': (
        lambda input_dim, output_dim: build_wavelet_1d_2d_cnn_mlp(
            input_dim,
            output_dim,
            should_share_wavelet=True,
            n_wavelets=32,
            wavelet_range=[k for k in range(1, 33)],
            wavelet_length=8,
            conv_structure=[
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 32, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 4, 1, 2, 64, 'selu'),
                (2, 8, 1, 2, 128, 'selu'),
                (1, 2, 1, 2, -1, 'pooling'),
                (4, 16, 1, 2, 128, 'selu'),
                (4, 16, 1, 2, 256, 'selu'),
            ],
            dense_structure=[
                (4096, 'selu'),
                (4096, 'selu'),
            ],
            l2_regularize=0.00001,
            do_global_pooling=True,
            batch_norm=True,
            wavelet_use_gated_activation=False,
            wavelet_pool_size=2,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.0,
        },
    ),
    '49_mfcc_global_pool': (
        lambda input_dim, output_dim: build_mfcc_2d_conv(
            input_dim,
            output_dim,
            frame_length=240,
            frame_step=80,
            n_mfccs=128,
            num_mel_bins=128,
            conv_structure=[
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 1, 1, 32, 'selu'),
                (2, 2, 2, 2, 32, 'selu'),
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 1, 1, 64, 'selu'),
                (2, 2, 2, 2, 64, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (3, 3, 2, 2, 128, 'selu'),
                (3, 3, 1, 1, 128, 'selu'),
                (4, 4, 4, 4, 256, 'selu'),
                (5, 5, 1, 1, 256, 'selu'),
                (5, 5, 1, 1, 256, 'selu'),
                (7, 7, 2, 2, 512, 'selu'),
            ],
            dense_structure=(
                (4096, 'selu'),
                (4096, 'selu'),
            ),
            do_global_pooling=True,
            conv_with_bias=True,
            batch_norm=True,
        ), {
            'wavelet_dropout_prob': 0.0,
            'conv_dropout_prob': 0.0,
            'dense_dropout_prob': 0.1,
        },
    ),
}
