#python #keras #training-data #batchsize
#python #keras #обучение-данные #размер пакета
Вопрос:
Я пытаюсь переопределить keras.util.Sequence
своим классом SequenceGenerator(Sequence)
и передать его fit_generator
, но fit_generator
выдал ошибку ValueError
Вот мой пользовательский класс
импортируйте os, импортируйте numpy как np из keras.utils, импортируйте последовательность из batchGenerator, импортируйте BatchGenerator
из настроек импортируйте batch_size, train_folder, test_folder
class SequenceGenerator(Sequence):
def __init__(self, batches_folder):
self.batch_generator = BatchGenerator(folder_name=batches_folder)
self.names = [f for f in os.listdir(batches_folder) if f.lower().endswith('.jpg')]
def __len__(self):
return int(np.ceil(len(self.names) / float(batch_size)))
def __getitem__(self, idx):
print('Getting a bacth{0}'.format(idx))
[X_batch, Y_batch] = self.batch_generator.load_batch_from_disk(idx)
return X_batch, Y_batch
def train_seq_genenrator():
return SequenceGenerator(train_folder)
def test_seq_generator():
return SequenceGenerator(test_folder)
и в jupyter notebook я импортировал следующее
from sequenceGenerator import train_seq_genenrator, test_seq_generator
наконец, вот и вызов fit_generator
history = new_model.fit_generator(train_seq_genenrator()
, steps_per_epoch=num_train_samples // batch_size
, validation_data=test_seq_generator()
, validation_steps=num_test_samples // batch_size
, epochs=epochs
, shuffle=True)
Я получил следующую ошибку:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-63-347bef86c8c0> in <module>()
4 , validation_steps=num_test_samples // batch_size
5 , epochs=epochs
----> 6 , shuffle=True)
~Anaconda3envstensorflowlibsite-packagestensorflowpythonkerasenginetraining.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
1759 use_multiprocessing=use_multiprocessing,
1760 shuffle=shuffle,
-> 1761 initial_epoch=initial_epoch)
1762
1763 def evaluate_generator(self,
~Anaconda3envstensorflowlibsite-packagestensorflowpythonkerasenginetraining_generator.py in fit_generator(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
121 '`validation_data` should be a tuple '
122 '`(val_x, val_y, val_sample_weight)` '
--> 123 'or `(val_x, val_y)`. Found: ' str(validation_data))
124 val_x, val_y, val_sample_weights = model._standardize_user_data(
125 val_x, val_y, val_sample_weight)
ValueError: `validation_data` should be a tuple `(val_x, val_y, val_sample_weight)` or `(val_x, val_y)`. Found: <sequenceGenerator.SequenceGenerator object at 0x000001DCB58259B0>
Я не знаю, почему это происходит, однако это найдено в https://keras.io/models/sequential /
validation_data: Это может быть либо
- генератор или объект последовательности для проверки данных
- кортеж (x_val, y_val)
- кортеж (x_val, y_val, val_sample_weights)
Комментарии:
1. Какая у вас версия keras?
2. Я бы также попробовал создать экземпляр объекта sequence generator при передаче его в fit_generator(); вместо того, чтобы вызывать его как функцию, которая возвращает sequence generator
3. версия keras 2.2.0 Я попытался создать экземпляр генератора последовательностей при вызове fit_generator, он выдал ту же ошибку.