TensorFlow.js训练报错Received 30 Tensors,调整inputShape无效如何解决
问题解决方法
报错根本原因
你收到的报错和inputShape配置无关,问题出在数据集转换逻辑:convertedTrainingData返回的xs是长度为30的普通数值数组,TensorFlow.js会默认把数组内的每个元素解析为独立的Tensor,因此出现「收到30个Tensor但模型仅需要1个输入Tensor」的报错。
修改方案
你需要在数据映射阶段把特征、标签都转为指定形状的张量,同时给训练数据集添加batch操作,符合模型训练的输入规范,修改后完整代码如下:
const trainingUrl = "/data/wdbc-train.csv"; const trainingData = tf.data.csv(trainingUrl, { columnConfigs: { diagnosis: { isLabel: true, }, }, }); const numOfFeatures = (await trainingData.columnNames()).length - 1; const convertedTrainingData = trainingData .map(({ xs, ys }) => { // 把30个特征转为形状为[numOfFeatures]的单个张量 const features = tf.tensor1d(Object.values(xs)); // 把标签转为单个张量 const label = tf.tensor1d(Object.values(ys)); return { xs: features, ys: label }; }) // 添加batch,可根据你的硬件配置调整batchSize大小 .batch(32); const model = tf.sequential(); model.add( tf.layers.dense({ inputShape: [numOfFeatures], activation: "relu", units: 5 }) ); model.add(tf.layers.dense({ units: 1, activation: "sigmoid" })); // 原代码缺少编译步骤,二分类任务可按需调整优化器、损失函数参数 model.compile({ optimizer: tf.train.adam(), loss: 'binaryCrossentropy', metrics: ['accuracy'] }); await model.fitDataset(convertedTrainingData, { epochs: 100, callbacks: { onEpochEnd: async (epoch, logs) => { console.log( "Epoch: " + epoch + " Loss: " + logs.loss + " Accuracy: " + logs.acc ); }, }, });
内容的提问来源于stack exchange,提问作者Yash Singhal
相关产品推荐
相关产品推荐

