Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按id筛选Tensorflow数据集_Python_Tensorflow - Fatal编程技术网

Python 按id筛选Tensorflow数据集

Python 按id筛选Tensorflow数据集,python,tensorflow,Python,Tensorflow,发行 我正在尝试基于一个numpy数组过滤一个Tensorflow 2.4数据集,该数组包含我想要子集的索引。该数据集有1000张形状为28,28,1的图像 玩具示例代码 错误消息 迄今为止的研究 我发现了,但它们是特定于它们的用例的,而我正在寻找一种更通用的子集方法,即基于外部派生的索引数组 我对张量流数据集很陌生,到目前为止,我发现学习曲线相当陡峭。希望能得到一些帮助。提前谢谢 TL;博士 建议使用下面定义的选项C 完整答案 创建tf.data.Dataset对象时,不必将所有对象加载到内存

发行

我正在尝试基于一个numpy数组过滤一个Tensorflow 2.4数据集,该数组包含我想要子集的索引。该数据集有1000张形状为28,28,1的图像

玩具示例代码

错误消息

迄今为止的研究

我发现了,但它们是特定于它们的用例的,而我正在寻找一种更通用的子集方法,即基于外部派生的索引数组

我对张量流数据集很陌生,到目前为止,我发现学习曲线相当陡峭。希望能得到一些帮助。提前谢谢

TL;博士 建议使用下面定义的选项C

完整答案 创建tf.data.Dataset对象时,不必将所有对象加载到内存中。因此,默认情况下,使用tf.gather将不起作用。您可以选择三个选项:

选项A:将ds加载到内存+tf.gather中 如果要使用“聚集”,则必须将整个数据集加载到内存中,并选择一个子集:

m_X_ds=列表m_X_ds加载到内存中。 m_X_ds=tf.gatherm_X_ds,arr像往常一样聚集。 printm_X_ds 示例结果: 请注意,这并不总是可能的,尤其是对于大型数据集

选项B:迭代数据集,并过滤不需要的样本 您还可以迭代数据集并手动选择具有所需索引的样本。这可以通过和的组合实现

m_X_ds=m_X_ds。枚举数据集中的创建索引、值对。 创建过滤器功能: def过滤器_fnidx,值: 返回arr中的idx 以上内容在图形模式下不起作用 我们正在用py_函数包装它,以便急切地执行它 def py_函数过滤器IDX,值: 返回tf.py\u函数filter\u fn,idx,value,tf.bool 按常规筛选数据集: 过滤的\u ds=m\u X\u ds.filterpy\u函数\u过滤器 选项C:将选项B与tf.lookup.StaticHashTable组合 选项B是好的,除了在转换图张量->渴望张量->图张量时,您可以期望性能受到影响。tf.py_函数很有用,但要付出代价

相反,我们可以声明一个字典,其中所需的索引将返回true,而不存在的索引将返回false。这张纸可能是这样的

my_table={3:True,4:True,5:True}。 我们不能使用张量作为字典键,但我们可以声明一个,让我们检查好的索引

m_X_ds=m_X_ds.enumerate如果在选项B中执行,请不要重复此操作。 基斯张量=tf.constantarr VAL_tensor=tf.ones_likekeys_tensor将强制转换为True。 table=tf.lookup.StaticHashTable tf.lookup.KeyValueTensorInitializerkeys\u tensor、vals\u tensor、, 默认值=0如果索引不在表中,则返回0。 def哈希表过滤器索引,值: table_value=table.lookupindex 1如果索引位于arr中,则为0。 索引=tf.castable\u值,tf.bool 1->True,0->False 返回索引 过滤的\u ds=m\u X\u ds.filterhash\u表\u过滤器 不管选择B或C,剩下的就是从fileterd数据集中删除索引。我们可以使用带有lambda函数的简单映射:

final_ds=filtered_ds.maplambda idx,值:value 参加期末考试: 打印条目 tf.Tensor7,shape=,dtype=int32 tf.Tensor13,shape=,dtype=int32 tf.Tensor6,shape=,dtype=int32
祝你好运。

谢谢你清晰详细的解释!我希望TF文档能够简单明了。还有一件事:对于选项B,您能告诉我如何在没有每个元组中的所有第一个元素ID的情况下获取数据集吗?我打算使用过滤后的数据集进行培训。为了澄清我之前的评论,生成的数据集应该只包含过滤后的3个形状为28,28,1的张量。谢谢你的好话。我编辑了我的答案,包括删除索引,以及问题的第三个解决方案。祝你一切顺利!您好@sebastian sz,很抱歉再次打扰您,但当我尝试实现选项C时,行filtered_ds=m_X_ds.filterhash_table_filter给出了一个错误:ValueError:“predicate”返回类型必须转换为标量布尔张量。这是一个非紧张的时刻。即使使用我的玩具示例代码+选项C也不起作用。你能帮忙吗?如果有关系的话,我用的是TFV2.4
m_X_ds = tf.data.Dataset.from_tensor_slices(list(range(1, 21))).shuffle(10, reshuffle_each_iteration=False)
arr = np.array([3, 4, 5])
m_X_ds = tf.gather(m_X_ds, arr)  # This is the offending code
ValueError: Attempt to convert a value (<ShuffleDataset shapes: (), types: tf.int32>) with an unsupported type (<class 'tensorflow.python.data.ops.dataset_ops.ShuffleDataset'>) to a Tensor.