| // import { MnistData } from './MNIST_dataset.js'; | |
| /** | |
| * Loads and preprocesses MNIST dataset for neural network training | |
| * Reshapes flat image arrays into column vectors and formats labels | |
| * @returns {Promise<{trainingData: Array, testData: Array}>} Preprocessed training and test data | |
| */ | |
| async function preprocessMNISTData() { | |
| const IMAGE_SIZE = 784; | |
| const NUM_CLASSES = 10; | |
| const NUM_TRAIN_ELEMENTS = 55000; | |
| const NUM_TEST_ELEMENTS = 10000; | |
| // Load MNIST data from remote sources | |
| const mnistData = new MnistData(); | |
| await mnistData.load(); | |
| // Convert training data to format expected by Network class | |
| const trainingData = []; | |
| for (let i = 0; i < NUM_TRAIN_ELEMENTS; i++) { | |
| const imageStart = i * IMAGE_SIZE; | |
| const labelStart = i * NUM_CLASSES; | |
| // Reshape image from flat array into column vector [[val], [val], ...] | |
| const x = []; | |
| for (let j = 0; j < IMAGE_SIZE; j++) { | |
| x.push([mnistData.trainImages[imageStart + j]]); | |
| } | |
| // Extract one-hot encoded label as column vector | |
| const y = []; | |
| for (let j = 0; j < NUM_CLASSES; j++) { | |
| y.push([mnistData.trainLabels[labelStart + j]]); | |
| } | |
| trainingData.push([x, y]); | |
| } | |
| // Convert test data to format expected by Network class | |
| const testData = []; | |
| for (let i = 0; i < NUM_TEST_ELEMENTS; i++) { | |
| const imageStart = i * IMAGE_SIZE; | |
| const labelStart = i * NUM_CLASSES; | |
| // Reshape image from flat array into column vector [[val], [val], ...] | |
| const x = []; | |
| for (let j = 0; j < IMAGE_SIZE; j++) { | |
| x.push([mnistData.testImages[imageStart + j]]); | |
| } | |
| // Extract one-hot encoded label as column vector | |
| const y = []; | |
| for (let j = 0; j < NUM_CLASSES; j++) { | |
| y.push([mnistData.testLabels[labelStart + j]]); | |
| } | |
| testData.push([x, y]); | |
| } | |
| return { trainingData, testData }; | |
| } | |