Данные обучения по продуктам tf.data.experimental.CsvDataset имеют неправильную форму [измерения, размера партии] - PullRequest
0 голосов
/ 20 июня 2019

Я хочу прочитать данные csv с тензорным потоком (1.13.1).Размерность данных - 429, код:

class VoiceDataGenerator(DataGenerator):
    def __init__(self):
        pass

    @staticmethod
    def parse_data(x, n_classes):
        return x[:-1], tf.one_hot(indices=tf.cast(x[-1], tf.int32), depth=n_classes)

    @staticmethod
    def load_dataset(batch_size, cpu_cores, dataset_path):
        dataset_train = tf.data.experimental.CsvDataset(dataset_path + 'train.csv', [tf.float32] * 430, header=False,
                                                        field_delim=' ')

        dataset_val = tf.data.experimental.CsvDataset(dataset_path + 'test.csv', [tf.float32] * 430, header=False,
                                                      field_delim=' ')

        n_sample_train = 1019915
        total_batches_train = n_sample_train // batch_size + 1
        n_sample_val = 57909

        n_classes = 1928

        dataset_train = dataset_train.shuffle(buffer_size=100000)
        dataset_train = dataset_train.map(map_func=lambda *x: VoiceDataGenerator.parse_data(x, n_classes),
                                          num_parallel_calls=cpu_cores)

        dataset_train = dataset_train.batch(batch_size)
        dataset_train = dataset_train.prefetch(buffer_size=1)

        dataset_val = dataset_val.map(map_func=lambda *x: VoiceDataGenerator.parse_data(x, n_classes),
                                      num_parallel_calls=cpu_cores)

        dataset_val = dataset_val.batch(batch_size)
        dataset_val = dataset_val.prefetch(buffer_size=1)

        return dataset_train, dataset_val, total_batches_train, n_sample_train, n_sample_val

его суперкласс:

class DataGenerator:
    @staticmethod
    def dataset_iterator(dataset_train, dataset_val):
        vgg_iter = tf.data.Iterator.from_structure(dataset_train.output_types, dataset_train.output_shapes)
        x, y = vgg_iter.get_next()

        # initializer for train_data
        train_init = vgg_iter.make_initializer(dataset_train)
        test_init = vgg_iter.make_initializer(dataset_val)

        return train_init, test_init, x, y

Вышеуказанные классы вызываются (это класс, и параметры передаютсяпо свойствам)

    def load_dataset(self, config):
        dataset_train, dataset_val, self.total_batches_train, self.n_samples_train, self.n_samples_val = VoiceDataGenerator.load_dataset(
            config['basic'].getint('batch_size'), config['basic'].getint('cpu_cores'), self.path)
        self.train_init, self.test_init, self.X, self.Y = VoiceDataGenerator.dataset_iterator(dataset_train, dataset_val)

но форма возвращаемых данных x имеет вид [измерение, размер партии], а не [размер партии, размерность].Интересно, почему и как я могу с этим справиться.

...