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

发布于 2025-01-11 02:56:45 字数 448 浏览 1 评论 0原文

我有一个 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)

提前感谢大家的宝贵时间

I have a pandas dataframe and of its columns is "bbox" with value i.e. [[94.0, 58.0, 469.0, 362.0]]. I want to convert this dataframe to a custom dataset with tf.data.Dataset.from_tensor_slices.
I want the bbox element to have a shape of (None,4) but it is created with shape (1,4) tf.Tensor([[ 94. 58. 469. 362.]], shape=(1, 4), dtype=float32) and I don't know what I am doing wrong.

My dataset is created with this code:

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

Thanks everyone in advance for your time

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

天荒地未老 2025-01-18 02:56:46

您可以使用 tf.data.Dataset.map 和 tf.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)

You can just use tf.data.Dataset.map and tf.squeeze to get rid of the extra dimension:

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)
夏末的微笑 2025-01-18 02:56:46

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

要获得每个标签的 (4, ) 形状,您可以通过索引每个 bbox 元素来修改数据框中 bbox 列中的元素以获得第一个 bbox,并将其插入到数据框中,如下所示:

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

The shape of the tensor is (1, 4) since the bbox column in your dataframe contains elements that are a list of lists, not a single list.

To get a shape of (4, ) for each label, you can modify the elements in the bbox column in your dataframe by indexing each bbox element to obtain the first bbox, and inserting it into the dataframe like so:

myimages["bbox"] = [bbox_element[0] for bbox_element in myimages["bbox"].values]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文