将 Tensorflow 数据集转换为包含图像和标签的 2 个数组

Convert Tensorflow Dataset into 2 arrays containing images and labels

我正在使用 TensorFlow 2.0,我有一个批处理数据集,其中包含 968 张图像和每个图像的标签(4 元素数组):

dataSetSize = allDataSet.reduce(0, lambda x, _: x + 1).numpy()
allDataSet = allDataSet.shuffle(dataSetSize)
allDataSet = allDataSet.map(processPath, num_parallel_calls=tf.data.experimental.AUTOTUNE)
allDataSet = allDataSet.batch(10)
predictions = loadedModel.predict(allDataSet)

onlyImages = # how to create this?
onlyLabels = # how to create this?

# the 'map' function in my dataset returns a batch of images and their corresponding labels
for idx, (imageBatch, labelBatch) in enumerate(allDataSet) :
    # how to concatenate batches together?
    onlyImages = # ?
    onlyLabels = # ?

我需要将这个数据集分成两个 numpy 数组。第一个数组应仅包含 968 个图像(形状:(968, 299, 299, 3)),第二个数组应包含 968 个标签(形状:(968, 4))。我该怎么做?

我检查了一个类似的问题 但这些示例似乎使用的是 Tensorflow 1.x 并且包含不同的输入类型?

数据集的大小和类型:

dataset size:  968
<DatasetV1Adapter shapes: ((None, 299, 299, 3), (None, 4)), types: (tf.float32, tf.float32)

如果我很好地理解您的问题,您现在需要做的是在遍历数据集时连接到 numpy 数组。请注意,在迭代期间,如果您应用 .numpy() 操作,您会自动从 tf.tensor 转换为 np.array

因此,您可以选择以下选项:

  1. 根据文档,

      a = np.array([[1, 2], [3, 4]])
      b = np.array([[5, 6]])
      np.concatenate((a, b), axis=0)
    

    输出为:

    array([[1, 2],
           [3, 4],
           [5, 6]])
    

    所以,在你的代码中,定义一个初始的空 numpy 数组,你 在 axis=0 上连接(使用 imageBatch 和 labelBatch)。

  2. 或者您可以使用 np.vstacknp.concatenate 在后台使用 np.vstack),结果相同。