Обработка большого набора данных тензорного потока - PullRequest
0 голосов
/ 01 мая 2020

Я относительно новичок в Tensorflow и собираю некоторые модели обучения на основе учебника, который я нашел на сайте ts. Мне удалось собрать что-то функциональное, что удовлетворяет моим предварительным требованиям.

Я читаю локально файлы CSV, которые предоставляют некоторые ссылки на изображения, связанные с метками, написанными в той же строке CSV. Мой код выглядит примерно так:

def map_func(*row):
  img = process_img(img_filename)
  output = read(row)
  return img, output

dataset = tf.data.experimental.CsvDataset(CSV_FILE, default_format, header=True)
dataset = dataset.map(map_func)
dataset = dataset.shuffle(buffer_size=shuffle_buffer_size)
dataset = dataset.batch(NB_IMG)
dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

X, y = next(iter(dataset))

X_train, X_test = tf.split(X, split, axis=0)
y_train, y_test = tf.split(y, split, axis=0)

model = create_model()
model.compile(optimizer=OPTIMIZER, loss='mse')
model.fit(x=X_train, y=y_train, epochs=EPOCHS, validation_data=(X_test, y_test))

NB_IMG - это общее количество изображений, которые у меня есть. EPOCHS здесь произвольно фиксируется на заданном значении (обычно 20 или 40), и разделение - это соотношение, применяемое к NB_IMG.

Все мои изображения находятся локально на моем компьютере, и с этим кодом мой GPU в настоящее время может управлять до 50000 изображений примерно. Обучение терпит неудачу с большим количеством изображений (GPU исчерпан). Я могу понять, что это связано с тем, что я читаю данные одновременно, но я немного заблокирован, чтобы сделать следующий шаг, чтобы иметь возможность управлять большим набором данных.

Эта часть ниже - это один, который нуждается в улучшении, я думаю:

X, y = next(iter(dataset))

Может ли кто-нибудь здесь помочь мне продвинуться вперед и привести меня к некоторым примерам или фрагментам, где я могу обучить модель на большем наборе данных? Я немного потерян для следующего шага и не уверен, где сосредоточиться в документации по TS. Я действительно не нашел четкого примера в Интернете, который бы соответствовал моим потребностям. Как я должен l oop на разных партиях? Как закодирован итератор?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

process_img и read - очень простые функции:

def process_img(filename):
  img = tf.io.read_file(filename)
  return tf.image.decode_jpeg(img, channels=3)
def read(row):
  return row[1]

Медленная часть кода в случайном порядке, но, похоже, не является причиной сбоя, я могу удалить его и перетасовать данные непосредственно из CSV-файла. В строке X, y = next(iter(dataset)) может возникнуть ошибка, если набор данных слишком большой

Спасибо за ваши предложения по профилированию кода, я дам ему go. Есть ли другой возможный подход для разделения и перебора набора данных?

0 голосов
/ 01 мая 2020

Хорошо, вы можете дать более подробную информацию о двух функциях process_img и read?

Во время моих экспериментов я заметил, что функция shuffle может быть медленной, когда у вас много данные и размер буфера большой. Попробуйте прокомментировать эту строку и проверьте, работает ли она быстрее. Если это так, вы можете использовать pandas для загрузки файла CSV, а затем перемешать его и использовать tf.data.Dataset.from_tensor_slices

Теперь у Tensorflow есть отличный инструмент для профилирования моделей и конвейера набора данных (https://www.tensorflow.org/tensorboard/tensorboard_profiling_keras).

...