归一化:

为什么要归一化:

归一化任务实例-身高体重预测:

1
2
3
4
5
6
7
8
9
10
11
12
13
//模拟标签和特征
const heights=[150,160,170,180];
const weights=[40,50,60,70];

//可视化数据
tfvis.render.scatterplot(
{name:'身高体重预测'},
{values:heights.map((x,i)=>({x,y:weights[i]}))},
{
xAxisDomain:[140,190],
yAxisDomain:[30,80],
}
)
1
2
3
4
5
//将数据转换为tensor 并归一化
const inputs = tf.tensor(heights).sub(150).div(30);
const labels = tf.tensor(weights).sub(40).div(30);
inputs.print();
labels.print();

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//创造一个连续模型
const model = tf.sequential();
model.add(tf.layers.dense({units:1,inputShape:[1]})); //添加一个全连接层(点乘权重+偏置)
model.compile({loss:tf.losses.meanSquaredError,optimizer:tf.train.sgd(0.1)}); //设置:损失函数为均方误差MSE,优化器为随机梯度下降SGD,学习速率为0.1,学习率是一个需要调整优化的超参数

await model.fit(inputs, labels, {
batchSize: 4, //批量训练的数据集大小(超参数,需要不断调整试验)
epochs: 100, //迭代实验次数(超参数,需要不断调整试验)
callbacks: tfvis.show.fitCallbacks({ name: "训练过程" }, ["loss"])
});

//将待预测数据190转为Tensor,用训练好的模型进行预测
const output = model.predict(tf.tensor([190]).sub(150).div(30));
output.print();
1
2
//将输出的Tensor反归一化并转为普通数据并显示
alert(`如果身高是190cm,预测体重为${output.mul(30).add(40).dataSync()}kg`);

image