下面以一个线性回归的模型为例来介绍使用Eager模型进行机器学习计算的方法,其中涉及模型参数的保存与读取以及保存模型的重新计算。
首先是模型的定义,这里使用一个简单的一元函数模型作为待测定的模型基础,公式如下:
即3倍的输入值加上0.217作为输出值。
由于既定的模型是一个一元线性方程,因此在使用Eager模型时自定义一个类似的数据模型,代码如下:
weight = tfe.Variable(1., name="weight") bias = tfe.Variable(1., name="bias") def model(xs): logits = tf.multiply(xs, weight) + bias return logits
首先使用固定数据定义模型初始化参数weight和bias,之后定义一个线性回归模型在初始状态拟合了一元回归模型。
对于使用机器学习进行数据拟合,一个非常重要的内容就是损失函数的编写,其往往决定着对于数据从空间中的哪个角度去拟合真实数据。
在本例中,使用均方差(MSE)去计算拟合的数据与真实数据之间的误差,代码如下:
tf.losses.MeanSquaredError()(model(xs), ys)
这是使用TensorFlow自带损失函数计算MSE(均方差)的表示方法,当然也可以使用自定义的损失函数:
tf.reduce_mean(tf.pow((model(xs) - ys), 2)) / (2 * 1000)
这两者是等效的,不过自定义的损失函数可以使程序编写者获得更大的自由度。对于新手来说还是使用定制的损失函数去计算较好,请读者自行斟酌。
可以直接调用TensorFlow的优化器完成梯度函数的计算。笔者选择使用Adam优化器作为优化工具,代码如下:
opt = tf.train.AdamOptimizer(1e-1)
opt对应的是TensorFlow优化器的对应写法。全部代码如下:
【程序2-5】
该程序的运行结果如图2.3所示。
图2.3 程序2-5的运行结果
可以看到经过迭代计算以后,生成的weight值和bias值较好地拟合成预定的数据。有TensorFlow 1.X编程经验的读者可能会对这种数据更新的方式不习惯,不过记住这种写法即可:
grads = tape.gradient(_loss, [weight, bias]) opt.apply_gradients(zip(grads, [weight, bias]))
除此之外,Keras对于梯度的更新采用回调的方式,代码如下:
全部代码如下所示(函数调用过于复杂,仅供参考):
【程序2-6】
在这里函数直接被调用,其内部多次用到回调函数,对Python有较多研究的读者可以尝试。