我对@987654321@ 图表和会话的理解是:
tensorflow 图形承载操作,placeholders 和 Variables。 tensorflow 图存在于 tensorflow 会话中(这就是为什么要使用 tensorflow.train.Saver 保存经过训练的模型,您需要类似 Saver.save(sess, the graph) 的东西)。
下面是一个简单示例,可帮助您理解 keras 模型和 tensorflow 图表之间的关系:
import tensorflow as tf
from keras.layers import Input, Dense
from keras.models import Model
tf.reset_default_graph()
graph_1, graph_2 = tf.Graph(), tf.Graph()
with graph_1.as_default():
x_in = Input(shape=(1, ), name='in_graph1')
pred = Dense(5, name='dense1_graph1')(x_in)
pred = Dense(1, name='dense2_graph1')(pred)
model = Model(input=x_in, output=pred)
with graph_2.as_default():
x_in = Input(shape=(1, ), name='in_graph2')
pred = Dense(10, name='dense1_graph2')(x_in)
pred = Dense(1, name='dense2_graph2')(pred)
model = Model(input=x_in, output=pred)
with tf.Session() as sess:
default_ops = sess.graph.get_operations()
with graph_1.as_default():
with tf.Session() as sess:
one_ops = sess.graph.get_operations()
with graph_2.as_default():
with tf.Session() as sess:
two_ops = sess.graph.get_operations()
运行代码可以看到,default_ops 是一个空列表,这意味着默认图表中没有任何操作。 one_ops 是第一个 keras 模型的操作列表,two_ops 是第二个 keras 模型的操作列表。
因此,通过使用with graph.as_default(),keras 模型可以专门嵌入到tensorflow 图中。
考虑到这一点,在单个脚本中加载多个keras 模型变得很容易。我认为下面的示例脚本将解决您的困惑:
import numpy as np
import tensorflow as tf
from keras.layers import Input, Dense
from keras.models import Model
from Keras.models import model_from_json
tf.reset_default_graph()
x = np.linspace(1, 4, 4)
y = np.random.rand(4)
models = {}
graph_1, graph_2 = tf.Graph(), tf.Graph()
# graph_1
with graph_1.as_default():
x_in = Input(shape=(1, ), name='in_graph1')
pred = Dense(5, name='dense1_graph1')(x_in)
pred = Dense(1, name='dense2_graph1')(pred)
model = Model(input=x_in, output=pred)
models['graph_1'] = model
# graph_2
with graph_2.as_default():
x_in = Input(shape=(1, ), name='in_graph2')
pred = Dense(10, name='dense1_graph2')(x_in)
pred = Dense(1, name='dense2_graph2')(pred)
model = Model(input=x_in, output=pred)
models['graph_2'] = model
# save the two models
with tf.Session(graph=graph_1) as sess:
with open("model_1.json", "w") as source:
source.write(models['graph_1'].to_json())
models['graph_1'].save_weights("weights_1.h5")
with tf.Session(graph=graph_2) as sess:
with open("model_2.json", "w") as source:
source.write(models['graph_2'].to_json())
models['graph_2'].save_weights("weights_2.h5")
####################################################
# play with the model
pred_one, pred_one_reloaded = [], []
pred_two, pred_two_reloaded = [], []
for _ in range(10):
print(_)
if _ % 2 == 0:
with graph_1.as_default():
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
pred_one.append(models['graph_1'].predict(x).ravel())
with tf.Session() as sess:
with open("model_1.json", "r") as f:
model = model_from_json(f.read())
model.load_weights("weights_1.h5")
pred_one_reloaded.append(model.predict(x).ravel())
else:
with graph_2.as_default():
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
pred_two.append(models['graph_2'].predict(x).ravel())
with tf.Session() as sess:
with open("model_2.json", "r") as f:
model = model_from_json(f.read())
model.load_weights("weights_2.h5")
pred_two_reloaded.append(model.predict(x).ravel())
pred_one = np.array(pred_one)
pred_one_reloaded = np.array(pred_one_reloaded)
pred_two = np.array(pred_two)
pred_two_reloaded = np.array(pred_two_reloaded)
print(pred_one)
print(pred_one_reloaded)
print(pred_two)
print(pred_two_reloaded)