实际上我正在学习在nodejs中构建机器学习:我为此选择了tensorflow API。 机器学习的目标是输入14个条目,并返回与14个条目相关的数字。 (我无法描述更多的上下文,因为我正在接受实习,而且我不知道是否允许谈论这个问题。) 但是该模型总是预测错误的值,我也不知道为什么。我尝试了不同的损耗/优化器功能,不同的图层模型配置,不同的图层激活...,但是该模型始终为我提供浮点值。
我试图将输入/输出值替换为0.3,预测返回的值在0.1到0.3之间。 (测试3次)。但是在训练过程中损失值下降,这似乎效果更好。
我还尝试将训练时期增加到1000个,没有结果:/
首先,我创建一个函数来构建模型网络。我的模型的输入层为14个单位,然后有2个隐藏层(为5个单位),然后为输出层,只有一个单位。 (所有层都处于“ Sigmoid”激活状态,并且是密集型。)
const get_model = async () => {
const model = tf.sequential();
const input_layer = tf.layers.dense({
units: 13,
inputShape: [14],
activation: 'sigmoid',
});
model.add(input_layer)
let left = 3;
while(left >= 2){
const step_layer = tf.layers.dense({
units: 5,
activation: 'sigmoid',
});
model.add(step_layer)
left --;
}
const output = tf.layers.dense({
units: 1,
activation: 'sigmoid',
});
model.add(output)
model.compile({
optimizer: tf.train.sgd(0.01),
loss: tf.losses.absoluteDifference,
metrics: 'accuracy',
})
return model;
}
为了测试模型,在训练期间,我总是给出一个由13个数字组成的列表(所有值均为100),并且我总是给出以下值:100。
const get_output = () => {
return 100;
}
const get_input = () => {
return [
100,
100,
100,
100,
100,
100,
100,
100,
100,
100,
100,
100,
100,
100,
];
}
我有两个函数将值转换为张量值。
const get_input_tensor = (value) => {
return tf.tensor([value],[1,14])
}
const get_output_tensor = (value) => {
return tf.tensor(
[Math.floor(value)],
[1,1]
)
}
然后我得到了模型,我训练了模型并尝试了预测。
(async () => {
const model = await get_model();
let left = 20;
while(left >= 0){
const input = get_input();
const output = get_output();
await model.fit(get_input_tensor(input),get_output_tensor(output),{
batchSize: 30,
epochs: 10,
shuffle: true,
});
left--;
}
const input = get_input();
const output = model.predict(get_input_tensor(input));
output.print();
})();
在训练过程中,损失值接近100。这突出表明模型总是返回接近1的值。
这是培训期间的控制台:
Epoch 8 / 10
eta=0.0 ====================================================================>
11ms 10943us/step - loss=99.14
Epoch 9 / 10
eta=0.0 ====================================================================>
10ms 10351us/step - loss=99.14
Epoch 10 / 10
eta=0.0 ====================================================================>
12ms 12482us/step - loss=99.14
然后,当我尝试进行预测时,模型会向我返回一个接近1的值。
这是预测的打印张量。
Tensor
[[0.8586583],]
你能帮我吗?我不知道出了什么问题。预测可能超过1吗?
答案 0 :(得分:1)
这是一个简单的模型,将从14个值的输入中预测100个。通常在0到1之间对输入值进行采样。它可以改善最速下降算法的收敛性。
关于模型预测错误值的原因;有一般的答案here
(async () => {
const model = tf.sequential({
layers: [tf.layers.dense({units: 1, inputShape: [14], activation: 'relu', kernelInitializer: 'ones'})]
});
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
await model.fit(tf.ones([1, 14]), tf.tensor([100], [1, 1]), {epochs: 100})
model.predict(tf.ones([1, 14])).print();
})()
<html>
<head>
<!-- Load TensorFlow.js -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"> </script>
</head>
<body>
</body>
</html>
答案 1 :(得分:1)
我终于解决了问题!
我的图层使用以下激活:'sigmoid'。 sigmoid是一个函数,其中值包括在0到1之间,这就是我获得相同值的原因。 (激活“ relu”不是我真正想要的)
我将激活设置为“线性”,但是这种激活会使训练期间的损失值变为NaN,然后我将优化器切换为adam,这可以解决问题:)