/// <summary> /// Constructor /// </summary> /// <param name="baseFolder">Base folder with MNIST dataset files</param> /// <param name="imagesCnt">How many images to load</param> /// <param name="exact">If TRUE, you will get exactly imagesCnt images. If FALSE, you will get AT MOST imagesCnt images. It's here for performance reason and BC</param> /// <param name="afterLastImage">What to do, after the last values has been sent</param> public MyMNISTManager(string baseFolder, int trainingExamplesPerDigitCnt = int.MaxValue, int testExamplesPerDigitCnt = int.MaxValue, bool exact = false, MNISTLastImageMethod afterLastImage = MNISTLastImageMethod.ResetToStart) { m_baseFolder = baseFolder; m_trainingImages = new ArrayList(); m_testImages = new ArrayList(); m_afterLastImage = afterLastImage; m_trainingExamplesPerDigitCnt = trainingExamplesPerDigitCnt; m_testExamplesPerDigitCnt = testExamplesPerDigitCnt; m_imagesServed = 0; m_sequenceIterator = 0; m_definedOrder = false; // START TIME MEASUREMENT ---------------------------------------------------------- //Stopwatch sw = new Stopwatch(); //sw.Start(); ReadMnistSet("train-images.idx3-ubyte", "train-labels.idx1-ubyte", m_trainingExamplesPerDigitCnt, m_trainingImages); ReadMnistSet("t10k-images.idx3-ubyte", "t10k-labels.idx1-ubyte", m_testExamplesPerDigitCnt, m_testImages); byte[,] data = new byte[28, 28]; m_blankImage = new MyMNISTImage(data, 0); m_trainingImagesEnumerator = m_trainingImages.GetEnumerator(); m_testImagesEnumerator = m_testImages.GetEnumerator(); //sw.Stop(); //Console.WriteLine("Elapsed={0}", sw.Elapsed); }
/// <summary> /// Constructor /// </summary> /// <param name="baseFolder">Base folder with MNIST dataset files</param> /// <param name="imagesCnt">How many images to load</param> /// <param name="exact">If TRUE, you will get exactly imagesCnt images. If FALSE, you will get AT MOST imagesCnt images. It's here for performance reason and BC</param> /// <param name="afterLastImage">What to do, after the last values has been sent</param> public MyMNISTManager(string baseFolder, int trainingExamplesPerDigitCnt = int.MaxValue, int testExamplesPerDigitCnt = int.MaxValue, bool exact = false, MNISTLastImageMethod afterLastImage = MNISTLastImageMethod.ResetToStart, int randomSeed = 0) { if (randomSeed == 0) { rand = new Random(); } else { rand = new Random(randomSeed); } m_baseFolder = baseFolder; m_trainingImages = new ArrayList(); m_testImages = new ArrayList(); m_afterLastImage = afterLastImage; m_trainingExamplesPerDigitCnt = trainingExamplesPerDigitCnt; m_testExamplesPerDigitCnt = testExamplesPerDigitCnt; m_lastServedImage = -1; m_sequenceIterator = 0; m_definedOrder = false; // START TIME MEASUREMENT ---------------------------------------------------------- //Stopwatch sw = new Stopwatch(); //sw.Start(); ReadMnistSet("train-images.idx3-ubyte", "train-labels.idx1-ubyte", m_trainingExamplesPerDigitCnt, m_trainingImages); ReadMnistSet("t10k-images.idx3-ubyte", "t10k-labels.idx1-ubyte", m_testExamplesPerDigitCnt, m_testImages); byte[,] data = new byte[28, 28]; m_blankImage = new MyMNISTImage(data, 0); m_trainingImagesEnumerator = m_trainingImages.GetEnumerator(); m_testImagesEnumerator = m_testImages.GetEnumerator(); //sw.Stop(); //Console.WriteLine("Elapsed={0}", sw.Elapsed); }
/// <summary> /// Constructor /// </summary> /// <param name="baseFolder">Base folder with MNIST dataset files</param> /// <param name="imagesCnt">How many images to load</param> /// <param name="exact">If TRUE, you will get exactly imagesCnt images. If FALSE, you will get AT MOST imagesCnt images. It's here for performance reason and BC</param> /// <param name="afterLastImage">What to do, after the last values has been sent</param> public MyMNISTManager(string baseFolder, int imagesCnt = int.MaxValue, bool exact = false, MNISTLastImageMethod afterLastImage = MNISTLastImageMethod.ResetToStart) { m_baseFolder = baseFolder; m_images = new ArrayList(); m_afterLastImage = afterLastImage; m_imagesDemand = imagesCnt; m_imagesServed = 0; m_sequenceIterator = 0; m_definedOrder = false; FileStream ifsTrainLabels = new FileStream(m_baseFolder + "train-labels.idx1-ubyte", FileMode.Open, FileAccess.Read); FileStream ifsTrainImages = new FileStream(m_baseFolder + "train-images.idx3-ubyte", FileMode.Open, FileAccess.Read); BinaryReader brTrainLabels = new BinaryReader(ifsTrainLabels); BinaryReader brTrainImages = new BinaryReader(ifsTrainImages); //Magic number brTrainLabels.ReadInt32(); brTrainImages.ReadInt32(); int numImagesTrainLables = brTrainLabels.ReadInt32(); numImagesTrainLables = ReverseBytes(numImagesTrainLables); int numImagesTrainImages = brTrainImages.ReadInt32(); numImagesTrainImages = ReverseBytes(numImagesTrainImages); int numRowsTrainImages = brTrainImages.ReadInt32(); numRowsTrainImages = ReverseBytes(numRowsTrainImages); int numColsTrainImages = brTrainImages.ReadInt32(); numColsTrainImages = ReverseBytes(numColsTrainImages); int maxImages; if (exact) { // numImagesTrainImages = 60000 maxImages = numImagesTrainImages; } else { // value of 2000 is a compromise between long loading-time for maximum of 60k images and minimum of user set "imagesCnt" // this also brings more flexibility for changing the m_imagesDemand during simulation (up to max(2000,imagesCnt) instead of imagesCnt) maxImages = Math.Max(2000, Math.Min(numImagesTrainImages, imagesCnt)); } byte[][] data = new byte[numColsTrainImages][]; for (int i = 0; i < data.Length; ++i) { data[i] = new byte[numRowsTrainImages]; } for (int i = 0; i < maxImages; ++i) { for (int j = 0; j < numColsTrainImages; ++j) { for (int k = 0; k < numRowsTrainImages; ++k) { byte b = brTrainImages.ReadByte(); data[j][k] = b; } } byte label = brTrainLabels.ReadByte(); MyMNISTImage mImage = new MyMNISTImage(data, label, numColsTrainImages, numRowsTrainImages); m_images.Add(mImage); } ifsTrainImages.Close(); brTrainImages.Close(); ifsTrainLabels.Close(); brTrainLabels.Close(); m_imageEnumerator = m_images.GetEnumerator(); for (int i = 0; i < numColsTrainImages; ++i) { for (int j = 0; j < numRowsTrainImages; ++j) { data[i][j] = 0; } } m_blankImage = new MyMNISTImage(data, 0); }