TL; DR
MNIST là nhận dạng hình ảnh Hello World. Sau khi học nó bằng trái tim, những câu hỏi trong tâm trí của bạn rất dễ giải quyết.
Đặt câu hỏi:
Câu hỏi chính của bạn được viết là
// how to train, where to pass image and labels ?
bên trong khối mã của bạn. Đối với những người tôi đã tìm thấy câu trả lời hoàn hảo từ các ví dụ của phần ví dụ Tensorflow.js: ví dụ MNIST. Các liên kết bên dưới của tôi có các phiên bản javascript và node.js thuần túy và giải thích Wikipedia. Tôi sẽ xem xét chúng ở mức độ cần thiết để trả lời câu hỏi chính trong đầu bạn và tôi cũng sẽ thêm các quan điểm về cách hình ảnh và nhãn của riêng bạn có liên quan gì đến bộ ảnh MNIST và các ví dụ sử dụng nó.
Điều đầu tiên trước tiên:
Đoạn mã.
nơi để truyền hình ảnh (mẫu 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;
}
Ghi chú:
Bộ dữ liệu của MNIST là một hình ảnh khổng lồ, trong đó trong một tệp có một số hình ảnh giống như các ô trong câu đố, mỗi hình có cùng kích thước, cạnh nhau, giống như các hộp trong bảng phối hợp x và y. Mỗi hộp có một mẫu và x và y tương ứng trong mảng nhãn có nhãn. Từ ví dụ này, việc chuyển nó sang định dạng một số tệp không phải là vấn đề lớn, do đó thực tế chỉ có một hình ảnh tại một thời điểm được đưa vào vòng lặp while để xử lý.
Nhãn:
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;
}
Ghi chú:
Ở đây, nhãn cũng là dữ liệu byte trong một tệp. Trong thế giới Javascript và với cách tiếp cận bạn có trong điểm xuất phát của mình, nhãn cũng có thể là một mảng json.
đào tạo người mẫu:
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
});
Ghi chú:
Đây model.fit
là dòng mã thực tế thực hiện công việc: đào tạo mô hình.
Kết quả của toàn bộ:
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)}`);
Ghi chú:
Trong Khoa học dữ liệu, lần này cũng ở đây, phần khó hiểu nhất là để biết mô hình sống sót qua thử nghiệm dữ liệu mới và không có nhãn như thế nào, nó có thể gắn nhãn cho chúng hay không? Vì đó là phần đánh giá hiện in cho chúng tôi một số con số.
Mất và chính xác: [4]
Mất mát càng thấp, mô hình càng tốt (trừ khi mô hình đã quá phù hợp với dữ liệu đào tạo). Mất mát được tính toán trên đào tạo và xác nhận và sự can thiệp của nó là mô hình hoạt động tốt như thế nào đối với hai bộ này. Không giống như độ chính xác, mất không phải là một tỷ lệ phần trăm. Đây là tổng hợp các lỗi được tạo cho từng ví dụ trong tập huấn luyện hoặc xác nhận hợp lệ.
..
Độ chính xác của một mô hình thường được xác định sau khi các tham số mô hình được học và cố định và không có việc học nào diễn ra. Sau đó, các mẫu thử được đưa vào mô hình và số lỗi (mất không một) mà mô hình tạo ra được ghi lại, sau khi so sánh với các mục tiêu thực sự.
Thêm thông tin:
Trong các trang github, trong tệp README.md, có một liên kết đến hướng dẫn, trong đó tất cả trong ví dụ về github được giải thích chi tiết hơn.
[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] Cách diễn giải "mất" và "chính xác" cho mô hình học máy