Известно, что tensorflow
использует статический график для определения модели, и мы должны запустить сеанс для оценки.Хотя keras
кажется более простым и может использоваться в качестве общей библиотеки.Но когда мы используем keras
для построения модели и backend.set_session
из keras
вместе, возникают некоторые проблемы.Посмотрите на следующий пример
from keras import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
import keras.backend as K
def build_model(advantange='avg'):
model = Sequential()
model.add(Dense(3, input_shape=(3,)))
# optimizer
adam = Adam(lr=1E-3)
# model compile
model.compile(loss='mse', optimizer=adam)
return model
nn1 = build_model()
nn2 = build_model()
nn1.set_weights(nn2.get_weights())
K.set_session(tf.Session())
print(K.get_value(nn1.optimizer.lr))
здесь мы строим две независимые модели (одинаковую архитектуру) nn1
и nn2
и пытаемся просто напечатать их внутреннюю скорость обучения, и мы получили следующую ошибку
tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value Adam/lr
Кажется, что модели nn1
и nn2
не инициализированы.Но если мы просто удалим строку
nn1.set_weights(nn2.get_weights())
или удалим строку
K.set_session(tf.Session())
, тогда мы сможем получить правильную скорость обучения 0.001
.
Это действительно беспокоит меня, потому что я не знаю причину этой проблемы.Особенно я не понимаю отношения между keras
моделью и backend
сессией.Как решить проблему, не удаляя две строки, приведенные выше?
PS: Я понимаю, что это может быть из-за конфликта между сеансами по умолчанию tf.Session
и keras
.Если самоопределение tf.Session
не задано, программа будет работать в сеансе по умолчанию, заданном keras.Однако, когда задано tf.Session
, оно отличается от сеанса модели keras
.Такая разница приведет к конфликту и ошибке.