Example #1
0
    public void RunGAN()
    {
        ClearNetworks();
        dLosses = 0; tie = 0; gLosses = 0;
        System.Random random = new System.Random();
        //the dimension in this case will have a depth of 4 since it is an ARGB image, thus having 3 color channels and one alpha channel
        inputDimension = new Dimension(imageCount: 1, depth: 4, width: inputImages[0].width, height: inputImages[0].height);
        inputVolume    = Utils.Init4dArr(1, 4, inputDimension.width, inputDimension.height);
        noiseVolume    = Utils.Init4dArr(1, 4, inputDimension.width, inputDimension.height);
        CreateDNet();
        CreateGNet();
        for (int i = 0; i < epochs; i++)
        {
            var pixels = inputImages[random.Next(0, inputImages.Length - 1)].GetPixels();
            for (int y = 0; y < inputDimension.height; y++)
            {
                for (int x = 0; x < inputDimension.width; x++)
                {
                    inputVolume[0][0][x][y] = pixels[x + y * inputDimension.width].a;
                    inputVolume[0][1][x][y] = pixels[x + y * inputDimension.width].r;
                    inputVolume[0][2][x][y] = pixels[x + y * inputDimension.width].g;
                    inputVolume[0][3][x][y] = pixels[x + y * inputDimension.width].b;
                }
            }
            for (int y = 0; y < inputDimension.height; y++)
            {
                for (int x = 0; x < inputDimension.width; x++)
                {
                    noiseVolume[0][0][x][y] = Mathf.PerlinNoise((float)x / (float)inputDimension.width * (float)random.NextDouble(), (float)y / (float)inputDimension.height);
                    noiseVolume[0][1][x][y] = Mathf.PerlinNoise((float)x / (float)inputDimension.width * (float)random.NextDouble(), (float)y / (float)inputDimension.height);
                    noiseVolume[0][2][x][y] = Mathf.PerlinNoise((float)x / (float)inputDimension.width * (float)random.NextDouble(), (float)y / (float)inputDimension.height);
                    noiseVolume[0][3][x][y] = Mathf.PerlinNoise((float)x / (float)inputDimension.width * (float)random.NextDouble(), (float)y / (float)inputDimension.height);
                }
            }
            var detectedImage = dNet.ForwardPropagation(input: inputVolume);
            trueImage             = Utils.Init4dArr(detectedImage.Length, detectedImage[0].Length, detectedImage[0][0].Length, detectedImage[0][0][0].Length);
            falseImage            = trueImage;
            trueImage[0][0][0][0] = 1;
            guess1 = detectedImage[0][0][0][0];
            var generatedImage  = gNet.ForwardPropagation(noiseVolume);
            var generatedImage2 = dNet.ForwardPropagation(generatedImage);
            guess2 = generatedImage2[0][0][0][0];

            if (guess1 > guess2)
            {
                gLosses++;
                gNet.GBackwardPropagation(actual: generatedImage, expected: inputVolume);
            }
            else if (guess1 == guess2)
            {
                tie++;
                Debug.Log("Tie!");
                SetPixels(textureFromNoise, generatedImage);
                break;
            }
            else
            {
                dLosses++;
                dNet.DBackwardPropagation(actual: detectedImage, expected: trueImage);
                dNet.DBackwardPropagation(actual: generatedImage2, expected: falseImage);
            }
        }
    }