def build_dcnn(input_var, batch_size, sentence_len, vocab_size, word_dimension, word_embedding,
               non_static, n_out, arch_params):
    windows = arch_params['windows']
    n_filters = arch_params['n_filters']
    k = arch_params['k']
    activations = arch_params['activations']
    k_top = arch_params['k_top']
    dropout = arch_params['dropout']

    # sentence_len может быть None
    l_in = lasagne.layers.InputLayer(
        shape=(batch_size, sentence_len),
        input_var=input_var
    )

    l_embedding = CNN.embeddings.SentenceEmbeddingLayer(
        l_in,
        vocab_size=vocab_size,
        word_dimension=word_dimension,
        word_embedding=word_embedding,
        non_static=non_static
    )
    assert len(windows) == 2
    assert isinstance(windows[0], tuple)
    assert isinstance(windows[1], tuple)

    l_conv1 = CNN.Conv1DLayerSplitted(
        l_embedding,
        n_filters[0],
        filter_hight=windows[0],
        nonlinearity=lasagne.nonlinearities.linear
    )
    l_fold1 = CNN.folding.FoldingLayer(l_conv1)
    # TODO: Заменить на dynamic k-max-pooling
    l_pool1= CNN.pooling.KMaxPoolLayer(l_fold1, k=k)
    l_nonlinear1 = lasagne.layers.NonlinearityLayer(l_pool1, nonlinearity=parse_activation(activations[0]))

    l_conv2 = CNN.Conv1DLayerSplitted(
        l_nonlinear1,
        n_filters[1],
        filter_hight=windows[1],
        nonlinearity=lasagne.nonlinearities.linear,
        border_mode = "full"
    )
    l_fold2 = CNN.folding.FoldingLayer(l_conv2)
    l_pool2 = CNN.pooling.KMaxPoolLayer(l_fold2, k=k_top)
    l_nonlinear2 = lasagne.layers.NonlinearityLayer(l_pool2, nonlinearity=parse_activation(activations[1]))

    l_dropout2 = lasagne.layers.DropoutLayer(l_nonlinear2, p=dropout)
    l_out = lasagne.layers.DenseLayer(
        l_dropout2,
        num_units=n_out,
        nonlinearity=lasagne.nonlinearities.softmax
    )
    return l_out