classMNISTModel(tfe.Network):
def __init__(self):
super(MNISTModel, self).__init__()
self.layer1 = self.track_layer(tf.layers.Dens
e(units=10))
self.layer2 = self.track_layer(tf.layers.Dens
e(units=10))
def call(self, input):
"""Actually runs the model."""
result = self.layer1(input)
result = self.layer2(result)
return result
我们建议在tf.layers中使用类(而不是函数),因为它们创建并包含了模型参数(变量) 。变量的生命周期是与层对象的生命周期绑定在一起的,因此要确保对其进行追踪 。
为什么要使用tfe.Network?网络就是层的容器,也就是tf.layer.Layer本身,使得Network对象能够嵌入到其他Network对象中 。它还包含帮助检查、保存和恢复的实用程序 。
即使不对模型进行训练,我们也可以强制调用它并检查输出结果:
# Let's make up a blank input image
model = MNISTModel()
batch = tf.zeros([1, 1, 784])
print(batch.shape)
# (1, 1, 784)
result = model(batch)
print(result)
# tf.Tensor([[[ 0. 0., ...., 0.]]], shape=(1,
1, 10), dtype=float32)
请注意,我们不需要任何占位符或会话(sessions) 。在我们第一次将输入传递进去时,层参数的大小就已经得以设置 。
为了能够对任何模型进行训练,我们定义了一个损失函数进行优化、计算梯度,并使用优化器来更新变量 。首先,定义一个损失函数:
defloss_function(model, x, y):
y_ = model(x)
returntf.nn.softmax_cross_entropy_with_logits
(labels=y, logits=y_)
然后,训练的循环过程如下:
optimizer = tf.train.GradientDescentOptimizer(l
earning_rate=0.001)
for (x, y) in tfe.Iterator(dataset):
grads = tfe.implicit_gradients(loss_function)
(model, x, y)
optimizer.apply_gradients(grads)
对于在其计算过程中使用的所有TensorFlow变量,implicit_gradients()将计算loss_function的导数 。
我们可以将计算移动到GPU上,就像我们一直使用TensorFlow所做的那样:
withtf.device("/gpu:0"):
for (x, y) in tfe.Iterator(dataset):
optimizer.minimize(lambda: loss_function(mo
del, x, y))
(注意:我们正在减少存储损失,并直接调用optimizer.minimize,当然,你也可以使用上面提到的apply_gradients()方法,它们是等效的 。)
使用具有graph的eager
Eager Execution使开发和调试过程更加具有互动性,但是涉及在分布式训练、性能优化和生产部署方面,TensorFlow graphs具有很多优势 。
启用Eager Execution时,执行操作的相同代码将构建一个描述Eager Execution未启动时的计算图 。要将模型转换为图,只需在新的Python会话中运行相同的代码即可,其中,Eager Execution还没有得以启用,正如在MNIST示例中所看到的那样 。可以从检查点保存和恢复模型变量的值,从而使我们能够更容易地在eager(命令式)和graph(声明式)之间移动编程 。通过这种方式,启用Eager Execution编程的模型可以轻松导出以进行生产部署 。
在不久的将来,我们将提供实用程序,以便选择性地将模型的部分转换为图 。通过这种方式,你可以将计算的各个部分(例如一个自定义RNN单位的内部)融合在一起,以便实现高性能,还可以保持Eager Execution的灵活性和易读性 。
代码如何更改?
对于当前的TensorFlow用户来说,使用Eager Execution应该是很直观、容易的 。只有少数专门针对eager 的API可能会有些难度 。大多数现有的API和操作需要与已启动的eager一起运行 。下面是一些注意事项:
?与TensorFlow一样,我们的建议是,如果你还没有从队列切换到使用tf.data进行输入处理,那你该将其提上日程了 。它更容易使用,且通常较快 。更多详情,可点击链接查阅:博客文章(https://developers.googleblog.com/2017/09/introducing-tensorflow-datasets.html),相关资料文档(https://www.tensorflow.org/programmers_guide/datasets) 。
?使用面向对象层,如tf.layer.Conv2D()或Keras层;它们可以对变量进行显式存储 。
?对于大多数模型来说,你可以编写一些代码,以便它们在执行Eager Execution和图形构建时都可以使用 。当然也有一些例外,例如使用Python控制流基于输入来改变计算的动态模型 。
?一旦你调用了tfe.enable_eager_execution(),它就不能关闭 。要获取图行为,请启动一个新的Python会话 。
入门和未来
这只是一个预览版,所以你可能会碰到一些不足之处 。入门须知:
?安装TensorFlow的nightly版本:https://github.com/tensorflow/tensorflow#installation
?查看README文件(包括已知问题):https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/eager/README.md
秒懂生活扩展阅读
- 电脑麦克风有尖锐声音怎么解决
- 糖醋土豆丝怎么做好吃
- qq被封七天这怎么办
- 新手做淘宝怎么刷销量?怎么刷才安全?
- 怎么购买村淘专供商品?
- 复兴号wifi怎么连
- 钉钉怎么接受好友请求
- 2021年度个税汇算退税怎么预约办理
- 京东家电实体店怎么加盟?家电实体店利润有多少?
- 山地自行车车座高度怎么调整