使用 Tensorflow 初始化神经网络权重

Posted

技术标签:

【中文标题】使用 Tensorflow 初始化神经网络权重【英文标题】:Initialize neural network weights with Tensorflow 【发布时间】:2019-10-09 09:05:55 【问题描述】:

我正在使用 Tensorflow 开发神经网络模型。在 LOSO 交叉验证中,我需要将模型训练 10 折,因为我有来自 10 个不同主题的数据。

考虑到这一点,我需要在每次交叉验证折叠开始时重置优化器和网络权重。我将权重定义如下:

weights = 
    'w1' : tf.Variable(tf.random_uniform(shape = [100, 10],seed =   0)),

    'w2' : tf.Variable(tf.random_uniform(shape = [10, 100],seed = 0))

我通过重新初始化所有全局变量来重置优化器和权重,如下所示:

# Start session to run Tensors and Operations
with tf.Session() as sess:
    # Optimizer
    optimizer = tf.train.GradientDescentOptimizer(lr).minimize(loss)
    # Variables initializer
    init = tf.global_variables_initializer()
    # Loop over the 10 cross-validation subjects
    for subject in range(0,10):
        # Initialize global variables and optimizer
        sess.run(init)
        # Print initialized weights (should be always the same)
        print(sess.run(weights['w1']))
        # Loop over epochs to train the model
        for epoch in range(epochs):         
            # Run network optimizer for the current epoch
            _,cost = sess.run([optimizer,loss], feed_dict =X:x_train[subject,:], Y:y_train[subject,:])

但是,在循环的每次迭代中,我都会打印出不同的权重值,例如我设置为 0 的操作种子没有发挥作用。有谁知道我错过了什么?

【问题讨论】:

如果输入变量在每次折叠时都发生变化,你怎么能期望相同的权重?。 因为权重是在折叠开始时打印的,在任何输入传递给优化器@Neb之前 【参考方案1】:

我猜正在发生的事情如下。假设您在脚本开头将初始种子设置为 42:

set_seed(42)

然后,你采样一个随机数:

sample()
>>> 0.875

现在,您再次采样:

sample()
>>> 0.311

不一样。这不是一个错误。 set_seed() 函数告诉系统从位置 42 开始采样“随机”数(在伪随机数序列中)每次运行程序,而不是每次调用 sample 函数时.尝试多次运行您的程序。您会看到参数的权重在折叠之间会有所不同,但在多次运行中是相同的,即在所有运行中,在折叠 1 处,权重将始终初始化为相同的值。


现在,如何解决这个问题?

在脚本开头采样一次随机初始化,并在每次折叠开始时使用它初始化您的权重:

w = tf.Variable(..., initializer=YOUR_NUMPY_ARRAY)

【讨论】:

以上是关于使用 Tensorflow 初始化神经网络权重的主要内容,如果未能解决你的问题,请参考以下文章

吴裕雄 python 神经网络——TensorFlow 使用卷积神经网络训练和预测MNIST手写数据集

Tensorflow - 从恢复的模型中平均模型权重

TensorFlow:神经网络在训练集和测试集上的准确率始终为 100%

TensorFlow 中的连体神经网络

TensorFlow 神经网络只预测 1 作为结果

测试最佳神经元数量 - Keras / Tensorflow