有人开玩笑说,80%的数据科学家都在清洗数据,剩下的20%都在抱怨清洗数据……在数据科学工作中,清洗的比例数据比外界高出很多,超乎想象。一般来说,训练模型通常只占机器学习或数据科学家工作的一小部分(不到10%)。——KaggleCEOAntonyGoldbloom对于任何机器学习问题,数据处理都是重要的一步。本文将使用Tensorflow.js(0.11.1)的MNIST示例(https://github.com/tensorflow/tfjs-examples/blob/master/mnist/data.js)逐行运行数据处理代码.MNIST样例18import*astffrom'@tensorflow/tfjs';1920constIMAGE_SIZE=784;21constNUM_CLASSES=10;22constNUM_DATASET_ELEMENTS=65000;2324constNUM_TRAIN_ELEMENTS=55000;25constNUM_TEST_ELEMENTS=NUM_DATASET_ELEMENTS-NUM_TRAIN_ELEMENTS;2627constMNIST_IMAGES_SPRITE_PATH=28'https://storage.googleapis.com/learnjs-data/model-builder/mnist_images.png';29constMNIST_LABELS_PATH=30'https://storage.googleapis.com/learnjs-data/model-builder/mnist_labels_uint8';`首先,导入TensorFlow(确保你正在转译代码)并创建一些常量,包括:IMAGE_SIZE:图像大小(28*28=784)NUM_CLASSES:标签类别数(这个数字可以是0到9,所以有这里有10个类别)NUM_DATASET_ELEMENTS:图像总数(65000)NUM_TRAIN_ELEMENTS:训练集图像数量(55000)NUM_TEST_ELEMENTS:测试集中图像数量(10000,也称为余数)MNIST_IMAGES_SPRITE_PATH&MNIST_LABELS_PATH:图像和标签的路径将这些图片拼接成一张巨大的图片,如下图:MNISTData接下来,从第38页开始该行以MnistData开头,该类使用了以下函数:load:负责异步加载图片和标注数据;nextTrainBatch:加载下一个训练批次;nextTestBatch:加载下一个测试批次;nextBatch:一个返回下一个batch的通用函数,函数的用途取决于是在训练集上还是在测试集上。这篇文章是介绍性的文章,所以只用到了load函数。loadasyncload(){//请求MNISTspritedimage.constimg=newImage();constcanvas=document.createElement('canvas');constctx=canvas.getContext('2d');异步函数(async)是Javascript中比较新的语言特性,所以你需要一个转译器。图像对象是在内存中表示图像的本机DOM函数,提供可以在图像加载时访问图像属性的回调。画布是DOM的另一个元素,它提供了一种访问像素数组并通过上下文处理它们的简单方法。由于它们都是DOM元素,因此如果使用Node.js(或WebWorker)则无需访问这些元素。请参阅下文了解其他替代方案。imgRequestconstimgRequest=newPromise((resolve,reject)=>{img.crossOrigin='';img.onload=()=>{imgimg.width=img.naturalWidth;imgimg.height=img.naturalHeight;这段代码初始化了一个新的promise,promise在图片加载成功时结束。这个例子没有明确处理错误状态。crossOrigin是一个允许图片跨域加载的图片,可以解决与DOM属性交互时的CORS(跨域资源共享)问题.naturalWidth和naturalHeight指的是加载图片的原始尺寸,计算时可以强制修正图片大小constdatasetBytesBuffer=newArrayBuffer(NUMDATASETELEMENTS*IMAGESIZE*4);5758constchunkSize=5000;59canvas.width=img.width;60canvas。height=chunkSize;这段代码初始化一个包含每幅图像的每个像素的新缓冲区,它将图像总数乘以每幅图像的大小和通道数。我认为chunkSize的目的是为了防止UI一次加载太多数据到内存中,但不能100%确定。62for(leti=0;i
