在Tensorflow 1.13.1中具有自定义层的功能save_weights / load_weights中是否存在bug?

时间:2019-03-24 07:51:00

标签: tensorflow tensorflow2.0

花了我一天多的时间,如此沮丧。我怀疑这是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

尽管结果表明这可能是一个错误,但我不确定。由于代码非常基础,因此,如果存在这样的错误,应该容易发现。我进行了很多搜索,但没有人提及它。因此,我想我有些误会了:)

0 个答案:

没有答案