TensorFlow提供random_normal_initializer。但是,我需要一个初始化器来产生介于0和N之间的数字,但这会在范围[0, N] (其中N可以是1)内的某个值x (由用户选择)周围设置更多的密度,因此我不能使用统一初始化器(因为它将质量等同地赋予所有值)。
我认为一个产生HalfNormal的初始化器是可以的。
TF是否已经提供了这个功能,或者我是否需要实现一个自定义的初始化器?
如果我需要实现一个自定义初始化器,典型的方法是什么?我想我可以从initializer class继承,但我不知道这是否是一种常见的做法。
这个问题也是raised in the TF's issue tracker造成的。
发布于 2020-04-22 11:52:28
根据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()https://stackoverflow.com/questions/61333274
复制相似问题