TL; DR
MNIST é o reconhecimento de imagem Hello World. Depois de aprender de cor, essas perguntas são fáceis de resolver.
Configuração da pergunta:
Sua principal pergunta escrita é
// how to train, where to pass image and labels ?
dentro do seu bloco de código. Para aqueles que encontrei a resposta perfeita dos exemplos da seção de exemplos do Tensorflow.js: Exemplo do MNIST. Meus links abaixo têm versões javascript e node.js puras e explicação da Wikipedia. Vou examiná-los no nível necessário para responder à pergunta principal em sua mente e acrescentarei também perspectivas de como suas próprias imagens e rótulos têm alguma coisa a ver com o conjunto de imagens MNIST e os exemplos usando-os.
Primeiras coisas primeiro:
Partes de codigo.
onde transmitir imagens (amostra do Node.js.)
async function loadImages(filename) {
const buffer = await fetchOnceAndSaveToDiskWithBuffer(filename);
const headerBytes = IMAGE_HEADER_BYTES;
const recordBytes = IMAGE_HEIGHT * IMAGE_WIDTH;
const headerValues = loadHeaderValues(buffer, headerBytes);
assert.equal(headerValues[0], IMAGE_HEADER_MAGIC_NUM);
assert.equal(headerValues[2], IMAGE_HEIGHT);
assert.equal(headerValues[3], IMAGE_WIDTH);
const images = [];
let index = headerBytes;
while (index < buffer.byteLength) {
const array = new Float32Array(recordBytes);
for (let i = 0; i < recordBytes; i++) {
// Normalize the pixel values into the 0-1 interval, from
// the original 0-255 interval.
array[i] = buffer.readUInt8(index++) / 255;
}
images.push(array);
}
assert.equal(images.length, headerValues[1]);
return images;
}
Notas:
O conjunto de dados MNIST é uma imagem enorme, onde em um arquivo existem várias imagens como blocos no quebra-cabeça, todas com o mesmo tamanho, lado a lado, como caixas na tabela de coordenação xey. Cada caixa tem uma amostra e x e y correspondentes na matriz de rótulos têm o rótulo. Neste exemplo, não é grande coisa transformá-lo em vários formatos de arquivo, de modo que, na verdade, apenas uma foto de cada vez seja dada ao loop while para lidar.
Marcadores:
async function loadLabels(filename) {
const buffer = await fetchOnceAndSaveToDiskWithBuffer(filename);
const headerBytes = LABEL_HEADER_BYTES;
const recordBytes = LABEL_RECORD_BYTE;
const headerValues = loadHeaderValues(buffer, headerBytes);
assert.equal(headerValues[0], LABEL_HEADER_MAGIC_NUM);
const labels = [];
let index = headerBytes;
while (index < buffer.byteLength) {
const array = new Int32Array(recordBytes);
for (let i = 0; i < recordBytes; i++) {
array[i] = buffer.readUInt8(index++);
}
labels.push(array);
}
assert.equal(labels.length, headerValues[1]);
return labels;
}
Notas:
Aqui, os rótulos também são dados de bytes em um arquivo. No mundo Javascript, e com a abordagem que você tem no seu ponto de partida, os rótulos também podem ser uma matriz json.
treinar o modelo:
await data.loadData();
const {images: trainImages, labels: trainLabels} = data.getTrainData();
model.summary();
let epochBeginTime;
let millisPerStep;
const validationSplit = 0.15;
const numTrainExamplesPerEpoch =
trainImages.shape[0] * (1 - validationSplit);
const numTrainBatchesPerEpoch =
Math.ceil(numTrainExamplesPerEpoch / batchSize);
await model.fit(trainImages, trainLabels, {
epochs,
batchSize,
validationSplit
});
Notas:
Aqui model.fit
está a linha de código real que faz a coisa: treina o modelo.
Resultados da coisa toda:
const {images: testImages, labels: testLabels} = data.getTestData();
const evalOutput = model.evaluate(testImages, testLabels);
console.log(
`\nEvaluation result:\n` +
` Loss = ${evalOutput[0].dataSync()[0].toFixed(3)}; `+
`Accuracy = ${evalOutput[1].dataSync()[0].toFixed(3)}`);
Nota:
Em Data Science, também desta vez aqui, a parte mais fascinante é saber até que ponto o modelo sobrevive ao teste de novos dados e sem rótulos, pode rotulá-los ou não? Pois essa é a parte da avaliação que agora nos imprime alguns números.
Perda e precisão: [4]
Quanto menor a perda, melhor o modelo (a menos que o modelo tenha se ajustado demais aos dados de treinamento). A perda é calculada no treinamento e na validação e sua interoperação é o desempenho do modelo nesses dois conjuntos. Diferentemente da precisão, a perda não é uma porcentagem. É uma soma dos erros cometidos para cada exemplo nos conjuntos de treinamento ou validação.
..
A precisão de um modelo é geralmente determinada depois que os parâmetros do modelo são aprendidos e corrigidos e nenhum aprendizado está ocorrendo. Em seguida, as amostras de teste são fornecidas ao modelo e o número de erros (perda zero e um) que o modelo comete é registrado, após comparação com os verdadeiros alvos.
Mais Informações:
Nas páginas do github, no arquivo README.md, há um link para o tutorial, onde tudo no exemplo do github é explicado em mais detalhes.
[1] https://github.com/tensorflow/tfjs-examples/tree/master/mnist
[2] https://github.com/tensorflow/tfjs-examples/tree/master/mnist-node
[3] https://en.wikipedia.org/wiki/MNIST_database
[4] Como interpretar "perda" e "precisão" para um modelo de aprendizado de máquina