【免费下载链接】propel
Differential Programming in JavaScript.
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/train | 6 万张 28×28 手写数字 | images/labels |
mnist/test | 1 万张 28×28 手写数字 | images/labels |
cifar10/train/cifar10/test | 32×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.
相关推荐
Python Machine Learning Book 配套数据集全解析:iris、wine、wdbc、movie、housing 与 mnist 的格式、加载与章节应用
Python Machine Learning Book 配套数据集全解析:iris、wine、wdbc、movie、housing 与 mnist 的格式、加
机器学习教程未来终端渲染趋势:从refterm看终端技术的发展方向
未来终端渲染趋势:从refterm看终端技术的发展方向 在数字化时代,终端作为人机交互的重要界面,其渲染技术的发展直接影响着用户体验与工作效率。refterm作
DeepLearningPython数据集处理:MNIST加载与扩展技巧终极指南
DeepLearningPython数据集处理:MNIST加载与扩展技巧终极指南 想要快速掌握深度学习中的 MNIST数据集处理 技巧吗?🤔 DeepLear
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考