繁体   English   中英

保存为张量流图的 Keras Sequential 模型缺少火车操作?

[英]Keras Sequential model saved as tensorflow graph is missing train operation?

我尝试在 keras 和 tensorflow 中制作简单的模型,然后将它们保存到 pb 文件中。 运行以下命令时,我注意到 tensorflow 示例有一个训练操作,但 keras 示例没有。 问题:有没有办法在从 keras 模型创建的张量流图中找到训练操作或确保添加了一个?

tf.get_default_graph().get_operations()

Tensorflow 示例

import tensorflow as tf

x = tf.placeholder(tf.float32, shape=[None, 1, 1], name='input')
y = tf.placeholder(tf.float32, shape=[None, 1, 1], name='target')

y_ = tf.identity(tf.layers.dense(x, 1), name='output')

loss = tf.reduce_mean(tf.square(y_ - y), name='loss')
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(loss, name='train')

init = tf.global_variables_initializer()
saver_def = tf.train.Saver().as_saver_def()
tf.get_default_graph().get_operations()

Keras 示例

import tensorflow as tf
from tensorflow.keras import layers

model = tf.keras.Sequential()
model.add(layers.GRU(20, input_shape=(10, 1), return_sequences=True, name='input'))
model.add(layers.Dense(1, activation='linear'))
model.compile(loss="mse", optimizer="adam")
model.summary()

init = tf.global_variables_initializer()
saver_def = tf.train.Saver().as_saver_def()
tf.get_default_graph().get_operations()

编辑

感谢 Daniel Möller,将跑步后的健身训练添加到图表中。 但是,它的命名不如 tensorflow 模型好,后者似乎总是使用“train”。 我发现我的 keras 模型的名称“training/group_deps”保存在张量流图中。

如果可以像输入和输出一样轻松找到训练名称和目标名称,那就太好了,可以通过以下方式找到:

model.input.name
model.output.name

但我的问题似乎解决了,但每次都需要挖掘图形文件。 因此,如果有人知道更简单的方法,我们将不胜感激。 目标是使用 tensorflows C API 运行网络。

编辑 2

我在 tesorflow 中找到了 summary_graph 工具。 但是最初的尝试在 Windows 上的挡板上失败了。 目前其他事情是优先考虑的,所以我没有更进一步。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/graph_transforms#inspecting-graphs

为了社区的利益,提及以下问题的解决方案(到目前为止已实现)。

保存为张量流图的 Keras Sequential 模型缺少火车操作?

在使用命令保存模型之前运行命令, model.fit

saver_def = tf.train.Saver().as_saver_def()

包括Keras Sequential Model图中的训练操作。

好想法@Tensorflow 支持。

我设法找到了保存 keras 模型的正确顺序。 (至少它对我有用)。 我的解释在下面代码块的注释中。

import tensorflow as tf
from tensorflow.keras import layers

model = tf.keras.Sequential()
model.add(layers.GRU(20, input_shape=(10, 1), return_sequences=True, name='input'))
model.add(layers.Dense(1, activation='linear'))
model.compile(loss="mse", optimizer="adam")
model.summary()

# Calling fit to get the training operations added to the graph
model.fit(input_data, target_data, validation_data=(input_vali, target_vali), batch_size=1, epochs=1)

# Important to call init after training so that training can also be reinitialized later
init = tf.global_variables_initializer()
# Calling save after training like mentioned above
saver_def = tf.train.Saver().as_saver_def()

# Save graph as pb to be used later
tf.train.write_graph(tf.get_default_graph(),  "./", 'graph.pb', as_text=False)
# Save as text file as operation names not directly accessible by keras (to my knowledge) may be needed. Example target & training
tf.train.write_graph(tf.get_default_graph(),  "./", 'graph.txt', as_text=True)

我一直在使用上述方法和我自己的深度学习代码在 TensorFlow C 中加载图形,以便在将来某个时候部署的代码集中在线运行推理和训练。 (我确认使用 tensorflow 1.15 声明上述方法适用于我的环境)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM