我想从一个生成器创建一个数据帧管道,该生成器使用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数据帧查找这些图像的路径并将其加载到管道中。请,如果有人可以提供帮助,将不胜感激。
答案 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))