使用Keras时,
必须先初始化变量,然后才能使用它们。实际上,它比这要微妙得多:必须 它们 初始化变量。让我们来看这个例子:
import tensorflow as tf
x = tf.Variable(0.)
with tf.Session() as sess:
tf.global_variables_initializer().run()
# x is initialized -- no issue here
x.eval()
with tf.Session() as sess:
x.eval()
# Error -- x was never initialized in this session, even though
# it has been initialized before in another session
因此,model
不初始化您的变量就不足为奇了,因为您在之前创建了模型sess
。
但是,VGG16
不仅会为模型变量(用调用的变量)创建初始化操作tf.global_variables_initializer
,而且实际上 会 调用它们。问题是,在哪个范围内Session
?
好吧,由于在构建模型时不存在此模型,因此Keras为您创建了一个默认模型,您可以使用进行恢复tf.keras.backend.get_session()
。现在使用此会话可以按预期工作,因为在此会话中初始化了变量:
with tf.keras.backend.get_session() as sess:
K.set_session(sess)
output = sess.run(features, Feed_dict={inputs: images})
print(output.shape)
请注意,您还可以创建自己的数据库,Session
并将其提供给Keras,keras.backend.set_session
这正是您所做的。但是,如本例所示,Keras和TensorFlow具有不同的心态。
一个TensorFlow用户通常会首先构造一个图形,然后实例化一个Session,也许在冻结图形之后。
Keras与框架无关,并且在构造阶段之间没有这种固有的区别-特别是,我们在这里了解到Keras可以很好地 在 图形构造 期间 实例化Session 。
因此,在使用Keras时,我建议不要自行管理tf.Session
,而应该依赖于tf.keras.backend.get_session
是否需要处理需要使用TensorFlow的特定代码tf.Session
。