TL; DR
MNIST는 이미지 인식 Hello World입니다. 마음으로 그것을 배우고 나면, 당신의 마음에있는이 질문들은 쉽게 풀 수 있습니다.
질문 설정 :
당신의 주요 질문은
// how to train, where to pass image and labels ?
코드 블록 내부. 그런 사람들을 위해 Tensorflow.js 예제 섹션의 예제에서 완벽한 대답을 찾았습니다 : MNIST 예제. 아래 링크에는 순수한 javascript 및 node.js 버전과 Wikipedia 설명이 있습니다. 나는 당신의 마음에있는 주요 질문에 대답하는 데 필요한 수준에서 그것들을 살펴보고, 자신의 이미지와 레이블이 MNIST 이미지 세트와 어떤 관련이 있는지와 그것을 사용하는 예제에 대한 관점을 추가 할 것입니다.
먼저 첫 번째 것들:
코드 스 니펫.
이미지를 전달할 위치 (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;
}
노트:
MNIST 데이터 세트는 하나의 파일에 x와 y 좌표 테이블의 상자와 같이 같은 크기, 나란히, 같은 크기의 퍼즐 타일과 같은 여러 이미지가있는 거대한 이미지입니다. 각 상자에는 하나의 샘플이 있으며 labels 배열의 해당 x 및 y에는 레이블이 있습니다. 이 예제에서 여러 파일 형식으로 변환하는 것은 큰 문제가 아니므로 실제로 한 번에 하나의 그림 만 처리 할 while 루프에 제공됩니다.
라벨 :
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;
}
노트:
여기서 레이블은 파일의 바이트 데이터이기도합니다. Javascript 세계에서, 그리고 시작점에서 접근 한 방식으로 레이블은 json 배열 일 수도 있습니다.
모델 훈련 :
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
});
노트:
다음 model.fit
은 작업을 수행하는 실제 코드 줄입니다. 모델을 훈련시킵니다.
모든 것의 결과 :
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)}`);
노트 :
이번에는 데이터 사이언스에서 가장 매혹적인 부분은 모델이 새로운 데이터의 테스트에서 얼마나 잘 살아남 았는지, 레이블이 없는지, 레이블을 붙일 수 있는지를 아는 것입니다. 그것은 이제 우리에게 숫자를 인쇄하는 평가 부분입니다.
손실 및 정확도 : [4]
손실이 적을수록 모델이 향상됩니다 (모델이 훈련 데이터에 과도하게 적합하지 않은 경우). 손실은 훈련 및 검증에 의해 계산되며 그 상호 작용은 모델이이 두 세트에 대해 얼마나 잘 수행되고 있는지를 나타냅니다. 정확도와 달리 손실은 백분율이 아닙니다. 훈련 또는 검증 세트에서 각 예에 대해 발생한 오류를 요약 한 것입니다.
..
모델의 정확도는 일반적으로 모델 매개 변수를 학습하고 수정 한 후 학습이 수행되지 않은 후에 결정됩니다. 그런 다음 테스트 샘플을 모델에 공급하고 실제 목표와 비교 한 후 모델의 실수 횟수 (0 대 1 손실)를 기록합니다.
추가 정보:
github 페이지의 README.md 파일에는 github 예제의 모든 내용이 자세히 설명되어있는 튜토리얼 링크가 있습니다.
[1] https://github.com/tensorflow/tfjs-examples/tree/master/mnist
[2] https://github.com/tensorflow/tfjs-examples/tree/master/mnist-node
[3] https://ko.wikipedia.org/wiki/MNIST_database
[4] 기계 학습 모델의 "손실"및 "정확도"해석 방법