TL; DR
MNIST to rozpoznawanie obrazów Hello World. Po nauczeniu się na pamięć, te pytania w twoim umyśle są łatwe do rozwiązania.
Ustawienie pytania:
Twoje główne pytanie jest napisane
// how to train, where to pass image and labels ?
wewnątrz twojego bloku kodu. Dla tych znalazłem idealną odpowiedź z przykładów sekcji przykładów Tensorflow.js: przykład MNIST. Moje poniższe linki mają czystą wersję javascript i node.js oraz objaśnienie Wikipedii. Przejdę je na poziomie niezbędnym do odpowiedzi na główne pytanie w twoim umyśle i dodam również perspektywy, w jaki sposób twoje własne obrazy i etykiety mają cokolwiek wspólnego z zestawem obrazów MNIST i przykładami z nich korzystającymi.
Po pierwsze:
Fragmenty kodu.
gdzie przekazać obrazy (próbka 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;
}
Uwagi:
Zestaw danych MNIST to ogromny obraz, w którym w jednym pliku znajduje się kilka obrazów, takich jak kafelki w puzzlach, każdy o tym samym rozmiarze, obok siebie, jak pola w tabeli koordynacyjnej xiy. Każde pudełko ma jedną próbkę, a odpowiednie xiy w tablicy etykiet mają etykietę. Z tego przykładu nie jest wielkim problemem, aby zmienić go na kilka formatów plików, tak że właściwie tylko jedno zdjęcie na raz jest przekazywane pętli while do obsługi.
Etykiety:
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;
}
Uwagi:
W tym przypadku etykiety są również danymi bajtowymi w pliku. W świecie Javascript i przy podejściu do punktu wyjścia etykiety mogą być również tablicą json.
wytrenuj model:
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
});
Uwagi:
Oto model.fit
właściwy wiersz kodu, który działa: trenuje model.
Wyniki całej sprawy:
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)}`);
Uwaga:
W Data Science, również tym razem, najbardziej fascynujące jest to, jak dobrze model przetrwa test nowych danych i żadnych etykiet, czy może je oznaczać, czy nie? Jest to część ewaluacyjna, która drukuje nam teraz niektóre liczby.
Utrata i dokładność: [4]
Im niższa strata, tym lepszy model (chyba że model zbytnio dopasował się do danych treningowych). Stratę oblicza się na podstawie szkolenia i walidacji, a jej interperacja określa, jak dobrze model radzi sobie w tych dwóch zestawach. W przeciwieństwie do dokładności, strata nie jest procentem. Jest to suma błędów popełnianych dla każdego przykładu w zestawach szkoleniowych lub walidacyjnych.
..
Dokładność modelu jest zwykle określana po poznaniu i ustaleniu parametrów modelu i braku uczenia się. Następnie próbki testowe są podawane do modelu i rejestrowana jest liczba błędów (zero zero jeden), które popełnił model, po porównaniu do prawdziwych celów.
Więcej informacji:
Na stronach github w pliku README.md znajduje się link do samouczka, w którym wszystko w przykładzie github wyjaśniono bardziej szczegółowo.
[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] Jak interpretować „utratę” i „dokładność” dla modelu uczenia maszynowego