我实际上是在学习用Node.js构建机器学习模型:我选择了tensorflow API来做这件事。这个机器学习的目标是输入14个条目,并根据这14个条目返回一个数值。(我无法详细描述上下文,因为我正在实习,我不知道是否允许谈论这些。)但模型总是预测错误的值,我不知道为什么。我尝试了不同的损失/优化函数,不同的层模型配置,不同的层激活…但模型总是给我一个浮点数值。
我尝试将输入/输出值改为0.3,预测返回给我一个介于0.1到0.3之间的值。(测试了3次)。但在训练过程中,损失值在下降,看起来效果更好。
我还尝试将训练轮次增加到1000次,没有结果 :/
首先,我创建了一个函数来构建模型网络。我的模型有一个14个单元的输入层,然后是两个5个单元的隐藏层,最后是一个只有一个单元的输出层。(所有层都使用’sigmoid’激活,并且是dense类型。)
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 / 10eta=0.0 ====================================================================> 11ms 10943us/step - loss=99.14 Epoch 9 / 10eta=0.0 ====================================================================> 10ms 10351us/step - loss=99.14 Epoch 10 / 10eta=0.0 ====================================================================> 12ms 12482us/step - loss=99.14
然后当我尝试预测时,模型返回给我一个接近1的值。
这是预测的张量打印输出。
Tensor [[0.8586583],]
你能帮我吗?我不知道哪里出了问题。是否有可能得到大于1的预测值?
回答:
我最终解决了问题!
我的层使用以下激活函数:’sigmoid’。sigmoid是一个函数,其值在0到1之间,这就是我得到相同值的原因。(激活函数’relu’并不是我所期望的)
我将激活函数设置为’linear’,但这种激活函数在训练过程中使损失值变为NaN,然后我将优化器切换到adam,这解决了问题 🙂