如何在张量流上优化批量加载?

时间:2016-07-06 16:10:44

标签: python numpy optimization tensorflow

我对tensorflow中非常慢的批量加载有问题。 训练中的每一步都相当快,但我加载数据的功能非常慢。

我想知道是否有任何方法可以加快速度,或者在列车运行过程中在后台运行它,以便在完成一步之后批处理就可以了。

我的功能存储在numpy数组中。

任何想法? 这是我的代码。

def test_loadbatch(no_timesteps,list_of_file_paths,batch_size):
    nof=no_timesteps# No of combined
    files=list_of_file_paths
    files=shuffle_list(files)
    classes=get_class_number(files)
    temp_batch=np.zeros(shape=(batch_size,no_timesteps,4096),dtype=np.float32)
    temp_classes=np.zeros(shape=(batch_size,101),dtype=np.float32)
    bat_num=0
    fileno=0
    while bat_num != batch_size :
        if os.path.isfile(str(files[fileno])):
            val=np.load(str(files[fileno]))
            try:
                if val.shape[0]>no_timesteps+2:
                    num=random.randint(0,val.shape[0]-(no_timesteps+2))
                    temp_batch[bat_num,:,:]=val[num:num+nof,:]
                    temp_classes[bat_num,:]=create_one_hot(classes[fileno])
                    bat_num=bat_num+1
            except Exception as ex:
                fileno=fileno+1
        fileno=fileno+1
    return np.maximum(np.tanh(temp_batch), 0),temp_classes #normalize in range 0->1

1 个答案:

答案 0 :(得分:3)

使用准备好的数据输入数据准备和训练模型可以使用queues在TensorFlow中解耦。您可以使用tf.FIFOQueuetf.RandomShuffleQueue创建一个队列,并使用tf.enqueue将迷你批次排入其中。图表的培训部分将通过运行tf.dequeue获得小批量。请注意,您应该在不同的Python线程中运行数据准备和培训以获得并发性。有关更多说明和示例,请查看有关线程和队列的how to。另请注意,数据准备+培训管道的吞吐量将受到最慢阶段的限制。在您的情况下,如果每个小批量的数据准备比训练步骤慢,您可能必须运行多个线程来并行创建许多小批量以跟上培训线程。