如何用TensorFlow进行机器学习研究

在此之前,我们介绍过用于自动微分的 tensorflow api - 自动微分,优化机器学习模型的关键技术,这是机器学习的基本构建块。在今天的教程中,我们将使用先前教程中介绍的 tensorflow 基础来进行一些简单的机器学习。
tensorflow 还包括一个更高级别的神经网络 api(tf.keras),它提供了有用的抽象来减少样板。我们强烈建议那些使用神经网络的人使用更高级别的 api。但是,在这个简短的教程中我们将从神经网络训练的基本原理来建立一个坚实的基础。
设置
import tensorflow as tftf.enable_eager_execution()
变量
tensorflow 中的张量是不可变的无状态对象。然而,机器学习模型需要具有可变的状态:随着模型的训练,计算预测的相同代码应该随着时间的推移而表现不同(希望具有较低的损失!)。要表示在计算过程中需要改变的状态,事实上您可以选择依赖 python 这种有状态的编程语言:
# using python statex = tf.zeros([10, 10])x += 2 # this is equivalent to x = x + 2, which does not mutate the original # value of xprint(x)
tf.tensor([[2。2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。2. 2. 2. 2. 2. 2. 2. 2. 2.]],shape =(10,10),dtype = float32)
但是,tensorflow 内置了有状态操作,这些操作通常比您所用的低级 python 表示更易于使用。例如,为了表示模型中的权重,使用 tensorflow 变量通常是方便有效的。
变量是一个存储值的对象,当在 tensorflow 计算中使用时,它将隐式地从该存储值中读取。有些操作(如:tf.assign_sub,tf.scatter_update 等)会操纵存储在 tensorflow 变量中的值。
v = tf.variable(1.0)assert v.numpy() == 1.0# re-assign the valuev.assign(3.0)assert v.numpy() == 3.0# use `v` in a tensorflow operation like tf.square() and reassignv.assign(tf.square(v))assert v.numpy() == 9.0
使用变量的计算在计算梯度时自动跟踪。对于表示嵌入式的变量,tensorflow 默认会进行稀疏更新,这样可以提高计算效率和内存效率。
使用变量也是一种快速让代码的读者知道这段状态是可变的方法。
示例:拟合线性模型
现在让我们把目前掌握的几个概念 — 张量、梯度带、变量 — 应用到构建和训练一个简单模型中去。这通常涉及几个步骤:
1.定义模型。
2.定义损失函数。
3.获取训练数据。
4.运行训练数据并使用 “优化器” 调整变量以匹配数据。
在本教程中,我们将介绍一个简单线性模型的简单示例:f(x) = x * w + b,它有两个变量 —w 和 b。此外,我们将综合数据,以便训练好的模型具有 w = 3.0 和 b = 2.0。
定义模型
让我们定义一个简单的类来封装变量和计算。
class model(object): def __init__(self): # initialize variable to (5.0, 0.0) # in practice, these should be initialized to random values. self.w = tf.variable(5.0) self.b = tf.variable(0.0) def __call__(self, x): return self.w * x + self.b model = model()assert model(3.0).numpy() == 15.0
定义损失函数
损失函数测量给定输入的模型输出与期望输出的匹配程度。让我们使用标准的 l2 损失。
def loss(predicted_y, desired_y): return tf.reduce_mean(tf.square(predicted_y - desired_y))
获取训练数据
让我们用一些噪音(noise)合成训练数据。
true_w = 3.0true_b = 2.0num_examples = 1000inputs = tf.random_normal(shape=[num_examples])noise = tf.random_normal(shape=[num_examples])outputs = inputs * true_w + true_b + noise
在我们训练模型之前,让我们想象一下模型现在的位置。我们将用红色绘制模型的预测,用蓝色绘制训练数据。
import matplotlib.pyplot as pltplt.scatter(inputs, outputs, c='b')plt.scatter(inputs, model(inputs), c='r')plt.show()print('current loss: '),print(loss(model(inputs), outputs).numpy())
current loss:
7.92897
定义训练循环
我们现在有了网络和培训数据。我们来训练一下,使用训练数据更新模型的变量 ( w 和 b),以便使用梯度下降减少损失。在 tf.train.optimizer 实现中有许多梯度下降方案的变体。我们强烈建议使用这种实现,但本着从基本原理出发的精神,在这个特定的例子中,我们将自己实现基本的数学。
def train(model, inputs, outputs, learning_rate): with tf.gradienttape() as t: current_loss = loss(model(inputs), outputs) dw, db = t.gradient(current_loss, [model.w, model.b]) model.w.assign_sub(learning_rate * dw) model.b.assign_sub(learning_rate * db)
最后,让我们反复运行训练数据,看看 w 和 b 是如何发展的。
model = model()# collect the history of w-values and b-values to plot laterws, bs = [], []epochs = range(10)for epoch in epochs: ws.append(model.w.numpy()) bs.append(model.b.numpy()) current_loss = loss(model(inputs), outputs) train(model, inputs, outputs, learning_rate=0.1) print('epoch %2d: w=%1.2f b=%1.2f, loss=%2.5f' % (epoch, ws[-1], bs[-1], current_loss))# let's plot it allplt.plot(epochs, ws, 'r', epochs, bs, 'b')plt.plot([true_w] * len(epochs), 'r--', [true_b] * len(epochs), 'b--')plt.legend(['w', 'b', 'true w', 'true_b'])plt.show()
epoch 0: w=5.00 b=0.00, loss=7.92897epoch 1: w=4.64 b=0.35, loss=5.61977epoch 2: w=4.35 b=0.64, loss=4.07488epoch 3: w=4.11 b=0.88, loss=3.04133epoch 4: w=3.91 b=1.07, loss=2.34987epoch 5: w=3.75 b=1.23, loss=1.88727epoch 6: w=3.62 b=1.36, loss=1.57779epoch 7: w=3.51 b=1.47, loss=1.37073epoch 8: w=3.42 b=1.55, loss=1.23221epoch 9: w=3.35 b=1.62, loss=1.13954
下一步
在本教程中,我们介绍了变量 variables,使用了到目前为止讨论的 tensorflow 基本原理构建并训练了一个简单的线性模型。
从理论上讲,这几乎是您使用 tensorflow 进行机器学习研究所需要的全部内容。在实践中,特别是对于神经网络,更高级别的 apitf.keras 会更方便,因为它提供更高级别的构建块(称为 “层”),保存和恢复状态的实用程序,一套损失函数,一套优化策略等等。

关于外媒对明星芯片架构师Jim Keller为什么加入Intel的采访总结
2017中国半导体制造、设计、封装测试十大企业
比亚迪滴滴定制车曝光,租金4299元起
电子线故障的几个常见问题,是由什么原因引起的
PLC将继续向开放式控制系统方向转移
如何用TensorFlow进行机器学习研究
步进电机驱动器工作模式_步进电机驱动器电路图
热焊盘与反焊盘
神经语言学中的卷积神经网络
信步科技SV-1900嵌入式主板介绍
HTC官方旗舰店下架了几乎全部的手机将要退出中国市场
变频器的分类、功能及控制方式
探析连接器技术和市场的发展趋势
微雪电子SX1262 Lora 915M频段简介
dfrobot电阻式压力传感器6Kg C18.3简介
自动点火的煤气报警器电路图
三大运营商正式公布了2019年5月份运营数据
5G驱动中国产业升级,拥抱5G中国企业在行动
小尺寸拉力传感器的优势和应用场景
高压断路器应用和放线挂线和紧线口诀