Node.js Tensorflow模型总是预测相同的错误值
实际上,我正在学习在nodejs中构建机器学习:为此我选择API。 机器学习的目标是输入14个条目,并返回与14个条目相关的数字。我无法描述更多的背景,因为我在实习,我不知道我是否允许谈论这个。 但是模型总是预测错误的值,我不知道为什么。我尝试了不同的损失/优化功能,不同的层模型配置,不同的层激活。。。但是模型总是给我一个浮动值 我尝试将输入/输出值替换为0.3,预测返回的值介于0.1和0.3之间。测试了3次。但在训练过程中损失值会下降,这似乎效果更好 我还尝试将训练次数增加到1000次,但没有结果:/ 首先,我创建了一个函数来构建模型网络。我的模型有14个单元的输入层,然后是5个单元的2个隐藏层,然后是只有一个单元的输出层。所有层均为“乙状”激活,且为致密型Node.js Tensorflow模型总是预测相同的错误值,node.js,tensorflow,machine-learning,tensorflow.js,Node.js,Tensorflow,Machine Learning,Tensorflow.js,实际上,我正在学习在nodejs中构建机器学习:为此我选择API。 机器学习的目标是输入14个条目,并返回与14个条目相关的数字。我无法描述更多的背景,因为我在实习,我不知道我是否允许谈论这个。 但是模型总是预测错误的值,我不知道为什么。我尝试了不同的损失/优化功能,不同的层模型配置,不同的层激活。。。但是模型总是给我一个浮动值 我尝试将输入/输出值替换为0.3,预测返回的值介于0.1和0.3之间。测试了3次。但在训练过程中损失值会下降,这似乎效果更好 我还尝试将训练次数增加到1000次,但没有
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();
})();
Tensor
[[0.8586583],]
在训练期间,损失值接近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的值
这是预测的打印张量
(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();
})();
Tensor
[[0.8586583],]
你能帮我吗?我不知道出了什么问题。预测值是否可能超过1?这里有一个简单的模型,可以从14个值的输入中预测100。通常,对输入值进行采样,使其介于0和1之间。它改进了最速下降算法的收敛性 至于模型预测错误值的原因;有一般性的答案 异步=>{ 常量模型=tf.sequential{ 层:[tf.layers.dense{units:1,inputShape:[14],激活:'relu',内核初始化器:'ones'}] }; 编译{优化器:'sgd',loss:'meanSquaredError'}; wait model.fittf.one[1,14],tf.tensor[100],[1,1],{epochs:100} model.predictf.ones[1,14].打印; }
我终于解决了问题 我的图层使用以下激活:“sigmoid”。sigmoid是一个函数,其中的值包含在0和1之间,这就是我得到相同值的原因。 激活“relu”并不是我所期望的 我将激活设置为“线性”,但此激活会在训练期间将损失值设置为NaN,然后我将优化器切换为adam,这解决了问题: