我无法使用使用pandas Dataframes作为参数的生成器来创建Dataset.from_generator()

时间:2019-06-14 12:29:28

标签: python tensorflow machine-learning tensorflow-datasets

我想从一个生成器创建一个数据帧管道,该生成器使用pandas数据帧在磁盘上查找图像路径并将它们加载到管道中。 Tensorflow不允许我这样做,弹出一条Can't convert non-rectangular Python sequence to Tensor.消息。

在将生成器传递给.values时,我尝试在args参数中使用tf.data.Dataset.from_generator,但是我必须重写所有使用数据帧编写的代码,以找到到正确的图像。

以下是生成数据集的命令:

train_dataset = tf.data.Dataset.from_generator(make_triplet_dataset, (tf.float32, tf.float32, tf.float32), args = ([train_families, train_positive_relations]))

这是make_triplet_dataset生成器(它使用pandas数据帧作为参数):

`def make_triplet_dataset(families,positive_relations):     '''     数据集生成器,每次调用时都会返回随机锚点,正图像和负图像     '''     而True:

    # generates random triplet
    anchor, positive, negative = make_triplet(families, positive_relations)

    # builds the path for the randomly chosen images
    path_anchor_img = 'train/' + anchor + '/' + random.choice(os.listdir('train/' + anchor))
    path_positive_img = 'train/' + positive + '/' + random.choice(os.listdir('train/' + positive))
    path_negative_img = 'train/' + negative + '/' + random.choice(os.listdir('train/' + negative))

    # loads and preprocess the images to be used in the in the algorithm 
    anchor_img = preprocess_input(cv2.imread(path_anchor_img)) # preprocess does a (img/127.5) - 1 operation
    positive_img = preprocess_input(cv2.imread(path_positive_img))
    negative_img = preprocess_input(cv2.imread(path_negative_img))

    yield (anchor_img, positive_img, negative_img)`

函数make_triplet是一个嵌套函数,它使用pandas Dataframe生成图像的路径。 我希望能够使用生成器生成一个tensorflow数据集,该生成器可以生成三胞胎图像,使用pandas数据帧查找这些图像的路径并将其加载到管道中。请,如果有人可以提供帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

找到了答案。我没有在args方法的tf.data.Dataset.from_generator参数中传递生成器函数的pandas dataframes参数,而是使用lambda在生成器函数本身中传递了它们:

train_dataset = tf.data.Dataset.from_generator(lambda: make_triplet_dataset(train_families, train_positive_relations), output_types = (tf.float32, tf.float32, tf.float32))