我正在尝试训练 GAN,该架构在输出激活函数之前包括一个全连接层。在我的例子中,通过第二次训练迭代,这一层的输出总是爆炸式的。
我无法通过调试确定任何原因。层实现非常简单:
def fully_connected_d(inp, output_dim, name="Linear", stddev=0.02):
shape = inp.get_shape().as_list()
with tf.variable_scope(name):
w = tf.get_variable("w", [shape[1], output_dim], initializer=tf.truncated_normal_initializer(stddev=stddev))
#biases = tf.get_variable("b", [output_dim], initializer=tf.constant_initializer(0.0))
return tf.matmul(inp, w) #tf.nn.bias_add(tf.matmul(inp, w), biases)
在这里,我删除了偏见以排除偏见爆炸的原因,但无论是否存在偏见,都会发生这种情况。
在任何给定的运行中,无论该层的输入是什么,它的激活在最初的几次训练迭代中从大约 0 跳到大约 10 左右:
我无法弄清楚为什么输出在这个范围内,因为权重和输入非常小:
重量:
输入:
最后,我检查了损失相对于权重的梯度,在激活跳跃之前它们似乎也很正常。一旦激活增加,它们就会趋近于零,因为我使用并且对于非常大的输入,它的梯度很小。
本质上,我不确定(看似合理的输入)x(看似合理的权重)如何产生(疯狂的激活)。因为输出跳的太快了,我认为这将是一个设计缺陷,但是层本身是如此简单,以至于我看不到我缺少什么。任何帮助表示赞赏。



