使用 tf.data.Dataset.from_tensor_slices 和一个具有动态大小的 属性 创建 tensorflow

Create tensorflow with tf.data.Dataset.from_tensor_slices and one property with dynamic size

我有一个 pandas 数据框,它的列是“bbox”,其值为 [[94.0, 58.0, 469.0, 362.0]]。我想使用 tf.data.Dataset.from_tensor_slices 将此数据框转换为自定义数据集。 我希望 bbox 元素的形状为 (None,4) 但它是用形状 (1,4) tf.Tensor([[ 94. 58. 469. 362.]], shape=(1, 4), dtype=float32) 创建的,我不知道我做错了什么。

我的数据集是使用以下代码创建的:

myimages = pd.DataFrame.from_dict(train_data).to_dict("list")
myimages = tf.data.Dataset.from_tensor_slices(myimages)

提前感谢大家的宝贵时间

张量的形状是 (1, 4),因为数据框中的 bbox 列包含的元素是列表的列表,而不是单个列表。

要为每个标签获得 (4, ) 的形状,您可以修改数据框中 bbox 列中的元素,方法是索引每个 bbox 元素以获得第一个 bbox,并将其插入到像这样的数据框:

myimages["bbox"] = [bbox_element[0] for bbox_element in myimages["bbox"].values]

您可以只使用 tf.data.Dataset.maptf.squeeze 来去除多余的维度:

import tensorflow as tf
import pandas as pd

train_data = {'names': ['some_image.jpg', 'other_image.jpg'],
              'bbox': [[[94.0, 58.0, 469.0, 362.0]], [[94.0, 58.0, 469.0, 362.0]]]}
df = pd.DataFrame(train_data)
myimages = tf.data.Dataset.from_tensor_slices((df['names'].to_numpy(), df['bbox'].to_list()))
myimages = myimages.map(lambda x, y: (x, tf.squeeze(y, axis=0)))

for x, y in myimages:
  print(x, y)
tf.Tensor(b'some_image.jpg', shape=(), dtype=string) tf.Tensor([ 94.  58. 469. 362.], shape=(4,), dtype=float32)
tf.Tensor(b'other_image.jpg', shape=(), dtype=string) tf.Tensor([ 94.  58. 469. 362.], shape=(4,), dtype=float32)