«ValueError: Если ваши данные в форме генератора Python, вы не можете использовать` validation_split`. " в Тензорфул Керас - PullRequest
0 голосов
/ 13 мая 2019

Я следую этому примеру , чтобы обучить модель своим собственным категориям, и использую validation_split в model.fit (), чтобы увидеть точность проверки. Вот код:

model.fit((item for item in image_data), epochs=30, 
                steps_per_epoch=steps_per_epoch,callbacks = [batch_stats], validation_split=0.33)    

При этом я получаю следующую ошибку

Traceback (most recent call last):
  File "C:\Users\admin\Desktop\phd python projects\tensorflow_img_class\src\tensorflow_img_class.py", line 65, in <module>
    steps_per_epoch=steps_per_epoch,callbacks = [batch_stats], validation_split=0.33)    
  File "C:\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", line 758, in fit
    y, sample_weight, validation_split=validation_split)
  File "C:\Python37\lib\site-packages\tensorflow\python\keras\engine\training_utils.py", line 955, in check_generator_arguments
    raise ValueError('If your data is in the form of a Python generator, '
ValueError: If your data is in the form of a Python generator, you cannot use `validation_split`.

Я не могу найти решение этой ошибки. Как я могу увидеть результаты проверки без загрузки данных проверки из отдельного каталога? Я хочу, чтобы мои исходные данные тренировок были указаны для проверки. Является ли это возможным? Какие есть другие варианты?

UPDATE Следуя решению от KRUXX, я получаю эту ошибку после того, как она запускается для первой эпохи, которая указывает на строку model.fit

ValueError: Error when checking input: expected lambda_input to have shape (224, 224, 3) but got array with shape (256, 256, 3)

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Как вы следовали этому примеру.Вы можете попытаться разделить данные при инициализации ImageDataGenerator, например,

image_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255, validation_split=0.33)

image_data_train = image_generator.flow_from_directory(str(data_root),subset='training')
image_data_val = image_generator.flow_from_directory(str(data_root),subset='validation')

Здесь subset используется для указания генератора обучения и проверки.И вы можете использовать параметр validation_data для передачи проверочных изображений в model.fit.

model.fit((item for item in image_data_train), 
          epochs=1, 
          steps_per_epoch=steps_per_epoch,
          callbacks = [batch_stats], 
          validation_data = (item for item in image_data_val), 
          validation_steps =image_data_val.samples/image_data_val.batch_size )

Обновление

Вам необходимо использовать flow_from_directory в соответствии сваши требования.Пожалуйста, прочитайте документацию .

image_data_train = image_generator.flow_from_directory(str(data_root), target_size=(224,224),subset='training')
image_data_val = image_generator.flow_from_directory(str(data_root), target_size=(224,224),subset='validation')
0 голосов
/ 13 мая 2019

Метод keras.fit имеет следующую подпись:

fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_freq=1)

, где

x = Numpy массив обучающих данных (если модель имеет один вход), илисписок массивов Numpy (если модель имеет несколько входов)

Вы не можете использовать генератор для разделения данных, так как генератор не загружает все результаты в память.

Пример:

x = (i for i in range(int(10e10)))

x теперь является generator object, и его значение может быть принято с помощью next, или итератор может быть сгенерирован с помощью iter.x теперь не хранит в памяти все целые числа от 0 до 10 ^ 10.Это называется Ленивая оценка .Поскольку x не является списком как таковым, вы не можете использовать validation_data.Решением этого может быть:

model.fit(np.array([item for item in image_data]), epochs=30, 
            steps_per_epoch = steps_per_epoch, callbacks = [batch_stats], validation_split = 0.33) 

Кроме того, 33% для проверки может быть слишком много.Я обычно беру 10-15%, поэтому пробую что-то между 10 - 25% в зависимости от вашего набора данных и / или вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...