欢迎访问宙启技术站
智能推送

TensorFlow中的keras初始化器:高斯分布初始化权重

发布时间:2024-01-03 23:06:13

在TensorFlow中,keras提供了多种初始化器用于初始化神经网络的权重。其中之一是高斯分布初始化(Gaussian Initialization),它会生成服从高斯分布(也称为正态分布)的随机数作为权重的初始值。

高斯分布初始化器可通过keras的tf.keras.initializers.Gaussian类来实现。该类的构造函数接受两个参数:meanstddev,分别表示高斯分布的均值和标准差。默认情况下,均值为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个全连接层的神经网络模型。每个全连接层的权重都使用高斯分布初始化器进行初始化。我们打印每个层的权重初始值以进行验证。

通过调整高斯分布初始化器的meanstddev参数,我们可以自定义初始权重的分布。例如,通过将stddev值设置为更大的值,我们可以增加初始权重的方差,从而使模型更容易接收到更大的梯度更新。