оценка tensorflow и ранняя остановка дают ошибку бесконечного переполнения

#python #numpy #tensorflow #keras #overflow

#python #numpy #tensorflow #keras #переполнение

Вопрос:

Я использую модель, как показано в приведенном ниже коде, но при попытке оценить ее или использовать для нее earlystopping, она выдает следующую ошибку:

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

Я должен заявить, что без использования .EarlyStopping or model.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 — это массив массивов из 100 целых чисел между 0 и 10 . Y — это массив массивов из 100 целых чисел, все они являются либо 0 или 1 .

Комментарии:

1. sep должно быть int(len(X_set)*TRAIN_PERCENT)

2. @meTchaikovsky Это неожиданно, похоже, решает проблему. Спасибо, но почему это вызвало это в первую очередь?

Ответ №1:

Ну, трудно точно сказать, поскольку я не могу запускать код без some_get_data_function() реализации, но недавно я получил ту же ошибку, когда ошибочно передал ПУСТОЙ массив model.evaluate . Принимая во внимание, что комментарий @meTchaikovsky решил вашу проблему, это, безусловно, связано с перепутанными входными массивами.

Комментарии:

1. 1 потому что иногда вы пытаетесь делать такие вещи, как использовать 95% ваших данных для обучения, 10% для проверки, и удивляетесь, почему это не удается при попытке протестировать остальные данные…

Ответ №2:

в моем случае данные были небольшими, поэтому делать что-то вроде

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

это привело бы к пустому cached_test ! это не влияет model.fit

поэтому всегда проверяйте длину используемых данных cached_test.__len__() , чтобы убедиться, что вы не передаете пустые данные в функцию.