From 8ff8b7535e954caddf2c5daccb452c5997b26dcb Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Tue, 13 Jul 2021 18:14:48 +0530 Subject: [PATCH 01/20] added pycache to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 86308f8c..61b9dd79 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ cmake-build-* *.a *.so data +utils/__pycache__ \ No newline at end of file From a1bf251a7ac37f8df258f8ab25c6131219782cd6 Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Sun, 25 Jul 2021 17:13:02 +0530 Subject: [PATCH 02/20] Training Script for GAN --- mnist_gan/Makefile | 36 ++++++++ mnist_gan/mnist_gan.cpp | 191 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 mnist_gan/Makefile create mode 100644 mnist_gan/mnist_gan.cpp diff --git a/mnist_gan/Makefile b/mnist_gan/Makefile new file mode 100644 index 00000000..a11bf622 --- /dev/null +++ b/mnist_gan/Makefile @@ -0,0 +1,36 @@ + +TARGET := mnist_gan +SRC := mnist_gan.cpp +LIBS_NAME := armadillo mlpack + +CXX := g++ +# CXXFLAGS += -std=c++11 -Wall -Wextra -O3 -DNDEBUG -fopenmp +# Use these CXXFLAGS instead if you want to compile with debugging symbols and +# without optimizations. +CXXFLAGS += -std=c++11 -Wall -Wextra -g -O0 +LDFLAGS += -fopenmp +LDFLAGS += -lboost_serialization +LDFLAGS += -larmadillo +LDFLAGS += -L /home/viole/mlpack/build/lib/ # /path/to/mlpack/library/ # if installed locally. +# Add header directories for any includes that aren't on the +# default compiler search path. +INCLFLAGS := -I /home/viole/mlpac/build/include/ +CXXFLAGS += $(INCLFLAGS) + +OBJS := $(SRC:.cpp=.o) +LIBS := $(addprefix -l,$(LIBS_NAME)) +CLEAN_LIST := $(TARGET) $(OBJS) + +# default rule +default: all + +$(TARGET): $(OBJS) + $(CXX) $(CXXFLAGS) $(OBJS) -o $(TARGET) $(LDFLAGS) $(LIBS) + +.PHONY: all +all: $(TARGET) + +.PHONY: clean +clean: + @echo CLEAN $(CLEAN_LIST) + @rm -f $(CLEAN_LIST) \ No newline at end of file diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp new file mode 100644 index 00000000..40379142 --- /dev/null +++ b/mnist_gan/mnist_gan.cpp @@ -0,0 +1,191 @@ +#include + +#include +#include +#include +#include +#include +#include + +#include + +using namespace mlpack; +using namespace mlpack::data; +using namespace mlpack::ann; +using namespace mlpack::math; +using namespace mlpack::regression; +using namespace std::placeholders; + +int main() +{ + size_t trainRatio = 0.8; + size_t dNumKernels = 32; + size_t discriminatorPreTrain = 5; + size_t batchSize = 64; + size_t noiseDim = 100; + size_t generatorUpdateStep = 1; + size_t numSamples = 10; + size_t cycles = 10; + double stepSize = 0.0003; + double eps = 1e-8; + size_t numEpochs = 1; + double tolerance = 1e-5; + bool shuffle = true; + double multiplier = 10; + + std::cout << std::boolalpha + << " batchSize = " << batchSize << std::endl + << " generatorUpdateStep = " << generatorUpdateStep << std::endl + << " noiseDim = " << noiseDim << std::endl + << " numSamples = " << numSamples << std::endl + << " stepSize = " << stepSize << std::endl + << " numEpochs = " << numEpochs << std::endl + << " shuffle = " << shuffle << std::endl; + + + arma::mat mnistDataset; + data::Load("/home/viole/Documents/datasets/digit-recognizer/train.csv", mnistDataset, true); + + std::cout << arma::size(mnistDataset) << std::endl; + + mnistDataset = mnistDataset.submat(1, 0, mnistDataset.n_rows-1, mnistDataset.n_cols-1); + mnistDataset /= 255.0; + + arma::mat trainDataset, valDataset; + data::Split(mnistDataset, valDataset, trainDataset, trainRatio); + + std::cout << " Dataset Loaded " << std::endl; + std::cout << " Train Dataset Size : (" << trainDataset.n_rows << ", " << trainDataset.n_cols << ")" << std::endl; + + std::cout << " Validation Dataset Size : (" << valDataset.n_rows << ", " << valDataset.n_cols << ")" << std::endl; + + arma::mat trainTest, dump; + data::Split(trainDataset, dump, trainTest, 0.045); + + size_t iterPerCycle = (numEpochs * trainDataset.n_cols); + + /** + * @brief Model Architecture: + * + * Discriminator: + * 28x28x1---->Convolution layer(32 filters of size 5x5, stride = 1, padding = 2)-----> + * + * + * Note: Output of a Convolution layer = [(W-K+2P)/S + 1] + * where, W : Size of input volume + * K : Kernel size + * P : Padding + * S : Stride + */ + + // Discriminator network + + // Creating the Discriminator network. + FFN > discriminator; + discriminator.Add >(1, // Number of input activation maps + dNumKernels, // Number of output activation maps + 5, // Filter width + 5, // Filter height + 1, // Stride along width + 1, // Stride along height + 2, // Padding width + 2, // Padding height + 28, // Input widht + 28); // Input height + // Adding first ReLU + discriminator.Add >(); + // Adding mean pooling layer + discriminator.Add >(2, 2, 2, 2); + // Adding second convolution layer + discriminator.Add >(dNumKernels, 2 * dNumKernels, 5, 5, 1, 1, + 2, 2, 14, 14); + // Adding second ReLU + discriminator.Add >(); + // Adding second mean pooling layer + discriminator.Add >(2, 2, 2, 2); + // Adding linear layer + discriminator.Add >(7 * 7 * 2 * dNumKernels, 1024); + // Adding third ReLU + discriminator.Add >(); + // Adding final layer + discriminator.Add >(1024, 1); + + + // Creating the Generator network + FFN > generator; + generator.Add >(noiseDim, 3136); + generator.Add >(3136); + generator.Add >(); + generator.Add >(1, // Number of input activation maps + noiseDim / 2, // Number of output activation maps + 3, // Filter width + 3, // Filter height + 2, // Stride along width + 2, // Stride along height + 1, // Padding width + 1, // Padding height + 56, // input width + 56); // input height + // Adding first batch normalization layer + generator.Add >(39200); + // Adding first ReLU + generator.Add >(); + // Adding a bilinear interpolation layer + generator.Add >(28, 28, 56, 56, noiseDim / 2); + // Adding second convolution layer + generator.Add >(noiseDim / 2, noiseDim / 4, 3, 3, 2, 2, 1, 1, + 56, 56); + // Adding second batch normalization layer + generator.Add >(19600); + // Adding second ReLU + generator.Add >(); + // Adding second bilinear interpolation layer + generator.Add >(28, 28, 56, 56, noiseDim / 4); + // Adding third convolution layer + generator.Add >(noiseDim / 4, 1, 3, 3, 2, 2, 1, 1, 56, 56); + // Adding final tanh layer + generator.Add >(); + + // Creating GAN. + GaussianInitialization gaussian(0, 1); + ens::Adam optimizer(stepSize, // Step size of optimizer. + batchSize, // Batch size. + 0.9, // Exponential decay rate for first moment estimates. + 0.999, // Exponential decay rate for weighted norm estimates. + eps, // Value used to initialize the mean squared gradient parameter. + iterPerCycle, // Maximum number of iterations. + tolerance, // Tolerance. + shuffle); // Shuffle. + std::function noiseFunction = [] () { + return math::RandNormal(0, 1);}; + GAN >, GaussianInitialization, + std::function > gan(generator, discriminator, + gaussian, noiseFunction, noiseDim, batchSize, generatorUpdateStep, + discriminatorPreTrain, multiplier); + + std::cout << "Training ... " << std::endl; + + const clock_t beginTime = clock(); + // Cycles for monitoring training progress. + for( int i = 0; i < cycles; i++) + { + // Training the neural network. For first iteration, weights are random, + // thus using current values as starting point. + gan.Train(trainDataset, + optimizer, + ens::PrintLoss(), + ens::ProgressBar(), + ens::Report()); + + optimizer.ResetPolicy() = false; + + std::cout << " Loss after cycle " << i << " -> " << + MeanTestLoss(gan, trainTest, batchSize) << std::endl; + } + + std::cout << " Time taken to train -> " << float(clock()-beginTime) / CLOCKS_PER_SEC << "seconds" << std::endl; + + data::Save("./saved_models/ganMnist.bin", "ganMnist", gan); + std::cout << "Model saved in mnist_gan/saved_models." << std::endl; + +} \ No newline at end of file From 3a68c83c77a8e9869a1c5a62b1a02876635a1af7 Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Sun, 25 Jul 2021 18:21:53 +0530 Subject: [PATCH 03/20] tested training script --- mnist_gan/Makefile | 4 ++-- mnist_gan/mnist_gan.cpp | 28 +++++++++++++++++++++------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/mnist_gan/Makefile b/mnist_gan/Makefile index a11bf622..344da4a8 100644 --- a/mnist_gan/Makefile +++ b/mnist_gan/Makefile @@ -4,10 +4,10 @@ SRC := mnist_gan.cpp LIBS_NAME := armadillo mlpack CXX := g++ -# CXXFLAGS += -std=c++11 -Wall -Wextra -O3 -DNDEBUG -fopenmp +CXXFLAGS += -std=c++11 -Wall -Wextra -O3 -DNDEBUG # Use these CXXFLAGS instead if you want to compile with debugging symbols and # without optimizations. -CXXFLAGS += -std=c++11 -Wall -Wextra -g -O0 +# CXXFLAGS += -std=c++11 -Wall -Wextra -g -O0 LDFLAGS += -fopenmp LDFLAGS += -lboost_serialization LDFLAGS += -larmadillo diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp index 40379142..bc6145fe 100644 --- a/mnist_gan/mnist_gan.cpp +++ b/mnist_gan/mnist_gan.cpp @@ -1,6 +1,6 @@ #include - #include + #include #include #include @@ -16,6 +16,7 @@ using namespace mlpack::math; using namespace mlpack::regression; using namespace std::placeholders; + int main() { size_t trainRatio = 0.8; @@ -52,7 +53,7 @@ int main() mnistDataset /= 255.0; arma::mat trainDataset, valDataset; - data::Split(mnistDataset, valDataset, trainDataset, trainRatio); + data::Split(mnistDataset, trainDataset, valDataset, trainRatio); std::cout << " Dataset Loaded " << std::endl; std::cout << " Train Dataset Size : (" << trainDataset.n_rows << ", " << trainDataset.n_cols << ")" << std::endl; @@ -68,7 +69,20 @@ int main() * @brief Model Architecture: * * Discriminator: - * 28x28x1---->Convolution layer(32 filters of size 5x5, stride = 1, padding = 2)-----> + * 28x28x1-----------> conv (32 filters of size 5x5, + * stride = 1, padding = 2)----------> 28x28x32 + * 28x28x32----------> ReLU -----------------------------> 28x28x32 + * 28x28x32----------> Mean pooling ---------------------> 14x14x32 + * 14x14x32----------> conv (64 filters of size 5x5, + * stride = 1, padding = 2)------> 14x14x64 + * 14x14x64----------> ReLU -----------------------------> 14x14x64 + * 14x14x64----------> Mean pooling ---------------------> 7x7x64 + * 7x7x64------------> Linear Layer ---------------------> 1024 + * 1024--------------> ReLU -----------------------------> 1024 + * 1024 -------------> Linear ---------------------------> 1 + * + * + * Generator: * * * Note: Output of a Convolution layer = [(W-K+2P)/S + 1] @@ -78,7 +92,6 @@ int main() * S : Stride */ - // Discriminator network // Creating the Discriminator network. FFN > discriminator; @@ -178,9 +191,10 @@ int main() ens::Report()); optimizer.ResetPolicy() = false; - - std::cout << " Loss after cycle " << i << " -> " << - MeanTestLoss(gan, trainTest, batchSize) << std::endl; + std::cout << " Model Performance " << + gan.Evaluate(gan.Parameters(), // Parameters of the network. + i, // Index of current input. + batchSize); // Batch size. } std::cout << " Time taken to train -> " << float(clock()-beginTime) / CLOCKS_PER_SEC << "seconds" << std::endl; From acb204813ef5ae575634083fad131d1d56ac33cc Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Mon, 9 Aug 2021 14:53:48 +0530 Subject: [PATCH 04/20] gan image generate and sampling --- mnist_gan/.gitignore | 9 +++ mnist_gan/gan_utils.hpp | 42 +++++++++++++ mnist_gan/generate_images.py | 91 ++++++++++++++++++++++++++++ mnist_gan/mnist_gan.cpp | 79 ++++++++++++++++++------ mnist_gan/mnist_gan.ipynb | 28 +++++++++ mnist_gan/mnist_gan_generate.cpp | 101 +++++++++++++++++++++++++++++++ 6 files changed, 333 insertions(+), 17 deletions(-) create mode 100644 mnist_gan/.gitignore create mode 100644 mnist_gan/gan_utils.hpp create mode 100644 mnist_gan/generate_images.py create mode 100644 mnist_gan/mnist_gan.ipynb create mode 100644 mnist_gan/mnist_gan_generate.cpp diff --git a/mnist_gan/.gitignore b/mnist_gan/.gitignore new file mode 100644 index 00000000..1d97e131 --- /dev/null +++ b/mnist_gan/.gitignore @@ -0,0 +1,9 @@ +.ipynb_checkpoints +saved_models +samples_posterior +samples_csv_files +mnist_first250_training_4s_and_9s.arm +mnist_gan +mnist_gan_generate +mnist_gan_generate.o +mnist_gan.o \ No newline at end of file diff --git a/mnist_gan/gan_utils.hpp b/mnist_gan/gan_utils.hpp new file mode 100644 index 00000000..f6a1eb6a --- /dev/null +++ b/mnist_gan/gan_utils.hpp @@ -0,0 +1,42 @@ +/** + * @file gan_utils.cpp + * @author Roshan Swain + * @author Atharva Khandait + * + * Utility function necessary for working with GAN models. + * + * mlpack is free software; you may redistribute it and/or modify it under the + * terms of the 3-clause BSD license. You should have received a copy of the + * 3-clause BSD license along with mlpack. If not, see + * http://www.opensource.org/licenses/BSD-3-Clause for more information. + */ + +#ifndef MODELS_GAN_UTILS_HPP +#define MODELS_GAN_UTILS_HPP + +#include +#include + +using namespace mlpack; +using namespace mlpack::ann; + +// Sample from the output distribution and post-process the outputs(because +// we pre-processed it before passing it to the model). +template +void GetSample(DataType &input, DataType& samples, bool isBinary) +{ + if (isBinary) + { + samples = arma::conv_to::from( + arma::randu(input.n_rows, input.n_cols) <= input); + samples *= 255; + } + else + { + samples = input / 2 + 0.5; + samples *= 255; + samples = arma::clamp(samples, 0, 255); + } +} + +#endif \ No newline at end of file diff --git a/mnist_gan/generate_images.py b/mnist_gan/generate_images.py new file mode 100644 index 00000000..78b52af5 --- /dev/null +++ b/mnist_gan/generate_images.py @@ -0,0 +1,91 @@ +""" +@file generate_images.py +@author Atharva Khandait +Generates jpg files from csv. +mlpack is free software; you may redistribute it and/or modify it under the +terms of the 3-clause BSD license. You should have received a copy of the +3-clause BSD license along with mlpack. If not, see +http://www.opensource.org/licenses/BSD-3-Clause for more information. +""" + +from PIL import Image +import numpy as np +import cv2 +import os + +def ImagesFromCSV(filename, + imgShape = (28, 28), + destination = 'samples', + saveIndividual = False): + + # Import the data into a numpy matrix. + samples = np.genfromtxt(filename, delimiter = ',', dtype = np.uint8) + + # Reshape and save it as an image in the destination. + tempImage = Image.fromarray(np.reshape(samples[:, 0], imgShape), 'L') + if saveIndividual: + tempImage.save(destination + '/sample0.jpg') + + # All the images will be concatenated to this for a combined image. + allSamples = tempImage + + for i in range(1, samples.shape[1]): + tempImage = np.reshape(samples[:, i], imgShape) + + allSamples = np.concatenate((allSamples, tempImage), axis = 1) + + tempImage = Image.fromarray(tempImage, 'L') + if saveIndividual: + tempImage.save(destination + '/sample' + str(i) + '.jpg') + + tempImage = allSamples + allSamples = Image.fromarray(allSamples, 'L') + allSamples.save(destination + '/allSamples' + '.jpg') + + print ('Samples saved in ' + destination + '/.') + + return tempImage + +# Save posterior samples. +ImagesFromCSV('./samples_csv_files/samples_posterior.csv', destination = + 'samples_posterior') + +# Save prior samples with individual latent varying. +latentSize = 10 +allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent0.csv', + destination = 'samples_prior') + +for i in range(1, latentSize): + allLatent = np.concatenate((allLatent, + (ImagesFromCSV('./samples_csv_files/samples_prior_latent' + str(i) + '.csv', + destination = 'samples_prior'))), axis = 0) + +saved = Image.fromarray(allLatent, 'L') +saved.save('./samples_prior/allLatent.jpg') + +# Save prior samples with 2d latent varying. +nofSamples = 20 +allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d0.csv', + destination = 'latent') + +for i in range(1, nofSamples): + allLatent = np.concatenate((allLatent, + (ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d' + str(i) + + '.csv', destination = 'samples_prior'))), axis = 0) + +saved = Image.fromarray(allLatent, 'L') +saved.save('./samples_prior/2dLatent.jpg') + +# AVI file +vid_fname = 'gans_celebface_training1.avi' +sample_dir = " " + +files = [os.path.join(sample_dir, f) for f in os.listdir(sample_dir) if 'generated' in f] +files.sort() + +out = cv2.VideoWriter(vid_fname, cv2.VideoWriter_fourcc(*'MP4V'), 1, (530, 530)) +[out.write(cv2.imread(fname)) for fname in files] +out.release() + + +###Output### diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp index bc6145fe..fd3815a0 100644 --- a/mnist_gan/mnist_gan.cpp +++ b/mnist_gan/mnist_gan.cpp @@ -19,51 +19,66 @@ using namespace std::placeholders; int main() { - size_t trainRatio = 0.8; + double trainRatio = 0.8; size_t dNumKernels = 32; size_t discriminatorPreTrain = 5; - size_t batchSize = 64; + size_t batchSize = 5; size_t noiseDim = 100; size_t generatorUpdateStep = 1; size_t numSamples = 10; size_t cycles = 10; double stepSize = 0.0003; double eps = 1e-8; - size_t numEpochs = 1; + size_t numEpoches = 1; double tolerance = 1e-5; bool shuffle = true; double multiplier = 10; + int datasetMaxCols = 10; + std::cout << std::boolalpha << " batchSize = " << batchSize << std::endl << " generatorUpdateStep = " << generatorUpdateStep << std::endl << " noiseDim = " << noiseDim << std::endl << " numSamples = " << numSamples << std::endl << " stepSize = " << stepSize << std::endl - << " numEpochs = " << numEpochs << std::endl + << " numEpochs = " << numEpoches << std::endl << " shuffle = " << shuffle << std::endl; arma::mat mnistDataset; - data::Load("/home/viole/Documents/datasets/digit-recognizer/train.csv", mnistDataset, true); + // data::Load("/home/viole/Documents/datasets/digit-recognizer/train.csv", mnistDataset, true); + mnistDataset.load("./mnist_first250_training_4s_and_9s.arm"); std::cout << arma::size(mnistDataset) << std::endl; - mnistDataset = mnistDataset.submat(1, 0, mnistDataset.n_rows-1, mnistDataset.n_cols-1); - mnistDataset /= 255.0; + mnistDataset = mnistDataset.cols(0, datasetMaxCols-1); + size_t numIterations = mnistDataset.n_cols * numEpoches; + numIterations /= batchSize; + + std::cout << "MnistDataset No. of rows: " << mnistDataset.n_rows << std::endl; + + // mnistDataset = mnistDataset.submat(1, 0, mnistDataset.n_rows-1, mnistDataset.n_cols-1); + // mnistDataset /= 255.0; - arma::mat trainDataset, valDataset; - data::Split(mnistDataset, trainDataset, valDataset, trainRatio); + // arma::mat trainDataset, valDataset; + // data::Split(mnistDataset, trainDataset, valDataset, trainRatio); - std::cout << " Dataset Loaded " << std::endl; - std::cout << " Train Dataset Size : (" << trainDataset.n_rows << ", " << trainDataset.n_cols << ")" << std::endl; + // std::cout << " Dataset Loaded " << std::endl; + // std::cout << " Train Dataset Size : (" << trainDataset.n_rows << ", " << trainDataset.n_cols << ")" << std::endl; - std::cout << " Validation Dataset Size : (" << valDataset.n_rows << ", " << valDataset.n_cols << ")" << std::endl; + // std::cout << " Validation Dataset Size : (" << valDataset.n_rows << ", " << valDataset.n_cols << ")" << std::endl; - arma::mat trainTest, dump; - data::Split(trainDataset, dump, trainTest, 0.045); + // const size_t testSize = static_cast(mnistDataset.n_cols * trainRatio); + // std::cout << "After Split: " << std::endl; + // std::cout << " testSize" << testSize << std::endl; + // std::cout << " Mnist_Dataset cols: " << mnistDataset.n_cols << std::endl; + // std::cout << " TrainRatio: " << trainRatio << std::endl; - size_t iterPerCycle = (numEpochs * trainDataset.n_cols); + // // arma::mat trainTest, dump; + // data::Split(trainDataset, dump, trainTest, 0.045); + + // size_t iterPerCycle = (numEpochs * trainDataset.n_cols); /** * @brief Model Architecture: @@ -166,7 +181,7 @@ int main() 0.9, // Exponential decay rate for first moment estimates. 0.999, // Exponential decay rate for weighted norm estimates. eps, // Value used to initialize the mean squared gradient parameter. - iterPerCycle, // Maximum number of iterations. + numIterations, // iterPerCycle// Maximum number of iterations. tolerance, // Tolerance. shuffle); // Shuffle. std::function noiseFunction = [] () { @@ -184,7 +199,7 @@ int main() { // Training the neural network. For first iteration, weights are random, // thus using current values as starting point. - gan.Train(trainDataset, + gan.Train(mnistDataset, //trainDataset optimizer, ens::PrintLoss(), ens::ProgressBar(), @@ -202,4 +217,34 @@ int main() data::Save("./saved_models/ganMnist.bin", "ganMnist", gan); std::cout << "Model saved in mnist_gan/saved_models." << std::endl; + // -----------------------------Sampling -----------------// + // Generate samples. + std::cout << "Sampling..." << std::endl; + arma::mat noise(noiseDim, batchSize); + size_t dim = std::sqrt(mnistDataset.n_rows); + arma::mat generatedData(2 * dim, dim * numSamples); + + for (size_t i = 0; i < numSamples; ++i) + { + arma::mat samples; + noise.imbue( [&]() { return noiseFunction(); } ); + + gan.Generator().Forward(noise, samples); + samples.reshape(dim, dim); + samples = samples.t(); + + generatedData.submat(0, i * dim, dim - 1, i * dim + dim - 1) = samples; + + samples = mnistDataset.col(math::RandInt(0, mnistDataset.n_cols)); + samples.reshape(dim, dim); + samples = samples.t(); + + generatedData.submat(dim, + i * dim, 2 * dim - 1, i * dim + dim - 1) = samples; + } + + data::Save("./saved_csv_files/ouput_mnist.csv", generatedData, false, false); + + std::cout << "Output generated!" << std::endl; + } \ No newline at end of file diff --git a/mnist_gan/mnist_gan.ipynb b/mnist_gan/mnist_gan.ipynb new file mode 100644 index 00000000..c5898516 --- /dev/null +++ b/mnist_gan/mnist_gan.ipynb @@ -0,0 +1,28 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "3a04f60c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "C++14", + "language": "C++14", + "name": "xcpp14" + }, + "language_info": { + "codemirror_mode": "text/x-c++src", + "file_extension": ".cpp", + "mimetype": "text/x-c++src", + "name": "c++", + "version": "14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/mnist_gan/mnist_gan_generate.cpp b/mnist_gan/mnist_gan_generate.cpp new file mode 100644 index 00000000..e22bafcf --- /dev/null +++ b/mnist_gan/mnist_gan_generate.cpp @@ -0,0 +1,101 @@ +#include + +#include +#include + + +#include +#include +#include +#include +#include + +#include + +#include "gan_utils.hpp" + +using namespace mlpack; +using namespace mlpack::ann; + +int main() +{ + // constexpr bool loadData = false; + // constexpr size_t nofSamples = 10; + // constexpr bool isBinary = false; + // constexpr size_t batchSize = 5; + // constexpr size_t noiseDim = 100; + // constexpr size_t numSamples = 10; + // // constexpr size_t latentSize = + size_t dNumKernels = 32; + size_t discriminatorPreTrain = 5; + size_t batchSize = 5; + size_t noiseDim = 100; + size_t generatorUpdateStep = 1; + size_t numSamples = 10; + double stepSize = 0.0003; + double eps = 1e-8; + size_t numEpoches = 1; + double tolerance = 1e-5; + int datasetMaxCols = 10; + bool shuffle = true; + double multiplier = 10; + bool loadData = false; + + arma::mat inputData, trainData, validData; + + trainData.load("./mnist_first250_training_4s_and_9s.arm"); + + if(loadData) + { + data::Load(" ", inputData, true, false); + // Removing the headers + inputData = inputData.submat(0, 1, inputData.n_rows - 1, inputData.n_cols - 1); + inputData /= 255.0; + + // Removing the labels + inputData = inputData.submat(1, 0, inputData.n_rows - 1, inputData.n_cols - 1); + + inputData = (inputData - 0.5) * 2; + + data::Split(inputData, trainData, validData, 0.8); + } + + arma::arma_rng::set_seed_random(); + + GAN >, GaussianInitialization, + std::function > ganModel(); + + data::Load("./saved_models/ganMnist.bin", "ganMnist", ganModel); + + std::cout << "Sampling...." << std::endl; + arma::mat noise(noiseDim, batchSize); + size_t dim = std::sqrt(trainData.n_rows); + arma::mat generatedData(2 * dim, dim * numSamples); + + std::function noiseFunction = [](){ return math::Random(-8, 8) + + math::RandNormal(0, 1) * 0.01;}; + + for (size_t i = 0; i < numSamples; ++i) + { + arma::mat samples; + noise.imbue( [&]() { return noiseFunction(); } ); + ganModel.Generator().Forward(noise, samples); + samples.reshape(dim, dim); + samples = samples.t(); + + generatedData.submat(0, i * dim, dim - 1, i * dim + dim - 1) = samples; + + samples = trainData.col(math::RandInt(0, trainData.n_cols)); + samples.reshape(dim, dim); + samples = samples.t(); + + generatedData.submat(dim, + i * dim, 2 * dim - 1, i * dim + dim - 1) = samples; + } + // arma::mat output; + // GetSample(generatedData, output, false); + data::Save("./saved_csv_files/ouput_mnist.csv", generatedData, false, false); + + std::cout << "Output generated!" << std::endl; + +} \ No newline at end of file From 90214b6015b1b85a50fb62b8226354f53531d253 Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Mon, 9 Aug 2021 15:08:55 +0530 Subject: [PATCH 05/20] gan genenrate csv files --- mnist_gan/Makefile | 4 ++-- mnist_gan/mnist_gan_generate.cpp | 21 +++++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/mnist_gan/Makefile b/mnist_gan/Makefile index 344da4a8..258c8aa1 100644 --- a/mnist_gan/Makefile +++ b/mnist_gan/Makefile @@ -1,6 +1,6 @@ -TARGET := mnist_gan -SRC := mnist_gan.cpp +TARGET := mnist_gan_generate +SRC := mnist_gan_generate.cpp LIBS_NAME := armadillo mlpack CXX := g++ diff --git a/mnist_gan/mnist_gan_generate.cpp b/mnist_gan/mnist_gan_generate.cpp index e22bafcf..e8ca19ff 100644 --- a/mnist_gan/mnist_gan_generate.cpp +++ b/mnist_gan/mnist_gan_generate.cpp @@ -62,24 +62,33 @@ int main() arma::arma_rng::set_seed_random(); + std::function noiseFunction = [](){ return math::Random(-8, 8) + + math::RandNormal(0, 1) * 0.01;}; + + FFN > generator; + + FFN > discriminator; + + GaussianInitialization gaussian(0,1); + GAN >, GaussianInitialization, - std::function > ganModel(); + std::function > gan(generator, discriminator, + gaussian, noiseFunction, noiseDim, batchSize, generatorUpdateStep, + discriminatorPreTrain, multiplier); - data::Load("./saved_models/ganMnist.bin", "ganMnist", ganModel); + data::Load("./saved_models/ganMnist.bin", "ganMnist", gan); std::cout << "Sampling...." << std::endl; arma::mat noise(noiseDim, batchSize); size_t dim = std::sqrt(trainData.n_rows); arma::mat generatedData(2 * dim, dim * numSamples); - std::function noiseFunction = [](){ return math::Random(-8, 8) + - math::RandNormal(0, 1) * 0.01;}; for (size_t i = 0; i < numSamples; ++i) { arma::mat samples; noise.imbue( [&]() { return noiseFunction(); } ); - ganModel.Generator().Forward(noise, samples); + gan.Generator().Forward(noise, samples); samples.reshape(dim, dim); samples = samples.t(); @@ -94,7 +103,7 @@ int main() } // arma::mat output; // GetSample(generatedData, output, false); - data::Save("./saved_csv_files/ouput_mnist.csv", generatedData, false, false); + data::Save("./samples_csv_files/ouput_mnist_1.csv", generatedData, false, false); std::cout << "Output generated!" << std::endl; From 3f9bafe20f1573aa9690bb235147f9674b2e759c Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Mon, 16 Aug 2021 14:10:59 +0530 Subject: [PATCH 06/20] gans generating images --- mnist_gan/Untitled.ipynb | 165 +++++++++++++++++++++++++++++++ mnist_gan/generate_images.py | 115 ++++++++++----------- mnist_gan/mnist_gan.ipynb | 153 +++++++++++++++++++++++++++- mnist_gan/mnist_gan_generate.cpp | 7 +- 4 files changed, 378 insertions(+), 62 deletions(-) create mode 100644 mnist_gan/Untitled.ipynb diff --git a/mnist_gan/Untitled.ipynb b/mnist_gan/Untitled.ipynb new file mode 100644 index 00000000..80764e3f --- /dev/null +++ b/mnist_gan/Untitled.ipynb @@ -0,0 +1,165 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "81c68540", + "metadata": {}, + "outputs": [], + "source": [ + "from PIL import Image\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "25021e81", + "metadata": {}, + "outputs": [], + "source": [ + "samples = np.genfromtxt(\"samples_csv_files/ouput_mnist_2.csv\", delimiter = ',', dtype = np.uint8)\n", + "\n", + "img = Image.fromarray(samples)\n", + "img.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "af43503a", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "dataset = pd.read_csv(\"samples_csv_files/ouput_mnist_2.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "47913b40", + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: 'samples_csv_files/output_mnist_2.csv'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"samples_csv_files/output_mnist_2.csv\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf_in\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mf_in\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'samples_csv_files/output_mnist_2.csv'" + ] + } + ], + "source": [ + "with open(\"samples_csv_files/output_mnist_2.csv\", 'r') as f_in:\n", + " for line in f_in:\n", + " print(line)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b8584b96", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 55 entries, 0 to 54\n", + "Columns: 280 entries, 9.94226905097128e-01 to 1.00000000000000e+00.264\n", + "dtypes: float64(280)\n", + "memory usage: 120.4 KB\n" + ] + } + ], + "source": [ + "dataset.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "a68eb523", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 55 entries, 0 to 54\n", + "Columns: 280 entries, 9.99801803453734e-01 to 9.96537507993331e-01\n", + "dtypes: float64(280)\n", + "memory usage: 120.4 KB\n" + ] + } + ], + "source": [ + "dataset = pd.read_csv(\"samples_csv_files/samples_posterior.csv\")\n", + " \n", + "dataset.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "338ae5db", + "metadata": {}, + "outputs": [ + { + "ename": "OSError", + "evalue": "samples_csv_files/output_mnist_2.csv not found.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msamples\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgenfromtxt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"samples_csv_files/output_mnist_2.csv\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdelimiter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\",\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muint8\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfromarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msamples\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mimg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/envs/notebook/lib/python3.7/site-packages/numpy/lib/npyio.py\u001b[0m in \u001b[0;36mgenfromtxt\u001b[0;34m(fname, dtype, comments, delimiter, skip_header, skip_footer, converters, missing_values, filling_values, usecols, names, excludelist, deletechars, replace_space, autostrip, case_sensitive, defaultfmt, unpack, usemask, loose, invalid_raise, max_rows, encoding, like)\u001b[0m\n\u001b[1;32m 1789\u001b[0m \u001b[0mfname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos_fspath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1790\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1791\u001b[0;31m \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_datasource\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'rt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1792\u001b[0m \u001b[0mfid_ctx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcontextlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclosing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1793\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/envs/notebook/lib/python3.7/site-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(path, mode, destpath, encoding, newline)\u001b[0m\n\u001b[1;32m 192\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 193\u001b[0m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDataSource\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdestpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 194\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnewline\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnewline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 195\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 196\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/envs/notebook/lib/python3.7/site-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, path, mode, encoding, newline)\u001b[0m\n\u001b[1;32m 529\u001b[0m encoding=encoding, newline=newline)\n\u001b[1;32m 530\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 531\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIOError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"%s not found.\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 532\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 533\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mOSError\u001b[0m: samples_csv_files/output_mnist_2.csv not found." + ] + } + ], + "source": [ + "samples = np.genfromtxt(\"samples_csv_files/output_mnist_2.csv\", delimiter=\",\", dtype = np.uint8)\n", + "img = Image.fromarray(samples)\n", + "img.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57ef526f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/mnist_gan/generate_images.py b/mnist_gan/generate_images.py index 78b52af5..66211470 100644 --- a/mnist_gan/generate_images.py +++ b/mnist_gan/generate_images.py @@ -13,79 +13,84 @@ import cv2 import os -def ImagesFromCSV(filename, - imgShape = (28, 28), - destination = 'samples', - saveIndividual = False): +# def ImagesFromCSV(filename, +# imgShape = (28, 28), +# destination = 'samples', +# saveIndividual = False): - # Import the data into a numpy matrix. - samples = np.genfromtxt(filename, delimiter = ',', dtype = np.uint8) +# # Import the data into a numpy matrix. +# samples = np.genfromtxt(filename, delimiter = ',', dtype = np.uint8) - # Reshape and save it as an image in the destination. - tempImage = Image.fromarray(np.reshape(samples[:, 0], imgShape), 'L') - if saveIndividual: - tempImage.save(destination + '/sample0.jpg') +# # Reshape and save it as an image in the destination. +# tempImage = Image.fromarray(np.reshape(samples[:, 0], imgShape), 'L') +# if saveIndividual: +# tempImage.save(destination + '/sample0.jpg') - # All the images will be concatenated to this for a combined image. - allSamples = tempImage +# # All the images will be concatenated to this for a combined image. +# allSamples = tempImage - for i in range(1, samples.shape[1]): - tempImage = np.reshape(samples[:, i], imgShape) +# for i in range(1, samples.shape[1]): +# tempImage = np.reshape(samples[:, i], imgShape) - allSamples = np.concatenate((allSamples, tempImage), axis = 1) +# allSamples = np.concatenate((allSamples, tempImage), axis = 1) - tempImage = Image.fromarray(tempImage, 'L') - if saveIndividual: - tempImage.save(destination + '/sample' + str(i) + '.jpg') +# tempImage = Image.fromarray(tempImage, 'L') +# if saveIndividual: +# tempImage.save(destination + '/sample' + str(i) + '.jpg') - tempImage = allSamples - allSamples = Image.fromarray(allSamples, 'L') - allSamples.save(destination + '/allSamples' + '.jpg') +# tempImage = allSamples +# allSamples = Image.fromarray(allSamples, 'L') +# allSamples.save(destination + '/allSamples' + '.jpg') - print ('Samples saved in ' + destination + '/.') +# print ('Samples saved in ' + destination + '/.') - return tempImage +# return tempImage -# Save posterior samples. -ImagesFromCSV('./samples_csv_files/samples_posterior.csv', destination = - 'samples_posterior') +# # Save posterior samples. +# ImagesFromCSV('./samples_csv_files/samples_posterior.csv', destination = +# 'samples_posterior') -# Save prior samples with individual latent varying. -latentSize = 10 -allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent0.csv', - destination = 'samples_prior') +# # Save prior samples with individual latent varying. +# latentSize = 10 +# allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent0.csv', +# destination = 'samples_prior') -for i in range(1, latentSize): - allLatent = np.concatenate((allLatent, - (ImagesFromCSV('./samples_csv_files/samples_prior_latent' + str(i) + '.csv', - destination = 'samples_prior'))), axis = 0) +# for i in range(1, latentSize): +# allLatent = np.concatenate((allLatent, +# (ImagesFromCSV('./samples_csv_files/samples_prior_latent' + str(i) + '.csv', +# destination = 'samples_prior'))), axis = 0) -saved = Image.fromarray(allLatent, 'L') -saved.save('./samples_prior/allLatent.jpg') +# saved = Image.fromarray(allLatent, 'L') +# saved.save('./samples_prior/allLatent.jpg') -# Save prior samples with 2d latent varying. -nofSamples = 20 -allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d0.csv', - destination = 'latent') +# # Save prior samples with 2d latent varying. +# nofSamples = 20 +# allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d0.csv', +# destination = 'latent') -for i in range(1, nofSamples): - allLatent = np.concatenate((allLatent, - (ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d' + str(i) + - '.csv', destination = 'samples_prior'))), axis = 0) +# for i in range(1, nofSamples): +# allLatent = np.concatenate((allLatent, +# (ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d' + str(i) + +# '.csv', destination = 'samples_prior'))), axis = 0) -saved = Image.fromarray(allLatent, 'L') -saved.save('./samples_prior/2dLatent.jpg') +# saved = Image.fromarray(allLatent, 'L') +# saved.save('./samples_prior/2dLatent.jpg') -# AVI file -vid_fname = 'gans_celebface_training1.avi' -sample_dir = " " +# # AVI file +# vid_fname = 'gans_celebface_training1.avi' +# sample_dir = " " -files = [os.path.join(sample_dir, f) for f in os.listdir(sample_dir) if 'generated' in f] -files.sort() +# files = [os.path.join(sample_dir, f) for f in os.listdir(sample_dir) if 'generated' in f] +# files.sort() -out = cv2.VideoWriter(vid_fname, cv2.VideoWriter_fourcc(*'MP4V'), 1, (530, 530)) -[out.write(cv2.imread(fname)) for fname in files] -out.release() +# out = cv2.VideoWriter(vid_fname, cv2.VideoWriter_fourcc(*'MP4V'), 1, (530, 530)) +# [out.write(cv2.imread(fname)) for fname in files] +# out.release() -###Output### +# ###Output### + +samples = np.genfromtxt("./samples_csv_files/output_mnist_1.csv", delimiter = ',', dtype = np.uint8) + +im = Image.fromarray(samples) +im.save("./samples_posterior/output_mnist_1.jpeg") \ No newline at end of file diff --git a/mnist_gan/mnist_gan.ipynb b/mnist_gan/mnist_gan.ipynb index c5898516..3f08b71e 100644 --- a/mnist_gan/mnist_gan.ipynb +++ b/mnist_gan/mnist_gan.ipynb @@ -1,12 +1,157 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "source": [ + "#include \n", + "#include \n", + "\n", + "#include \n", + "#include \n", + "\n", + "\n", + "#include \n", + "#include \n", + "#include \n", + "#include \n", + "#include \n", + "\n", + "#include \"xwidgets/ximage.hpp\"\n", + "#include \n", + "\n", + "#include \"gan_utils.hpp\"" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 2, + "source": [ + "using namespace mlpack;" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 3, + "source": [ + "using namespace mlpack::ann;" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 4, + "source": [ + " size_t dNumKernels = 32;\n", + " size_t discriminatorPreTrain = 5;\n", + " size_t batchSize = 5;\n", + " size_t noiseDim = 100;\n", + " size_t generatorUpdateStep = 1;\n", + " size_t numSamples = 10;\n", + " double stepSize = 0.0003;\n", + " double eps = 1e-8;\n", + " size_t numEpoches = 1;\n", + " double tolerance = 1e-5;\n", + " int datasetMaxCols = 10;\n", + " bool shuffle = true;\n", + " double multiplier = 10;\n", + " bool loadData = false;" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 5, + "source": [ + "arma::mat inputData, trainData, validData;" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 6, + "source": [ + " trainData.load(\"./mnist_first250_training_4s_and_9s.arm\");\n", + "\n", + "// if(loadData)\n", + "// {\n", + "// data::Load(\" \", inputData, true, false);\n", + "// // Removing the headers\n", + "// inputData = inputData.submat(0, 1, inputData.n_rows - 1, inputData.n_cols - 1);\n", + "// inputData /= 255.0;\n", + "\n", + "// // Removing the labels\n", + "// inputData = inputData.submat(1, 0, inputData.n_rows - 1, inputData.n_cols - 1);\n", + "\n", + "// inputData = (inputData - 0.5) * 2;\n", + "\n", + "// data::Split(inputData, trainData, validData, 0.8);\n", + "// }\n" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "true" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 7, + "source": [ + " arma::arma_rng::set_seed_random();" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "std::function noiseFunction = [](){ return math::Random(-8, 8) +\n", + " math::RandNormal(0, 1) * 0.01;};\n", + "\n" + ], + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "In file included from input_line_5:1:\n", + "In file included from /home/viole/anaconda3/envs/notebook/include/xeus/xinterpreter.hpp:13:\n", + "In file included from /home/viole/anaconda3/envs/notebook/bin/../lib/gcc/x86_64-conda-linux-gnu/7.5.0/../../../../x86_64-conda-linux-gnu/include/c++/7.5.0/functional:58:\n", + "\u001b[1m/home/viole/anaconda3/envs/notebook/bin/../lib/gcc/x86_64-conda-linux-gnu/7.5.0/../../../../x86_64-conda-linux-gnu/include/c++/7.5.0/bits/std_function.h:264:34: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno matching constructor for initialization of '(lambda at input_line_17:2:43)'\u001b[0m\n", + " { ::new (__functor._M_access()) _Functor(std::move(__f)); }\n", + "\u001b[0;1;32m ^ ~~~~~~~~~~~~~~\n", + "\u001b[0m\u001b[1m/home/viole/anaconda3/envs/notebook/bin/../lib/gcc/x86_64-conda-linux-gnu/7.5.0/../../../../x86_64-conda-linux-gnu/include/c++/7.5.0/bits/std_function.h:239:4: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of member function 'std::_Function_base::_Base_manager<(lambda at input_line_17:2:43)>::_M_init_functor' requested here\u001b[0m\n", + " { _M_init_functor(__functor, std::move(__f), _Local_storage()); }\n", + "\u001b[0;1;32m ^\n", + "\u001b[0m\u001b[1m/home/viole/anaconda3/envs/notebook/bin/../lib/gcc/x86_64-conda-linux-gnu/7.5.0/../../../../x86_64-conda-linux-gnu/include/c++/7.5.0/bits/std_function.h:693:19: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of member function" + ] + } + ], + "metadata": {} + }, { "cell_type": "code", "execution_count": null, - "id": "3a04f60c", - "metadata": {}, + "source": [], "outputs": [], - "source": [] + "metadata": {} } ], "metadata": { @@ -25,4 +170,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/mnist_gan/mnist_gan_generate.cpp b/mnist_gan/mnist_gan_generate.cpp index e8ca19ff..803c3e2c 100644 --- a/mnist_gan/mnist_gan_generate.cpp +++ b/mnist_gan/mnist_gan_generate.cpp @@ -42,12 +42,13 @@ int main() bool loadData = false; arma::mat inputData, trainData, validData; - trainData.load("./mnist_first250_training_4s_and_9s.arm"); if(loadData) { - data::Load(" ", inputData, true, false); + + inputData.load("./mnist_first250_training_4s_and_9s.arm"); + // Removing the headers inputData = inputData.submat(0, 1, inputData.n_rows - 1, inputData.n_cols - 1); inputData /= 255.0; @@ -103,7 +104,7 @@ int main() } // arma::mat output; // GetSample(generatedData, output, false); - data::Save("./samples_csv_files/ouput_mnist_1.csv", generatedData, false, false); + data::Save("./samples_csv_files/ouput_mnist_2.csv", generatedData, false, false); std::cout << "Output generated!" << std::endl; From 2ebecff6199b3da58f6264b80dfc90b8c89b8112 Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Tue, 17 Aug 2021 16:30:44 +0530 Subject: [PATCH 07/20] commented generator architecture --- mnist_gan/Untitled1.ipynb | 104 ++++++++++++++++++++++++++++++++++++++ mnist_gan/mnist_gan.cpp | 23 +++++++-- 2 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 mnist_gan/Untitled1.ipynb diff --git a/mnist_gan/Untitled1.ipynb b/mnist_gan/Untitled1.ipynb new file mode 100644 index 00000000..f5b99af4 --- /dev/null +++ b/mnist_gan/Untitled1.ipynb @@ -0,0 +1,104 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "438dc71b", + "metadata": {}, + "source": [ + "# Generative Adverserial Networks in mlpack\n", + "\n", + "Deep neural networks are used mainly for supervised learning: classification or regression. Generative Adverserial Networks or GANs, however, use neural networks for a very different purpose: Generative modeling\n", + "\n", + ">A generative adversarial network is a class of machine learning frameworks designed by Ian Goodfellow and his colleagues in 2014. Two neural networks contest with each other in a game. Given a training set, this technique learns to generate new data with the same statistics as the training set. [Wikipedia](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwj0oN6n3LXyAhVYIbcAHROSDhQQmhMwKnoECEAQAg&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FGenerative_adversarial_network&usg=AOvVaw09mLp9-GvBO7o23-xIW29P/)\n", + "\n", + "While there are many approaches used for generative modeling, a Generative Adverserial Network takes the following approach: \n", + "\n", + "![GAN Flowchart](https://i.imgur.com/6NMdO9u.png)\n", + "\n", + "There are two neural networks: a *Generator* and a *Discriminator*. The generator generates a \"fake\" sample given a random vector/matrix, and the discriminator attempts to detect whether a given sample is \"real\" (picked from the training data) or \"fake\" (generated by the generator). Training happens in tandem: we train the discriminator for a few epochs, then train the generator for a few epochs, and repeat. This way both the generator and the discriminator get better at doing their jobs. This rather simple approach can lead to some astounding results. The following images ([source](https://machinelearningmastery.com/resources-for-getting-started-with-generative-adversarial-networks/)), for instances, were all generated using GANs:\n", + "\n", + "\"gans_results\"\n", + "\n", + "\n", + "GANs however, can be notoriously difficult to train, and are extremely sensitive to hyperparameters, activation functions and regularization. In this tutorial, we'll train a GAN to generate images of handwritten digits similar to those from the MNIST database.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "13bd5c9f", + "metadata": {}, + "source": [ + "# Approach\n", + "Here's what we're going to do:\n", + "\n", + "* Define the problem statement.\n", + "* Create a GAN Training File\n", + " * Load the data.\n", + " * Define the Discriminator network.\n", + " * Define the Generator network.\n", + " * Gaussian Initialization.\n", + " * Define the Noise Function.\n", + " * Create GAN.\n", + " * Train GAN.\n", + "* Create a Image Generator File.\n", + " * Load the trained model.\n", + " * Create random noise.\n", + " * Generate Images using the trained model.\n", + " * Save the outputs in CSV.\n", + "* Look at outputs\n", + " * Convert CSV to Images.\n", + " * If not satisfied with result, train the model with different parameters." + ] + }, + { + "cell_type": "markdown", + "id": "343f3224", + "metadata": {}, + "source": [ + "Let's create the training file 'mnist_gan.cpp', train the model and save it." + ] + }, + { + "cell_type": "markdown", + "id": "4cb6adc2", + "metadata": {}, + "source": [ + "Let's also create the 'mnist_generate.cpp' file for sampling, generating the outputs from the model and saving the CSV file." + ] + }, + { + "cell_type": "markdown", + "id": "48fa8872", + "metadata": {}, + "source": [ + "Let's look at the outputs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "411accfd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "C++14", + "language": "C++14", + "name": "xcpp14" + }, + "language_info": { + "codemirror_mode": "text/x-c++src", + "file_extension": ".cpp", + "mimetype": "text/x-c++src", + "name": "c++", + "version": "14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp index fd3815a0..3e50ef82 100644 --- a/mnist_gan/mnist_gan.cpp +++ b/mnist_gan/mnist_gan.cpp @@ -19,7 +19,6 @@ using namespace std::placeholders; int main() { - double trainRatio = 0.8; size_t dNumKernels = 32; size_t discriminatorPreTrain = 5; size_t batchSize = 5; @@ -27,9 +26,10 @@ int main() size_t generatorUpdateStep = 1; size_t numSamples = 10; size_t cycles = 10; + size_t numEpoches = 1; double stepSize = 0.0003; + double trainRatio = 0.8; double eps = 1e-8; - size_t numEpoches = 1; double tolerance = 1e-5; bool shuffle = true; double multiplier = 10; @@ -47,7 +47,6 @@ int main() arma::mat mnistDataset; - // data::Load("/home/viole/Documents/datasets/digit-recognizer/train.csv", mnistDataset, true); mnistDataset.load("./mnist_first250_training_4s_and_9s.arm"); std::cout << arma::size(mnistDataset) << std::endl; @@ -98,6 +97,24 @@ int main() * * * Generator: + * noiseDim---------> Linear ---------------------------> 3136 + * 3136 ------------> BatchNormalizaton ----------------> 3136 + * 3136 ------------> ReLu Layer -----------------------> 3136 + * 56x56x1 ---------> conv(1 filter of size 3x3, + * stride = 1, padding = 2)----> 28x28x(noiseDim/2) + * 28x28x(noiseDim/2)----> BatchNormalizaton -----------> 28x28x(noiseDim/2) + * 28x28x(noiseDim/2)----> ReLu Layer-------------------> 28x28x(noiseDim/2) + * 28x28x(noiseDim/2) ----> BilinearInterpolation ------> 56x56x(noiseDim/2) + * 56x56x(noiseDim/2) -----> conv((noiseDim/2) filters + * of size 3x3,stride = 2, + * padding = 1)----------> 28x28x(noiseDim/4) + * 28x28x(noiseDim/4) ----->BatchNormalization----------> 28x28x(noiseDim/4) + * 28x28x(noiseDim/4) ------> ReLu Layer ---------------> 28x28x(noiseDim/4) + * 28x28x(noiseDim/4) ------> BilinearInterpolation ----> 56x56x(noiseDim/4) + * 56x56x(noiseDim/4) ------> conv((noiseDim/4) filters + * of size 3x3, stride = 2, + * padding = 1)-------> 28x28x1 + * 28x28x1 ----------> tanh layer ----------------------> 28x28x1 * * * Note: Output of a Convolution layer = [(W-K+2P)/S + 1] From 7ded9fc7635f7069e7f0e3e6e49b40f4b0d7d61d Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Tue, 17 Aug 2021 17:21:33 +0530 Subject: [PATCH 08/20] modified mnist_gan_generate file --- mnist_gan/generate_images.py | 5 +-- mnist_gan/mnist_gan.cpp | 49 +++++++++++----------- mnist_gan/mnist_gan_generate.cpp | 70 +++++++++++++++++--------------- 3 files changed, 64 insertions(+), 60 deletions(-) diff --git a/mnist_gan/generate_images.py b/mnist_gan/generate_images.py index 66211470..066aecd5 100644 --- a/mnist_gan/generate_images.py +++ b/mnist_gan/generate_images.py @@ -90,7 +90,6 @@ # ###Output### -samples = np.genfromtxt("./samples_csv_files/output_mnist_1.csv", delimiter = ',', dtype = np.uint8) - +samples = np.genfromtxt("./samples_csv_files/ouput_mnist_25_without_normalization.csv", delimiter = ',', dtype = np.uint8) im = Image.fromarray(samples) -im.save("./samples_posterior/output_mnist_1.jpeg") \ No newline at end of file +im.save("./samples_posterior/output_mnist_25_without_normalization.jpeg") \ No newline at end of file diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp index 3e50ef82..977405c8 100644 --- a/mnist_gan/mnist_gan.cpp +++ b/mnist_gan/mnist_gan.cpp @@ -26,14 +26,13 @@ int main() size_t generatorUpdateStep = 1; size_t numSamples = 10; size_t cycles = 10; - size_t numEpoches = 1; + size_t numEpoches = 25; double stepSize = 0.0003; double trainRatio = 0.8; double eps = 1e-8; double tolerance = 1e-5; bool shuffle = true; double multiplier = 10; - int datasetMaxCols = 10; std::cout << std::boolalpha @@ -231,37 +230,37 @@ int main() std::cout << " Time taken to train -> " << float(clock()-beginTime) / CLOCKS_PER_SEC << "seconds" << std::endl; - data::Save("./saved_models/ganMnist.bin", "ganMnist", gan); + data::Save("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); std::cout << "Model saved in mnist_gan/saved_models." << std::endl; - // -----------------------------Sampling -----------------// - // Generate samples. - std::cout << "Sampling..." << std::endl; - arma::mat noise(noiseDim, batchSize); - size_t dim = std::sqrt(mnistDataset.n_rows); - arma::mat generatedData(2 * dim, dim * numSamples); + // // -----------------------------Sampling -----------------// + // // Generate samples. + // std::cout << "Sampling..." << std::endl; + // arma::mat noise(noiseDim, batchSize); + // size_t dim = std::sqrt(mnistDataset.n_rows); + // arma::mat generatedData(2 * dim, dim * numSamples); - for (size_t i = 0; i < numSamples; ++i) - { - arma::mat samples; - noise.imbue( [&]() { return noiseFunction(); } ); + // for (size_t i = 0; i < numSamples; ++i) + // { + // arma::mat samples; + // noise.imbue( [&]() { return noiseFunction(); } ); - gan.Generator().Forward(noise, samples); - samples.reshape(dim, dim); - samples = samples.t(); + // gan.Generator().Forward(noise, samples); + // samples.reshape(dim, dim); + // samples = samples.t(); - generatedData.submat(0, i * dim, dim - 1, i * dim + dim - 1) = samples; + // generatedData.submat(0, i * dim, dim - 1, i * dim + dim - 1) = samples; - samples = mnistDataset.col(math::RandInt(0, mnistDataset.n_cols)); - samples.reshape(dim, dim); - samples = samples.t(); + // samples = mnistDataset.col(math::RandInt(0, mnistDataset.n_cols)); + // samples.reshape(dim, dim); + // samples = samples.t(); - generatedData.submat(dim, - i * dim, 2 * dim - 1, i * dim + dim - 1) = samples; - } + // generatedData.submat(dim, + // i * dim, 2 * dim - 1, i * dim + dim - 1) = samples; + // } - data::Save("./saved_csv_files/ouput_mnist.csv", generatedData, false, false); + // data::Save("./saved_csv_files/ouput_mnist.csv", generatedData, false, false); - std::cout << "Output generated!" << std::endl; + // std::cout << "Output generated!" << std::endl; } \ No newline at end of file diff --git a/mnist_gan/mnist_gan_generate.cpp b/mnist_gan/mnist_gan_generate.cpp index 803c3e2c..169251eb 100644 --- a/mnist_gan/mnist_gan_generate.cpp +++ b/mnist_gan/mnist_gan_generate.cpp @@ -19,92 +19,98 @@ using namespace mlpack::ann; int main() { - // constexpr bool loadData = false; - // constexpr size_t nofSamples = 10; - // constexpr bool isBinary = false; - // constexpr size_t batchSize = 5; - // constexpr size_t noiseDim = 100; - // constexpr size_t numSamples = 10; - // // constexpr size_t latentSize = - size_t dNumKernels = 32; size_t discriminatorPreTrain = 5; size_t batchSize = 5; size_t noiseDim = 100; size_t generatorUpdateStep = 1; size_t numSamples = 10; - double stepSize = 0.0003; - double eps = 1e-8; - size_t numEpoches = 1; - double tolerance = 1e-5; - int datasetMaxCols = 10; - bool shuffle = true; double multiplier = 10; bool loadData = false; - arma::mat inputData, trainData, validData; - trainData.load("./mnist_first250_training_4s_and_9s.arm"); + arma::mat trainData,inputData, validData; + trainData.load("./mnist_first250_training_4s_and_9s.arm"); - if(loadData) - { + if(loadData) + { - inputData.load("./mnist_first250_training_4s_and_9s.arm"); + inputData.load("./mnist_first250_training_4s_and_9s.arm"); - // Removing the headers - inputData = inputData.submat(0, 1, inputData.n_rows - 1, inputData.n_cols - 1); - inputData /= 255.0; + // Removing the headers. + inputData = inputData.submat(0, 1, inputData.n_rows - 1, inputData.n_cols - 1); + inputData /= 255.0; - // Removing the labels - inputData = inputData.submat(1, 0, inputData.n_rows - 1, inputData.n_cols - 1); + // Removing the labels. + inputData = inputData.submat(1, 0, inputData.n_rows - 1, inputData.n_cols - 1); - inputData = (inputData - 0.5) * 2; + inputData = (inputData - 0.5) * 2; - data::Split(inputData, trainData, validData, 0.8); - } + data::Split(inputData, trainData, validData, 0.8); + } arma::arma_rng::set_seed_random(); + // Define noise function. std::function noiseFunction = [](){ return math::Random(-8, 8) + math::RandNormal(0, 1) * 0.01;}; + // Define generator. FFN > generator; + // Define discriminator. FFN > discriminator; + // Define GaussinaInitialization. GaussianInitialization gaussian(0,1); + // Define GAN class. GAN >, GaussianInitialization, std::function > gan(generator, discriminator, gaussian, noiseFunction, noiseDim, batchSize, generatorUpdateStep, discriminatorPreTrain, multiplier); - data::Load("./saved_models/ganMnist.bin", "ganMnist", gan); + // Load the saved model. + data::Load("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); + + /*--------------Sampling-----------------------------------------*/ std::cout << "Sampling...." << std::endl; + + // Noise matrix. arma::mat noise(noiseDim, batchSize); + + // Dimensions of the image. size_t dim = std::sqrt(trainData.n_rows); + + // Matrix to store the generated data. arma::mat generatedData(2 * dim, dim * numSamples); for (size_t i = 0; i < numSamples; ++i) { arma::mat samples; + + // Create random noise using noise function. noise.imbue( [&]() { return noiseFunction(); } ); + + // Pass noise through generator and store output in samples. gan.Generator().Forward(noise, samples); + + // Reshape and Transpose the samples output. samples.reshape(dim, dim); samples = samples.t(); + // Store the output sample in a dimxdim grid in final output matrix. generatedData.submat(0, i * dim, dim - 1, i * dim + dim - 1) = samples; + // Add the image from original train data to compare. samples = trainData.col(math::RandInt(0, trainData.n_cols)); samples.reshape(dim, dim); samples = samples.t(); - generatedData.submat(dim, i * dim, 2 * dim - 1, i * dim + dim - 1) = samples; } - // arma::mat output; - // GetSample(generatedData, output, false); - data::Save("./samples_csv_files/ouput_mnist_2.csv", generatedData, false, false); + // Save the output as csv. + data::Save("./samples_csv_files/ouput_mnist_25_without_normalization.csv", generatedData, false, false); std::cout << "Output generated!" << std::endl; From e55e29e62480275a3a534bbbfb52a3463ea16bf0 Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Tue, 17 Aug 2021 18:05:44 +0530 Subject: [PATCH 09/20] add generate image cpython script --- mnist_gan/.gitignore | 4 +- mnist_gan/generate_images.py | 95 ------------------- ...titled1.ipynb => mnist_gan_notebook.ipynb} | 63 +++++++++++- utils/generateimage.hpp | 95 +++++++++++++++++++ utils/generateimage.py | 19 ++++ 5 files changed, 179 insertions(+), 97 deletions(-) delete mode 100644 mnist_gan/generate_images.py rename mnist_gan/{Untitled1.ipynb => mnist_gan_notebook.ipynb} (76%) create mode 100644 utils/generateimage.hpp create mode 100644 utils/generateimage.py diff --git a/mnist_gan/.gitignore b/mnist_gan/.gitignore index 1d97e131..983d56c4 100644 --- a/mnist_gan/.gitignore +++ b/mnist_gan/.gitignore @@ -6,4 +6,6 @@ mnist_first250_training_4s_and_9s.arm mnist_gan mnist_gan_generate mnist_gan_generate.o -mnist_gan.o \ No newline at end of file +mnist_gan.o +.vscode +mnist_gan.ipynb \ No newline at end of file diff --git a/mnist_gan/generate_images.py b/mnist_gan/generate_images.py deleted file mode 100644 index 066aecd5..00000000 --- a/mnist_gan/generate_images.py +++ /dev/null @@ -1,95 +0,0 @@ -""" -@file generate_images.py -@author Atharva Khandait -Generates jpg files from csv. -mlpack is free software; you may redistribute it and/or modify it under the -terms of the 3-clause BSD license. You should have received a copy of the -3-clause BSD license along with mlpack. If not, see -http://www.opensource.org/licenses/BSD-3-Clause for more information. -""" - -from PIL import Image -import numpy as np -import cv2 -import os - -# def ImagesFromCSV(filename, -# imgShape = (28, 28), -# destination = 'samples', -# saveIndividual = False): - -# # Import the data into a numpy matrix. -# samples = np.genfromtxt(filename, delimiter = ',', dtype = np.uint8) - -# # Reshape and save it as an image in the destination. -# tempImage = Image.fromarray(np.reshape(samples[:, 0], imgShape), 'L') -# if saveIndividual: -# tempImage.save(destination + '/sample0.jpg') - -# # All the images will be concatenated to this for a combined image. -# allSamples = tempImage - -# for i in range(1, samples.shape[1]): -# tempImage = np.reshape(samples[:, i], imgShape) - -# allSamples = np.concatenate((allSamples, tempImage), axis = 1) - -# tempImage = Image.fromarray(tempImage, 'L') -# if saveIndividual: -# tempImage.save(destination + '/sample' + str(i) + '.jpg') - -# tempImage = allSamples -# allSamples = Image.fromarray(allSamples, 'L') -# allSamples.save(destination + '/allSamples' + '.jpg') - -# print ('Samples saved in ' + destination + '/.') - -# return tempImage - -# # Save posterior samples. -# ImagesFromCSV('./samples_csv_files/samples_posterior.csv', destination = -# 'samples_posterior') - -# # Save prior samples with individual latent varying. -# latentSize = 10 -# allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent0.csv', -# destination = 'samples_prior') - -# for i in range(1, latentSize): -# allLatent = np.concatenate((allLatent, -# (ImagesFromCSV('./samples_csv_files/samples_prior_latent' + str(i) + '.csv', -# destination = 'samples_prior'))), axis = 0) - -# saved = Image.fromarray(allLatent, 'L') -# saved.save('./samples_prior/allLatent.jpg') - -# # Save prior samples with 2d latent varying. -# nofSamples = 20 -# allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d0.csv', -# destination = 'latent') - -# for i in range(1, nofSamples): -# allLatent = np.concatenate((allLatent, -# (ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d' + str(i) + -# '.csv', destination = 'samples_prior'))), axis = 0) - -# saved = Image.fromarray(allLatent, 'L') -# saved.save('./samples_prior/2dLatent.jpg') - -# # AVI file -# vid_fname = 'gans_celebface_training1.avi' -# sample_dir = " " - -# files = [os.path.join(sample_dir, f) for f in os.listdir(sample_dir) if 'generated' in f] -# files.sort() - -# out = cv2.VideoWriter(vid_fname, cv2.VideoWriter_fourcc(*'MP4V'), 1, (530, 530)) -# [out.write(cv2.imread(fname)) for fname in files] -# out.release() - - -# ###Output### - -samples = np.genfromtxt("./samples_csv_files/ouput_mnist_25_without_normalization.csv", delimiter = ',', dtype = np.uint8) -im = Image.fromarray(samples) -im.save("./samples_posterior/output_mnist_25_without_normalization.jpeg") \ No newline at end of file diff --git a/mnist_gan/Untitled1.ipynb b/mnist_gan/mnist_gan_notebook.ipynb similarity index 76% rename from mnist_gan/Untitled1.ipynb rename to mnist_gan/mnist_gan_notebook.ipynb index f5b99af4..362e108d 100644 --- a/mnist_gan/Untitled1.ipynb +++ b/mnist_gan/mnist_gan_notebook.ipynb @@ -78,10 +78,71 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "411accfd", "metadata": {}, "outputs": [], + "source": [ + "#include \n", + "\n", + "#define WITHOUT_NUMPY 1\n", + "#include \"matplotlibcpp.h\"\n", + "#include \"xwidgets/ximage.hpp\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "623277b4", + "metadata": {}, + "outputs": [], + "source": [ + "#include \"../utils/generateimage.hpp\"\n", + "\n", + "namespace plt = matplotlibcpp;" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "0a003687", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Call failed.\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1aec8fd7723942fea99127a8f84791b1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "A Jupyter widget with unique id: 1aec8fd7723942fea99127a8f84791b1" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "GenerateImage(\"./saved_csv_files/ouput_mnist_1.csv\", \"output_2.png\");\n", + "auto im = xw::image_from_file(\"output_2.png\").finalize();\n", + "im" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55352260", + "metadata": {}, + "outputs": [], "source": [] } ], diff --git a/utils/generateimage.hpp b/utils/generateimage.hpp new file mode 100644 index 00000000..0c20ba1e --- /dev/null +++ b/utils/generateimage.hpp @@ -0,0 +1,95 @@ +// Inside C++ notebook we can use: +// GenerateImage("input.csv", "output.png") +// auto im = xw::image_from_file("output.png").finalize() +// im + +#ifndef C_GENERATE_IMAGE_HPP +#define C_GENERATE_IMAGE_HPP + +#define PY_SSIZE_T_CLEAN +#include +#include + +// Here we use the same arguments as we used in the python script, +// since this is what is passed from the C++ notebook to call the python script. +int GenerateImage(const std::string& inFile, + const std::string& outFile = "output.png") +{ + PyObject *pName, *pModule, *pFunc; + PyObject *pArgs, *pValue; + + // This has to be adapted if you run this on your local system, + // so whenever you call the python script it can find the correct + // module -> PYTHONPATH, on lab.mlpack.org we put all the utility + // functions for plotting uinto the utils folder so we add that path + // to the Python search path. + + Py_Initialize(); + PyRun_SimpleString("import sys"); + PyRun_SimpleString("sys.path.append(\"../utils/\")"); + // Name of the python script without the extension. + pName = PyUnicode_DecodeFSDefault("generateimage"); + + pModule = PyImport_Import(pName); + Py_DECREF(pName); + + if (pModule != NULL) + { + // The Python function from the generateimage.py script + // we like to call - cgenerateimage + pFunc = PyObject_GetAttrString(pModule, "cgenerateimage"); + + if (pFunc && PyCallable_Check(pFunc)) + { + // The number of arguments we pass to the python script. + // inFile, outFile='output.png' + // for the example above it's 2 + pArgs = PyTuple_New(2); + + // Now we have to encode the argument to the correct type + // besides width, height everything else is a string. + // So we can use PyUnicode_FromString. + // If the data is an int we can use PyLong_FromLong, + // see the lines below for an example. + PyObject* pValueinFile = PyUnicode_FromString(inFile.c_str()); + // Here we just set the index of the argument. + PyTuple_SetItem(pArgs, 0, pValueinFile); + + PyObject* pValueoutFile = PyUnicode_FromString(outFile.c_str()); + PyTuple_SetItem(pArgs, 1, pValueoutFile); + + // The rest of the c++ part can stay the same. + + pValue = PyObject_CallObject(pFunc, pArgs); + Py_DECREF(pArgs); + if (pValue != NULL) + { + Py_DECREF(pValue); + } + else + { + Py_DECREF(pFunc); + Py_DECREF(pModule); + PyErr_Print(); + fprintf(stderr,"Call failed.\n"); + return 1; + } + } + else + { + if (PyErr_Occurred()) + PyErr_Print(); + } + + Py_XDECREF(pFunc); + Py_DECREF(pModule); + } + else + { + PyErr_Print(); + return 1; + } + + return 0; +} +#endif \ No newline at end of file diff --git a/utils/generateimage.py b/utils/generateimage.py new file mode 100644 index 00000000..5bd2d443 --- /dev/null +++ b/utils/generateimage.py @@ -0,0 +1,19 @@ +""" +@file generate_images.py +@author Roshan Swain +Generates jpg files from csv. +mlpack is free software; you may redistribute it and/or modify it under the +terms of the 3-clause BSD license. You should have received a copy of the +3-clause BSD license along with mlpack. If not, see +http://www.opensource.org/licenses/BSD-3-Clause for more information. +""" + +from PIL import Image +import numpy as np +import matplotlib.pyplot as plt + +def cgenerateimage(inFile, outFile = 'output.png'): + dataset = np.genfromtxt(inFile, delimiter = ',', dtype = np.uint8) + im = Image.fromarray(dataset) + im.save(outFile) + From 0a6a590e2c4526231acefd8e34382a2d82137713 Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Thu, 19 Aug 2021 20:02:53 +0530 Subject: [PATCH 10/20] cleaned mnist gan file --- mnist_gan/gan_utils.hpp | 42 ------------------------------- mnist_gan/mnist_gan.cpp | 55 +---------------------------------------- 2 files changed, 1 insertion(+), 96 deletions(-) delete mode 100644 mnist_gan/gan_utils.hpp diff --git a/mnist_gan/gan_utils.hpp b/mnist_gan/gan_utils.hpp deleted file mode 100644 index f6a1eb6a..00000000 --- a/mnist_gan/gan_utils.hpp +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @file gan_utils.cpp - * @author Roshan Swain - * @author Atharva Khandait - * - * Utility function necessary for working with GAN models. - * - * mlpack is free software; you may redistribute it and/or modify it under the - * terms of the 3-clause BSD license. You should have received a copy of the - * 3-clause BSD license along with mlpack. If not, see - * http://www.opensource.org/licenses/BSD-3-Clause for more information. - */ - -#ifndef MODELS_GAN_UTILS_HPP -#define MODELS_GAN_UTILS_HPP - -#include -#include - -using namespace mlpack; -using namespace mlpack::ann; - -// Sample from the output distribution and post-process the outputs(because -// we pre-processed it before passing it to the model). -template -void GetSample(DataType &input, DataType& samples, bool isBinary) -{ - if (isBinary) - { - samples = arma::conv_to::from( - arma::randu(input.n_rows, input.n_cols) <= input); - samples *= 255; - } - else - { - samples = input / 2 + 0.5; - samples *= 255; - samples = arma::clamp(samples, 0, 255); - } -} - -#endif \ No newline at end of file diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp index 977405c8..33d004ca 100644 --- a/mnist_gan/mnist_gan.cpp +++ b/mnist_gan/mnist_gan.cpp @@ -56,28 +56,6 @@ int main() std::cout << "MnistDataset No. of rows: " << mnistDataset.n_rows << std::endl; - // mnistDataset = mnistDataset.submat(1, 0, mnistDataset.n_rows-1, mnistDataset.n_cols-1); - // mnistDataset /= 255.0; - - // arma::mat trainDataset, valDataset; - // data::Split(mnistDataset, trainDataset, valDataset, trainRatio); - - // std::cout << " Dataset Loaded " << std::endl; - // std::cout << " Train Dataset Size : (" << trainDataset.n_rows << ", " << trainDataset.n_cols << ")" << std::endl; - - // std::cout << " Validation Dataset Size : (" << valDataset.n_rows << ", " << valDataset.n_cols << ")" << std::endl; - - // const size_t testSize = static_cast(mnistDataset.n_cols * trainRatio); - // std::cout << "After Split: " << std::endl; - // std::cout << " testSize" << testSize << std::endl; - // std::cout << " Mnist_Dataset cols: " << mnistDataset.n_cols << std::endl; - // std::cout << " TrainRatio: " << trainRatio << std::endl; - - // // arma::mat trainTest, dump; - // data::Split(trainDataset, dump, trainTest, 0.045); - - // size_t iterPerCycle = (numEpochs * trainDataset.n_cols); - /** * @brief Model Architecture: * @@ -100,7 +78,7 @@ int main() * 3136 ------------> BatchNormalizaton ----------------> 3136 * 3136 ------------> ReLu Layer -----------------------> 3136 * 56x56x1 ---------> conv(1 filter of size 3x3, - * stride = 1, padding = 2)----> 28x28x(noiseDim/2) + * stride = 2, padding = 1)----> 28x28x(noiseDim/2) * 28x28x(noiseDim/2)----> BatchNormalizaton -----------> 28x28x(noiseDim/2) * 28x28x(noiseDim/2)----> ReLu Layer-------------------> 28x28x(noiseDim/2) * 28x28x(noiseDim/2) ----> BilinearInterpolation ------> 56x56x(noiseDim/2) @@ -232,35 +210,4 @@ int main() data::Save("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); std::cout << "Model saved in mnist_gan/saved_models." << std::endl; - - // // -----------------------------Sampling -----------------// - // // Generate samples. - // std::cout << "Sampling..." << std::endl; - // arma::mat noise(noiseDim, batchSize); - // size_t dim = std::sqrt(mnistDataset.n_rows); - // arma::mat generatedData(2 * dim, dim * numSamples); - - // for (size_t i = 0; i < numSamples; ++i) - // { - // arma::mat samples; - // noise.imbue( [&]() { return noiseFunction(); } ); - - // gan.Generator().Forward(noise, samples); - // samples.reshape(dim, dim); - // samples = samples.t(); - - // generatedData.submat(0, i * dim, dim - 1, i * dim + dim - 1) = samples; - - // samples = mnistDataset.col(math::RandInt(0, mnistDataset.n_cols)); - // samples.reshape(dim, dim); - // samples = samples.t(); - - // generatedData.submat(dim, - // i * dim, 2 * dim - 1, i * dim + dim - 1) = samples; - // } - - // data::Save("./saved_csv_files/ouput_mnist.csv", generatedData, false, false); - - // std::cout << "Output generated!" << std::endl; - } \ No newline at end of file From abfcd330fb8580e4d8e3282fbdda700237f56b6e Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Thu, 19 Aug 2021 20:08:20 +0530 Subject: [PATCH 11/20] cleaned mnist generate file --- mnist_gan/mnist_gan.ipynb | 173 ------------------------------- mnist_gan/mnist_gan_generate.cpp | 25 +++-- 2 files changed, 12 insertions(+), 186 deletions(-) delete mode 100644 mnist_gan/mnist_gan.ipynb diff --git a/mnist_gan/mnist_gan.ipynb b/mnist_gan/mnist_gan.ipynb deleted file mode 100644 index 3f08b71e..00000000 --- a/mnist_gan/mnist_gan.ipynb +++ /dev/null @@ -1,173 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "source": [ - "#include \n", - "#include \n", - "\n", - "#include \n", - "#include \n", - "\n", - "\n", - "#include \n", - "#include \n", - "#include \n", - "#include \n", - "#include \n", - "\n", - "#include \"xwidgets/ximage.hpp\"\n", - "#include \n", - "\n", - "#include \"gan_utils.hpp\"" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 2, - "source": [ - "using namespace mlpack;" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 3, - "source": [ - "using namespace mlpack::ann;" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 4, - "source": [ - " size_t dNumKernels = 32;\n", - " size_t discriminatorPreTrain = 5;\n", - " size_t batchSize = 5;\n", - " size_t noiseDim = 100;\n", - " size_t generatorUpdateStep = 1;\n", - " size_t numSamples = 10;\n", - " double stepSize = 0.0003;\n", - " double eps = 1e-8;\n", - " size_t numEpoches = 1;\n", - " double tolerance = 1e-5;\n", - " int datasetMaxCols = 10;\n", - " bool shuffle = true;\n", - " double multiplier = 10;\n", - " bool loadData = false;" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 5, - "source": [ - "arma::mat inputData, trainData, validData;" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 6, - "source": [ - " trainData.load(\"./mnist_first250_training_4s_and_9s.arm\");\n", - "\n", - "// if(loadData)\n", - "// {\n", - "// data::Load(\" \", inputData, true, false);\n", - "// // Removing the headers\n", - "// inputData = inputData.submat(0, 1, inputData.n_rows - 1, inputData.n_cols - 1);\n", - "// inputData /= 255.0;\n", - "\n", - "// // Removing the labels\n", - "// inputData = inputData.submat(1, 0, inputData.n_rows - 1, inputData.n_cols - 1);\n", - "\n", - "// inputData = (inputData - 0.5) * 2;\n", - "\n", - "// data::Split(inputData, trainData, validData, 0.8);\n", - "// }\n" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "true" - ] - }, - "metadata": {}, - "execution_count": 6 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 7, - "source": [ - " arma::arma_rng::set_seed_random();" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "std::function noiseFunction = [](){ return math::Random(-8, 8) +\n", - " math::RandNormal(0, 1) * 0.01;};\n", - "\n" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "In file included from input_line_5:1:\n", - "In file included from /home/viole/anaconda3/envs/notebook/include/xeus/xinterpreter.hpp:13:\n", - "In file included from /home/viole/anaconda3/envs/notebook/bin/../lib/gcc/x86_64-conda-linux-gnu/7.5.0/../../../../x86_64-conda-linux-gnu/include/c++/7.5.0/functional:58:\n", - "\u001b[1m/home/viole/anaconda3/envs/notebook/bin/../lib/gcc/x86_64-conda-linux-gnu/7.5.0/../../../../x86_64-conda-linux-gnu/include/c++/7.5.0/bits/std_function.h:264:34: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno matching constructor for initialization of '(lambda at input_line_17:2:43)'\u001b[0m\n", - " { ::new (__functor._M_access()) _Functor(std::move(__f)); }\n", - "\u001b[0;1;32m ^ ~~~~~~~~~~~~~~\n", - "\u001b[0m\u001b[1m/home/viole/anaconda3/envs/notebook/bin/../lib/gcc/x86_64-conda-linux-gnu/7.5.0/../../../../x86_64-conda-linux-gnu/include/c++/7.5.0/bits/std_function.h:239:4: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of member function 'std::_Function_base::_Base_manager<(lambda at input_line_17:2:43)>::_M_init_functor' requested here\u001b[0m\n", - " { _M_init_functor(__functor, std::move(__f), _Local_storage()); }\n", - "\u001b[0;1;32m ^\n", - "\u001b[0m\u001b[1m/home/viole/anaconda3/envs/notebook/bin/../lib/gcc/x86_64-conda-linux-gnu/7.5.0/../../../../x86_64-conda-linux-gnu/include/c++/7.5.0/bits/std_function.h:693:19: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of member function" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [], - "outputs": [], - "metadata": {} - } - ], - "metadata": { - "kernelspec": { - "display_name": "C++14", - "language": "C++14", - "name": "xcpp14" - }, - "language_info": { - "codemirror_mode": "text/x-c++src", - "file_extension": ".cpp", - "mimetype": "text/x-c++src", - "name": "c++", - "version": "14" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file diff --git a/mnist_gan/mnist_gan_generate.cpp b/mnist_gan/mnist_gan_generate.cpp index 169251eb..0a9ba2ec 100644 --- a/mnist_gan/mnist_gan_generate.cpp +++ b/mnist_gan/mnist_gan_generate.cpp @@ -12,8 +12,6 @@ #include -#include "gan_utils.hpp" - using namespace mlpack; using namespace mlpack::ann; @@ -30,22 +28,23 @@ int main() arma::mat trainData,inputData, validData; trainData.load("./mnist_first250_training_4s_and_9s.arm"); - if(loadData) - { + // If you want to load other mnist data, then uncomment the below lines in the "if" statement to remove and prepare the data for your test. + // if(loadData) + // { - inputData.load("./mnist_first250_training_4s_and_9s.arm"); + // inputData.load("File Path"); - // Removing the headers. - inputData = inputData.submat(0, 1, inputData.n_rows - 1, inputData.n_cols - 1); - inputData /= 255.0; + // // Removing the headers. + // inputData = inputData.submat(0, 1, inputData.n_rows - 1, inputData.n_cols - 1); + // inputData /= 255.0; // Note that if you are bringing all the values to 0-1, then in the output csv, you have to multiply all values by 255.0 - // Removing the labels. - inputData = inputData.submat(1, 0, inputData.n_rows - 1, inputData.n_cols - 1); + // // Removing the labels. + // inputData = inputData.submat(1, 0, inputData.n_rows - 1, inputData.n_cols - 1); - inputData = (inputData - 0.5) * 2; + // inputData = (inputData - 0.5) * 2; - data::Split(inputData, trainData, validData, 0.8); - } + // data::Split(inputData, trainData, validData, 0.8); + // } arma::arma_rng::set_seed_random(); From e155073d47b0fd9d678c45abb7998a8ef47fdd92 Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Thu, 19 Aug 2021 20:26:38 +0530 Subject: [PATCH 12/20] modified generateimage python script --- mnist_gan/Untitled.ipynb | 165 ----------------------------- mnist_gan/mnist_gan_notebook.ipynb | 39 +++---- 2 files changed, 16 insertions(+), 188 deletions(-) delete mode 100644 mnist_gan/Untitled.ipynb diff --git a/mnist_gan/Untitled.ipynb b/mnist_gan/Untitled.ipynb deleted file mode 100644 index 80764e3f..00000000 --- a/mnist_gan/Untitled.ipynb +++ /dev/null @@ -1,165 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "81c68540", - "metadata": {}, - "outputs": [], - "source": [ - "from PIL import Image\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "25021e81", - "metadata": {}, - "outputs": [], - "source": [ - "samples = np.genfromtxt(\"samples_csv_files/ouput_mnist_2.csv\", delimiter = ',', dtype = np.uint8)\n", - "\n", - "img = Image.fromarray(samples)\n", - "img.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "af43503a", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "dataset = pd.read_csv(\"samples_csv_files/ouput_mnist_2.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "47913b40", - "metadata": {}, - "outputs": [ - { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: 'samples_csv_files/output_mnist_2.csv'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"samples_csv_files/output_mnist_2.csv\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf_in\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mf_in\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'samples_csv_files/output_mnist_2.csv'" - ] - } - ], - "source": [ - "with open(\"samples_csv_files/output_mnist_2.csv\", 'r') as f_in:\n", - " for line in f_in:\n", - " print(line)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "b8584b96", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 55 entries, 0 to 54\n", - "Columns: 280 entries, 9.94226905097128e-01 to 1.00000000000000e+00.264\n", - "dtypes: float64(280)\n", - "memory usage: 120.4 KB\n" - ] - } - ], - "source": [ - "dataset.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "a68eb523", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 55 entries, 0 to 54\n", - "Columns: 280 entries, 9.99801803453734e-01 to 9.96537507993331e-01\n", - "dtypes: float64(280)\n", - "memory usage: 120.4 KB\n" - ] - } - ], - "source": [ - "dataset = pd.read_csv(\"samples_csv_files/samples_posterior.csv\")\n", - " \n", - "dataset.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "338ae5db", - "metadata": {}, - "outputs": [ - { - "ename": "OSError", - "evalue": "samples_csv_files/output_mnist_2.csv not found.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msamples\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgenfromtxt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"samples_csv_files/output_mnist_2.csv\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdelimiter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\",\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muint8\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfromarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msamples\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mimg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/notebook/lib/python3.7/site-packages/numpy/lib/npyio.py\u001b[0m in \u001b[0;36mgenfromtxt\u001b[0;34m(fname, dtype, comments, delimiter, skip_header, skip_footer, converters, missing_values, filling_values, usecols, names, excludelist, deletechars, replace_space, autostrip, case_sensitive, defaultfmt, unpack, usemask, loose, invalid_raise, max_rows, encoding, like)\u001b[0m\n\u001b[1;32m 1789\u001b[0m \u001b[0mfname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos_fspath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1790\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1791\u001b[0;31m \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_datasource\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'rt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1792\u001b[0m \u001b[0mfid_ctx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcontextlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclosing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1793\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/notebook/lib/python3.7/site-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(path, mode, destpath, encoding, newline)\u001b[0m\n\u001b[1;32m 192\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 193\u001b[0m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDataSource\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdestpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 194\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnewline\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnewline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 195\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 196\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/notebook/lib/python3.7/site-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, path, mode, encoding, newline)\u001b[0m\n\u001b[1;32m 529\u001b[0m encoding=encoding, newline=newline)\n\u001b[1;32m 530\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 531\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIOError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"%s not found.\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 532\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 533\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mOSError\u001b[0m: samples_csv_files/output_mnist_2.csv not found." - ] - } - ], - "source": [ - "samples = np.genfromtxt(\"samples_csv_files/output_mnist_2.csv\", delimiter=\",\", dtype = np.uint8)\n", - "img = Image.fromarray(samples)\n", - "img.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "57ef526f", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/mnist_gan/mnist_gan_notebook.ipynb b/mnist_gan/mnist_gan_notebook.ipynb index 362e108d..e720167a 100644 --- a/mnist_gan/mnist_gan_notebook.ipynb +++ b/mnist_gan/mnist_gan_notebook.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "438dc71b", + "id": "9e5d496b", "metadata": {}, "source": [ "# Generative Adverserial Networks in mlpack\n", @@ -27,7 +27,7 @@ }, { "cell_type": "markdown", - "id": "13bd5c9f", + "id": "19351cd6", "metadata": {}, "source": [ "# Approach\n", @@ -54,7 +54,7 @@ }, { "cell_type": "markdown", - "id": "343f3224", + "id": "f69e2067", "metadata": {}, "source": [ "Let's create the training file 'mnist_gan.cpp', train the model and save it." @@ -62,7 +62,7 @@ }, { "cell_type": "markdown", - "id": "4cb6adc2", + "id": "7ff71009", "metadata": {}, "source": [ "Let's also create the 'mnist_generate.cpp' file for sampling, generating the outputs from the model and saving the CSV file." @@ -70,7 +70,7 @@ }, { "cell_type": "markdown", - "id": "48fa8872", + "id": "c333fc3f", "metadata": {}, "source": [ "Let's look at the outputs." @@ -79,7 +79,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "411accfd", + "id": "ba6ad46d", "metadata": {}, "outputs": [], "source": [ @@ -92,8 +92,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "623277b4", + "execution_count": 2, + "id": "2dcf56a4", "metadata": {}, "outputs": [], "source": [ @@ -104,43 +104,36 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "0a003687", + "execution_count": 9, + "id": "04fc2fd6", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Call failed.\n" - ] - }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "1aec8fd7723942fea99127a8f84791b1", + "model_id": "6e93ef0324214a2581451af02994a836", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "A Jupyter widget with unique id: 1aec8fd7723942fea99127a8f84791b1" + "A Jupyter widget with unique id: 6e93ef0324214a2581451af02994a836" ] }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "GenerateImage(\"./saved_csv_files/ouput_mnist_1.csv\", \"output_2.png\");\n", - "auto im = xw::image_from_file(\"output_2.png\").finalize();\n", + "GenerateImage(\"./samples_csv_files/sample.csv\", \"./samples_posterior/sample.png\");\n", + "auto im = xw::image_from_file(\"./samples_posterior/sample.png\").finalize();\n", "im" ] }, { "cell_type": "code", "execution_count": null, - "id": "55352260", + "id": "b26c96ff", "metadata": {}, "outputs": [], "source": [] From bc3afc2f7f41c5e0cb90bc7bce5d18e1c307715d Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Thu, 19 Aug 2021 20:32:02 +0530 Subject: [PATCH 13/20] changed makefile for Push --- mnist_gan/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mnist_gan/Makefile b/mnist_gan/Makefile index 258c8aa1..c8099998 100644 --- a/mnist_gan/Makefile +++ b/mnist_gan/Makefile @@ -11,7 +11,8 @@ CXXFLAGS += -std=c++11 -Wall -Wextra -O3 -DNDEBUG LDFLAGS += -fopenmp LDFLAGS += -lboost_serialization LDFLAGS += -larmadillo -LDFLAGS += -L /home/viole/mlpack/build/lib/ # /path/to/mlpack/library/ # if installed locally. +LDFLAGS += -L. # /path to mlpack library if installed locally. +# path: mlpack/build/lib. # Add header directories for any includes that aren't on the # default compiler search path. INCLFLAGS := -I /home/viole/mlpac/build/include/ From e3f9003a0dee004349c42e60e5887e59a377ed3a Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Thu, 19 Aug 2021 20:32:30 +0530 Subject: [PATCH 14/20] finalized generate image for Push --- utils/generateimage.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/utils/generateimage.py b/utils/generateimage.py index 5bd2d443..0ca38f64 100644 --- a/utils/generateimage.py +++ b/utils/generateimage.py @@ -12,8 +12,7 @@ import numpy as np import matplotlib.pyplot as plt -def cgenerateimage(inFile, outFile = 'output.png'): +def cgenerateimage(inFile, outFile = "output.png"): dataset = np.genfromtxt(inFile, delimiter = ',', dtype = np.uint8) im = Image.fromarray(dataset) im.save(outFile) - From 8ba21fd972722cd4ab1d327c7d9830a2ab9ff875 Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Thu, 19 Aug 2021 20:35:49 +0530 Subject: [PATCH 15/20] add samples posterior folder --- mnist_gan/.gitignore | 5 +---- mnist_gan/samples_posterior/sample.png | Bin 0 -> 1953 bytes 2 files changed, 1 insertion(+), 4 deletions(-) create mode 100644 mnist_gan/samples_posterior/sample.png diff --git a/mnist_gan/.gitignore b/mnist_gan/.gitignore index 983d56c4..51862a6a 100644 --- a/mnist_gan/.gitignore +++ b/mnist_gan/.gitignore @@ -1,11 +1,8 @@ .ipynb_checkpoints saved_models -samples_posterior -samples_csv_files mnist_first250_training_4s_and_9s.arm mnist_gan mnist_gan_generate mnist_gan_generate.o mnist_gan.o -.vscode -mnist_gan.ipynb \ No newline at end of file +.vscode \ No newline at end of file diff --git a/mnist_gan/samples_posterior/sample.png b/mnist_gan/samples_posterior/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7e43288ff443d4327b1a77274e3d4ebc5a1e99 GIT binary patch literal 1953 zcmV;S2VVGzP)@ND{=fL?)QH= zy3*}kPV=tl`f}wI<)A4_h;4U~E7mVCLB_blNEK^86C!;Rv34}penz~MqA|6j5$s6) zyy7_~UX~`{>}%ZYN>PyGMi)1`QWWGkCn63^G?q+nT80sC*G}PfYO^;D-bqo}t|M(T z*7?q93^CuX<0aW&%gNXAC0)~jaZ+Dk47#QR6P4t9H7Md76EA0uXvi@z@v^l>LGqej zN)B@Ms=HEeQjAZ&@e|G%FQwRLt(bq>j2HEqPn%bZdR1U9GXv?&<0q;0sZV|C(~qyr z=5gV|`o{md5{*fccV3Gm@;{=GH~9qsz^wL-<{q^w_DLBmcX*&wyx3#b|D}_3;XIulp<(W2 zeCRYE>spmC>W#@4|9I-@%y7kOA+`DdWViV>O%5#)LXZ$5G}A`j5Vf}f04jL4YIk4l z^;-7<g^W2}dnW*3?AeAC#qQ?7Z}sj2#ZndnkQJr}kXBE>?H86kRlfwW2%c)9faqd|`VqKZX<2kmYY?uYr@gKv5 z_c)-s^40GC0G{}pnhgqNFc@w$msD zNf{1_w;08m)ifm!AfeB$4s5~?v^4_&vX9eqcDPWyk_Z&={;rkD0s3M6piY0)rQ{85 z>nQp7WgDAILL5y8fbV~18&97`~!mkxQ}m8htRo%f)diF(3!jnQw&+e zf!*+5qOkzb-$ztvho|^<0L!?@Qk`*x=$rL90Fr-qNDa(tniDQ$o;hrrquvuFzAXZP z$<@LZm`bsvW5&LtnJ~z2$N(^h@&Kf!T2Mz|ilszQu}iCOx;xEJ52`IXvqy+tZ~;j9 zn&=<)eRnGFO9HT;CtB-gA0eXe4pWH~KZjn>@s2jNB9KXBs4hwMKI&{aNW&7zgOp3jqh6W4KW?4-0;*e+Y9u{V0mG=45u2K7Ldq8lgOL- zemx0)_Zezw@2^YNwG$C7QVwcAZRgEDdu%^5ZyRoB$@i9)mJIBNJR-mK1#Y5e0Sqaq zAbQhkGx(686B}APw(Fx-*v6k_0swaK$D?v`UJ*~I!z|$pdsQyN#~3Mf$C!JFH%%yI zVq)^Y*nI~4orp-ZR};}=YP)sJ%*+i_)MG`brZBhPVyT&WzG2Ij5X%s=+xGC{){AEt zAFlF(x{+`_^_sU{dq5ETAxTzq#=7%-rysHkYt z_-BYd8K~0i1GR0(neW$o0|3Y)T4SsFCsQlcugxZM+n*jXx~#0s}Orf=U6DJndM52~VJsS5of9G*9%~u11?5q)4i5N~t1{jPc zx3Fr3g6cpZ5ID!@eUBR^25V+@r-Bkdh34?PNtnm(!~md%XoiV>z^^%(ZY5GLg8+bg z=re;&YPBFS(E#`GUQ=HMa+1*xuk-<^&@88eO=Hx`ZZH4^LXf~r#WEInwx?yb2n-snfUG~5Oj&?=*m69bUCjoOW?Wo)Ryc&P=D-mJMqhV?lw zGxYbB5G}@czk?q#p*1JWj+n021OIKlC25#tXI}CPtULyTW~KZqWOfG^s!b#%UH(K* zJXtPR%N~RUui+&UiwH2 zhSn&j-maQv&M^n_jaG%a(;a{`xyfkb!~o!9;uU6Ecgkr`06YI(8Ux91(d)YUX;h{Evix%r;^|8?s_$vO n5#>s!&ze`g%qyu+(boR}*$;hX-~&Q200000NkvXXu0mjfKmo3d literal 0 HcmV?d00001 From a9d50116a0cfb320e464071d8b6b19e8754b996a Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Thu, 19 Aug 2021 21:16:01 +0530 Subject: [PATCH 16/20] modified mnist gan notebook --- mnist_gan/.gitignore | 1 - .../mnist_first250_training_4s_and_9s.arm | Bin 0 -> 3136027 bytes mnist_gan/mnist_gan.cpp | 3 +- mnist_gan/mnist_gan_generate.cpp | 4 +- mnist_gan/mnist_gan_notebook.ipynb | 41 +++++++++++++----- 5 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 mnist_gan/dataset/mnist_first250_training_4s_and_9s.arm diff --git a/mnist_gan/.gitignore b/mnist_gan/.gitignore index 51862a6a..6c11383c 100644 --- a/mnist_gan/.gitignore +++ b/mnist_gan/.gitignore @@ -1,6 +1,5 @@ .ipynb_checkpoints saved_models -mnist_first250_training_4s_and_9s.arm mnist_gan mnist_gan_generate mnist_gan_generate.o diff --git a/mnist_gan/dataset/mnist_first250_training_4s_and_9s.arm b/mnist_gan/dataset/mnist_first250_training_4s_and_9s.arm new file mode 100644 index 0000000000000000000000000000000000000000..fd28bbbfbc3657eec44896a69b52903a2e58380d GIT binary patch literal 3136027 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 G|xmf1O!>q5hR{aSn`~7qf2YK1}JB;&1id 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 T`M(#qe$3BF*J+o)oh0yoHz95L literal 0 HcmV?d00001 diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp index 33d004ca..e93a451d 100644 --- a/mnist_gan/mnist_gan.cpp +++ b/mnist_gan/mnist_gan.cpp @@ -46,7 +46,7 @@ int main() arma::mat mnistDataset; - mnistDataset.load("./mnist_first250_training_4s_and_9s.arm"); + mnistDataset.load("./dataset/mnist_first250_training_4s_and_9s.arm"); std::cout << arma::size(mnistDataset) << std::endl; @@ -208,6 +208,7 @@ int main() std::cout << " Time taken to train -> " << float(clock()-beginTime) / CLOCKS_PER_SEC << "seconds" << std::endl; + // Let's save the model. data::Save("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); std::cout << "Model saved in mnist_gan/saved_models." << std::endl; } \ No newline at end of file diff --git a/mnist_gan/mnist_gan_generate.cpp b/mnist_gan/mnist_gan_generate.cpp index 0a9ba2ec..e83cd090 100644 --- a/mnist_gan/mnist_gan_generate.cpp +++ b/mnist_gan/mnist_gan_generate.cpp @@ -26,7 +26,7 @@ int main() bool loadData = false; arma::mat trainData,inputData, validData; - trainData.load("./mnist_first250_training_4s_and_9s.arm"); + trainData.load("./dataset/mnist_first250_training_4s_and_9s.arm"); // If you want to load other mnist data, then uncomment the below lines in the "if" statement to remove and prepare the data for your test. // if(loadData) @@ -109,7 +109,7 @@ int main() i * dim, 2 * dim - 1, i * dim + dim - 1) = samples; } // Save the output as csv. - data::Save("./samples_csv_files/ouput_mnist_25_without_normalization.csv", generatedData, false, false); + data::Save("./samples_csv_files/sample.csv", generatedData, false, false); std::cout << "Output generated!" << std::endl; diff --git a/mnist_gan/mnist_gan_notebook.ipynb b/mnist_gan/mnist_gan_notebook.ipynb index e720167a..8e453ec5 100644 --- a/mnist_gan/mnist_gan_notebook.ipynb +++ b/mnist_gan/mnist_gan_notebook.ipynb @@ -52,11 +52,21 @@ " * If not satisfied with result, train the model with different parameters." ] }, + { + "cell_type": "markdown", + "id": "212e3471", + "metadata": {}, + "source": [ + "# Data\n", + "For the datasets, we will be using a small subset of MNIST dataset comprising of only 4's and 9's." + ] + }, { "cell_type": "markdown", "id": "f69e2067", "metadata": {}, "source": [ + "# Training File\n", "Let's create the training file 'mnist_gan.cpp', train the model and save it." ] }, @@ -65,6 +75,7 @@ "id": "7ff71009", "metadata": {}, "source": [ + "# Generate Output CSV\n", "Let's also create the 'mnist_generate.cpp' file for sampling, generating the outputs from the model and saving the CSV file." ] }, @@ -78,62 +89,68 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 11, "id": "ba6ad46d", "metadata": {}, "outputs": [], "source": [ "#include \n", "\n", - "#define WITHOUT_NUMPY 1\n", - "#include \"matplotlibcpp.h\"\n", "#include \"xwidgets/ximage.hpp\"" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 12, "id": "2dcf56a4", "metadata": {}, "outputs": [], "source": [ - "#include \"../utils/generateimage.hpp\"\n", - "\n", - "namespace plt = matplotlibcpp;" + "// Import the generate image script from utils folder\n", + "#include \"../utils/generateimage.hpp\"" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 13, "id": "04fc2fd6", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6e93ef0324214a2581451af02994a836", + "model_id": "e7cb5d5284844723975c2e993a1f2ce1", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "A Jupyter widget with unique id: 6e93ef0324214a2581451af02994a836" + "A Jupyter widget with unique id: e7cb5d5284844723975c2e993a1f2ce1" ] }, - "execution_count": 9, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "// Let's generate imgage from csv files\n", "GenerateImage(\"./samples_csv_files/sample.csv\", \"./samples_posterior/sample.png\");\n", "auto im = xw::image_from_file(\"./samples_posterior/sample.png\").finalize();\n", "im" ] }, + { + "cell_type": "markdown", + "id": "23b323fd", + "metadata": {}, + "source": [ + "Thus we can see how to leverage mlpack for unsupervised learning, especially GAN's in this example." + ] + }, { "cell_type": "code", "execution_count": null, - "id": "b26c96ff", + "id": "1ab57159", "metadata": {}, "outputs": [], "source": [] From 2a45d9274a3da0257f7c4a9de1b9a83be2771233 Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Sun, 29 Aug 2021 00:40:21 +0530 Subject: [PATCH 17/20] add mnist_gan for push --- mnist_gan/Makefile | 36 +++ .../mnist_first250_training_4s_and_9s.arm | Bin 0 -> 3136027 bytes mnist_gan/mnist_gan.cpp | 212 ++++++++++++++++++ mnist_gan/mnist_gan_generate.cpp | 116 ++++++++++ mnist_gan/mnist_gan_notebook.ipynb | 175 +++++++++++++++ mnist_gan/samples_posterior/sample.png | Bin 0 -> 1953 bytes utils/generateimage.hpp | 95 ++++++++ utils/generateimage.py | 18 ++ 8 files changed, 652 insertions(+) create mode 100644 mnist_gan/Makefile create mode 100644 mnist_gan/dataset/mnist_first250_training_4s_and_9s.arm create mode 100644 mnist_gan/mnist_gan.cpp create mode 100644 mnist_gan/mnist_gan_generate.cpp create mode 100644 mnist_gan/mnist_gan_notebook.ipynb create mode 100644 mnist_gan/samples_posterior/sample.png create mode 100644 utils/generateimage.hpp create mode 100644 utils/generateimage.py diff --git a/mnist_gan/Makefile b/mnist_gan/Makefile new file mode 100644 index 00000000..a886421a --- /dev/null +++ b/mnist_gan/Makefile @@ -0,0 +1,36 @@ +TARGET := mnist_gan_generate +SRC := mnist_gan_generate.cpp +LIBS_NAME := armadillo mlpack + +CXX := g++ +CXXFLAGS += -std=c++11 -Wall -Wextra -O3 -DNDEBUG +# Use these CXXFLAGS instead if you want to compile with debugging symbols and +# without optimizations. +# CXXFLAGS += -std=c++11 -Wall -Wextra -g -O0 +LDFLAGS += -fopenmp +LDFLAGS += -lboost_serialization +LDFLAGS += -larmadillo +LDFLAGS += -L. # /path to mlpack library if installed locally. +# path: mlpack/build/lib. +# Add header directories for any includes that aren't on the +# default compiler search path. +INCLFLAGS := -I. +CXXFLAGS += $(INCLFLAGS) + +OBJS := $(SRC:.cpp=.o) +LIBS := $(addprefix -l,$(LIBS_NAME)) +CLEAN_LIST := $(TARGET) $(OBJS) + +# default rule +default: all + +$(TARGET): $(OBJS) + $(CXX) $(CXXFLAGS) $(OBJS) -o $(TARGET) $(LDFLAGS) $(LIBS) + +.PHONY: all +all: $(TARGET) + +.PHONY: clean +clean: + @echo CLEAN $(CLEAN_LIST) + @rm -f $(CLEAN_LIST) \ No newline at end of file diff --git a/mnist_gan/dataset/mnist_first250_training_4s_and_9s.arm b/mnist_gan/dataset/mnist_first250_training_4s_and_9s.arm new file mode 100644 index 0000000000000000000000000000000000000000..fd28bbbfbc3657eec44896a69b52903a2e58380d GIT binary patch literal 3136027 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 G|xmf1O!>q5hR{aSn`~7qf2YK1}JB;&1id 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 T`M(#qe$3BF*J+o)oh0yoHz95L literal 0 HcmV?d00001 diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp new file mode 100644 index 00000000..447b37c6 --- /dev/null +++ b/mnist_gan/mnist_gan.cpp @@ -0,0 +1,212 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include + +using namespace mlpack; +using namespace mlpack::data; +using namespace mlpack::ann; +using namespace mlpack::math; +using namespace mlpack::regression; +using namespace std::placeholders; + + +int main() +{ + size_t dNumKernels = 32; + size_t discriminatorPreTrain = 5; + size_t batchSize = 5; + size_t noiseDim = 100; + size_t generatorUpdateStep = 1; + size_t numSamples = 10; + size_t cycles = 10; + size_t numEpoches = 25; + double stepSize = 0.0003; + double trainRatio = 0.8; + double eps = 1e-8; + double tolerance = 1e-5; + bool shuffle = true; + double multiplier = 10; + int datasetMaxCols = 10; + + std::cout << std::boolalpha + << " batchSize = " << batchSize << std::endl + << " generatorUpdateStep = " << generatorUpdateStep << std::endl + << " noiseDim = " << noiseDim << std::endl + << " numSamples = " << numSamples << std::endl + << " stepSize = " << stepSize << std::endl + << " numEpochs = " << numEpoches << std::endl + << " shuffle = " << shuffle << std::endl; + + arma::mat mnistDataset; + mnistDataset.load("./dataset/mnist_first250_training_4s_and_9s.arm"); + + std::cout << "Dataset Shape: " << (mnistDataset.n_rows, mnistDataset.n_cols) << std::endl; + std::cout << arma::size(mnistDataset) << std::endl; + + mnistDataset = mnistDataset.cols(0, datasetMaxCols-1); + size_t numIterations = mnistDataset.n_cols * numEpoches; + numIterations /= batchSize; + + std::cout << "MnistDataset No. of rows: " << mnistDataset.n_rows << std::endl; + + /** + * @brief Model Architecture: + * + * Discriminator: + * 28x28x1-----------> conv (32 filters of size 5x5, + * stride = 1, padding = 2)----------> 28x28x32 + * 28x28x32----------> ReLU -----------------------------> 28x28x32 + * 28x28x32----------> Mean pooling ---------------------> 14x14x32 + * 14x14x32----------> conv (64 filters of size 5x5, + * stride = 1, padding = 2)------> 14x14x64 + * 14x14x64----------> ReLU -----------------------------> 14x14x64 + * 14x14x64----------> Mean pooling ---------------------> 7x7x64 + * 7x7x64------------> Linear Layer ---------------------> 1024 + * 1024--------------> ReLU -----------------------------> 1024 + * 1024 -------------> Linear ---------------------------> 1 + * + * + * Generator: + * noiseDim---------> Linear ---------------------------> 3136 + * 3136 ------------> BatchNormalizaton ----------------> 3136 + * 3136 ------------> ReLu Layer -----------------------> 3136 + * 56x56x1 ---------> conv(1 filter of size 3x3, + * stride = 2, padding = 1)----> 28x28x(noiseDim/2) + * 28x28x(noiseDim/2)----> BatchNormalizaton -----------> 28x28x(noiseDim/2) + * 28x28x(noiseDim/2)----> ReLu Layer-------------------> 28x28x(noiseDim/2) + * 28x28x(noiseDim/2) ----> BilinearInterpolation ------> 56x56x(noiseDim/2) + * 56x56x(noiseDim/2) -----> conv((noiseDim/2) filters + * of size 3x3,stride = 2, + * padding = 1)----------> 28x28x(noiseDim/4) + * 28x28x(noiseDim/4) ----->BatchNormalization----------> 28x28x(noiseDim/4) + * 28x28x(noiseDim/4) ------> ReLu Layer ---------------> 28x28x(noiseDim/4) + * 28x28x(noiseDim/4) ------> BilinearInterpolation ----> 56x56x(noiseDim/4) + * 56x56x(noiseDim/4) ------> conv((noiseDim/4) filters + * of size 3x3, stride = 2, + * padding = 1)-------> 28x28x1 + * 28x28x1 ----------> tanh layer ----------------------> 28x28x1 + * + * + * Note: Output of a Convolution layer = [(W-K+2P)/S + 1] + * where, W : Size of input volume + * K : Kernel size + * P : Padding + * S : Stride + */ + + // Creating the Discriminator network. + FFN > discriminator; + discriminator.Add >(1, // Number of input activation maps + dNumKernels, // Number of output activation maps + 5, // Filter width + 5, // Filter height + 1, // Stride along width + 1, // Stride along height + 2, // Padding width + 2, // Padding height + 28, // Input widht + 28); // Input height + // Adding first ReLU. + discriminator.Add >(); + // Adding mean pooling layer. + discriminator.Add >(2, 2, 2, 2); + // Adding second convolution layer. + discriminator.Add >(dNumKernels, 2 * dNumKernels, 5, 5, 1, 1, + 2, 2, 14, 14); + // Adding second ReLU. + discriminator.Add >(); + // Adding second mean pooling layer. + discriminator.Add >(2, 2, 2, 2); + // Adding linear layer. + discriminator.Add >(7 * 7 * 2 * dNumKernels, 1024); + // Adding third ReLU. + discriminator.Add >(); + // Adding final layer. + discriminator.Add >(1024, 1); + + // Creating the Generator network. + FFN > generator; + generator.Add >(noiseDim, 3136); + generator.Add >(3136); + generator.Add >(); + generator.Add >(1, // Number of input activation maps. + noiseDim / 2, // Number of output activation maps. + 3, // Filter width. + 3, // Filter height. + 2, // Stride along width. + 2, // Stride along height. + 1, // Padding width. + 1, // Padding height. + 56, // input width. + 56); // input height. + // Adding first batch normalization layer. + generator.Add >(39200); + // Adding first ReLU. + generator.Add >(); + // Adding a bilinear interpolation layer. + generator.Add >(28, 28, 56, 56, noiseDim / 2); + // Adding second convolution layer. + generator.Add >(noiseDim / 2, noiseDim / 4, 3, 3, 2, 2, 1, 1, + 56, 56); + // Adding second batch normalization layer. + generator.Add >(19600); + // Adding second ReLU. + generator.Add >(); + // Adding second bilinear interpolation layer. + generator.Add >(28, 28, 56, 56, noiseDim / 4); + // Adding third convolution layer. + generator.Add >(noiseDim / 4, 1, 3, 3, 2, 2, 1, 1, 56, 56); + // Adding final tanh layer. + generator.Add >(); + + // Creating GAN. + GaussianInitialization gaussian(0, 1); + ens::Adam optimizer(stepSize, // Step size of optimizer. + batchSize, // Batch size. + 0.9, // Exponential decay rate for first moment estimates. + 0.999, // Exponential decay rate for weighted norm estimates. + eps, // Value used to initialize the mean squared gradient parameter. + numIterations, // iterPerCycle// Maximum number of iterations. + tolerance, // Tolerance. + shuffle); // Shuffle. + std::function noiseFunction = []() { + return math::RandNormal(0, 1);}; + GAN >, GaussianInitialization, + std::function > gan(generator, discriminator, + gaussian, noiseFunction, noiseDim, batchSize, generatorUpdateStep, + discriminatorPreTrain, multiplier); + + std::cout << "Training ... " << std::endl; + + const clock_t beginTime = clock(); + // Cycles for monitoring training progress. + for( size_t i = 0; i < cycles; i++) + { + // Training the neural network. For first iteration, weights are random, + // thus using current values as starting point. + gan.Train(mnistDataset, //trainDataset. + optimizer, + ens::PrintLoss(), + ens::ProgressBar(), + ens::Report()); + + optimizer.ResetPolicy() = false; + std::cout << " Model Performance " << + gan.Evaluate(gan.Parameters(), // Parameters of the network. + i, // Index of current input. + batchSize); // Batch size. + } + + std::cout << " Time taken to train -> " << float(clock()-beginTime) / CLOCKS_PER_SEC << "seconds" << std::endl; + + // Let's save the model. + data::Save("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); + std::cout << "Model saved in mnist_gan/saved_models." << std::endl; +} \ No newline at end of file diff --git a/mnist_gan/mnist_gan_generate.cpp b/mnist_gan/mnist_gan_generate.cpp new file mode 100644 index 00000000..61485a3d --- /dev/null +++ b/mnist_gan/mnist_gan_generate.cpp @@ -0,0 +1,116 @@ +#include + +#include +#include + + +#include +#include +#include +#include +#include + +#include + +using namespace mlpack; +using namespace mlpack::ann; + +int main() +{ + size_t discriminatorPreTrain = 5; + size_t batchSize = 5; + size_t noiseDim = 100; + size_t generatorUpdateStep = 1; + size_t numSamples = 10; + double multiplier = 10; + bool loadData = false; + + arma::mat trainData,inputData, validData; + trainData.load("./dataset/mnist_first250_training_4s_and_9s.arm"); + + // If you want to load other mnist data, then uncomment the below lines in the "if" statement to remove and prepare the data for your test. + // if(loadData) + // { + + // inputData.load("File Path"); + + // // Removing the headers. + // inputData = inputData.submat(0, 1, inputData.n_rows - 1, inputData.n_cols - 1); + // inputData /= 255.0; // Note that if you are bringing all the values to 0-1, then in the output csv, you have to multiply all values by 255.0 + + // // Removing the labels. + // inputData = inputData.submat(1, 0, inputData.n_rows - 1, inputData.n_cols - 1); + + // inputData = (inputData - 0.5) * 2; + + // data::Split(inputData, trainData, validData, 0.8); + // } + + arma::arma_rng::set_seed_random(); + + // Define noise function. + std::function noiseFunction = [](){ return math::Random(-8, 8) + + math::RandNormal(0, 1) * 0.01;}; + + // Define generator. + FFN > generator; + + // Define discriminator. + FFN > discriminator; + + // Define GaussinaInitialization. + GaussianInitialization gaussian(0,1); + + // Define GAN class. + GAN >, GaussianInitialization, + std::function > gan(generator, discriminator, + gaussian, noiseFunction, noiseDim, batchSize, generatorUpdateStep, + discriminatorPreTrain, multiplier); + + // Load the saved model. + data::Load("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); + + /*--------------Sampling-----------------------------------------*/ + + std::cout << "Sampling...." << std::endl; + + // Noise matrix. + arma::mat noise(noiseDim, batchSize); + + // Dimensions of the image. + size_t dim = std::sqrt(trainData.n_rows); + + // Matrix to store the generated data. + arma::mat generatedData(2 * dim, dim * numSamples); + + + for (size_t i = 0; i < numSamples; ++i) + { + arma::mat samples; + + // Create random noise using noise function. + noise.imbue([&]() { return noiseFunction(); }); + + // Pass noise through generator and store output in samples. + gan.Generator().Forward(noise, samples); + + // Reshape and Transpose the samples output. + samples.reshape(dim, dim); + samples = samples.t(); + + // Store the output sample in a dimxdim grid in final output matrix. + generatedData.submat(0, i * dim, dim - 1, i * dim + dim - 1) = samples; + + // Add the image from original train data to compare. + samples = trainData.col(math::RandInt(0, trainData.n_cols)); + samples.reshape(dim, dim); + samples = samples.t(); + generatedData.submat(dim, + i * dim, 2 * dim - 1, i * dim + dim - 1) = samples; + } + // Save the output as csv. + data::Save("./samples_csv_files/sample.csv", generatedData, false, false); + + std::cout << "Output generated!" << std::endl; + +} \ No newline at end of file diff --git a/mnist_gan/mnist_gan_notebook.ipynb b/mnist_gan/mnist_gan_notebook.ipynb new file mode 100644 index 00000000..dfd66a4e --- /dev/null +++ b/mnist_gan/mnist_gan_notebook.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9e5d496b", + "metadata": {}, + "source": [ + "# Generative Adverserial Networks in mlpack\n", + "\n", + "Deep neural networks are used mainly for supervised learning: classification or regression. Generative Adverserial Networks or GANs, however, use neural networks for a very different purpose: Generative modeling\n", + "\n", + ">A generative adversarial network is a class of machine learning frameworks designed by Ian Goodfellow and his colleagues in 2014. Two neural networks contest with each other in a game. Given a training set, this technique learns to generate new data with the same statistics as the training set. [Wikipedia](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwj0oN6n3LXyAhVYIbcAHROSDhQQmhMwKnoECEAQAg&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FGenerative_adversarial_network&usg=AOvVaw09mLp9-GvBO7o23-xIW29P/)\n", + "\n", + "While there are many approaches used for generative modeling, a Generative Adverserial Network takes the following approach: \n", + "\n", + "![GAN Flowchart](https://i.imgur.com/6NMdO9u.png)\n", + "\n", + "There are two neural networks: a *Generator* and a *Discriminator*. The generator generates a \"fake\" sample given a random vector/matrix, and the discriminator attempts to detect whether a given sample is \"real\" (picked from the training data) or \"fake\" (generated by the generator). Training happens in tandem: we train the discriminator for a few epochs, then train the generator for a few epochs, and repeat. This way both the generator and the discriminator get better at doing their jobs. This rather simple approach can lead to some astounding results. The following images ([source](https://machinelearningmastery.com/resources-for-getting-started-with-generative-adversarial-networks/)), for instances, were all generated using GANs:\n", + "\n", + "\"gans_results\"\n", + "\n", + "\n", + "GANs however, can be notoriously difficult to train, and are extremely sensitive to hyperparameters, activation functions and regularization. In this tutorial, we'll train a GAN to generate images of handwritten digits similar to those from the MNIST database.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "19351cd6", + "metadata": {}, + "source": [ + "# Approach\n", + "Here's what we're going to do:\n", + "\n", + "* Define the problem statement.\n", + "* Create a GAN Training File\n", + " * Load the data.\n", + " * Define the Discriminator network.\n", + " * Define the Generator network.\n", + " * Gaussian Initialization.\n", + " * Define the Noise Function.\n", + " * Create GAN.\n", + " * Train GAN.\n", + "* Create a Image Generator File.\n", + " * Load the trained model.\n", + " * Create random noise.\n", + " * Generate Images using the trained model.\n", + " * Save the outputs in CSV.\n", + "* Look at outputs\n", + " * Convert CSV to Images.\n", + " * If not satisfied with result, train the model with different parameters." + ] + }, + { + "cell_type": "markdown", + "id": "212e3471", + "metadata": {}, + "source": [ + "# Data\n", + "For the datasets, we will be using a small subset of MNIST dataset comprising of only 4's and 9's." + ] + }, + { + "cell_type": "markdown", + "id": "f69e2067", + "metadata": {}, + "source": [ + "# Training File\n", + "Let's create the training file 'mnist_gan.cpp', train the model and save it." + ] + }, + { + "cell_type": "markdown", + "id": "7ff71009", + "metadata": {}, + "source": [ + "# Generate Output CSV\n", + "Let's also create the 'mnist_generate.cpp' file for sampling, generating the outputs from the model and saving the CSV file." + ] + }, + { + "cell_type": "markdown", + "id": "c333fc3f", + "metadata": {}, + "source": [ + "Let's look at the outputs." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ba6ad46d", + "metadata": {}, + "outputs": [], + "source": [ + "#include \n", + "\n", + "#include \"xwidgets/ximage.hpp\"" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2dcf56a4", + "metadata": {}, + "outputs": [], + "source": [ + "// Import the generate image script from utils folder.\n", + "#include \"../utils/generateimage.hpp\"" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "04fc2fd6", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e7cb5d5284844723975c2e993a1f2ce1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "A Jupyter widget with unique id: e7cb5d5284844723975c2e993a1f2ce1" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "// Let's generate image from csv files.\n", + "GenerateImage(\"./samples_csv_files/sample.csv\", \"./samples_posterior/sample.png\");\n", + "auto im = xw::image_from_file(\"./samples_posterior/sample.png\").finalize();\n", + "im" + ] + }, + { + "cell_type": "markdown", + "id": "23b323fd", + "metadata": {}, + "source": [ + "Thus we can see how to leverage mlpack for unsupervised learning, especially GAN's in this example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ab57159", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "C++14", + "language": "C++14", + "name": "xcpp14" + }, + "language_info": { + "codemirror_mode": "text/x-c++src", + "file_extension": ".cpp", + "mimetype": "text/x-c++src", + "name": "c++", + "version": "14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/mnist_gan/samples_posterior/sample.png b/mnist_gan/samples_posterior/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7e43288ff443d4327b1a77274e3d4ebc5a1e99 GIT binary patch literal 1953 zcmV;S2VVGzP)@ND{=fL?)QH= zy3*}kPV=tl`f}wI<)A4_h;4U~E7mVCLB_blNEK^86C!;Rv34}penz~MqA|6j5$s6) zyy7_~UX~`{>}%ZYN>PyGMi)1`QWWGkCn63^G?q+nT80sC*G}PfYO^;D-bqo}t|M(T z*7?q93^CuX<0aW&%gNXAC0)~jaZ+Dk47#QR6P4t9H7Md76EA0uXvi@z@v^l>LGqej zN)B@Ms=HEeQjAZ&@e|G%FQwRLt(bq>j2HEqPn%bZdR1U9GXv?&<0q;0sZV|C(~qyr z=5gV|`o{md5{*fccV3Gm@;{=GH~9qsz^wL-<{q^w_DLBmcX*&wyx3#b|D}_3;XIulp<(W2 zeCRYE>spmC>W#@4|9I-@%y7kOA+`DdWViV>O%5#)LXZ$5G}A`j5Vf}f04jL4YIk4l z^;-7<g^W2}dnW*3?AeAC#qQ?7Z}sj2#ZndnkQJr}kXBE>?H86kRlfwW2%c)9faqd|`VqKZX<2kmYY?uYr@gKv5 z_c)-s^40GC0G{}pnhgqNFc@w$msD zNf{1_w;08m)ifm!AfeB$4s5~?v^4_&vX9eqcDPWyk_Z&={;rkD0s3M6piY0)rQ{85 z>nQp7WgDAILL5y8fbV~18&97`~!mkxQ}m8htRo%f)diF(3!jnQw&+e zf!*+5qOkzb-$ztvho|^<0L!?@Qk`*x=$rL90Fr-qNDa(tniDQ$o;hrrquvuFzAXZP z$<@LZm`bsvW5&LtnJ~z2$N(^h@&Kf!T2Mz|ilszQu}iCOx;xEJ52`IXvqy+tZ~;j9 zn&=<)eRnGFO9HT;CtB-gA0eXe4pWH~KZjn>@s2jNB9KXBs4hwMKI&{aNW&7zgOp3jqh6W4KW?4-0;*e+Y9u{V0mG=45u2K7Ldq8lgOL- zemx0)_Zezw@2^YNwG$C7QVwcAZRgEDdu%^5ZyRoB$@i9)mJIBNJR-mK1#Y5e0Sqaq zAbQhkGx(686B}APw(Fx-*v6k_0swaK$D?v`UJ*~I!z|$pdsQyN#~3Mf$C!JFH%%yI zVq)^Y*nI~4orp-ZR};}=YP)sJ%*+i_)MG`brZBhPVyT&WzG2Ij5X%s=+xGC{){AEt zAFlF(x{+`_^_sU{dq5ETAxTzq#=7%-rysHkYt z_-BYd8K~0i1GR0(neW$o0|3Y)T4SsFCsQlcugxZM+n*jXx~#0s}Orf=U6DJndM52~VJsS5of9G*9%~u11?5q)4i5N~t1{jPc zx3Fr3g6cpZ5ID!@eUBR^25V+@r-Bkdh34?PNtnm(!~md%XoiV>z^^%(ZY5GLg8+bg z=re;&YPBFS(E#`GUQ=HMa+1*xuk-<^&@88eO=Hx`ZZH4^LXf~r#WEInwx?yb2n-snfUG~5Oj&?=*m69bUCjoOW?Wo)Ryc&P=D-mJMqhV?lw zGxYbB5G}@czk?q#p*1JWj+n021OIKlC25#tXI}CPtULyTW~KZqWOfG^s!b#%UH(K* zJXtPR%N~RUui+&UiwH2 zhSn&j-maQv&M^n_jaG%a(;a{`xyfkb!~o!9;uU6Ecgkr`06YI(8Ux91(d)YUX;h{Evix%r;^|8?s_$vO n5#>s!&ze`g%qyu+(boR}*$;hX-~&Q200000NkvXXu0mjfKmo3d literal 0 HcmV?d00001 diff --git a/utils/generateimage.hpp b/utils/generateimage.hpp new file mode 100644 index 00000000..0c20ba1e --- /dev/null +++ b/utils/generateimage.hpp @@ -0,0 +1,95 @@ +// Inside C++ notebook we can use: +// GenerateImage("input.csv", "output.png") +// auto im = xw::image_from_file("output.png").finalize() +// im + +#ifndef C_GENERATE_IMAGE_HPP +#define C_GENERATE_IMAGE_HPP + +#define PY_SSIZE_T_CLEAN +#include +#include + +// Here we use the same arguments as we used in the python script, +// since this is what is passed from the C++ notebook to call the python script. +int GenerateImage(const std::string& inFile, + const std::string& outFile = "output.png") +{ + PyObject *pName, *pModule, *pFunc; + PyObject *pArgs, *pValue; + + // This has to be adapted if you run this on your local system, + // so whenever you call the python script it can find the correct + // module -> PYTHONPATH, on lab.mlpack.org we put all the utility + // functions for plotting uinto the utils folder so we add that path + // to the Python search path. + + Py_Initialize(); + PyRun_SimpleString("import sys"); + PyRun_SimpleString("sys.path.append(\"../utils/\")"); + // Name of the python script without the extension. + pName = PyUnicode_DecodeFSDefault("generateimage"); + + pModule = PyImport_Import(pName); + Py_DECREF(pName); + + if (pModule != NULL) + { + // The Python function from the generateimage.py script + // we like to call - cgenerateimage + pFunc = PyObject_GetAttrString(pModule, "cgenerateimage"); + + if (pFunc && PyCallable_Check(pFunc)) + { + // The number of arguments we pass to the python script. + // inFile, outFile='output.png' + // for the example above it's 2 + pArgs = PyTuple_New(2); + + // Now we have to encode the argument to the correct type + // besides width, height everything else is a string. + // So we can use PyUnicode_FromString. + // If the data is an int we can use PyLong_FromLong, + // see the lines below for an example. + PyObject* pValueinFile = PyUnicode_FromString(inFile.c_str()); + // Here we just set the index of the argument. + PyTuple_SetItem(pArgs, 0, pValueinFile); + + PyObject* pValueoutFile = PyUnicode_FromString(outFile.c_str()); + PyTuple_SetItem(pArgs, 1, pValueoutFile); + + // The rest of the c++ part can stay the same. + + pValue = PyObject_CallObject(pFunc, pArgs); + Py_DECREF(pArgs); + if (pValue != NULL) + { + Py_DECREF(pValue); + } + else + { + Py_DECREF(pFunc); + Py_DECREF(pModule); + PyErr_Print(); + fprintf(stderr,"Call failed.\n"); + return 1; + } + } + else + { + if (PyErr_Occurred()) + PyErr_Print(); + } + + Py_XDECREF(pFunc); + Py_DECREF(pModule); + } + else + { + PyErr_Print(); + return 1; + } + + return 0; +} +#endif \ No newline at end of file diff --git a/utils/generateimage.py b/utils/generateimage.py new file mode 100644 index 00000000..0ca38f64 --- /dev/null +++ b/utils/generateimage.py @@ -0,0 +1,18 @@ +""" +@file generate_images.py +@author Roshan Swain +Generates jpg files from csv. +mlpack is free software; you may redistribute it and/or modify it under the +terms of the 3-clause BSD license. You should have received a copy of the +3-clause BSD license along with mlpack. If not, see +http://www.opensource.org/licenses/BSD-3-Clause for more information. +""" + +from PIL import Image +import numpy as np +import matplotlib.pyplot as plt + +def cgenerateimage(inFile, outFile = "output.png"): + dataset = np.genfromtxt(inFile, delimiter = ',', dtype = np.uint8) + im = Image.fromarray(dataset) + im.save(outFile) From 4cac2a4ca8593a1a896bbe0978d705b82092c91f Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Sun, 29 Aug 2021 00:45:13 +0530 Subject: [PATCH 18/20] add all files --- mnist_gan/.gitignore | 7 -- mnist_gan/Makefile | 8 -- mnist_gan/mnist_gan.cpp | 155 ----------------------------- mnist_gan/mnist_gan_generate.cpp | 55 ---------- mnist_gan/mnist_gan_notebook.ipynb | 8 -- 5 files changed, 233 deletions(-) delete mode 100644 mnist_gan/.gitignore diff --git a/mnist_gan/.gitignore b/mnist_gan/.gitignore deleted file mode 100644 index 6c11383c..00000000 --- a/mnist_gan/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.ipynb_checkpoints -saved_models -mnist_gan -mnist_gan_generate -mnist_gan_generate.o -mnist_gan.o -.vscode \ No newline at end of file diff --git a/mnist_gan/Makefile b/mnist_gan/Makefile index 2eaa05ba..a886421a 100644 --- a/mnist_gan/Makefile +++ b/mnist_gan/Makefile @@ -1,7 +1,3 @@ -<<<<<<< HEAD -======= - ->>>>>>> a9d50116a0cfb320e464071d8b6b19e8754b996a TARGET := mnist_gan_generate SRC := mnist_gan_generate.cpp LIBS_NAME := armadillo mlpack @@ -18,11 +14,7 @@ LDFLAGS += -L. # /path to mlpack library if installed locally. # path: mlpack/build/lib. # Add header directories for any includes that aren't on the # default compiler search path. -<<<<<<< HEAD INCLFLAGS := -I. -======= -INCLFLAGS := -I /home/viole/mlpac/build/include/ ->>>>>>> a9d50116a0cfb320e464071d8b6b19e8754b996a CXXFLAGS += $(INCLFLAGS) OBJS := $(SRC:.cpp=.o) diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp index 0fc01624..447b37c6 100644 --- a/mnist_gan/mnist_gan.cpp +++ b/mnist_gan/mnist_gan.cpp @@ -19,7 +19,6 @@ using namespace std::placeholders; int main() { -<<<<<<< HEAD size_t dNumKernels = 32; size_t discriminatorPreTrain = 5; size_t batchSize = 5; @@ -58,46 +57,6 @@ int main() std::cout << "MnistDataset No. of rows: " << mnistDataset.n_rows << std::endl; /** -======= - size_t dNumKernels = 32; - size_t discriminatorPreTrain = 5; - size_t batchSize = 5; - size_t noiseDim = 100; - size_t generatorUpdateStep = 1; - size_t numSamples = 10; - size_t cycles = 10; - size_t numEpoches = 25; - double stepSize = 0.0003; - double trainRatio = 0.8; - double eps = 1e-8; - double tolerance = 1e-5; - bool shuffle = true; - double multiplier = 10; - int datasetMaxCols = 10; - - std::cout << std::boolalpha - << " batchSize = " << batchSize << std::endl - << " generatorUpdateStep = " << generatorUpdateStep << std::endl - << " noiseDim = " << noiseDim << std::endl - << " numSamples = " << numSamples << std::endl - << " stepSize = " << stepSize << std::endl - << " numEpochs = " << numEpoches << std::endl - << " shuffle = " << shuffle << std::endl; - - - arma::mat mnistDataset; - mnistDataset.load("./dataset/mnist_first250_training_4s_and_9s.arm"); - - std::cout << arma::size(mnistDataset) << std::endl; - - mnistDataset = mnistDataset.cols(0, datasetMaxCols-1); - size_t numIterations = mnistDataset.n_cols * numEpoches; - numIterations /= batchSize; - - std::cout << "MnistDataset No. of rows: " << mnistDataset.n_rows << std::endl; - - /** ->>>>>>> a9d50116a0cfb320e464071d8b6b19e8754b996a * @brief Model Architecture: * * Discriminator: @@ -140,7 +99,6 @@ int main() * K : Kernel size * P : Padding * S : Stride -<<<<<<< HEAD */ // Creating the Discriminator network. @@ -221,95 +179,10 @@ int main() std::function noiseFunction = []() { return math::RandNormal(0, 1);}; GAN >, GaussianInitialization, -======= - */ - - - // Creating the Discriminator network. - FFN > discriminator; - discriminator.Add >(1, // Number of input activation maps - dNumKernels, // Number of output activation maps - 5, // Filter width - 5, // Filter height - 1, // Stride along width - 1, // Stride along height - 2, // Padding width - 2, // Padding height - 28, // Input widht - 28); // Input height - // Adding first ReLU - discriminator.Add >(); - // Adding mean pooling layer - discriminator.Add >(2, 2, 2, 2); - // Adding second convolution layer - discriminator.Add >(dNumKernels, 2 * dNumKernels, 5, 5, 1, 1, - 2, 2, 14, 14); - // Adding second ReLU - discriminator.Add >(); - // Adding second mean pooling layer - discriminator.Add >(2, 2, 2, 2); - // Adding linear layer - discriminator.Add >(7 * 7 * 2 * dNumKernels, 1024); - // Adding third ReLU - discriminator.Add >(); - // Adding final layer - discriminator.Add >(1024, 1); - - - // Creating the Generator network - FFN > generator; - generator.Add >(noiseDim, 3136); - generator.Add >(3136); - generator.Add >(); - generator.Add >(1, // Number of input activation maps - noiseDim / 2, // Number of output activation maps - 3, // Filter width - 3, // Filter height - 2, // Stride along width - 2, // Stride along height - 1, // Padding width - 1, // Padding height - 56, // input width - 56); // input height - // Adding first batch normalization layer - generator.Add >(39200); - // Adding first ReLU - generator.Add >(); - // Adding a bilinear interpolation layer - generator.Add >(28, 28, 56, 56, noiseDim / 2); - // Adding second convolution layer - generator.Add >(noiseDim / 2, noiseDim / 4, 3, 3, 2, 2, 1, 1, - 56, 56); - // Adding second batch normalization layer - generator.Add >(19600); - // Adding second ReLU - generator.Add >(); - // Adding second bilinear interpolation layer - generator.Add >(28, 28, 56, 56, noiseDim / 4); - // Adding third convolution layer - generator.Add >(noiseDim / 4, 1, 3, 3, 2, 2, 1, 1, 56, 56); - // Adding final tanh layer - generator.Add >(); - - // Creating GAN. - GaussianInitialization gaussian(0, 1); - ens::Adam optimizer(stepSize, // Step size of optimizer. - batchSize, // Batch size. - 0.9, // Exponential decay rate for first moment estimates. - 0.999, // Exponential decay rate for weighted norm estimates. - eps, // Value used to initialize the mean squared gradient parameter. - numIterations, // iterPerCycle// Maximum number of iterations. - tolerance, // Tolerance. - shuffle); // Shuffle. - std::function noiseFunction = [] () { - return math::RandNormal(0, 1);}; - GAN >, GaussianInitialization, ->>>>>>> a9d50116a0cfb320e464071d8b6b19e8754b996a std::function > gan(generator, discriminator, gaussian, noiseFunction, noiseDim, batchSize, generatorUpdateStep, discriminatorPreTrain, multiplier); -<<<<<<< HEAD std::cout << "Training ... " << std::endl; const clock_t beginTime = clock(); @@ -336,32 +209,4 @@ int main() // Let's save the model. data::Save("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); std::cout << "Model saved in mnist_gan/saved_models." << std::endl; -======= - std::cout << "Training ... " << std::endl; - - const clock_t beginTime = clock(); - // Cycles for monitoring training progress. - for( int i = 0; i < cycles; i++) - { - // Training the neural network. For first iteration, weights are random, - // thus using current values as starting point. - gan.Train(mnistDataset, //trainDataset - optimizer, - ens::PrintLoss(), - ens::ProgressBar(), - ens::Report()); - - optimizer.ResetPolicy() = false; - std::cout << " Model Performance " << - gan.Evaluate(gan.Parameters(), // Parameters of the network. - i, // Index of current input. - batchSize); // Batch size. - } - - std::cout << " Time taken to train -> " << float(clock()-beginTime) / CLOCKS_PER_SEC << "seconds" << std::endl; - - // Let's save the model. - data::Save("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); - std::cout << "Model saved in mnist_gan/saved_models." << std::endl; ->>>>>>> a9d50116a0cfb320e464071d8b6b19e8754b996a } \ No newline at end of file diff --git a/mnist_gan/mnist_gan_generate.cpp b/mnist_gan/mnist_gan_generate.cpp index afeebbae..61485a3d 100644 --- a/mnist_gan/mnist_gan_generate.cpp +++ b/mnist_gan/mnist_gan_generate.cpp @@ -46,7 +46,6 @@ int main() // data::Split(inputData, trainData, validData, 0.8); // } -<<<<<<< HEAD arma::arma_rng::set_seed_random(); // Define noise function. @@ -91,52 +90,6 @@ int main() // Create random noise using noise function. noise.imbue([&]() { return noiseFunction(); }); -======= - arma::arma_rng::set_seed_random(); - - // Define noise function. - std::function noiseFunction = [](){ return math::Random(-8, 8) + - math::RandNormal(0, 1) * 0.01;}; - - // Define generator. - FFN > generator; - - // Define discriminator. - FFN > discriminator; - - // Define GaussinaInitialization. - GaussianInitialization gaussian(0,1); - - // Define GAN class. - GAN >, GaussianInitialization, - std::function > gan(generator, discriminator, - gaussian, noiseFunction, noiseDim, batchSize, generatorUpdateStep, - discriminatorPreTrain, multiplier); - - // Load the saved model. - data::Load("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); - - /*--------------Sampling-----------------------------------------*/ - - std::cout << "Sampling...." << std::endl; - - // Noise matrix. - arma::mat noise(noiseDim, batchSize); - - // Dimensions of the image. - size_t dim = std::sqrt(trainData.n_rows); - - // Matrix to store the generated data. - arma::mat generatedData(2 * dim, dim * numSamples); - - - for (size_t i = 0; i < numSamples; ++i) - { - arma::mat samples; - - // Create random noise using noise function. - noise.imbue( [&]() { return noiseFunction(); } ); ->>>>>>> a9d50116a0cfb320e464071d8b6b19e8754b996a // Pass noise through generator and store output in samples. gan.Generator().Forward(noise, samples); @@ -154,18 +107,10 @@ int main() samples = samples.t(); generatedData.submat(dim, i * dim, 2 * dim - 1, i * dim + dim - 1) = samples; -<<<<<<< HEAD } // Save the output as csv. data::Save("./samples_csv_files/sample.csv", generatedData, false, false); std::cout << "Output generated!" << std::endl; -======= - } - // Save the output as csv. - data::Save("./samples_csv_files/sample.csv", generatedData, false, false); - - std::cout << "Output generated!" << std::endl; ->>>>>>> a9d50116a0cfb320e464071d8b6b19e8754b996a } \ No newline at end of file diff --git a/mnist_gan/mnist_gan_notebook.ipynb b/mnist_gan/mnist_gan_notebook.ipynb index 83126a09..dfd66a4e 100644 --- a/mnist_gan/mnist_gan_notebook.ipynb +++ b/mnist_gan/mnist_gan_notebook.ipynb @@ -106,11 +106,7 @@ "metadata": {}, "outputs": [], "source": [ -<<<<<<< HEAD "// Import the generate image script from utils folder.\n", -======= - "// Import the generate image script from utils folder\n", ->>>>>>> a9d50116a0cfb320e464071d8b6b19e8754b996a "#include \"../utils/generateimage.hpp\"" ] }, @@ -137,11 +133,7 @@ } ], "source": [ -<<<<<<< HEAD "// Let's generate image from csv files.\n", -======= - "// Let's generate imgage from csv files\n", ->>>>>>> a9d50116a0cfb320e464071d8b6b19e8754b996a "GenerateImage(\"./samples_csv_files/sample.csv\", \"./samples_posterior/sample.png\");\n", "auto im = xw::image_from_file(\"./samples_posterior/sample.png\").finalize();\n", "im" From 25abdc9c79fb5d016832dc298f5d6a8407f2926c Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Sun, 29 Aug 2021 00:46:27 +0530 Subject: [PATCH 19/20] push --- mnist_gan/mnist_gan.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp index 447b37c6..d45f6343 100644 --- a/mnist_gan/mnist_gan.cpp +++ b/mnist_gan/mnist_gan.cpp @@ -209,4 +209,4 @@ int main() // Let's save the model. data::Save("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); std::cout << "Model saved in mnist_gan/saved_models." << std::endl; -} \ No newline at end of file +} From 3281b0a2aa7ae8f429a39922c7691da8a97a1a4f Mon Sep 17 00:00:00 2001 From: Roshan Swain Date: Sun, 29 Aug 2021 00:53:30 +0530 Subject: [PATCH 20/20] add new line at the end of file --- mnist_gan/mnist_gan.cpp | 1 + mnist_gan/mnist_gan_generate.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mnist_gan/mnist_gan.cpp b/mnist_gan/mnist_gan.cpp index d45f6343..47f8390f 100644 --- a/mnist_gan/mnist_gan.cpp +++ b/mnist_gan/mnist_gan.cpp @@ -209,4 +209,5 @@ int main() // Let's save the model. data::Save("./saved_models/ganMnist_25epochs.bin", "ganMnist", gan); std::cout << "Model saved in mnist_gan/saved_models." << std::endl; + std::cout << "\n"; } diff --git a/mnist_gan/mnist_gan_generate.cpp b/mnist_gan/mnist_gan_generate.cpp index 61485a3d..358d9975 100644 --- a/mnist_gan/mnist_gan_generate.cpp +++ b/mnist_gan/mnist_gan_generate.cpp @@ -112,5 +112,5 @@ int main() data::Save("./samples_csv_files/sample.csv", generatedData, false, false); std::cout << "Output generated!" << std::endl; - -} \ No newline at end of file + std::cout << "\n"; +}