花了我一天多的时间,如此沮丧。我怀疑这是Tensorflow 1.13.1
(稳定版本)中的错误。
总而言之,我以模型子类化样式创建了一个自定义模型,其中仅包含1个自定义层。初始后,我通过使用save_weights和load_weights函数将其可训练的权重转储到文件中并还原。保存前后的可训练重量不同。
我还在Tensorflow 2.0.0a0
上进行了相同的测试,结果发现该版本没有出现这种现象。
我的自定义图层:
class EncodingLayer(tf.keras.layers.Layer):
def __init__(self, out_size):
super().__init__()
self.rnn_layer = tf.keras.layers.GRU(out_size, return_sequences=True, return_state=True, recurrent_initializer='glorot_uniform')
def call(self, X, **kwargs):
output, state = self.rnn_layer(X)
return output, state
这是主要部分:
class EncodingModel(tf.keras.Model):
def __init__(self):
super().__init__()
self.encoder_layer = EncodingLayer(out_size=1)
def infer(self, inputs):
output, state = self.encoder_layer(inputs)
return output
if __name__ == '__main__':
# Comment line below for running in TF 2.0
tf.enable_eager_execution()
# shape == (2, 3, 2)
inputs = tf.convert_to_tensor([
[[1., 2.], [2., 3.], [4., 4.]],
[[1., 2.], [2., 3.], [4., 4.]],
])
model = EncodingModel()
# Just for building the graph
model.infer(inputs)
print('Before saving model: ', model.trainable_weights[0].numpy().mean())
model.save_weights('weight')
new_model = EncodingModel()
new_model.infer(inputs)
new_model.load_weights('weight')
print('Loaded model: ', new_model.trainable_weights[0].numpy().mean())
在TF 1.13.1中运行时的结果:
Before saving model: 0.28864467
Loaded model: 0.117300846
在TF 2.0.0a0中运行时的结果:
Before saving model: -0.06922924
Loaded model: -0.06922924
尽管结果表明这可能是一个错误,但我不确定。由于代码非常基础,因此,如果存在这样的错误,应该容易发现。我进行了很多搜索,但没有人提及它。因此,我想我有些误会了:)