TLDR
При использовании Keras,
- Избегайте использования
Session
, если можете (в духе агностика Керас)
- В противном случае используйте Keras-handled
Session
- tf.keras.backend.get_session
.
- Используйте Keras '
set_session
для расширенного использования (например, когда вам нужно профилирование или размещение устройства) и очень рано в вашей программе - вопреки обычной практике и хорошему использованию в "чистом" Tensorflow.
Подробнее об этом
Переменные должны быть инициализированы перед использованием. На самом деле, это немного сложнее: переменные должны быть инициализированы в сеансе , который они используют. Давайте посмотрим на этот пример:
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
.