2

我花了一天多的时间,非常沮丧。我怀疑这是Tensorflow 1.13.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

虽然结果表明它可能是一个错误,但我不太确定。由于代码非常基础,如果存在这样的错误,应该很容易发现。我做了很多搜索,但没有人提到它。因此,我想我误解了一些东西:)

4

0 回答 0