保存为张量流图的Keras序列模型缺少列车运行?

时间:2019-12-10 03:10:13

标签: python tensorflow keras

我尝试在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()

编辑

感谢丹尼尔·莫勒(DanielMöller),在进行跑步健身训练后,将其添加到图表中。 但是,它的名称不像张量流模型那样好,后者似乎总是使用“ 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

2 个答案:

答案 0 :(得分:1)

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

  

保存为张量流图的Keras序列模型缺少训练   操作吗?

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

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

在图形中包括针对Keras Sequential Model的训练操作。

答案 1 :(得分:1)

好想@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的环境)