使用 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手写数据集