标题可能过于具体,这也可能适用于其他费用函数。基本上我有如下的虚拟设置(在我的情况下,我有一个非常不同的架构,但问题总是被复制):
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高估:
我应该说这似乎是后端不可知的,影响theano和tensorflow。
从这种行为来看,这似乎是一个精确的问题。你知道是否有办法减轻这种影响,对于我的真实模型,成本函数与numpy答案的差异始终是5-10%
答案 0 :(得分:0)
两个成本函数之间存在正则化项差异,这在评估绩效时可能无用