我计划训练具有多个数组的NN,而且我知道使用fit()
是不可能的。因此,我尝试使用fit()
重新创建train_on_batch()
的工作(至少部分是暂时的)。训练了非常简单的Keras顺序模型后,在比较fit()
和我自己的train_on_batch()
循环时,我发现损耗的差异很大。 epochs
和batch_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
的改组),但是我肯定缺少一些东西。有什么想法吗?