Keras fit()与train_on_batch()的损失差异

时间:2019-04-05 23:15:38

标签: tensorflow keras

我计划训练具有多个数组的NN,而且我知道使用fit()是不可能的。因此,我尝试使用fit()重新创建train_on_batch()的工作(至少部分是暂时的)。训练了非常简单的Keras顺序模型后,在比较fit()和我自己的train_on_batch()循环时,我发现损耗的差异很大。 epochsbatch_size等于1,我认为这是最简单的测试用例。

在下面的示例中,ab是一个ndarray,包含来自rfft()的上一次运行的float32幅度数据。 labels是一个包含整数的ndarray,对于二进制分类,整数可以为0或1。

ab = np.load(absName)
ab2 = np.transpose(ab)
labels = np.load(labelName)

l = ab.shape[1]
fftSize = ab.shape[0]

assert l == len(labels)

print("ab.shape     =", ab.shape)
print("ab2.shape    =", ab2.shape)
print("labels.shape =", labels.shape)
print("l =", l)
print("fftSize =", fftSize)

model = Sequential()
model.add(Dense(1024, input_shape=(fftSize,)))
model.add(Activation("relu"))
model.add(Dense(1))
model.add(Activation("sigmoid"))
model.compile(
        optimizer="rmsprop",
        loss="binary_crossentropy",
        metrics=["accuracy"])

epochs = 1
batchSize = 1
useFit = True

if useFit:
    model.fit(ab2, labels, batch_size=batchSize, epochs=epochs, verbose=0)
else:
    for i in range(0, epochs):
        j = 0

        while (j + batchSize) < l:
            model.train_on_batch(ab2[j:j+batchSize], labels[j:j+batchSize])
            j += batchSize

        if j < l:
            model.train_on_batch(ab2[j:l], labels[j:l])

score = model.evaluate(ab2, labels, verbose=1)

for i in range(0, len(score)):
    print("score[" + model.metrics_names[i] + "] = " + str(score[i]))

所有情况下的打印输出:

ab.shape     = (513, 168)
ab2.shape    = (168, 513)
labels.shape = (168,)
l = 168
fftSize = 513

如果useFit为True,则打印的分数为:

score[loss] = 0.36022053304172696
score[acc] = 0.8809523809523809

如果useFit为False,则打印的分数为:

score[loss] = 0.49978475148479146
score[acc] = 0.8809523809523809

这是一个很大的损失差异。如果我尝试10个时期,每批次32个,它们都会造成〜35的损失。不过,我不确定这是一个可靠的实验,因为我了解到混叠发生在各个时期之间。

我给我的印象是我的自定义训练循环确实完成了fit()的工作(忽略了epochs=1的改组),但是我肯定缺少一些东西。有什么想法吗?

0 个答案:

没有答案