41 lines
1.2 KiB
JavaScript
41 lines
1.2 KiB
JavaScript
export async function loadBinary(url) {
|
|
const response = await fetch(url);
|
|
if (!response.ok) throw new Error("Failed to load " + url);
|
|
const buffer = await response.arrayBuffer();
|
|
return buffer;
|
|
}
|
|
|
|
// Loads MNIST 28x28 grayscale images + labels
|
|
export async function loadMNIST() {
|
|
const imgBuf = await loadBinary("/models/MNIST-2k-images.bin");
|
|
const lblBuf = await loadBinary("/models/MNIST-2k-labels.bin");
|
|
|
|
const images = new Float32Array(imgBuf); // already normalized [0..1]
|
|
const labels = new Uint8Array(lblBuf);
|
|
|
|
const sampleCount = labels.length;
|
|
console.log("MNIST Loaded:", sampleCount, "samples");
|
|
|
|
return { images, labels, sampleCount };
|
|
}
|
|
|
|
// Utility visualization helper for debugging
|
|
export function showImage(img784, canvas) {
|
|
const size = 28;
|
|
canvas.width = size;
|
|
canvas.height = size;
|
|
|
|
const ctx = canvas.getContext("2d");
|
|
const imgData = ctx.createImageData(size, size);
|
|
|
|
for (let i = 0; i < size * size; i++) {
|
|
const v = Math.floor(img784[i] * 255);
|
|
imgData.data[i * 4 + 0] = v;
|
|
imgData.data[i * 4 + 1] = v;
|
|
imgData.data[i * 4 + 2] = v;
|
|
imgData.data[i * 4 + 3] = 255;
|
|
}
|
|
|
|
ctx.putImageData(imgData, 0, 0);
|
|
}
|