【问题标题】:Bias initializer for Multi-Layer Perceptron多层感知器的偏置初始化器
【发布时间】:2018-12-14 20:49:42
【问题描述】:

我在 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 之间变化,具体取决于输入。我一直在互联网上阅读有关初始化权重的替代方法,我想知道它们是否适用于 MLP 模型或仅适用于 CNN 等更复杂的模型。例如,Xavier、HE、方差缩放初始化等。

是否有任何替代初始化器适用于我的情况,哪一个被认为最适合这种类型的网络?

【问题讨论】:

    标签: python tensorflow neural-network perceptron


    【解决方案1】:

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

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

    通常对于具有几层的网络和具有少量神经元的网络,初始化并不重要。你可以试试看,自己看看。泽维尔和他确实是更好的人。一般来说,对于任何类型的网络都没有真正的“最佳网络”,尝试一下可能会有所收获。

    【讨论】:

      【解决方案2】:

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

      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)
      

      【讨论】:

        猜你喜欢
        • 2015-08-14
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 2019-12-28
        • 2019-04-13
        • 2017-09-09
        • 2011-07-01
        相关资源
        最近更新 更多