首页 > 解决方案 > “ValueError:如果您的数据是 Python 生成器的形式,则不能使用 `validation_split`。” 在 TensorFlow Keras 中

问题描述

我正在按照这个示例在我自己的类别上训练模型,并在 model.fit() 中使用 validation_split 来查看验证准确性。这是代码:

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`.

我无法找到此错误的解决方案。如何在不从单独的目录加载验证数据的情况下查看验证分数?我希望我的原始训练数据被吐出以进行验证。是否可以?还有哪些其他选择?

更新遵循 KRUXX 的解决方案后,我在运行第一个 epoch 后收到此错误,它指向 model.fit 行

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

标签: pythontensorflowkeras

解决方案


当您遵循示例时。您可以在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')

推荐阅读