如何为Keras Dense层自定义随机生成±1值的权重初始化器?
实现逐元素随机选择-1/1的Keras初始化器
你的代码问题在于random.choice([-1,1])仅在Python层面执行一次,得到单个固定值后填充整个张量,因此所有元素完全相同。要实现逐元素独立随机选择,必须使用TensorFlow的原生随机操作生成每个位置的独立随机值,以下是几种可行方案:
方法一:通过随机整数映射为-1/1
生成0或1的随机整数张量,再将0映射为-1:
import tensorflow as tf from tensorflow.keras import backend as backend def init_plus_or_minus(shape, dtype=None): # 生成指定形状的0/1随机整数 random_flags = tf.random.uniform(shape, minval=0, maxval=2, dtype=tf.int32) # 将0转为-1,1保留,最终转换为指定数据类型 return tf.cast(tf.where(random_flags == 0, -1, 1), dtype=dtype) # 测试 if __name__ == '__main__': print(init_plus_or_minus(shape=(10,), dtype='int8'))
方法二:直接从候选值中逐元素采样
创建包含-1和1的候选张量,生成随机索引逐元素选取:
import tensorflow as tf from tensorflow.keras import backend as backend def init_plus_or_minus(shape, dtype=None): # 定义可选值张量 candidates = tf.constant([-1, 1], dtype=dtype or tf.int8) # 生成每个位置的随机索引(0或1) random_indices = tf.random.uniform(shape, minval=0, maxval=2, dtype=tf.int32) # 根据索引选取对应元素 return tf.gather(candidates, random_indices) # 测试 if __name__ == '__main__': print(init_plus_or_minus(shape=(10,), dtype='int8'))
方法三:简洁的数学转换
利用随机浮点数直接转换为-1/1:
import tensorflow as tf from tensorflow.keras import backend as backend def init_plus_or_minus(shape, dtype=None): # 生成0-1之间的随机浮点数,通过符号函数转换为-1或1 random_vals = tf.random.uniform(shape, minval=0, maxval=1) return tf.cast(tf.sign(random_vals - 0.5), dtype=dtype) # 测试 if __name__ == '__main__': print(init_plus_or_minus(shape=(10,), dtype='int8'))
以上方案均在TensorFlow计算图中执行,符合Keras初始化器的要求,每个元素都会独立随机选择-1或1,不会出现全张量值相同的情况。
内容的提问来源于stack exchange,提问作者Maksim Shavrin
相关产品推荐
相关产品推荐

