Окончательное решение:
Импорт из правильного места:
from tensorflow.keras.utils import Sequence
Старые ответы:
Если __getitem__
никогда не вызывал, проблема может быть в __len__
. Вы не возвращаете int
, вы возвращаете np.int
.
Я предлагаю вам попробовать:
def __len__(self):
length = len(self.filenames) // self.batch_size
if len(self.filenames) % self.batch_size > 0:
length += 1
return length
Но если вызывается __getitem__
и ваши данные вернувшись, вы должны проверить свои массивы.
Получить элемент из генератора самостоятельно и проверить содержимое:
x, y = train_generator[0]
- Являются ли они отдельными массивами? Или это массивы массивов? (Должен быть один)
- Каковы их формы? У них есть ожидаемые формы?
- Какие у них типы? Обычно они должны быть
float
, иногда int
(для входных данных для встраивания слоев), очень редко string
(для входных данных в пользовательские слои, которые знают, как обрабатывать строки). - Выходные данные всегда должны быть
float
, максимум int
(для разреженных потерь)
Другие предположения, которые вы используете fit
с batch_size
при использовании генератора .... это странно, и предложения "если" внутри метода могут быть не очень хорошо подготовлены, возможно, вы попадаете в другой обучающий случай.
Go прямо к обычным опциям:
self.model_semantic.fit_generator(train_generator,
epochs=10,
verbose=1,
validation_data=val_generator)
Ваш генератор Sequence
, он уже имеет __len__
, вам не нужно указывать steps_per_epoch
или validation_steps
.
Каждый генератор имеет автоматические c размеры партии, каждый шаг - партия, и все. Вам не нужно указывать batch_size
в fit_generator
.
Если вы собираетесь использовать fit
, go следующим образом:
...fit(train_generator, steps_per_epoch = len(train_generator),
epochs = 10, verbose = 1,
validation_data = val_generator, validation_steps = len(val_generator))
Наконец, вы должны охотиться за всем, что может быть None
( как подсказывает сообщение об ошибке) в вашем коде.
- Проверьте, имеет ли каждая функция строку
return
. - Проверьте все входы вашего генератора в
__init__
. - Печать имен файлов внутри генератора.
- Получите
__len__
генератора. - Попробуйте получить предмет из генератора:
x, y= train_generator[0]