如何在TensorFlow.js中格式化输入数据实现6输入1输出的任务时长预测
概念说明
维度(dimension)
直接对应数组的嵌套层数:
- 一维数组
[1,2,3]→ 1维张量 - 二维数组
[[1,2,3],[4,5,6]]→ 2维张量 - 三维数组
[[[1],[2]],[[3],[4]]]→ 3维张量
深度学习中常规表格类训练数据都是2维张量,第一维是样本数量,第二维是单条样本的特征数量。
inputShape
指单条样本的特征形状,不需要包含样本数量。比如你单条样本有6个特征,单条就是长度为6的一维数组,inputShape就填[6];如果是28*28像素的单通道图片,单条是28行28列的二维数组,inputShape就填[28,28]。
为什么需要定义这些参数
TensorFlow属于静态图框架,训练前需要先确定整个计算链路的结构、提前分配权重参数和计算资源。如果不提前定义输入形状,框架无法判断需要创建多少个权重、怎么对齐输入输出数据,会直接报错。
使用逻辑
- 先确定单条样本的特征结构,填写inputShape
- 构造训练输入张量时,整体形状为
[总样本数, ...inputShape],比如100条样本每条6个特征,输入张量形状就是[100, 6] - 对应的标签张量形状为
[总样本数, 输出值数量],你这里每条输出1个预测耗时,标签形状就是[100, 1]
原代码错误说明
- inputShape设置错误:你单条样本有3个特征,填成了
[1],模型只能接收1个特征的输入 - 张量构造参数错误:
tf.tensor2d第二个参数是形状数组,你填的[20,1,0]不符合2维张量的形状要求(2维张量形状只能是两个数字:[样本数, 特征数]) - 标签张量形状错误:2条样本的标签形状应该是
[2,1],你填的[25]不符合要求 - 预测输入形状错误:单条预测输入也需要对齐维度,要写成2维张量形状
[1, 特征数]
修复后的TensorFlow.js代码
首先是对应你注释需求的3特征测试版本:
const model = tf.sequential(); // 单条样本3个特征,inputShape设为[3] model.add(tf.layers.dense({units: 1, inputShape: [3]})); model.compile({ optimizer: tf.optimizers.adam(0.1), // 对齐Python版本用Adam优化器,学习率0.1收敛更快 loss: 'meanSquaredError' }); async function createAndTrainModel(){ // 2条训练样本,每条3个特征,形状[2,3] const xs = tf.tensor2d([[40, 1, 0], [20, 1, 0]], [2, 3]); // 2条样本对应的标签,形状[2,1] const ys = tf.tensor2d([[45], [25]], [2, 1]); await model.fit(xs, ys, {epochs: 500}); console.log("done training model!"); // 预测单条样本,形状要对齐为[1,3] const result = model.predict(tf.tensor2d([[-40, 15, 0]], [1, 3])); console.log("预测结果:", result.dataSync()[0]); // 用完释放张量内存避免泄漏 xs.dispose(); ys.dispose(); result.dispose(); } createAndTrainModel();
如果要对接6个特征的正式需求,仅需修改两处:
- 第一层inputShape改为
[6] - 训练输入和预测输入的特征数量对应改成6个即可,示例:
// 6特征版本的输入示例 const xs = tf.tensor2d([[4,1,1,5,8,2], [此处填写其他样本的6个特征]], [样本总数, 6]);
如果是加载你用Python导出的tfjs模型,不需要自己搭建结构,直接用tf.loadLayersModel('模型json文件地址')加载后即可直接调用predict。
内容的提问来源于stack exchange,提问作者Johnnybossboy
相关产品推荐
相关产品推荐

