【发布时间】:2021-07-25 10:55:36
【问题描述】:
我有一个张量数据集,它是一个文件名列表和一个 Pandas 数据框,其中包含每个文件的元数据。
filename_ds = tf.data.Dataset.list_files(path + "/*.bmp")
metadata_df = pandas.read_csv(path + "/metadata.csv")
文件名包含一个 idx,它引用元数据数据帧中的一行,例如“3_data.bmp”,其中 3 是 idx。我希望打电话给filename_ds.map(combine_data)。
这似乎不像解析文件名和进行数据框查找那么简单。以下失败是因为filename 是张量,并且由于我在Dataset.map() 调用上运行它,所以我无法访问tf.executing_eagerly() 之类的.numpy() 方法,并且无法从文件名中获取字符串值来执行我的正则表达式和 df 查找。
combine_data(filename)
idx = re.findall("(\d+)_data.bmp", filename)[0]
val = metadata_df.loc[metadata_df["idx"] == idx]["test-col"]
...
Tensorflow 新手,我怀疑我会以一种奇怪的方式处理这个问题。解决这个问题的正确方法是什么?我可以列出我的文件并为每个文件连接一个数据集,但我想知道我是否只是缺少这样做的“Tensorflow 方式”。
【问题讨论】:
-
您可以使用
as_numpy_iterator()循环播放,但不确定您是否有限制。像这样的东西可以工作。dataset_list=list(filename_ds.as_numpy_iterator()) for each_file in dataset_list: file_name=each_file.decode('utf-8') # this will contain the abs path /user/me/so/file_1.png try: idx=re.findall("(\d+).*.png", file_name)[0] # changed for my case except : print("Exception==>") print(f"File:{file_name},idx:{idx}")
标签: python pandas tensorflow