tensorflow 是否可以将NumPy函数Map到tf.data.dataset?

e4eetjau  于 2023-02-24  发布在  其他
关注(0)|答案(2)|浏览(138)

我有下面的简单代码:

import tensorflow as tf
import numpy as np

filename = # a list of wav filenames   
x = tf.placeholder(tf.string)

def mfcc(x):
    feature = # some function written in NumPy to convert a wav file to MFCC features
    return feature

mfcc_fn = lambda x: mfcc(x)

# create a training dataset
train_dataset = tf.data.Dataset.from_tensor_slices((x))
train_dataset = train_dataset.repeat()
train_dataset = train_dataset.map(mfcc_fn)
train_dataset = train_dataset.batch(100)
train_dataset = train_dataset.prefetch(buffer_size=1)

# create an iterator and iterate over training dataset
iterator = tf.data.Iterator.from_structure(train_dataset.output_types, train_dataset.output_shapes)
train_iterator = iterator.make_initializer(train_dataset)

with tf.Session() as sess:
    sess.run(train_iterator, feed_dict={x: filename})

基本上,该代码创建了一个tf.data.dataset对象,该对象加载一个wav文件并将其转换为mfcc特性。这里,数据转换发生在train_dataset.map(mfcc_fn),在这里我将一个用NumPy编写的mfcc函数应用于所有输入数据。
显然,代码在这里不起作用,因为NumPy不支持对tf.placeholder对象的操作。如果我必须在NumPy中编写函数,是否可以将函数Map到tf.data.dataset的输入?我不使用TensorFlow内置MFCC特性转换的原因是,TensorFlow中的FFT函数与NumPy中的FFT函数相比,输出明显不同(如here所示),并且我正在构建的模型倾向于使用NumPy生成MFCC特征。

jvlzgdj9

jvlzgdj91#

你可以用tf.py_func函数或者tf.py_function(更新的版本)来实现,它完全按照你的要求来做,它会把对数组进行操作的numpy函数 Package 成一个张流操作,你可以把它作为数据集图的一部分。

ckx4rj1h

ckx4rj1h2#

可以使用python生成器处理numpy数组,然后将其传递给tf.data.Dataset.from_generator
例如

def sample_generator(image_paths):
    for image_path in image_paths:
        img = cv2.imread(image_path)
        # Do all the custom numpy things
    
        yield img

data_loader = tf.data.Dataset.from_generator(sample_generator,
                                             args=[image_paths],
                                             output_types=tf.int32,
                                             output_shapes=((None, None, 3))

这将从python生成器创建一个TensorFlow数据加载器。您可以在此处阅读更多相关信息。

相关问题