【问题标题】:ValueError: Expect x to be a non-empty array or dataset (Tensor Flow lite model maker on Collab)ValueError: Expect x to be an non-empty array or dataset (Tensor Flow lite model maker on Collab)
【发布时间】:2020-11-23 15:50:44
【问题描述】:

我正在关注this 关于在 Collab 上使用 TensorFlow lite Model Maker 创建自定义模型的教程。

import pathlib
path = pathlib.Path('/content/employee_pics') 
count = len(list(path.glob('*/*.jpg')))
count

data = ImageClassifierDataLoader.from_folder(path)
train_data, test_data = data.split(0.5)

我对第 2 步有疑问:

model = image_classifier.create(train_data)

我收到一个错误: ValueError: 期望 x 为非空数组或数据集。

我做错了吗?示例中提供的数据集工作正常。为什么?

【问题讨论】:

  • 可以加len(train_data) & len(test_data)吗?
  • @AdityaMishra 我收到以下错误:TypeError: 'ImageClassifierDataLoader' 类型的对象没有 len()
  • @AdityaMishra train_data.size 和 test_data.size 各返回 7

标签: tensorflow keras tf.keras tensorflow-lite google-mlkit


【解决方案1】:

我刚刚做了一些手动测试。 不完全知道为什么,但是对于这个二元分类器,当我增加数据量以确保每个标签至少有 16 个图像用于训练时,它就开始工作了。

对于您的情况,由于您将训练/测试拆分为 0.5 倍,因此每个标签需要 32 张图像。如果能解决您的问题,您可以试试吗?

【讨论】:

    【解决方案2】:

    这个错误是由于训练数据的大小小于batch_size,这是不允许的。

    默认batch_size为32,即训练图片数量不少于32张。无需统计每个标签的图片数量,只需要保证总训练图片不少于32张.

    您需要选择以下解决方案之一来解决它。

    • 设置batch_size小于训练数据大小,例如:
    image_classifier.create(train_data, batch_size=4)
    
    • 通过添加更多数据来增加训练数据的大小。

    【讨论】:

      【解决方案3】:

      有同样的错误:

      File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py", line 1110, in fit
          raise ValueError('Expect x to be a non-empty array or dataset.')
      ValueError: Expect x to be a non-empty array or dataset.
      

      首先尝试减小批量大小。如果批量大小大于训练数据集,则不创建输入数据集,因此保持为空。但我的不是这样。

      然后我尝试查看我的数据集在哪里变为空。我的第一个时代运行良好,但不是另一个。似乎我的数据集在批处理过程中进行了转换。

      classes = len(y.unique())
      model = Sequential()
      model.add(Dense(10, activation='relu', 
      activity_regularizer=tf.keras.regularizers.l1(0.00001)))
      model.add(Dense(classes, activation='softmax', name='y_pred'))
      opt = Adam(lr=0.0005, beta_1=0.9, beta_2=0.999)
      
      BATCH_SIZE = 12
      train_dataset, validation_dataset =set_batch_size(BATCH_SIZE,train_dataset,validation_dataset)
      model.compile(loss='categorical_crossentropy', optimizer=opt, metrics['accuracy'])
      model.fit(_train_dataset, epochs=10,validation_data=_validation_dataset,verbose=2, callbacks=callbacks)
      

      这种情况的解决方案: 更新了训练和验证数据集的冗余更新,同时通过赋予不同的名称将其分批。

      之前:

      train_dataset, validation_dataset = set_batch_size(BATCH_SIZE, train_dataset, validation_dataset)
      

      之后:

      _train_dataset, _validation_dataset = set_batch_size(BATCH_SIZE, train_dataset, validation_dataset)
      
      
      
      
      classes = len(y.unique())   
      model = Sequential()
      model.add(Dense(10, activation='relu',activity_regularizer=tf.keras.regularizers.l1(0.00001)))
      model.add(Dense(classes, activation='softmax', name='y_pred'))  
      

      opt = Adam(lr=0.0005, beta_1=0.9, beta_2=0.999)

      BATCH_SIZE = 12
      

      _train_dataset, _validation_dataset = set_batch_size(BATCH_SIZE, train_dataset, validation_dataset) model.compile(loss='categorical_crossentropy',优化器=opt,metrics=['accuracy'])
      model.fit(_train_dataset, epochs=10, validation_data=_validation_dataset, verbose=2, callbacks=callbacks)

      有用的链接:https://code.ihub.org.cn/projects/124/repository/commit_diff?changeset=1fb8f4988d69237879aac4d9e3f268f837dc0221

      【讨论】:

      • 我遇到了同样的错误,因为我使用一个小数据集进行快速错误检查。这篇评论对我帮助很大,谢谢。
      猜你喜欢
      • 2020-11-24
      • 1970-01-01
      • 2021-12-19
      • 2022-12-26
      • 2022-12-01
      • 2020-11-02
      • 2022-12-26
      • 2018-11-01
      • 1970-01-01
      相关资源
      最近更新 更多