2015-12-25 2 views
2

Я тренирую глубокий классификатор обучения, который использует набор данных HDF5, который слишком велик, чтобы вписаться в память. Поэтому я извлекаю данные партиями 256 и использую эти партии для обучения моего классификатора следующим образом. Библиотека глубокого обучения, которую я использую (Keras), предоставляет метод model.train_on_batch(X_batch, y_batch).Предварительная загрузка части файла HDF5 при выполнении другой задачи

for i in range(n_batches_in_dset): 
     X_batch, y_batch = load_partition('train', ind=[i*batch_size, (i+1)*batch_size]) 
     loss = model.train_on_batch(X_batch, y_batch) 

Было бы целесообразно предварительно отбирать следующую партию данных во время обучения текущим данным с использованием графического процессора. Как это можно сделать в Python?

Я приложил код, который я использую для загрузки данных.

def load_hdf5(path, datapart, ind=None): 
    f = h5py.File(path, 'r') 
    if ind is None: 
     dat = f[datapart][:] 
    else: 
     dat = f[datapart][ind[0]:ind[1]] 
    f.close() 
    return np.array(dat) 

def load_partition(name, ind=None): 
    path = DEEP_ROOT + 'data/{}.h5'.format(name) 
    X = load_hdf5(path, 'data', ind) 
    y = load_hdf5(path, 'label', ind) 
    X = np.swapaxes(X, 2, 3) 
    y = np_utils.to_categorical(y) 
    return X, y 

ответ

4

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

import Queue, threading 

data_queue = Queue.Queue(2) # a queue with two space for two "chunks" 
sentinel = object() 

#start the data-loading task 
def load_task() 
    for x in i in range(n_batches_in_dset): 
     data_queue.put(load_partition('train', ind=[i*batch_size, (i+1)*batch_size]), True) 
    # tell the other side we're "done" 
    data_queue.put(sentinel, True) 

threading.Thread(target=load_task).start() 

while True: 
    batch = data_queue.get(True) 
    data_queue.task_done() 
    if batch is sentinel: 
     break # we're done now! 
    X_batch, y_batch = batch 
    loss = model.train_on_batch(X_batch, y_batch) 

EDIT: мы должны использовать Queue.task_done() для разблокирования очередь нужно

+0

Вместо загрузки каждой партии (256 наблюдений), было бы на самом деле больше смысла для предварительной загрузки 20% набора данных (20000 наблюдений) и переместить все это на GPU. Таким образом, как IO с диска, так и на графический процессор значительно сокращаются. Вы знаете, как я могу явно перенести данные на графический процессор? – pir

+0

Нет, я не знаю в первую очередь об инструментах, которые вы используете, кроме того, что вы описали в своем вопросе. Этот ответ, если с точки зрения «общего решения проблемы на питоне». – SingleNegationElimination

Смежные вопросы