我已经使用Keras工作了一周左右。我知道Keras可以使用TensorFlow或Theano作为后端。在我的情况下,我使用的是TensorFlow。
所以我在想:有没有一种方法可以用Keras编写一个神经网络,然后打印出TensorFlow中的等效版本?
最小可行示例
例如,假设我编写了以下代码:
# 创建序列模型
model = Sequential()
# 添加层
model.add(Dense(100, input_dim = (10,), activation = 'relu'))
model.add(Dense(1, activation = 'linear'))
# 编译模型
model.compile(optimizer = 'adam', loss = 'mse')
# 拟合
model.fit(Xtrain, ytrain, epochs = 100, batch_size = 32)
# 预测
ypred = model.predict(Xtest, batch_size = 32)
# 评估
result = model.evaluate(Xtest)
这段代码可能有错误,因为我刚开始,但我认为你明白我的意思。
我想做的是编写这段代码,运行它(或者甚至不运行),然后有一个函数或其他东西可以生成Keras用来执行所有这些计算的TensorFlow代码。
回答:
首先,让我们澄清一下问题中的一些语言。TensorFlow(和Theano)使用计算图来执行张量计算。所以,当你问是否有办法在TensorFlow中“打印出等效版本”,或者“生成TensorFlow代码”时,你真正问的是,如何从Keras模型中导出TensorFlow图?
正如Keras作者在这个线程中所说,
当你使用TensorFlow后端时,你的Keras代码实际上是在构建一个TF图。你可以直接获取这个图。
Keras只使用一个图和一个会话。
然而,他链接到一个现在已经过时的教程。但基本概念没有改变。
我们只需要做以下几件事:
- 获取TensorFlow会话
- 从TensorFlow会话中导出计算图
使用Keras实现
keras_to_tensorflow存储库包含了一个在iPython笔记本中如何从Keras导出模型以在TensorFlow中使用的简短示例。这基本上是使用TensorFlow。这不是一个写得清楚的示例,但作为资源抛出来。
使用TensorFlow实现
事实证明,我们实际上可以从TensorFlow本身获取Keras正在使用的TensorFlow会话,使用tf.contrib.keras.backend.get_session()函数。这做起来非常简单 – 只需导入并调用。这将返回TensorFlow会话。
一旦你有了TensorFlow会话变量,你可以使用SavedModelBuilder来保存你的计算图(TensorFlow文档中使用SavedModelBuilder的指南和示例)。如果你想知道SavedModelBuilder是如何工作的,它实际上给你什么,Github仓库中的SavedModelBuilder自述文件是一个很好的指南。
P.S. – 如果你计划大量使用TensorFlow + Keras的组合,可以看看tf.contrib.keras中可用的其他模块