众所周知,tensorflow
使用静态图来定义模型,我们必须运行一个会话来进行评估。 keras
似乎更简单,可以用作公用库。但是,当我们使用keras
来构建模型和backend.set_session
的{{1}}时,会出现一些问题。看下面的例子
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
会话之间的关系。如何在不删除上面给出的两行的情况下解决问题?
PS:我意识到这可能是由于backend
和tf.Session
默认会话之间的冲突所致。如果未设置自定义keras
,则程序将在keras给出的默认会话下运行。但是,给定tf.Session
时,它与tf.Session
模型的会话不同。这种差异会引起冲突和错误。