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); } } }