TL; DR
MNIST görüntü tanıma Merhaba Dünya olduğunu. Kalbinizi öğrendikten sonra, aklınızdaki bu soruları çözmek kolaydır.
Soru belirleme:
Yazılan ana sorunuz:
// how to train, where to pass image and labels ?
kod bloğunuzun içinde. Bunlar için Tensorflow.js örnekler bölümü örneklerinden mükemmel cevap buldum: MNIST örneği. Aşağıdaki linklerimin saf javascript ve node.js sürümleri ve Wikipedia açıklaması var. Onları zihninizdeki ana soruyu cevaplamak için gereken seviyede geçireceğim ve kendi resimlerinizin ve etiketlerinizin MNIST görüntü kümesi ve onu kullanan örneklerle nasıl bir ilgisi olduğunu da perspektiflere ekleyeceğim.
Her şey sırayla:
Kod parçacıkları.
görüntülerin nereye aktarılacağı (Node.js örneği)
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;
}
Notlar:
MNIST veri seti, bir dosyada, x ve y koordinasyon tablosundaki kutular gibi, her biri aynı boyutta, yan yana, her biri aynı boyutta, bulmacadaki fayanslar gibi birkaç görüntünün bulunduğu büyük bir görüntüdür. Her kutunun bir örneği vardır ve etiket dizisindeki karşılık gelen x ve y etiketine sahiptir. Bu örnekten, birkaç dosya biçimine dönüştürmek büyük bir şey değildir, böylece işlemek için while döngüsüne bir seferde sadece bir resim verilir.
Etiketler:
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;
}
Notlar:
Burada, etiketler bir dosyadaki bayt verileridir. Javascript dünyasında ve başlangıç noktanızdaki yaklaşımla etiketler bir json dizisi de olabilir.
modeli eğit:
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
});
Notlar:
İşte model.fit
işi yapan gerçek kod satırı: modeli eğitir.
Her şeyin sonuçları:
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)}`);
Not:
Veri Biliminde, bu sefer de burada, en büyüleyici kısım, modelin yeni verilerin testinden ne kadar iyi kurtulduğunu ve etiketsiz kaldığını bilmek, bunları etiketleyebilir mi, değil mi? Çünkü şimdi bize bazı rakamlar basan değerlendirme bölümü.
Kayıp ve doğruluk: [4]
Kayıp ne kadar düşükse, bir model o kadar iyi olur (model eğitim verilerine fazla oturmamışsa). Kayıp, eğitim ve validasyonda hesaplanır ve yorumu, modelin bu iki set için ne kadar iyi olduğunu gösterir. Doğruluğun aksine, kayıp bir yüzde değildir. Eğitim veya doğrulama setlerinde her örnek için yapılan hataların bir toplamıdır.
..
Bir modelin doğruluğu genellikle model parametreleri öğrenilip sabitlendikten ve hiçbir öğrenme yapılmadığında belirlenir. Daha sonra test örnekleri modele beslenir ve gerçek hedeflerle karşılaştırıldıktan sonra modelin yaptığı hata sayısı (sıfır bir kayıp) kaydedilir.
Daha fazla bilgi:
Github sayfalarında, README.md dosyasında, github örneğindeki tüm bilgilerin daha ayrıntılı olarak açıklandığı öğretici bir bağlantı vardır.
[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] Bir makine öğrenme modeli için "kayıp" ve "doğruluk" nasıl yorumlanır