【问题标题】:Does TensorFlow provide a half normal initialiser?TensorFlow 是否提供半正常初始化程序?
【发布时间】:2020-08-03 14:15:05
【问题描述】:

TensorFlow 提供random_normal_initializer。但是,我需要一个初始化器,它产生介于0N 之间的数字,但这会在[0, N] 范围内(其中N 可以是@ 987654331@),所以我不能使用统一初始化器(因为它在所有值上均等地放置质量)。

我认为产生HalfNormal 的初始化程序是可以的。

TF 是否已经提供此功能,还是我需要实现自定义初始化程序?

如果我需要实现自定义初始化程序,典型的做法是什么?我想我可以继承initializer class,但我不知道这是否是一种常见的做事方式。

这个问题也是raised in the TF's issue tracker

【问题讨论】:

    标签: tensorflow keras initialization tensorflow2.0 initializer


    【解决方案1】:

    根据this documentation page,我们可以通过定义一个返回初始值的函数来实现自定义初始化器。然后我们将此函数对象(即您不调用该函数)传递给初始化程序。

    这是一个示例(在 TensorFlow 2.1 中),它可以满足我的需求。

    import tensorflow as tf
    
    
    def random_half_normal(shape, **kwargs):
        return tf.abs(tf.keras.backend.random_normal(shape, **kwargs))
    
    
    class MyLayer(tf.keras.layers.Layer):
        def build(self, input_shape):
            self.my_var = self.add_weight(initializer=random_half_normal, 
                                          trainable=False)
    
        def call(self, inputs):
            tf.print("\nself.my_var =", self.my_var)
            return inputs
    
    
    def get_model():
        inp = tf.keras.layers.Input(shape=(1,))
        out = MyLayer(8)(inp)
        model = tf.keras.Model(inputs=inp, outputs=out)
        model.summary()
        return model
    
    
    def train():
        model = get_model()
        model.compile(optimizer="adam", loss="mae")
        x_train = [2, 3, 4, 1, 2, 6]
        y_train = [1, 0, 1, 0, 1, 1]
        model.fit(x_train, y_train)
    
    
    if __name__ == '__main__':
        train()
    

    【讨论】:

      猜你喜欢
      • 2019-10-24
      • 1970-01-01
      • 2023-03-18
      • 2015-07-16
      • 1970-01-01
      • 2019-09-28
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多