Exemple #1
0
        ///<summary>Реализует слой StyleSwap.</summary>
        ///<param name="Content">Карты признаков контентного изображения.</param>
        ///<param name="Style">Карты признаков стилевого изображения.</param>
        public static Tensor StyleSwap(Tensor Content, Tensor Style, int patch_size = 3, int stride = 2)
        {
            var style_kernels      = extract_image_patches(Style, patch_size, stride);
            var style_kernels_norm = l2_norm(style_kernels);
            var ss_enc             = Layers.Conv2D(Content, style_kernels_norm, stride);
            var ss_argmax          = argmax(ss_enc);
            var encC        = ss_enc.Depth;
            var ss_oh       = one_hot(ss_argmax, encC);
            var ss_dec      = Layers.ConvTranspose2D(ss_oh, style_kernels, stride);
            var ss_oh_sum   = reduce_sum(ss_oh);
            var filter_ones = new Tensor[1] {
                ones(patch_size, patch_size, stride)
            };
            var counting = Layers.ConvTranspose2D(ss_oh_sum, filter_ones, stride);

            counting = tile(counting, Content.Depth);
            return(divide(ss_dec, counting));
        }
Exemple #2
0
        ///<summary>Выполняет прямой проход через кодирующую нейросеть.</summary>
        ///<param name="input">Входные данные.</param>
        public Tensor Encode(Tensor input)
        {
            var Temp = Layers.Conv2D(input, this.Data.Conv1_1_Weights, this.Data.Conv1_1_Biases);

            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.ReLU(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.Conv2D(Temp, this.Data.Conv1_2_Weights, this.Data.Conv1_2_Biases);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.ReLU(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.MaxPool2D(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.Conv2D(Temp, this.Data.Conv2_1_Weights, this.Data.Conv2_1_Biases);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.ReLU(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.Conv2D(Temp, this.Data.Conv2_2_Weights, this.Data.Conv2_2_Biases);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.ReLU(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.MaxPool2D(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.Conv2D(Temp, this.Data.Conv3_1_Weights, this.Data.Conv3_1_Biases);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.ReLU(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.Conv2D(Temp, this.Data.Conv3_2_Weights, this.Data.Conv3_2_Biases);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.ReLU(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.Conv2D(Temp, this.Data.Conv3_3_Weights, this.Data.Conv3_3_Biases);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.ReLU(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.Conv2D(Temp, this.Data.Conv3_4_Weights, this.Data.Conv3_4_Biases);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.ReLU(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.MaxPool2D(Temp);
            if (Step != null)
            {
                Step(5);
            }
            Temp = Layers.Conv2D(Temp, this.Data.Conv4_1_Weights, this.Data.Conv4_1_Biases);
            Temp = Layers.ReLU(Temp);
            if (Step != null)
            {
                Step(5);
            }
            return(Temp);
        }
        ///<summary>Выполняет прямой проход через сеть-трансформер.</summary>
        ///<param name="input">Входные данные.</param>
        public Tensor Stylize(Tensor input)
        {
            var Temp = Layers.Conv2D(input, this.Data.Conv1_Weights, 1);

            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.InstanceNorm2D(Temp, this.Data.Conv1_Shift, this.Data.Conv1_Scale);
            Temp = Layers.ReLU(Temp);
            Temp = Layers.Conv2D(Temp, this.Data.Conv2_Weights, 2);
            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.InstanceNorm2D(Temp, this.Data.Conv2_Shift, this.Data.Conv2_Scale);
            Temp = Layers.ReLU(Temp);
            Temp = Layers.Conv2D(Temp, this.Data.Conv3_Weights, 2);
            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.InstanceNorm2D(Temp, this.Data.Conv3_Shift, this.Data.Conv3_Scale);
            Temp = Layers.ReLU(Temp);
            Temp = Layers.ResBlock(Temp, this.Data.ResBlock1);
            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.ResBlock(Temp, this.Data.ResBlock2);
            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.ResBlock(Temp, this.Data.ResBlock3);
            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.ResBlock(Temp, this.Data.ResBlock4);
            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.ResBlock(Temp, this.Data.ResBlock5);
            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.ConvTranspose2D(Temp, this.Data.TConv1_Weights, 2);
            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.InstanceNorm2D(Temp, this.Data.TConv1_Shift, this.Data.TConv1_Scale);
            Temp = Layers.ReLU(Temp);
            Temp = Layers.ConvTranspose2D(Temp, this.Data.TConv2_Weights, 2);
            if (Step != null)
            {
                Step(10);
            }
            Temp = Layers.InstanceNorm2D(Temp, this.Data.TConv2_Shift, this.Data.TConv2_Scale);
            Temp = Layers.ReLU(Temp);
            Temp = Layers.Conv2D(Temp, this.Data.TConv3_Weights, 1);
            Temp = Layers.InstanceNorm2D(Temp, this.Data.TConv3_Shift, this.Data.TConv3_Scale);
            Temp = Layers.Tanh(Temp);
            return(Temp);
        }