我正在尝试编写热切且图形兼容的代码。但是,关于如何执行此操作的在线信息很少,这是 TensorFlow网站上的文字脚注。此外,他们所写的内容令人困惑,说:
为 Eager Execution 编写的相同代码也将在图执行期间构建图。为此,只需在未启用 Eager Execution 的新 Python 会话中运行相同的代码即可。
这意味着可以使用相同的代码解决方案,其中唯一需要的更改是添加或删除tf.enable_eager_execution().
目前我tf.keras用来定义我的模型和tf.data我的输入管道。然而,许多急切操作在图形中不起作用,反之亦然。
例如,我会记录我epochs使用tf.train.Checkpoint(). 在急切模式下,恢复后我可以访问它epochs.numpy(),将其值分配给局部变量。但是,这不适用于图形,sess.run(epochs)因为在执行期间未定义值,因此需要图形。
同样,为了快速计算我的梯度,我需要使用某种形式的 autograd,在我的例子中tf.GradientTape()。这与图形不兼容,因为“tf.GradientTape.gradients() 不支持图形控制流”。
我看到tfe.py_func存在,但再一次,这仅在未启用eager时有效,因此无助于解决此问题。
那么,当eager和graph的许多方面似乎直接相互冲突时,我该如何做出相同的代码解决方案呢?
完成我的模型后,我现在希望按照TensorFlow网站上的本教程进行导出和部署。但是,没有迹象表明如何在急于执行的情况下执行此操作,因为我无法向提供会话或图形builder.add_meta_graph_and_variables()。
是在我的代码需要热切和图形兼容的情况下,还是在我需要保存我的模型,将其导入会话并从中导出的情况下?
使用请求,我需要在一次发布中将带有json数据的numpy数组发送到我的flask应用程序。我该怎么做呢?
从 tf.keras.Model 继承的类中的权重目前似乎无法加载。我无法使用检查点从类外的 Example() 加载权重,因此我尝试在内部进行加载,所有帐户都应该这样做。它能够保存权重,就像在保存 Example() 时一样,但它仍然无法加载它们。这是我的模型代码:
class Example(tf.keras.Model):
def __init__(self, cfg):
super(Example, self).__init__()
self.model = tf.keras.Sequential([
........layers.......
])
# Create saver
self.save_path = cfg.save_dir + cfg.extension
self.ckpt_prefix = self.save_path + '/ckpt'
self.saver = tf.train.Checkpoint(model=self.model)
def call(self, x_in):
x_out = self.model(x_in)
return x_out
def save(self):
self.saver.save(file_prefix=self.ckpt_prefix)
def load(self):
self.saver.restore(tf.train.latest_checkpoint(self.save_path))
Run Code Online (Sandbox Code Playgroud)
这就是我用来检查它是否加载的内容:
example = Example()
if Path(self.example.save_path).is_dir():
print(self.example.weights)
print(self.example.model.weights)
self.example.load()
print(self.example.weights)
print(self.example.model.weights)
Run Code Online (Sandbox Code Playgroud)
输出:
[]
[]
[]
[]
Run Code Online (Sandbox Code Playgroud)
这在 tensorflow 1.3 和 2.0 上都进行了测试,我可以确认第一批后权重不为空,并且它正在检查点/保存。