多层感知器的偏置初始化器

时间:2018-07-06 09:22:53

标签: python tensorflow neural-network perceptron

我已经在TensorFlow中编写了自己的多层感知器,在其中我初始化了权重和偏差,如下所示:

# Store layers weight & bias
weights = {
    'h1': tf.Variable(tf.random_normal([n_input, hidden_layer_sizes[0]], 0, 0.1, seed=random_state)),  # 1 hidden layer is mandatory
}
biases = {
    'b1': tf.Variable(tf.random_normal([hidden_layer_sizes[0]], 0, 0.1, seed=random_state)),
}
for i in range(len(hidden_layer_sizes)-1):
    weights['h'+str(i+2)] = tf.Variable(tf.random_normal([hidden_layer_sizes[i], hidden_layer_sizes[i+1]], 0, 0.1, seed=random_state))
    biases['b'+str(i+2)] = tf.Variable(tf.random_normal([hidden_layer_sizes[i+1]], 0, 0.1, seed=random_state))
weights['out'] = tf.Variable(tf.random_normal([hidden_layer_sizes[-1], n_classes], 0, 0.1, seed=random_state))
biases['out'] = tf.Variable(tf.random_normal([n_classes], 0, 0.1, seed=random_state))

隐藏层的数量在1到4之间变化,具体取决于输入。我一直在Internet上阅读有关初始化权重的其他方法,我想知道它们是否适用于MLP模型或仅适用于CNN等更复杂的模型。例如,Xavier,HE,方差缩放初始化等。

在我的情况下,是否可以使用任何其他初始化方法?哪种方法最适合此类网络?

2 个答案:

答案 0 :(得分:1)

这取决于MLP的大小。通常出于以下两个原因之一进行初始化:

  • 防止梯度爆炸或消失
  • 要更正确地初始化,因此有助于收敛速度和结果

通常对于具有几层的网络和具有很少神经元的网络,初始化并不重要。您可以尝试一下,然后自己看看。 Xavier和他的确是更好的人。通常,对于任何类型的网络,实际上都没有一个“最好的”,尝试一下可能会有所收获。

答案 1 :(得分:0)

这就是我在代码中实现它的方式。首先,我定义了以下函数:

def get_initial_weights(self, varname, shape, initializer="random_normal"):
    if initializer == 'random_normal':
        return tf.Variable(tf.random_normal(shape=shape, mean=0, stddev=0.1, seed=self.random_state))
    elif initializer == "xavier":
        return tf.get_variable(varname, shape=shape, initializer=tf.contrib.layers.xavier_initializer())
    elif initializer == "he":
        return tf.get_variable(varname, shape=shape, initializer=tf.variance_scaling_initializer())

然后在我班级的主体内部,我用第一篇文章中的代码替换了以下内容:

# Store layers weight & bias
weights = {
    'h1': self.get_initial_weights('h1', [n_input, hidden_layer_sizes[0]], initializer=initializer)
}
biases = {
    'b1': self.get_initial_weights('b1', [hidden_layer_sizes[0]], initializer=initializer)
}
for i in range(len(hidden_layer_sizes)-1):
    weights['h' + str(i + 2)] = self.get_initial_weights('h' + str(i + 2), [hidden_layer_sizes[i], hidden_layer_sizes[i+1]], initializer=initializer)
    biases['b'+str(i+2)] = self.get_initial_weights('b'+str(i+2), [hidden_layer_sizes[i+1]], initializer=initializer)
weights['hout'] = self.get_initial_weights('hout', [hidden_layer_sizes[-1], n_classes], initializer=initializer)
biases['bout'] = self.get_initial_weights('bout', [n_classes], initializer=initializer)