Skip to main content
 首页 » 编程设计

python之使用带有函数(tensorflow 或 numpy)的 tf.data.Dataset.from_generator() 作为生成源(而不是文件)

2024年09月03日26shangdawei

该脚本试图使用一个函数(在本例中为 np.sin())作为生成器,旨在最终通过管道传输到模型中进行训练(因此 tf.Session( ))。不幸的是,我不断收到错误消息:

“ValueError:generator 产生了一个形状为 () 的元素,而应该是形状为 (1,) 的元素。”

我过去曾使用生成器从 .hdf5 文件中提取数据,但我在这里尝试做的是从可调用类中的函数生成波形数据。

在 tf.data.Dataset.from_generator() 之外调用生成函数可以按预期工作:

下一个(sine_wave_source())

import numpy as np 
import tensorflow as tf 
 
class sine_wave_source: 
 
    def __init__(self,frequency = 1,sampling_frequency = 100): 
        self.fc = frequency 
        self.Fs = sampling_frequency 
        self.time_vector = np.arange(0,1,1/self.Fs,dtype = 'float32') 
 
    def __call__(self): 
        for t in self.time_vector: 
            yield np.sin(2*np.pi*self.fc*t,dtype = 'float32') 
 
data_gen = tf.data.Dataset.from_generator( 
            sine_wave_source(), 
            output_types = (tf.float32), 
            output_shapes = (tf.TensorShape([1]))) 
 
data_iterator = data_gen.make_initializable_iterator() 
 
next_sample = data_iterator.get_next() 
 
with tf.Session() as sess: 
        sess.run(data_iterator.initializer) 
        for ii in range(0,100): 
           sample = sess.run([next_sample]) 
           print(sample) 
 

请您参考如下方法:

使用 output_shapes = (tf.TensorShape([1])) 表示数据集中的每一项都是具有一个元素的一维张量。但是,sine_wave_source 中的生成器返回标量值。 TensorFlow 在这里很严格,它可以只广播到单项向量,但认为这是一个错误。您可以像这样更改 output_shapes:

data_gen = tf.data.Dataset.from_generator(sine_wave_source(), 
                                          output_types=tf.float32, 
                                          output_shapes=tf.TensorShape([])) 

或者更改生成器以返回列表或数组,例如:

def __call__(self): 
    for t in self.time_vector: 
        yield [np.sin(2 * np.pi * self.fc * t, dtype='float32')]