Как сохранить np.arrays () на диске?
Хранение их в файле HDF5 - хорошая идея. Тип basi c HDF5 - это Datasets
, который содержит многомерные массивы однородного типа. Файлы HDF5 Datasets
могут быть собраны вместе в файлы HDF5 Groups
, которые также могут содержать другие группы, для создания более сложных структур. Другим способом является выборка ваших numpy массивов или более абстрактных объектов набора данных непосредственно с диска, но тогда ваш файл будет доступен для чтения только Python. Также не рекомендуется по соображениям безопасности . Наконец, если вы хотите оптимизировать формат данных для операций чтения / записи TensorFlow, вы можете использовать формат файла TFRecord
. Сохранение массива numpy в формате TFRecord может быть сложным, но, к счастью, кто-то создал скрипт для этого .
Должен ли я использовать базу данных для хранения этих матриц и для запроса от них во время тренировок?
Можно, но тогда вы бы заново изобрели колесо. Что вам нужно, так это один или несколько отдельных процессов в процессе обучения, чтение следующего пакета обучающих наблюдений (предварительная выборка) и применение к ним некоторых преобразований, пока процесс обучения работает с предыдущим пакетом. Таким образом вы избежите любых задержек ввода-вывода и предварительной обработки и сможете получить значительный прирост производительности. Фреймворки AI разработали собственные инструменты для решения этой проблемы. В Pytorch есть класс torch.utils.data.DataLoader
. Здесь - учебное пособие, показывающее, как эффективно загружать файлы HDF5 с помощью Dataloader. В TensorFlow вы можете создать входной конвейер , используя класс tf.data.Dataset
. Основной подход c состоит в том, чтобы сначала открыть файл (ы) (1), прочитать данные из файла (ов) в память (2), а затем обучить вашу модель, используя то, что находится в памяти (3). Давайте посмеемся над набором данных TF и обучением l oop:
import tf, time
class MyDataset(tf.data.Dataset):
def __new__(self, filename="image_dataset.proto"):
time.sleep(0.01) # mock step (1) delay
return tf.data.TFRecordDataset([filename])
def train(dataset, nb_epoch=10):
start_time = time.perf_counter()
for epoch_num in range(nb_epoch):
for sample in dataset: # where step (2) delay takes place
time.sleep(0.01) # mock step (3) delay
tf.print("Execution time:", time.perf_counter() - start_time)
Вы можете просто последовательно применять шаги (1, 2, 3):
train(MyDataset())
Лучше читать следующая партия данных, в то время как процесс обучения все еще тренируется на предыдущей партии, так что шаги (2, 3) могут выполняться в парралеле. Также можно применить преобразования к следующей партии, продолжая тренироваться на предыдущей партии. Для предварительной выборки:
train(MyDataset().prefetch(tf.data.experimental.AUTOTUNE))
Кроме того, вы можете иметь несколько процессов для чтения ваших файлов и иметь последовательность шагов (1, 2), выполняющихся в parralel:
train( tf.data.Dataset.range(2).interleave(\
MyDataset().prefetch(tf.data.experimental.AUTOTUNE),\
num_parallel_calls=tf.data.experimental.AUTOTUNE))
Learn больше в документации .
Должен ли я вместо этого переключиться на Pytorch?
Почти все, что может сделать Pytorch, TensorFlow может сделать тоже. Некоторое время TensorFlow был самой готовой к использованию платформой AI, используемой Google для своих TPU. Pytorch догоняет все же. Я бы сказал, что Pytorch больше ориентирован на исследования / разработки, а TensorFlow больше ориентирован на производство. Другое отличие состоит в том, как вы проектируете свои нейронные сети: Pytorch работает, добавляя слои поверх друг друга, в то время как в TensorFlow вы сначала проектируете вычислительный граф, который в какой-то момент запускается для некоторых входных данных. Люди часто разрабатывают свои модели в Pytorch, а затем экспортируют их в формате TensorFlow для использования в производстве.