如何在TensorFlow中随机初始化权重?

5
在TensorFlow中,我从教程中学到,可以通过以下方式初始化变量: sess.run(tf.global_variables_initializer()) 但我发现,每次使用相同的输入数据集运行时,损失值始终以相同的值开始。
我认为这是由于初始化始终将变量设置为相同的值(可能是0)。
我希望权重的值是随机的。我尝试搜索这个问题,但TensorFlow文档没有明确回答默认情况下是使用零值还是随机值进行初始化。
如何指定随机值进行初始化?
更新:
我的网络首先是一堆卷积层和池化层,像下面这样:
``` conv1 = tf.layers.conv2d(inputs=input_layer, filters=32, kernel_size=[3,3], padding="same", activation=tf.nn.relu, name="conv_chad_1") ```
    pool1 = tf.layers.max_pooling2d(inputs=conv1,pool_size=[2,2],strides=2)

    conv2 = tf.layers.conv2d(inputs=pool1, filters=64, kernel_size=[3,3], padding="same", activation=tf.nn.relu, name="conv_chad_2")

    pool2 = tf.layers.max_pooling2d(inputs=conv2,pool_size=[2,2],strides=2, name="pool_chad_2")

据我所知,这些预定义层内已经定义了权重。我该如何指定这些层以随机初始化其权重变量?

2个回答

7

您需要提供更多信息。例如,在图表中如何初始化变量?对于神经网络中的权重初始化,必须随机初始化它们(偏差可以全部初始化为零)。因此,您必须使用类似以下代码的适当初始化定义它们:

# initialize weights randomly from a Gaussian distribution
# step 1: create the initializer for weights
weight_initer = tf.truncated_normal_initializer(mean=0.0, stddev=0.01)
# step 2: create the weight variable with proper initialization
W = tf.get_variable(name="Weight", dtype=tf.float32, shape=[784, 200], initializer=weight_initer)

# initialize biases as zero
# step 1: create the initializer for biases
bias_initer =tf.constant(0., shape=[200], dtype=tf.float32)
# step 2: create the bias variable with proper initialization
b = tf.get_variable(name="Bias", dtype=tf.float32, initializer=bias_initer)

我已经更新了我的问题。在我的代码中,大部分网络都由层组成。你知道如何命令这些层使用随机值初始化它们的权重吗? - kwagjj
1
是的,请尝试像这样初始化您的层:conv2=tf.layers.conv2d(inputs=pool1, filters=64, kernel_size=[3,3], kernel_initializer=tf.contrib.layers.xavier_initializer(), bias_initializer=tf.zeros_initializer(), padding="same", activation=tf.nn.relu, name="conv_chad_2")。这将使用方差与其输出相关的高斯分布随机初始化权重(Xavier方法),并将偏置项初始化为零。 - Ary

1
我遇到了相同的问题,就好像你每次都在执行global_value_initializer()这一行代码。你需要做的是,例如,如果你正在使用jupyter笔记本,则将该部分会话(声明init)声明在一个单元格中,其余部分在另一个单元格中(训练部分)。
此外,当您想要在暂停后继续训练模型时,您可能需要保存参数并恢复它们。如何做到这一点,您可以查看 这里。如果这不能解决您的问题,请向我展示您正在处理的代码部分。我可能能提供更多帮助。

注意:当您更改优化器时,无法恢复参数,据我所知,您必须坚持使用一个优化器。您不能使用一个优化器进行100次迭代,然后继续使用另一个优化器并保持相同的参数。或者也许您可以尝试一些可能让您这样做的技巧,请告诉我。


抱歉,但这不是我要找的答案。我知道如何保存和恢复模型。 我尝试过在没有加载任何先前进展的情况下开始训练会话。但是,在几十次这样的尝试中,我注意到损失值都从相同的值开始。这使我认为我的层默认情况下都是零初始化的。我希望将其初始化为随机值。 - kwagjj
你可以尝试使用tf.contrib.layers.xavier_initializer,并查看完整文档此处。关于如何使用它,将initializer作为weights_initializer放置在此处所示的权重初始化器中,如果可行,请告诉我。 - shivam13juna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接