Использование tf.data.Dataset.from_generator () с функцией (tenorflow или numpy) в качестве источника генерации (вместо файла) - PullRequest
2 голосов
/ 22 мая 2019

Скрипт пытается использовать функцию (в данном случае np.sin()) в качестве генератора, предназначенного для последующей передачи в модель для обучения (следовательно, tf.Session()). К сожалению, я получаю сообщение об ошибке:

"ValueError: generator дал элемент shape (), где ожидался элемент shape (1,)."

В прошлом я использовал генераторы для извлечения данных из файлов .hdf5, но вместо этого я пытаюсь сгенерировать данные формы волны из функции в вызываемом классе.

Вызов функции генерирования вне tf.data.Dataset.from_generator() работает как нужно:

next(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)

1 Ответ

2 голосов
/ 22 мая 2019

С 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')]
...