Keras binary_crossentropy成本函数与大型网络的系统误差

时间:2017-08-04 13:54:36

标签: python tensorflow keras theano

标题可能过于具体,这也可能适用于其他费用函数。基本上我有如下的虚拟设置(在我的情况下,我有一个非常不同的架构,但问题总是被复制):

hidden_units=10000

l2_sparsity = 5e-7
l1_sparsity = 1e-8
mod=Sequential([Dense(hidden_units, input_shape = (1000,), activation="relu",  kernel_regularizer=l1_l2(l1=l1_sparsity, l2=l2_sparsity),
                    ),
                Dense(hidden_units, activation="relu",  kernel_regularizer=l1_l2(l1=l1_sparsity, l2=l2_sparsity),
                    ),
                Dense(1000, activation="sigmoid",
                        )
    ])
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0)
mod.compile(loss='binary_crossentropy', optimizer=adam, metrics=['binary_accuracy'])



x = np.array([np.array([random.random() for i in range(1000)], dtype=np.float64) for i in range(10)])
classes = (x + 0.5).astype(np.uint32)

def replica_cross_entropy_loss(predictions, truth):
    eps=10e-8

    predictions = np.clip(predictions, eps, 1.0-eps)
    x = np.log(1.0 *predictions / (1.0 - predictions) )

    return np.mean(np.clip(x, 0, None) - x * truth + np.log(1 + np.exp(-abs(x))))

mod.fit(x[:2],classes[:2], batch_size=128, epochs=1)



preds = mod.predict(x[:2])
print replica_cross_entropy_loss(preds,classes[:2])
print mod.test_on_batch(x[:2],classes[:2])[0]
print 100*(mod.test_on_batch(x[:2],classes[:2])[0] / 
replica_cross_entropy_loss(preds,classes[:2]) - 1)

我在这里做的是将内置的keras损失与使用numpy的(我相信)忠实重建进行比较。现在,尝试使用mlp架构中的隐藏单元可以产生一些有趣的结果。具体做法是:

  

keras成本函数系统地高于numpy   相当于,与神经元数量有关的差异   隐藏层。

作为一个例子,这里有一个简单的图表,描绘了这个mlp的隐藏层中的神经元数量与keras成本函数的pct高估:

enter image description here

我应该说这似乎是后端不可知的,影响theano和tensorflow。

从这种行为来看,这似乎是一个精确的问题。你知道是否有办法减轻这种影响,对于我的真实模型,成本函数与numpy答案的差异始终是5-10%

1 个答案:

答案 0 :(得分:0)

两个成本函数之间存在正则化项差异,这在评估绩效时可能无用