"Error: Error in oneHot: depth must be >=2, but it is 1" in tensorflow.js
"Error: Error in oneHot: depth must be >=2, but it is 1" in tensorflow.js
我对 tensorflow.js 和一般的机器学习还很陌生。我试图在 kaggle 上为 titanic 数据集做一个基本的 tf.js 模型,我已经走得很远了,但是我 运行 在尝试训练我的模型时出错了。这是我的代码:
function convertToTensor(data, ify) {
return tf.tidy(() => {
tf.util.shuffle(data);
const pc = data.map(d => Number(d.pc))
const sex = data.map(d => d.sex)
const age = data.map(d => Number(d.age))
const sib = data.map(d => Number(d.sib))
const par = data.map(d => Number(d.par))
const fare = data.map(d => Number(d.fare))
const inputs = [pc, sex, age, sib, par, fare]
let newy = []
inputs[0].forEach((thing, i) => {
newy.push([thing, inputs[1][i], inputs[2][i], inputs[3][i], inputs[4][i], inputs[5][i]])
})
let inputy = []
for (arr of newy){
inputy.push(tf.tensor2d(arr, [1, arr.length]))
}
if (ify) {
const labels = data.map(d => Number(d.sur))
const labelTensor = tf.tensor2d(labels, [labels.length, 1]);
return {
inputs: inputy,
labels: labelTensor,
}
}
return {
inputs: inputy
}
});
}
function createModel(data) {
// Create a sequential model
const model = tf.sequential();
// Add a single input layer
model.add(tf.layers.dense({inputShape: [1, 6], units: 100}));
model.add(tf.layers.dense({units: 100, activation: 'relu'}));
model.add(tf.layers.dense({units: 100, activation: 'relu'}));
model.add(tf.layers.flatten())
model.add(tf.layers.dense({units: 1}));
return model;
}
async function trainModel(model, inputs, labels) {
// Prepare the model for training.
model.compile({
optimizer: tf.train.adam(),
loss: 'sparseCategoricalCrossentropy',
metrics: ['accuracy']
});
const batchSize = 32;
const epochs = 30;
return await model.fit(tf.stack(inputs), labels, {
batchSize,
epochs,
shuffle: true
})
}
这是我遇到的错误:
rror: Error in oneHot: depth must be >=2, but it is 1
at oneHot_ (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:7536:15)
at Object.oneHot__op [as oneHot] (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:4283:29)
at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-layers/dist/tf-layers.node.js:5082:32
at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3337:22
at Engine.scopedRun (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3347:23)
at Engine.tidy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3336:21)
at Object.tidy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:8941:19)
at sparseCategoricalCrossentropy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-layers/dist/tf-layers.node.js:5078:16)
at totalLossFunction (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-layers/dist/tf-layers.node.js:9628:32)
at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3337:22
at Engine.scopedRun (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3347:23)
at Engine.tidy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3336:21)
at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3865:143
at Engine.scopedRun (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3347:23)
at Engine.gradients (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3865:22)
at variableGrads (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:13782:21)
(node:157) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:157) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
我发现了一个与这个问题非常相似的问题:Error in oneHot: depth must be >=2, but it is 1,但它没有答案,所以我无法从中得到任何东西。
提前致谢!
oneHot
错误是由您的 sparseCategoricalCrossentropy
损失函数引起的。您正在使用期望多长度输出的分类损失函数,但您的模型输出长度为 1 的向量(最后一层是 model.add(tf.layers.dense({units: 1}));
)。相反,您应该输出与要分类的类别一样多的节点,因此如果您正在执行 survival/no 生存标签,则输出 2 个节点。
我对 tensorflow.js 和一般的机器学习还很陌生。我试图在 kaggle 上为 titanic 数据集做一个基本的 tf.js 模型,我已经走得很远了,但是我 运行 在尝试训练我的模型时出错了。这是我的代码:
function convertToTensor(data, ify) {
return tf.tidy(() => {
tf.util.shuffle(data);
const pc = data.map(d => Number(d.pc))
const sex = data.map(d => d.sex)
const age = data.map(d => Number(d.age))
const sib = data.map(d => Number(d.sib))
const par = data.map(d => Number(d.par))
const fare = data.map(d => Number(d.fare))
const inputs = [pc, sex, age, sib, par, fare]
let newy = []
inputs[0].forEach((thing, i) => {
newy.push([thing, inputs[1][i], inputs[2][i], inputs[3][i], inputs[4][i], inputs[5][i]])
})
let inputy = []
for (arr of newy){
inputy.push(tf.tensor2d(arr, [1, arr.length]))
}
if (ify) {
const labels = data.map(d => Number(d.sur))
const labelTensor = tf.tensor2d(labels, [labels.length, 1]);
return {
inputs: inputy,
labels: labelTensor,
}
}
return {
inputs: inputy
}
});
}
function createModel(data) {
// Create a sequential model
const model = tf.sequential();
// Add a single input layer
model.add(tf.layers.dense({inputShape: [1, 6], units: 100}));
model.add(tf.layers.dense({units: 100, activation: 'relu'}));
model.add(tf.layers.dense({units: 100, activation: 'relu'}));
model.add(tf.layers.flatten())
model.add(tf.layers.dense({units: 1}));
return model;
}
async function trainModel(model, inputs, labels) {
// Prepare the model for training.
model.compile({
optimizer: tf.train.adam(),
loss: 'sparseCategoricalCrossentropy',
metrics: ['accuracy']
});
const batchSize = 32;
const epochs = 30;
return await model.fit(tf.stack(inputs), labels, {
batchSize,
epochs,
shuffle: true
})
}
这是我遇到的错误:
rror: Error in oneHot: depth must be >=2, but it is 1
at oneHot_ (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:7536:15)
at Object.oneHot__op [as oneHot] (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:4283:29)
at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-layers/dist/tf-layers.node.js:5082:32
at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3337:22
at Engine.scopedRun (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3347:23)
at Engine.tidy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3336:21)
at Object.tidy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:8941:19)
at sparseCategoricalCrossentropy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-layers/dist/tf-layers.node.js:5078:16)
at totalLossFunction (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-layers/dist/tf-layers.node.js:9628:32)
at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3337:22
at Engine.scopedRun (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3347:23)
at Engine.tidy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3336:21)
at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3865:143
at Engine.scopedRun (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3347:23)
at Engine.gradients (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3865:22)
at variableGrads (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:13782:21)
(node:157) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:157) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
我发现了一个与这个问题非常相似的问题:Error in oneHot: depth must be >=2, but it is 1,但它没有答案,所以我无法从中得到任何东西。
提前致谢!
oneHot
错误是由您的 sparseCategoricalCrossentropy
损失函数引起的。您正在使用期望多长度输出的分类损失函数,但您的模型输出长度为 1 的向量(最后一层是 model.add(tf.layers.dense({units: 1}));
)。相反,您应该输出与要分类的类别一样多的节点,因此如果您正在执行 survival/no 生存标签,则输出 2 个节点。