如何从需要加载和转换的文件名列表及其相应的标签创建张量流数据集

问题描述 投票:0回答:1

给定 npy 文件名列表

x
:

x = ['path/to/file1.npy', 'path/to/file2.npy']

和标签列表

y
:

y = [1, 0]

我想创建一个张量流

Dataset
,它由成对的标签以及 npy 文件中包含的加载和转换的 numpy 数组组成。

限制

  1. 必须加载每个 npy 文件,其中包含的 numpy 数组必须经过任意转换(与问题无关),然后该数组必须最终添加到
    Dataset
    及其相应的标签。
  2. 需要使用
    Dataset
    ,因为文件太大,无法一次加载到内存中。
  3. npy 文件并不全部包含在一个目录中。

现有答案以及它们如何与我的案例不匹配:

python tensorflow dataset
1个回答
0
投票

回答问题的评论,您需要一个

tf.py_function
包装器才能使用非 Tensorflow 函数。您不能直接在
.map
方法中使用非 TF 函数。 (大部分代码来自这个问题):

def load_files_py(train_filenames, width, height):
   image = np.load(train_filenames)
   image = skimage.transform.resize(array, (height, width))
   return image


def parse_function(image_filenames, labels):
    image = tf.py_function(load_files_py, inp=[image_filenames, width, height], Tout=[tf.float32])
    return image, label



dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(parse_function, num_parallel_calls=PARALLEL_CALLS)

您很可能是指

sklearn.transform.resize
。 sklearn.io.resize 不存在。如果您想保留通道数,则不要将其作为参数给出。
请注意,
num_parallel_calls
在这里可能没用,因为
tf.py_function
获取Python GIL(全局解释器锁),这会阻止多线程。

您可以关闭

sklearn.transform.resize
并使用
tf.image.resize
,或直接在模型中使用
tf.keras.layers.Resize
它们实际上是相同的

© www.soinside.com 2019 - 2024. All rights reserved.