☰
Propel数据集加载指南:MNIST/Iris/Wine数据管道与批处理迭代详解
2026/10/16 1:28:19 网站建设 项目流程

【免费下载链接】propel

Differential Programming in JavaScript.

项目地址:https://gitcode.com/gh_mirrors/pr/propel
点击查看免费下载

Propel 是一个用 JavaScript 实现微分编程(Differential Programming)的机器学习库,其核心数据入口pr.dataset()可以一行代码加载 MNIST、Iris、Wine 等内置数据集。本文详解 Propel 数据集加载的完整数据管道:从远程下载、本地磁盘缓存、CSV/IDX/npy 解析,到.batch()批处理、.repeat()epoch 迭代与for...of遍历,帮助新手快速搭好训练数据流。

内置数据集一览:30 秒上手 pr.dataset() 🚀

Propel 在 src/dataset.ts 中注册了一个数据集表,用pr.dataset(name)即可按需加载:

数据集名内容返回的张量键
iris鸢尾花:150 样本 × 4 特征,3 类各 50 条features/labels
wine红酒成分数据(首样本如 14.23, 1.71, 2.43, 15.6)features/labels
breast_cancer乳腺癌分类数据features/labels
mnist/train6 万张 28×28 手写数字images/labels
mnist/test1 万张 28×28 手写数字images/labels
cifar10/train/cifar10/test32×32×3 彩色图片(npy 格式)images/labels

最简用法(来自官方注释示例,见 src/dataset.ts):

import * as pr from "propel"; const ds = pr.dataset("iris").batch(10); // 每批 10 条 const { features, labels } = await ds.next();

💡 若数据集名拼错,会抛出Bad dataset xxx错误——按上表核对即可。CSV 类数据集(iris/wine/breast_cancer)的加载入口分别是 loadIris()、loadWine()、loadBreastCancer()。

数据管道内幕:从下载到 Tensor 的 4 个环节 🧩

Propel 的设计思路借鉴了 TensorFlow 的tf.data.Dataset,整条管道分四步:

1️⃣ 下载:所有远程数据由 src/fetch.ts 中的fetchArrayBuffer()统一抓取,浏览器端走 XHR、Node 端走 http/https 模块,下载过程中还会打印百分比进度。

2️⃣ 本地磁盘缓存:src/cache.ts 的fetchWithCache()把首次下载的数据存到$HOME/.propel/cache目录(按“主机名 + URL 路径”组织文件名),下次加载直接读盘,不再重复下载。注意:浏览器环境下缓存是空实现,不会写盘。

3️⃣ 文本数据解析:loadData() 把 CSV 解码后按行切分,首行头部携带样本数与特征数,随后构造出float32类型的features和int32类型的labels两个张量,并断言行数一致。

4️⃣ 二进制图像解析:MNIST 的 IDX 格式在 src/mnist.ts 中按小端字节序解析——先校验 magic value(图像为 2051、标签为 2049),再reshape成[N, 28, 28],最后expandDims(-1)补一个通道维得到[N, 28, 28, 1]的 4D 张量。Cifar10 则通过 src/npy.ts 直接解析 numpy 的.npy文件。

解析逻辑的验证用例可参考 src/mnist_test.ts(断言训练集形状为[60000, 28, 28, 1]、标签前 8 个为[5, 0, 4, 1, 9, 2, 1, 3])和 src/dataset_test.ts(MNISTbatch(5)后标签恰为[5, 0, 4, 1, 9])。

批处理与 epoch 迭代:batch() 和 repeat() 的组合 ⚡

batch(batchSize):如何切出训练批次

batch()返回一个BatchDataset(src/dataset.ts),内部有个聪明的优化:当父数据集是SliceDataset时,直接按批次slice切出大块张量,避免逐行创建大量小张量。两个实用细节:

  • 末批自动变小:若样本数不能被 batchSize 整除,最后一批只装剩余数据。例如 3 个样本batch(2),得到 2 条 + 1 条两批,随后next()返回null(见 datasetFromSlices 测试)。
  • 每次返回一个对象:包含该批所有命名张量(如{ images, labels }),形状首维即实际批大小。

repeat(count):自动重置的 epoch 循环

repeat(count)返回RepeatDataset(src/dataset.ts):每当父数据集走到末尾(next()返回null),它就累加 epoch 计数并调用reset()从头再来;达到count次后整体结束。若不带参数调用repeat()则无限循环,适合需要“跑到目标步数就停”的训练模式(见下文 MNIST 示例)。reset()的调用会沿数据集链向上传播,保证底层迭代位置归零。

两种迭代风格:for...of 与手动 next() 📖

Dataset实现了[Symbol.iterator](src/dataset.ts),注意迭代器每次 yield 的是一个 Promise,需要在循环里await:

const ds = pr.dataset("iris").batch(2); for (const p of ds) { const { labels } = await p; // 每个批次是一个命名张量对象 // ... 送入训练 }

官方测试里就用这种写法统计了 Iris 三类标签各 50 条(dataset_iterable 测试);另一种更直观的方式是反复调用await ds.next(),直到返回null表示数据耗尽(配合ds.done标志判断)。

shuffle(bufSize):带缓冲的随机打乱

shuffle()维护一个大小为bufSize的滑动缓冲:先把后续样本预取进缓冲区,然后随机弹出一条输出(ShuffleDataset 实现)。缓冲越大,随机性越强,代价是略高的内存占用。

MNIST 训练速览:10 行代码串起整条数据管道 🏁

仓库自带的 src/example.ts 展示了数据管道如何无缝接入训练循环:

const ds = pr.dataset("mnist/train").batch(128).repeat(100); const exp = await pr.experiment("exp001"); for (const batchPromise of ds) { const { images, labels } = await batchPromise; exp.sgd({ lr: 0.01 }, (params) => images.rescale([0, 255], [-1, 1]) .linear("L1", params, 200).relu() .linear("L2", params, 100).relu() .linear("L3", params, 10) .softmaxLoss(labels)); if (exp.step >= maxSteps) break; }

可以看到数据管道的全部价值:下载、缓存、解析、批处理、重复 100 个 epoch 全部声明式完成,训练代码只关心模型本身。图像先rescale到[-1, 1]再送进网络,是数值稳定的好习惯。

常见疑问与排坑清单 🛠️

现象原因与处理
抛出Bad dataset xxx数据集名不在注册表中,对照文首表格使用小写完整名(如mnist/train)
最后一个批次比预期小样本数不整除 batchSize 时的正常行为(末批装剩余数据),无需处理
浏览器端每次都要重新下载磁盘缓存只在 Node 端生效(src/cache.ts),浏览器端无缓存
首次加载 MNIST 较慢6 万张图需联网下载,fetch会显示百分比进度,之后命中$HOME/.propel/cache缓存即秒开
张量维度不符合预期MNIST 图像为 4D 的[N,28,28,1](含通道维),Cifar10 为[N,32,32,3]

小结

Propel 的数据管道用「dataset()→batch()→repeat()→for...of」四步串联,就覆盖了 MNIST、Iris、Wine 等内置数据集的加载、批处理与多 epoch 迭代,且底层自带下载进度与磁盘缓存。核心实现集中在 src/dataset.ts、src/mnist.ts、src/cache.ts 三个文件,配合 src/dataset_test.ts 的完整用例,足以支撑你从零搭起一个 JS 机器学习训练流程。

【免费下载链接】propel

Differential Programming in JavaScript.

项目地址:https://gitcode.com/gh_mirrors/pr/propel
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询