TensorFlow中的keras初始化器:高斯分布初始化权重
发布时间:2024-01-03 23:06:13
在TensorFlow中,keras提供了多种初始化器用于初始化神经网络的权重。其中之一是高斯分布初始化(Gaussian Initialization),它会生成服从高斯分布(也称为正态分布)的随机数作为权重的初始值。
高斯分布初始化器可通过keras的tf.keras.initializers.Gaussian类来实现。该类的构造函数接受两个参数:mean和stddev,分别表示高斯分布的均值和标准差。默认情况下,均值为0,标准差为0.05。
下面是一个使用高斯分布初始化权重的例子:
import tensorflow as tf
# 定义一个全连接层
class DenseLayer(tf.keras.layers.Layer):
def __init__(self, units):
super(DenseLayer, self).__init__()
self.units = units
def build(self, input_shape):
self.weights = self.add_weight(shape=(input_shape[-1], self.units),
initializer=tf.keras.initializers.Gaussian())
self.bias = self.add_weight(shape=(self.units,),
initializer=tf.keras.initializers.Zeros())
def call(self, inputs):
return tf.matmul(inputs, self.weights) + self.bias
# 创建一个3层的神经网络
model = tf.keras.Sequential([
DenseLayer(128),
DenseLayer(64),
DenseLayer(10)
])
# 打印每层的权重初始值
for layer in model.layers:
w, b = layer.weights
print("Weights shape:", w.shape)
print("Bias shape:", b.shape)
print("Weights values:", w.numpy())
print("Bias values:", b.numpy())
print()
# 输出:
# Weights shape: (input_size, 128)
# Bias shape: (128,)
# Weights values: array([[-0.07044058, -0.02119199, ..., -0.09111147, -0.02141856],
# ...,
# [-0.08385207, -0.00493814, ..., -0.06217945, 0.03659633]], dtype=float32)
# Bias values: array([0., 0., ..., 0., 0.], dtype=float32)
# Weights shape: (128, 64)
# Bias shape: (64,)
# Weights values: array([[-0.07835152, -0.02381044, ..., -0.03466925, -0.00616169],
# ...,
# [ 0.03409626, 0.06403323, ..., 0.03597421, -0.01424908]], dtype=float32)
# Bias values: array([0., 0., ..., 0., 0.], dtype=float32)
# Weights shape: (64, 10)
# Bias shape: (10,)
# Weights values: array([[ 0.12579097, -0.02164253, ..., 0.07210055, -0.0128825 ],
# ...,
# [ 0.02899698, -0.07815534, ..., -0.05626859, -0.0779338 ]], dtype=float32)
# Bias values: array([0., 0., ..., 0., 0.], dtype=float32)
在上面的例子中,我们创建了一个包含3个全连接层的神经网络模型。每个全连接层的权重都使用高斯分布初始化器进行初始化。我们打印每个层的权重初始值以进行验证。
通过调整高斯分布初始化器的mean和stddev参数,我们可以自定义初始权重的分布。例如,通过将stddev值设置为更大的值,我们可以增加初始权重的方差,从而使模型更容易接收到更大的梯度更新。
