0

我正在尝试在 BASIC_GPU 分层实例上的 google ml 引擎中训练计算机视觉的卷积模型,但训练以看似随机的时间间隔停止长达一个小时。从这张取自张量板的成本函数图片中可以看出。随时间绘制的成本函数

我能想到的这个问题的唯一明显原因是我使用的多线程或多处理函数(两者都会产生相同的问题,从现在开始称为并行处理)。我使用并行处理来并行获取和预处理我的图像,因为谷歌存储桶延迟约为 100 毫秒,加上一些 opencv 预处理,如果按顺序完成,每批最多可能需要 5/6 秒。并行获取通过从一个函数中派生工作人员来工作:

import threading as thr

def read_image_always_out(self, dirlist, que, seed):
    found_img = False
    np.random.seed(seed)
    number_of_files = len(dirlist)
    while not found_img:
        i = np.random.randint(number_of_files)
        seed = np.random.randint(self.maxInt)
        ex, se, found_img, _ = self.get_image_set(datapath, annopath, seed)

    que.put([ex, se])
    que.task_done()

def read_image_batch_thread(self, dirlist,seed):
    wait_for_thread = 5.0
    np.random.seed(seed)
    search_images, exemplars = [], []
    que = Queue.Queue((self.batch_size))
    process_list = []

    for i in range(0, self.batch_size):
        seed = np.random.randint(self.maxInt)
        p = thr.Thread(target=self.read_image,
                       args=(dirlist, que, seed))
        p.start()
        process_list.append(p)

    no_data = []

    for i in range(0, self.batch_size):
        try:
            images = que.get(wait_for_thread)
        except:
            print("timeout waiting for image")
            no_data.append(i)
        else:
            exemplars.append(images[0])
            search_images.append(images[1])

    for p in process_list:
        p.join(wait_for_thread)
    que.join()
    duration_image_get = time.time() - start_time
    return exemplars, search_images, duration_image_get, no_data

每当训练没有停止时,并行获取就像一种魅力,并将图像加载时间减少到大约一秒,从而大大提高了我的模型的训练速度。

更重要的是,在本地进行培训时,这些问题都没有出现。这似乎是 ML 引擎特有的错误,还是我遗漏了什么?我对机器学习引擎的限制或对这个问题的解决方案的搜索已经枯竭。

有没有人有这个问题的经验并且知道为什么它不起作用或者我可以尝试什么?这个问题是错误还是 ML 引擎的限制?

我知道有一些解决方法,比如使用更大的文件和训练块,所以我只需要每批下载一个文件而不是多个文件。或者使用 tf.train.QueueRunner 虽然我无法进行 tensorflow api 中所需的特定图像预处理并且必须预处理所有图像。这两种解决方案都需要对图像进行预处理才能工作,这是我想不惜一切代价避免的事情,因为我还没有确定最佳的图像尺寸,也不想为我想要的每个实验制作一个图像集试用。

4

1 回答 1

0

信息不足,只能猜测。您可能会遇到一些退化的情况,这会使您的图像获取循环变慢(例如,未设置默认超时、未处理某些故障条件、等待所有线程、为每个图像获取启动一个新线程)。

理想的解决方法是将所有这些操作移至 TensorFlow 操作,包括读取和入队。这些部分经过了很好的测试。您确定在 TensorFlow 中无法完成预处理吗?我们通常为此目的使用 TensorFlow 操作。例如,请参见此处: https ://github.com/tensorflow/models/blob/master/slim/preprocessing/vgg_preprocessing.py

于 2017-04-11T18:46:36.377 回答