#python #deep-learning #pytorch #pypi
Вопрос:
Я новичок в использовании библиотеки webdataset от pytorch. Я создал файлы .tar образца набора данных, присутствующего локально в моей системе, с помощью webdataset.ТарРайтер(). Создание файлов .tar, похоже, прошло успешно, так как я мог бы извлечь их отдельно на платформе Windows и проверить одни и те же файлы набора данных.
Теперь я создаю train_dataset = wds.Dataset(url)
, где URL-адрес является локальным путем к файлам .tar. после этого я выполняю следующие операции:
train_loader = torch.utils.data.DataLoader(train_dataset, num_workers=0, batch_size=10)
sample = next(iter(train_loader))
print(sample)
Это приводит меня к такой ошибке
Тот же код отлично работает, если я использую пример веб-адреса: "http://storage.googleapis.com/nvdata-openimages/openimages-train-000000.tar"
упоминается в документации webdataset: https://reposhub.com/python/deep-learning/tmbdev-webdataset.html
До сих пор я не мог понять причину ошибки. Есть идеи о том, как решить эту проблему?
Ответ №1:
Со вчерашнего дня у меня была та же ошибка, и я наконец нашел виновника. WebDataset/tarIterators.py использует WebDataset/gopen.py. В gopen.py urllib.parse.urlparse
вызывается для анализа открываемого URL-адреса, в вашем случае это URL- D:/PhD/...
адрес .
gopen_schemes = dict(
__default__=gopen_error,
pipe=gopen_pipe,
http=gopen_curl,
https=gopen_curl,
sftp=gopen_curl,
ftps=gopen_curl,
scp=gopen_curl)
def gopen(url, mode="rb", bufsize=8192, **kw):
"""Open the URL. This uses the `gopen_schemes` dispatch table to dispatch based on scheme.
Support for the following schemes is built-in: pipe, file, http, https, sftp, ftps, scp.
When no scheme is given the url is treated as a file. You can use the OPEN_VERBOSE argument to get info about files being opened.
:param url: the source URL
:param mode: the mode ("rb", "r")
:param bufsize: the buffer size
"""
global fallback_gopen
verbose = int(os.environ.get("GOPEN_VERBOSE", 0))
if verbose:
print("GOPEN", url, info, file=sys.stderr)
assert mode in ["rb", "wb"], mode
if url == "-":
if mode == "rb":
return sys.stdin.buffer
elif mode == "wb":
return sys.stdout.buffer
else:
raise ValueError(f"unknown mode {mode}")
pr = urlparse(url)
if pr.scheme == "":
bufsize = int(os.environ.get("GOPEN_BUFFER", -1))
return open(url, mode, buffering=bufsize)
if pr.scheme == "file":
bufsize = int(os.environ.get("GOPEN_BUFFER", -1))
return open(pr.path, mode, buffering=bufsize)
handler = gopen_schemes["__default__"]
handler = gopen_schemes.get(pr.scheme, handler)
return handler(url, mode, bufsize, **kw)
Как вы можете видеть в словаре __default__
, функция такова gopen_error
. Это функция, возвращающая ошибку, которую вы видите. pr = urlparse(url)
на вашем URL-адресе будет сгенерирован URL-адрес, в котором схема ( pr.scheme
) 'd'
указана, потому что ваш диск называется D. Однако это должно быть 'file'
для того, чтобы функция работала должным образом. Поскольку он не равен «файлу» или любой другой схеме в словаре (http, https, sftp и т. Д.), Будет использоваться функция по умолчанию, которая возвращает ошибку. Я обошел эту проблему, добавив d=gopen_file
к gopen_schemes
словарь. Я надеюсь, что это поможет вам в дальнейшем временно. Я также рассмотрю эту проблему на странице WebDataset GitHub и буду обновлять эту страницу, если получу более практичное обновление.
Удачи!
Комментарии:
1. Большое спасибо за этот ответ. Конечно, пожалуйста, обновляйте эту страницу, если найдете какое-либо другое решение.
2. Никаких проблем, рад помочь. Вот ссылка на билет на GitHub .