线性回归模型:为什么预测值总是错误的?
Linear regression model: Why are the predicted values always wrong?
我正在尝试做一个简单的线性回归模型,我的数据集是从 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
个纪元,这对你的情况来说还不够。
自己试试
我从下面的代码中删除了不必要的代码。您可以更改 epochs
和 learning 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>
我正在尝试做一个简单的线性回归模型,我的数据集是从 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
值。您需要将其作为第一个参数 传递给 - 你只学习了
5
个纪元,这对你的情况来说还不够。
tf.train.adam()
函数
自己试试
我从下面的代码中删除了不必要的代码。您可以更改 epochs
和 learning 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>