我使用CNN进行32x32bit图像的分类(6类)。
网络表现得非常奇怪,因为它需要900步才能完成与粘贴这些结果不同的任何操作。之后,经过几千步后,它开始移动到达合理的值。在Theano / Keras中使用相同数据完成的“相同网络”显示结果更快。我说“同一个网络”,因为Theano / Keras让我在变量(init =“orthogonal”)上定义leakyRELU和其他一些初始化方法,让我相信我的问题在于初始化。但我可能很远; - )
step -> 900
Minibatch loss at step 900: 1.440395
Minibatch accuracy: 43.0%
Validation accuracy: 35.5%
Val F-score: 0.0872979214781
confusion matrix
[[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[ 21 292 224 398 567 96]
[ 0 0 0 0 0 0]]
我的优化器是
tf.train.GradientDescentOptimizer(0.1).minimize(loss)
我的权重和偏差初始化是(仅显示6的第1层,但相同)
wc1 = tf.Variable(tf.truncated_normal([2, 2, 1, 16], stddev=0.05), name="weights_1")
bc1 = tf.Variable(tf.zeros([16]), name="bias_1")
任何人都可以暗示:
非常感谢 彼得
答案 0 :(得分:1)
只要你使用标准的Relu单位,将偏差初始化为0是一个坏主意,因为这些神经元很容易死亡。这意味着Relu进入一种状态,它为每个输入输出0,同时也具有0梯度。因此,它不再受过训练,并且通过始终输出0来影响下游神经元。我要尝试的第一件事是初始化更高的偏差。另一个选择是使用泄漏的relu模拟,例如elu,它在tensorflow中可用。
另外,混淆矩阵中的列和行是什么意思?基于该输出,它意味着每个示例都具有相同的标签(在这种情况下,您应该检查您的标签)或每个示例是由网络获得相同的预测(在这种情况下,您应该担心死亡的神经元) 。
您也可以尝试降低学习率;它可能太高,导致不稳定。最后,如果问题与初始化有关,则可以在900步之后获取输出并将其用作初始化。我只会在确定神经元死亡得到照顾后才会尝试。
答案 1 :(得分:0)
如果使用relu激活功能,请查看“ kaiming初始化”以了解您的体重。目的是在前进过程中的每一层之后,将输出的平均值保持为0,将标准偏差保持为1。
对于relu激活功能,您必须使用随机正态分布乘以2 /(给定层的输入数量)的平方根来初始化。
fork
对于CNN,我认为输入数将是过滤器数*内核中的单元数(对于[5,5]内核,则为5 * 5)