Tensorflow 给出回归问题的随机答案
Tensorflow giving random answers on a regression problem
我正在尝试使用 Tensorflow.js 重现 Python 练习 Node.js。
objective 是使用机器学习将摄氏度简单地转换为华氏度。
但是,我是 Tensorflow.js 的菜鸟,它一直给我随机答案。
我试过很多东西,比如很多不同的形状。
我检查过 Python 和 Node.js 是否具有相同的模型。他们都有以下模型:
Layer (type) Output shape Param #
=================================================================
dense_Dense1 (Dense) [null,1] 2
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
const tf = require("@tensorflow/tfjs-node")
function convert(c){
return (c*1.8)+32 // Convert celsius to fahrenheit
}
var celsius = []
var fahrenheit = []
for (let i = 0; i < 20; i++) {
var r = 100; // Keeping this only value to ensure that Tf knows the answer I also have tried with 20 different values but doesn't work
celsius.push([r]) // Shape [20,1]
fahrenheit.push([convert(r)]) // Push the answer (212) to the fahrenheit array
}
var model = tf.sequential();
model.add(tf.layers.dense({inputShape:[1], units: 1}))
async function trainModel(model, inputs, labels) {
// Prepare the model for training.
model.compile({
optimizer: tf.train.adam(),
loss: tf.losses.meanSquaredError,
metrics: ['accuracy'], // Accuracy = 0
});
model.summary();
const epochs = 500;
return await model.fit(inputs, labels, {
epochs,
batchSize: 20,
verbose: false // Nothing interesting with verbose
});
}
c = tf.tensor(celsius)
f = tf.tensor(fahrenheit)
var training = trainModel(model, c, f)
training.then(function(args){
var prediction = model.predict(tf.tensor([[100]]));
prediction.print(); // Prints a random number
console.log("Real answer = "+convert(100))
})
输出张量值每次都是随机变化的。
这是一个例子:
Tensor
[[65.9411697],]
Real answer = 212
看来主要问题出在优化器上。 - 如果使用 SGD 优化器进行训练。预测工作正常。
const tf = require("@tensorflow/tfjs-node")
const nr_epochs=500;
function convert(c){
return (c*1.8)+32 // Convert celsius to fahrenheit
}
let celsius = []
let fahrenheit = []
for (let i = 0; i < 100; i++) {
var r = 100; // Keeping this only value to ensure that Tf knows the answer
celsius.push(i) // Shape [20,1]
fahrenheit.push(convert(i)) // Push the answer (212) to the fahrenheit array
}
const train = async (xy, ys) => {
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});
await model.fit(xs,ys,{epochs: nr_epochs})
return model;
}
const predict = (model, n) => {
const predicted = model.predict(tf.tensor2d([n],[1,1]));
return predicted;
}
const xs = tf.tensor2d(celsius.slice (0,15), [15,1]);
const ys = tf.tensor2d(fahrenheit.slice (0,15), [15,1]);
(async () => {
let trained = await train (xs,ys);
for (let n of [4,6,12]) {
let predicted = predict (trained, n).dataSync ();
console.log (`Value: ${n} Predicted: ${predicted [0]}`)
}
})()
日志:
Value: 4 Predicted: 38.01055908203125
Value: 6 Predicted: 42.033267974853516
Value: 12 Predicted: 54.101402282714844
当我向模型添加另外 3 个更密集的层时,Adam 优化器起作用了。但我只用了一层就可以在 python 上对 adam 进行处理。
xs = []
ys = []
for (var i = -100; i < 100; i++) {
xs.push(i)
ys.push( i*1.8 + 32)
}
console.log(xs,ys)
model = tf.sequential({
layers: [
tf.layers.dense({
units: 4,
inputShape: [1]
}),
tf.layers.dense({
units: 4,
inputShape: [4]
}),
tf.layers.dense({
units: 4,
inputShape: [4]
}),
tf.layers.dense({
units: 1,
inputShape: [4]
})
]
})
model.compile({
loss: 'meanSquaredError',
optimizer: 'adam'
})
var tfxs = tf.tensor2d(xs,[xs.length,1])
var tfys = tf.tensor2d(ys,[xs.length,1])
model.fit(tfxs, tfys,{epochs: 500}).then(function() {
model.predict(tfxs).print()
})
我正在尝试使用 Tensorflow.js 重现 Python 练习 Node.js。
objective 是使用机器学习将摄氏度简单地转换为华氏度。
但是,我是 Tensorflow.js 的菜鸟,它一直给我随机答案。
我试过很多东西,比如很多不同的形状。 我检查过 Python 和 Node.js 是否具有相同的模型。他们都有以下模型:
Layer (type) Output shape Param #
=================================================================
dense_Dense1 (Dense) [null,1] 2
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
const tf = require("@tensorflow/tfjs-node")
function convert(c){
return (c*1.8)+32 // Convert celsius to fahrenheit
}
var celsius = []
var fahrenheit = []
for (let i = 0; i < 20; i++) {
var r = 100; // Keeping this only value to ensure that Tf knows the answer I also have tried with 20 different values but doesn't work
celsius.push([r]) // Shape [20,1]
fahrenheit.push([convert(r)]) // Push the answer (212) to the fahrenheit array
}
var model = tf.sequential();
model.add(tf.layers.dense({inputShape:[1], units: 1}))
async function trainModel(model, inputs, labels) {
// Prepare the model for training.
model.compile({
optimizer: tf.train.adam(),
loss: tf.losses.meanSquaredError,
metrics: ['accuracy'], // Accuracy = 0
});
model.summary();
const epochs = 500;
return await model.fit(inputs, labels, {
epochs,
batchSize: 20,
verbose: false // Nothing interesting with verbose
});
}
c = tf.tensor(celsius)
f = tf.tensor(fahrenheit)
var training = trainModel(model, c, f)
training.then(function(args){
var prediction = model.predict(tf.tensor([[100]]));
prediction.print(); // Prints a random number
console.log("Real answer = "+convert(100))
})
输出张量值每次都是随机变化的。 这是一个例子:
Tensor
[[65.9411697],]
Real answer = 212
看来主要问题出在优化器上。 - 如果使用 SGD 优化器进行训练。预测工作正常。
const tf = require("@tensorflow/tfjs-node")
const nr_epochs=500;
function convert(c){
return (c*1.8)+32 // Convert celsius to fahrenheit
}
let celsius = []
let fahrenheit = []
for (let i = 0; i < 100; i++) {
var r = 100; // Keeping this only value to ensure that Tf knows the answer
celsius.push(i) // Shape [20,1]
fahrenheit.push(convert(i)) // Push the answer (212) to the fahrenheit array
}
const train = async (xy, ys) => {
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});
await model.fit(xs,ys,{epochs: nr_epochs})
return model;
}
const predict = (model, n) => {
const predicted = model.predict(tf.tensor2d([n],[1,1]));
return predicted;
}
const xs = tf.tensor2d(celsius.slice (0,15), [15,1]);
const ys = tf.tensor2d(fahrenheit.slice (0,15), [15,1]);
(async () => {
let trained = await train (xs,ys);
for (let n of [4,6,12]) {
let predicted = predict (trained, n).dataSync ();
console.log (`Value: ${n} Predicted: ${predicted [0]}`)
}
})()
日志:
Value: 4 Predicted: 38.01055908203125
Value: 6 Predicted: 42.033267974853516
Value: 12 Predicted: 54.101402282714844
当我向模型添加另外 3 个更密集的层时,Adam 优化器起作用了。但我只用了一层就可以在 python 上对 adam 进行处理。
xs = []
ys = []
for (var i = -100; i < 100; i++) {
xs.push(i)
ys.push( i*1.8 + 32)
}
console.log(xs,ys)
model = tf.sequential({
layers: [
tf.layers.dense({
units: 4,
inputShape: [1]
}),
tf.layers.dense({
units: 4,
inputShape: [4]
}),
tf.layers.dense({
units: 4,
inputShape: [4]
}),
tf.layers.dense({
units: 1,
inputShape: [4]
})
]
})
model.compile({
loss: 'meanSquaredError',
optimizer: 'adam'
})
var tfxs = tf.tensor2d(xs,[xs.length,1])
var tfys = tf.tensor2d(ys,[xs.length,1])
model.fit(tfxs, tfys,{epochs: 500}).then(function() {
model.predict(tfxs).print()
})