如何为Keras Dense创建一个自定义的内核(或偏置)权重初始化器,使-1或1值随机?

cxfofazt  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(73)

在纯Python中,我可以很容易地做到这一点:

from random import choice

def init_by_plus_or_menus() -> int:
    return choice([-1, 1])

字符串
Keras文档在示例Keras.backend(tf)函数中使用:

def my_init(shape, dtype=None):
    return tf.random.normal(shape, dtype=dtype)

layer = Dense(64, kernel_initializer=my_init)


,但是没有一个函数类似于标准的Python random.choice或它的元素模拟。
我试过这个:

def init_plus_or_minus(shape, dtype=None):
    return backend.constant(value=choice([-1, 1]), shape=shape, dtype=dtype)

# Testing
if __name__ == '__main__':
   print(init_plus_or_minus(shape=(10,), dtype='int8'))


终端让我变成了这样:
第一个月
正如你所看到的,结果Tensor是由一次生成的随机值填充的,这不是我想要的。

46scxncf

46scxncf1#

我想我在tensorflow.constant的“value”参数中使用numpy.choice生成的数组解决了这个问题:

from keras.backend import constant
from numpy.random import choice

def init_plus_or_minus(shape, dtype=None, name=None):
    return constant(value=choice([-1, 1], size=shape), dtype=dtype, name=name)

# Testing
if __name__ == '__main__':
   print(init_plus_or_minus(shape=(10, 5,), dtype='int8'))

字符串
终端将此返回:

tf.Tensor(
[[ 1 -1  1 -1  1]
 [ 1  1 -1 -1  1]
 [ 1  1 -1  1  1]
 [ 1 -1  1  1  1]
 [-1  1 -1 -1  1]
 [ 1 -1 -1  1 -1]
 [ 1 -1 -1  1 -1]
 [-1 -1 -1 -1 -1]
 [-1  1  1 -1  1]
 [-1  1  1 -1  1]], shape=(10, 5), dtype=int8)

相关问题