线性回归模型:为什么预测值总是错误的?



我正在尝试做一个简单的线性回归模型,我的数据集是从 1 到 10 的数字。我正在尝试训练模型以预测对于任何给定的输出,例如 3,输出应该是输入的值 (y = x(。

预测总是错误的。有人可以向我解释我做错了什么吗?

const tf = require("@tensorflow/tfjs");
const xArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const yArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const createModel = () => {
const model = tf.sequential();
model.add(tf.layers.dense({ inputShape: [1], units: 1, useBias: true })); //input layer
model.add(tf.layers.dense({ units: 1, useBias: true })); //output layer
return model;
};
const convertToTensor = () => {
return tf.tidy(() => {
const inputTensor = tf.tensor2d(xArray, [xArray.length, 1]);
const outputTensor = tf.tensor2d(yArray, [yArray.length, 1]);
return {
inputs: inputTensor,
outputs: outputTensor,
};
});
};
async function trainModel(model, inputs, trueValues) {
model.compile({
optimizer: tf.train.adam(),
loss: tf.losses.meanSquaredError,
metrics: ["mse"]
});
return await model.fit(inputs, trueValues, {
batchSize: 2,
epochs: 5,
learningRate: 0.04
});
}
function testModel(model, testValue) {
return tf.tidy(() => model.predict(tf.tensor2d([testValue], [1, 1]));
}
const run = async testValue => {
const model = createModel();
const tensorData = convertToTensor();
await trainModel(model, tensorData.inputs, tensorData.outputs);
const prediction = testModel(model, testValue);
console.log(prediction.toString());
};
run(5);

您的代码有两个问题:

  • 您没有正确设置learningRate值。您需要将其作为第一个参数传递给tf.train.adam()函数
  • 你只学习5个时代,这对你来说是不够的。

自己尝试一下

我从下面的代码中删除了不必要的代码。您可以更改epochslearning rate值,以查看它如何影响5的结果预测。我将纪元的默认值更改为50.预测最终非常接近5.

document.querySelector('button').addEventListener('click', async () => {
const learningRate = document.querySelector('#learning_rate').value;
const epochs = document.querySelector('#epochs').value;
const xArray = [0,1,2,3,4,5,6,7,8,9];
const yArray = [0,1,2,3,4,5,6,7,8,9];
const createModel = () => {
const model = tf.sequential();
model.add(tf.layers.dense({ inputShape: [1], units: 1, useBias: true }));
model.add(tf.layers.dense({ units: 1, useBias: true }));
return model;
};
const convertToTensor = () => {
return tf.tidy(() => {
const inputTensor = tf.tensor2d(xArray, [xArray.length, 1]);
const outputTensor = tf.tensor2d(yArray, [yArray.length, 1]);
return {
inputs: inputTensor,
outputs: outputTensor,
};
});
};
async function trainModel(model, inputs, trueValues) {
model.compile({
optimizer: tf.train.adam(learningRate),
loss: tf.losses.meanSquaredError,
metrics: ["mse"]
});
const batchSize = 2;
return await model.fit(inputs, trueValues, {
batchSize,
epochs,
});
}
function testModel(model, testValue) {
return tf.tidy(() => model.predict(tf.tensor2d([testValue], [1, 1])));
}
const run = async testValue => {
const model = createModel();
const tensorData = convertToTensor();
await trainModel(model, tensorData.inputs, tensorData.outputs);
const prediction = testModel(model, testValue);
console.log(`Predction for 5: ${prediction.toString()}`);
};
run(5);
});
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js"></script>
epochs: <input type="number" id="epochs" value="50" />
learning rate: <input type="number" id="learning_rate" value="0.04" />
<button id="train">Train</button>

最新更新