TensorFlow - ошибка при использовании interleave или parallel_interleave - PullRequest
0 голосов
/ 21 февраля 2019

Я использую tf.data.Datasets API V1.12, например, Q & A , чтобы прочитать несколько файлов .h5, предварительно сохраненных для каждого файла в каталоге.Сначала я создал генератор:

class generator_yield:
    def __init__(self, file):
        self.file = file

    def __call__(self):
        with h5py.File(self.file, 'r') as f:
            yield f['X'][:], f['y'][:]

Затем составьте список имен файлов и вставьте их в Dataset:

def _fnamesmaker(dir, mode='h5'):
    fnames = []
    for dirpath, _, filenames in os.walk(dir):
        for fname in filenames:
            if fname.endswith(mode):
                fnames.append(os.path.abspath(os.path.join(dirpath, fname)))
    return fnames

fnames = _fnamesmaker('./')
len_fnames = len(fnames)
fnames = tf.data.Dataset.from_tensor_slices(fnames)

Примените метод чередования данных:

# handle multiple files
ds = fnames.interleave(lambda filename: tf.data.Dataset.from_generator(
    generator_yield(filename), output_types=(tf.float32, tf.float32),
    output_shapes=(tf.TensorShape([100, 100, 1]), tf.TensorShape([100, 100, 1]))), cycle_length=len_fnames)
ds = ds.batch(5).shuffle(5).prefetch(5)

# init iterator
it = ds.make_initializable_iterator()
init_op = it.initializer
X_it, y_it = it.get_next()

Модель:

# model
with tf.name_scope("Conv1"):
    W = tf.get_variable("W", shape=[3, 3, 1, 1],
                         initializer=tf.contrib.layers.xavier_initializer())
    b = tf.get_variable("b", shape=[1], initializer=tf.contrib.layers.xavier_initializer())
    layer1 = tf.nn.conv2d(X_it, W, strides=[1, 1, 1, 1], padding='SAME') + b
    logits = tf.nn.relu(layer1)


    loss = tf.reduce_mean(tf.losses.mean_squared_error(labels=y_it, predictions=logits))
    train_op = tf.train.AdamOptimizer(learning_rate=0.0001).minimize(loss)

Начальный сеанс:

with tf.Session() as sess:
    sess.run([tf.global_variables_initializer(), init_op])
    while True:
        try:
            data = sess.run(train_op)
            print(data.shape)
        except tf.errors.OutOfRangeError:
            print('done.')
            break

Ошибка выглядит следующим образом:

Ошибка типа: ожидаемая строка, байты или ОС.Объект PathLike, а не Tensor При генераторе init .Видимо, когда применяется чередование, Тензор проходит к генератору

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Согласно этой записи , мой случай не выиграет в производительности с parralel_interleave.

... с преобразованием, которое преобразует каждый элемент источниканабор данных в несколько элементов в наборе данных назначения ...

Это более актуально в типичной проблеме классификации с данными (собака, кошка ...) , сохраненными в отдельных каталогах .У нас есть проблема сегментации, которая означает, что метка содержит идентичные размеры входного изображения.Все данные хранятся в одном каталоге, и каждый файл .h5 содержит изображение и его метки (маски)

Здесь простое map с num_parallel_calls является достаточным .

0 голосов
/ 21 февраля 2019

Вы не можете запустить объект набора данных напрямую через sess.run.Вы должны определить итератор, получить следующий элемент.Попробуйте сделать что-то вроде:

next_elem = files.make_one_shot_iterator.get_next()
data = sess.run(next_elem)

Вы должны быть в состоянии получить свои тензоры.

...