4

我正在按照教程使用 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: Expect x to be a non-empty array or dataset。

在此处输入图像描述

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

4

3 回答 3

16

此错误是由训练数据的大小小于batch_size不允许的大小引起的。

默认的batch_size为32,即训练图像的数量应不少于32。无需计算每个标签的图像数量,只需确保总训练图像至少为32。

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

  • 设置batch_size小于训练数据大小,例如:
image_classifier.create(train_data, batch_size=4)
  • 通过添加更多数据来增加训练数据的大小。
于 2020-08-06T02:17:25.433 回答
5

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

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

于 2020-08-04T18:51:35.933 回答
1

有同样的错误:

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'))  

选择 = 亚当(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、回调=回调)

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

于 2021-03-12T05:20:59.780 回答