【问题标题】:Why do I get exploding grad problem even with ResNet, Batchnorm, ReLU? (tensorflow)为什么即使使用 ResNet、Batchnorm、ReLU,我也会遇到爆炸性的 grad 问题? (张量流)
【发布时间】:2020-01-15 15:10:59
【问题描述】:

我设计了一个简单的合成数据

tempdataset = np.random.normal(0.0,1.0,[20,10])
templabelset = np.random.normal(0.0,1.0,[20,10])

所以会有 20 个训练样例,NN 输入的大小为 10

我已经用 batchnorm、ReLu 激活实现了一个简单的 10 层深度 ResNet

def resnet_block(self, input_data, num_nodes):
    temp = tf.keras.layers.Dense(units=num_nodes)(input_data)
    temp = tf.keras.layers.BatchNormalization()(temp)
    temp2 = tf.keras.layers.Add()([input_data, temp])
    temp3 = tf.keras.layers.Activation(activation=tf.keras.activations.relu)(temp2)
    return temp3

def create_model(self):

    network = tf.keras.layers.Dense(10,tf.keras.activations.relu)(self.input_vec)
    network = tf.keras.layers.BatchNormalization()(network)

    for i in range(0, 10):
        network = self.resnet_block(network, 10)

    network = tf.keras.layers.Dense(10, tf.keras.activations.linear)(network)

    return network

def optimize(self, dataset, labelset, ln, epoch):

    cost = tf.reduce_mean((self.network - self.label_vec)**2)

    train_step = tf.train.GradientDescentOptimizer(ln).minimize(cost)

    for i in range(epoch):

        _, loss = self.session.run([train_step, cost], feed_dict={self.input_vec: dataset, self.label_vec: labelset})

        print(' current epoch ', i, ' and loss at ' , loss)

这里 self.input_vec 是一个 tf.placeholder

然后如果我要通过

对其进行优化
with tf.Session() as sess:
    NN = ResNet(..... constructors initialization.....)
    sess.run(tf.global_variables_initializer())
    NN.optimize(tempdataset,templabelset,0.01,10000)

我很快就会失去无穷无尽的损失。

我已经尝试过 (BN, ReLU, Add) 的所有排列,例如 (Add -> Batch -> ReLU)

它仍然给我带来爆炸性的损失。

问题在于,有时这很好,并且确实将损失降到最低,但有时,损失会爆炸式增长。

【问题讨论】:

  • 你在用什么initializer?尝试使用不同的初始化程序。
  • 你使用哪种学习率?

标签: python tensorflow machine-learning keras neural-network


【解决方案1】:

你的例子太少了。尝试数百个示例并降低学习率。 也可以尝试不同的优化器,比如 Adam 或 Adadelta。

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2018-10-21
    • 2017-12-13
    • 1970-01-01
    相关资源
    最近更新 更多