张量流评估和提前停止给出无限溢出错误

tensorflow evalutaion and earlystopping gives infinity overflow error

我在下面的代码中看到了一个模型,但是当尝试对其进行评估或对其使用提前停止时,它会出现以下错误:

    numdigits = int(np.log10(self.target)) + 1
OverflowError: cannot convert float infinity to integer

我必须声明,不使用 .EarlyStoppingmodel.evaluate 一切正常。

我知道 np.log10(0) 给出 -inf 所以这可能是一个潜在的原因,但为什么首先会有 0 并且如何预防?如何解决这个问题?

注意事项

这是我使用的代码:

import tensorflow as tf
from tensorflow import keras

TRAIN_PERCENT = 0.9

model = keras.Sequential([
    keras.layers.Dense(128, input_shape=(100,), activation='relu'),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(100)
])

earlystop_callback = keras.callbacks.EarlyStopping(min_delta=0.0001, patience=1
                                                   , monitor='accuracy'
                                                   )

optimizer = keras.optimizers.Adam(lr=0.01)
model.compile(optimizer=optimizer, loss="mse", metrics=['accuracy'])

X_set, Y_set = some_get_data_function()
sep = int(len(X_set)/TRAIN_PERCENT)
X_train, Y_train = X_set[:sep], Y_set[:sep]
X_test, Y_test = X_set[sep:], Y_set[sep:]

model.fit(X_train, Y_train, batch_size=16, epochs=5, callbacks=[earlystop_callback])
ev = model.evaluate(X_test, Y_test)
print(ev)

X,Y 集合是 np 数组。 X 是 010 之间的 100 个整数数组的数组。 Y 是一个由 100 个整数组成的数组,它们都是 01.

好吧,很难说清楚,因为我不能 运行 没有 some_get_data_function() 实现的代码,但最近我在 错误地传递了 EMPTY 数组 [=15] 时遇到了同样的错误=] 到 model.evaluate。考虑到@meTchaikovsky 的评论解决了您的问题,这肯定是由于输入数组混乱造成的。

在我的例子中,数据很小——所以做类似

的事情
cached_train = train.shuffle(100_000).batch(8192).cache()
cached_test = test.batch(4096).cache()

会导致空 cached_test !这不影响 model.fit

所以请始终使用 cached_test.__len__() 检查数据的长度,以确保您没有将空数据传递给函数。