在 Visual Studio 上的 运行 时,Dataloader worker 意外退出。但在 Google Colab 上运行正常
Dataloader worker exited unexpectedly while running on Visual Studio. But runs okay on Google Colab
所以我有这个从 hdf5 加载数据的数据加载器,但是当我使用 num_workers>0 时意外退出(当 0 时它工作正常)。更奇怪的是,它可以在 google colab 上与更多的工作人员一起使用,但在我的计算机上却不行。
在我的电脑上出现以下错误:
回溯(最后一次调用):
文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 986 行,在 _try_get_data 中
数据 = self._data_queue.get(超时=超时)
文件“C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\multiprocessing\queues.py”,第 105 行,在 get
提高空
_queue.Empty
上述异常是以下异常的直接原因:
回溯(最后一次调用):
文件“”,第 2 行,位于
文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 517 行,在 next 中
数据 = self._next_data()
文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 1182 行,在 _next_data 中
idx, 数据 = self._get_data()
文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 1148 行,在 _get_data 中
成功,数据 = self._try_get_data()
文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 999 行,在 _try_get_data 中
从 e 提高 RuntimeError('DataLoader worker (pid(s) {}) exited unexpectedly'.format(pids_str))
RuntimeError:DataLoader worker (pid(s) 12332) 意外退出
还有,我的getitem函数是:
def __getitem__(self,index):
desired_file = int(index/self.file_size)
position = index % self.file_size
h5_file = h5py.File(self.files[desired_file], 'r')
image = h5_file['Screenshots'][position]
rect = h5_file['Rectangles'][position]
numb = h5_file['Numbers'][position]
h5_file.close()
image = torch.from_numpy(image).float()
rect = torch.from_numpy(rect).float()
numb = torch.from_numpy( np.asarray(numb) ).float()
return (image, rect, numb)
有谁知道是什么导致了这个空队列?
Windows 无法处理 num_workers > 0
。您可以将其设置为 0,这很好。什么也应该起作用:将所有训练/测试脚本放在 train/test()
函数中并在 if __name__ == "__main__":
下调用它
例如像这样:
class MyDataLoder(torch.utils.data.Dataset):
train_set = create_dataloader()
. . .
def train():
test_set = create_dataloader()
. . .
def test():
. . .
if __name__ == "__main__":
train()
test()
所以我有这个从 hdf5 加载数据的数据加载器,但是当我使用 num_workers>0 时意外退出(当 0 时它工作正常)。更奇怪的是,它可以在 google colab 上与更多的工作人员一起使用,但在我的计算机上却不行。 在我的电脑上出现以下错误:
回溯(最后一次调用): 文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 986 行,在 _try_get_data 中 数据 = self._data_queue.get(超时=超时) 文件“C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\multiprocessing\queues.py”,第 105 行,在 get 提高空 _queue.Empty
上述异常是以下异常的直接原因:
回溯(最后一次调用): 文件“”,第 2 行,位于 文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 517 行,在 next 中 数据 = self._next_data() 文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 1182 行,在 _next_data 中 idx, 数据 = self._get_data() 文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 1148 行,在 _get_data 中 成功,数据 = self._try_get_data() 文件“C:\Users\Flavio Maia\AppData\Roaming\Python\Python37\site-packages\torch\utils\data\dataloader.py”,第 999 行,在 _try_get_data 中 从 e 提高 RuntimeError('DataLoader worker (pid(s) {}) exited unexpectedly'.format(pids_str)) RuntimeError:DataLoader worker (pid(s) 12332) 意外退出
还有,我的getitem函数是:
def __getitem__(self,index):
desired_file = int(index/self.file_size)
position = index % self.file_size
h5_file = h5py.File(self.files[desired_file], 'r')
image = h5_file['Screenshots'][position]
rect = h5_file['Rectangles'][position]
numb = h5_file['Numbers'][position]
h5_file.close()
image = torch.from_numpy(image).float()
rect = torch.from_numpy(rect).float()
numb = torch.from_numpy( np.asarray(numb) ).float()
return (image, rect, numb)
有谁知道是什么导致了这个空队列?
Windows 无法处理 num_workers > 0
。您可以将其设置为 0,这很好。什么也应该起作用:将所有训练/测试脚本放在 train/test()
函数中并在 if __name__ == "__main__":
下调用它
例如像这样:
class MyDataLoder(torch.utils.data.Dataset):
train_set = create_dataloader()
. . .
def train():
test_set = create_dataloader()
. . .
def test():
. . .
if __name__ == "__main__":
train()
test()