【发布时间】:2020-07-23 08:12:08
【问题描述】:
出于教育目的,我创建深度学习库已有一段时间了。前几天接到一个任务 实习生职位使用 numpy 从头开始创建模型,该模型会将 MNIST 数据集子集的数字分类为 2 类(0 - 奇数,1 - 素数)。一切都很顺利,直到 现在是创建损失函数的时候了。因为它是一个 二元分类问题,我选择了二元交叉熵。 有一个实现:
def loss(self, target: np.ndarray, predicted: np.ndarray, epsilon=1e-7) -> np.ndarray:
predicted = np.clip(predicted, epsilon, 1 - epsilon)
predicted = np.log(predicted / (1 - predicted))
return (target * -np.log(self.sigmoid(predicted)) +
(1 - target) * -np.log(1 - self.sigmoid(predicted)))
基本上它与 keras 用于 numpy 后端的功能几乎相同。批量损失函数的输出 16号如下:
[[1.61180957e+01]
[1.00000005e-07]
[1.00000005e-07]
[1.61180957e+01]
[1.00000005e-07]
[1.61180957e+01]
[1.61180957e+01]
[1.00000005e-07]
[1.61180957e+01]
[1.61180957e+01]
[1.00000005e-07]
[1.61180957e+01]
[1.61180957e+01]
[1.00000005e-07]
[1.61180957e+01]
[1.00000005e-07]]
我非常怀疑它们不应该是这样的。 也许这是我们必须重构的数据集的问题 我们自己。为了澄清典型样本只是一个 28x28 像素值矩阵,标签只是一个数字 0 或 1。 当我尝试总结整个时期的损失并将其保存到 Keras 历史对象之类的东西时,就会出现下一个问题。 我是否应该总结每批迭代的损失,然后 将其除以采样数(这对我来说听起来不对)还是必须正确计算 epoch loss?
提前感谢您的帮助,并保持安全和健康!
【问题讨论】:
标签: numpy deep-learning mnist loss cross-entropy