# mypy: 允许未类型化定义
导入 contextlib
导入 errno
导入 hashlib
导入 json
导入
操作系统
导入
正则表达式
导入 shutil
导入
系统
导入 tempfile
导入 uuid
导入
警告
导入 zipfile
from pathlib 导入 Path
from 打字
导入
任何,
可选,
联合
from typing_extensions 导入
已弃用
from urllib.error 导入 HTTPError,
URL 错误
from urllib.parse 导入 urlparse # noqa: F401
from urllib.request 导入
请求, urlopen
导入
火炬
from torch 序列化
导入
地图位置
类
模拟进度条:
# 类型:忽略[重新定义]
定义 __init__(self,
总计=
无,
禁用=False,
单位=
无, *
参数, **
关键字参数):
self.总计 =
总计
self.禁用 =
禁用
self.n = 0
# 如果不想重新发明轮子,请忽略所有额外的 *args 和 **kwargs
定义
更新(self, n):
如果 self.
禁用:
返回
self.n += n
如果 self.
总计
是
无:
系统模块.
标准错误输出.
写(f"
回车符{self.n:.1f}
字节")
否则:
系统模块.
标准错误输出.
写(f"
回车符{100 * self.n / float(self.
总计):.1f}
百分号")
系统模块.
标准错误输出.
清空()
# 不要实现;如果你想要,请使用真正的 tqdm
定义
设置描述(self, *
参数, **
关键字参数):
通过
定义
写(self, s):
系统模块.
标准错误输出.
写(f"{s}
输入文本翻译为简体中文为:\n")
定义
关闭(self):
self.禁用 =
真实
定义
__进入__(self):
返回 self
定义
__退出__(self,
异常类型,
异常值,
异常堆栈):
如果 self.
禁用:
返回
系统模块.
标准错误输出.
写("
输入文本翻译为简体中文为:\n")
尝试:
from tqdm 导入 tqdm
如果已安装 tqdm,则使用它,否则使用假包装器
除了
导入错误:
tqdm = _Faketqdm
全部 = [
"下载到文件的 URL",
"get_dir",
帮助,
列表,
加载,
"load_state_dict_from_url",
set_dir,
]
# 匹配 resnet18-bfd8deac.pth 中的 bfd8deac
HASH_REGEX = 正则表达式.
编译(r
"-([a-f0-9]*)\\.")
_TRUSTED_REPO_OWNERS = (
"facebookresearch",
"facebookincubator",
"pytorch",
"fairinternal",
)
ENV_GITHUB_TOKEN = "GITHUB_TOKEN"
ENV_TORCH_HOME = 火炬环境变量
ENV_XDG_CACHE_HOME = XDG 缓存环境变量
默认缓存目录 =
~/.cache
变量依赖 =
依赖项
模块配置中心 =
hubconf.py
读取数据块 = 128 * 1024
_hub 目录:
可选[str] =
无
@contextlib.contextmanager
定义
添加到系统路径(
路径):
系统模块.
路径.
插入(0,
路径)
尝试:
产生
最后:
系统模块.
路径.
删除(
路径)
从 tools/shared/module_loader 复制,包含在 torch 包中
定义
导入模块(
姓名,
路径):
导入 importlib.util
from importlib.abc 导入
加载器
规范 = importlib.
工具.
从文件位置加载规范(
姓名,
路径)
断言
规范
是 not
无
模块 = importlib.
工具.
从规范导入模块(
规格)
断言 isinstance(
规格.
加载器,
加载器)
规格.
加载器.
执行模块(
模块)
返回
模块
定义
删除如果存在(
路径):
如果 os.
路径.
存在(
路径):
如果 os.
路径.
判断是否为文件(
路径):
os.删除(
路径)
否则:
shutil.rmtree(路径)
定义
_git 存档链接(
仓库所有者,
仓库名, ref):
# 请参阅 https://docs.github.com/en/rest/reference/repos#download-a-repository-archive-zip
返回 f
"https://github.com/"{
仓库所有者}/{
仓库名}/zipball/{ref}"
定义
从模块中加载属性(
模块,
函数名):
检查可调用对象是否在模块中定义
如果
函数名 not
进入
目录(
模块):
返回
无
返回 getattr(
模块,
函数名)
定义
_获取 torch 家目录():
torch_home = os.路径.expanduser(
os.获取环境变量(
环境变量_TORCH_HOME,
os.路径.
连接(os.
获取环境变量(
环境变量_XDG_CACHE_HOME,
默认缓存目录),
torch),
)
)
返回 torch_home
定义
_解析仓库信息(github):
如果 ":"
进入 github:
仓库信息,
分支 = github.
分割(
“:”)
否则:
仓库信息,
分支 = github,
无
仓库所有者,
仓库名称 =
仓库信息.
分割(
根目录)
如果
分支
是
无:
用户未指定引用,因此我们需要找出
默认分支:main 或 master。我们的假设是,如果存在 main。
# 然后是默认分支,否则是 master。
尝试:
替换为
打开网址(f
"https://github.com/"{
仓库所有者}/{
仓库名}
/tree/main/):
分支 =
主
除了
HTTP 错误 as e:
如果 e.
代码 == 404:
分支 =
主人
否则:
抛出
除了
URL 错误 as e:
没有互联网连接,需要作为最后的手段检查缓存
对于
可能的引用
进入 (
主,
主控):
如果 os.
路径.
存在(
f"{获取目录()}/{
仓库所有者}_{
仓库名}_{
可能的引用}"
):
分支 =
可能的引用
断开
如果
分支
是
无:
抛出 RuntimeError(
"看起来没有互联网连接,并且“
f"仓库在缓存中未找到({
获取目录()})"
) from e
返回
仓库所有者,
仓库名,
分支
定义
读取 URL(
网址):
替换为
打开网址(
网址) as r:
返回 r.
阅读().
解码(r.
头部信息.
获取内容字符集(
utf-8))
定义
_验证非分支仓库(
仓库所有者,
仓库名, ref):
使用 urlopen 以避免依赖本地 git。
头部 = {
"接受":
application/vnd.github.v3+json}
令牌 = os.
环境.
获取(ENV_GITHUB_TOKEN)
如果
令牌
是 not
无:
头部信息[
"认证"] = f
"令牌"{
令牌}"
对于
url 前缀
进入 (
f"https://api.github.com/repos/"{
仓库所有者}/{
仓库名}
/分支,
f"https://api.github.com/repos/"{
仓库所有者}/{
仓库名}
标签,
):
页面 = 0
当 True:
页面 += 1
网址 = f"{
url 前缀}
?每页=100&页={
页面}"
响应 = json.loads(
读取 URL(
请求(
网址,
头部信息=
头部信息)))
# 空响应表示没有更多数据要处理
如果 not
响应:
断开
对于
换行符
进入
响应:
如果
换行符[
名称] ==
分支
或者
换行符[
提交
]
[sha].
以...开头(ref):
返回
抛出
值错误(
f无法找到{ref}
在 https://github.com/{
仓库所有者}/{
仓库名}
.
"如果这是一个来自分叉仓库的提交,请直接使用分叉仓库调用 hub.load()。"
)
定义 _get_cache_or_reload(
github,
强制重新加载,
信任的仓库,
调用函数,
详细模式=True,
跳过验证=False,
):
# 设置 hub_dir 以保存下载的文件
仓库目录 =
获取目录()
os.创建多级目录(
hub 目录, exist_ok=True)
解析 github 仓库信息
仓库所有者,
仓库名,
分支 =
_解析仓库信息(github)
# Github 允许分支名称包含斜杠 '/'
这在 Linux 和 Windows 上都可能导致路径混淆。
GitHub 分支名称不允许使用反斜杠,所以无需担心。
因此无需担心。
normalized_br = ref.替换(
根目录,
“_”)
# Github 将文件夹 repo-v1.x.x 重命名为 repo-1.x.x
# 在下载 zip 文件之前,我们不知道仓库名称
从中提取名称
检查缓存仓库是否存在,我们需要规范化文件夹名称。
owner_name_branch = “_”.
连接
[
仓库所有者,
仓库名,
标准化分支])
仓库目录 = os.
路径.
连接(
hub 目录,
拥有者名称分支)
# 检查仓库是否在受信任列表中
_检查仓库是否受信任(
仓库所有者,
仓库名,
拥有者名称分支,
信任的仓库=
信任的仓库,
调用函数=
调用函数,
)
使用缓存 = (not
强制重新加载)
和 os.
路径.
存在(
仓库目录)
如果
使用缓存:
如果
详细模式:
系统模块.
标准错误输出.
写(f
"在缓存中找到的 "{
仓库目录}
输入文本翻译为简体中文为:\n")
否则:
验证标签/分支是否来自原始仓库而不是分叉仓库
如果 not
跳过验证:
_验证非分支仓库(
仓库所有者,
仓库名, ref)
缓存文件 = os.
路径.
连接(
hub 目录, normalized_br + ".zip")
删除如果存在(
缓存文件)
尝试:
网址 =
_git 存档链接(
仓库所有者,
仓库名, ref)
系统模块.
标准输出.
写(f
下载中:{
网址}
“到”{
缓存文件}
输入文本翻译为简体中文为:\n')
下载到文件的 URL(
网址,
缓存文件,
进度=False)
除了
HTTP 错误 as
错误:
如果
错误.
代码 == 300:
获取 300 多种选择错误可能意味着引用既是标签也是分支。这可以通过显式使用 refs/heads/或 refs/tags 来消除歧义。
在仓库中,引用既是标签也是分支。这可以通过显式使用 refs/heads/或 refs/tags 来消除歧义。
# 请参阅 https://git-scm.com/book/en/v2/Git-Internals-Git-References
# 这里,我们与 git 的做法相同:我们抛出一个警告,并假设用户想要的是分支
警告.
警告(
f"该引用"{ref}
意思不明确。也许它既是仓库中的一个标签,也是一个分支?
现在 Torchhub 将假设它是一个分支。
您可以通过明确传递 refs/heads/branch_name 或 refs/tags/tag_name 来区分标签和分支。
这可能需要使用 skip_validation=True。
)
明确的分支引用 = f
"refs/heads/"{ref}"
网址 =
_git 存档链接(
仓库所有者,
仓库名, ref=
明确的分支引用
)
下载到文件的 URL(
网址,
缓存文件,
进度=False)
否则:
抛出
替换为
压缩包.ZipFile(
缓存文件) as
缓存的 zip 文件:
提取的仓库名称 =
缓存的压缩文件.
信息列表()[0].
文件名
解压仓库 = os.
路径.
连接(
hub 目录,
解压仓库名称)
删除如果存在(
提取仓库)
解压代码并重命名基本文件夹
缓存的 zip 文件.
提取所有(
hub 目录)
删除如果存在(
缓存文件)
删除如果存在(
仓库目录)
shutil.移动(
提取仓库,
仓库目录)
# 重命名仓库
返回
仓库目录
定义
_检查仓库是否受信任(
仓库所有者,
仓库名,
拥有者名称分支,
信任的仓库,
调用函数=
加载,
):
仓库目录 =
获取目录()
文件路径 = os.
路径.
连接(
hub 目录,
"可信列表")
如果 not os.
路径.
存在(filepath):
路径(filepath).
触摸()
替换为
打开(filepath) as
文件:
可信仓库 =
元组(
行.strip()
对于
行
进入
文件)
为了最小化引入新的信任仓库机制带来的摩擦,我们考虑
如果一个仓库已经被 torchhub 下载,那么它已经是可信的(即使它不在允许列表中)
trusted_repos_legacy = 下一(os.
步行(
hub 目录))[1]
拥有者名称 =
“_”.
连接
[
仓库所有者,
仓库名])
是否可信 = (
拥有者名称
进入
可信仓库
或者 owner_name_branch
进入 trusted_repos_legacy
或者 repo_owner
进入 _TRUSTED_REPO_OWNERS
)
# TODO: 在 2.0 版本中移除“None”选项,并将默认值改为“检查”
如果
信任库
是
无:
如果 not is_trusted:
警告.
警告(
"您即将从不受信任的仓库下载并运行代码。在未来版本中,这将不再可能"
"允许。要将仓库添加到您的受信任列表中,请将命令更改为"
{调用函数}(..., "
"trust_repo=False) 然后将出现一个命令提示符,要求进行显式的信任确认," "
f或者{
调用函数}
(..., trust_repo=True), 将假定提示需要用 "
f"'是'. 你还可以使用{
调用函数}
(..., trust_repo='check') 只会提示 "
f"如果仓库尚未受信任,则将提示“确认”。这最终将成为默认行为"
)
返回
如果 (
信任库
是 False)
或者 (
信任库 ==
检查
和 not is_trusted):
响应 =
输入(
f"该仓库"{
所有者名称}
不属于受信任的仓库列表,因此无法下载。
"您信任此仓库并希望将其添加到受信任的仓库列表中吗?(是/否)?"
)
如果
响应.
小写()
进入 (
"是",
"是的"):
如果 is_trusted:
打印(
"该仓库已被信任。")
elif 响应.
小写()
进入 ("n",
"没有",
输入文本翻译为简体中文为:""):
抛出
异常(
不受信任的仓库。)
# 无需注意:TRY002
否则:
抛出
值错误(f
无法识别的响应{
响应}.")
在这一点上,我们确信用户信任该仓库(或希望信任它)
如果 not is_trusted:
替换为
打开(filepath,
"一个") as
文件:
文件.
写(
拥有者名称 + "
输入文本翻译为简体中文为:\n")
定义
检查模块是否存在(
姓名):
导入 importlib.util
返回 importlib.
工具.
查找规范(
姓名)
是 not
无
定义 _check_dependencies(m):
依赖 =
从模块加载属性(m,
变量依赖)
如果
依赖
是 not
无:
缺失的依赖 = [
包
对于
包
进入
依赖
如果 not
检查模块是否存在(
包)]
如果
长度(
缺少依赖):
抛出 RuntimeError(f
"缺少依赖:"{
“,”.
连接(
缺少依赖)}")
定义
从中心配置加载条目(m,
模型):
如果 not isinstance(
模型, str):
抛出
值错误(
"无效输入:模型应该是函数名称的字符串")
# 注意,如果缺少的依赖在 hubconf 顶层导入,则
在此函数之前抛出异常。这是一个鸡生蛋、蛋生鸡的情况,我们必须
加载 hubconf 以了解依赖项,但导入 hubconf 需要缺少的包。
这没关系,Python 会为用户提供适当的错误信息。
_check_dependencies(m)
函数 =
从模块中加载属性(m,
模型)
如果
函数
是
无
或者 not
可调用(
函数):
抛出 RuntimeError(f
"找不到可调用对象"{
模型}
在 hubconf 中)
返回
函数
[文档]def get_dir() -> str:
r"""
获取用于存储下载的模型和权重的 Torch Hub 缓存目录。
如果未调用 :func:`~torch.hub.set_dir`,则默认路径为 ``$TORCH_HOME/hub``,其中环境变量 ``$TORCH_HOME`` 默认为 ``$XDG_CACHE_HOME/torch``。
环境变量 ``$TORCH_HOME`` 默认为 ``$XDG_CACHE_HOME/torch``。
``$XDG_CACHE_HOME``遵循 Linux X 设计组文件系统布局规范,默认值是``~/.cache``,如果环境变量未设置。
filesystem 布局规范,默认值``~/.cache``,如果环境变量未设置。
variable is not set.
"""
# 如果旧环境变量已设置,则发出警告移动数据
if os.getenv("TORCH_HUB"):
warnings.warn("TORCH_HUB 已弃用,请使用 env TORCH_HOME 代替")
if _hub_dir is not None:
返回_hub_dir
返回 os.path.join(_get_torch_home(), "hub")
[文档]def 设置_dir(d: 联合[str, os.PathLike]) -> None:
r"""
可选地设置用于保存下载的模型和权重的 Torch Hub 目录。
Args:
d (str): 保存下载的模型和权重的本地文件夹路径。
"""
全局_hub_dir
_hub_dir = os.path.expanduser(d)
[文档]
定义
列表(
github,
强制重新加载=False,
跳过验证=False,
信任的仓库=
无,
详细模式=True,
):
r""
列出在指定由 `github` 的仓库中可调用的所有入口点。
参数:
github (str): 格式为 "repo_owner/repo_name[:ref]" 的字符串,其中 `ref` 可选(标签或分支)。如果未指定 `ref`,则默认分支为存在时的 `main`,否则为 `master`。
ref (标签或分支)。如果 `ref` 未指定,默认分支为存在时的 `main`,否则为 `master`。
如果默认分支存在,否则为 `master`。
示例: 'pytorch/vision:0.10'
force_reload (bool, optional): 是否丢弃现有缓存并强制重新下载。
默认为 ``False``。
skip_validation (bool, 可选): 如果为 ``False``,torchhub 将检查分支或提交
指定给 ``github`` 参数的值应正确属于仓库所有者。这将使
请求 GitHub API;您可以通过设置非默认 GitHub 令牌来指定
GITHUB_TOKEN 环境变量。默认为 False。
trust_repo (布尔值、字符串或 None): ``"check"``, ``True``,``False`` 或 ``None``。
此参数自 v1.12 版本引入,有助于确保用户
只运行他们信任的仓库中的代码。
如果为 ``False``,则会提示用户是否应该信任该仓库。
如果为 ``True``,则该仓库将被添加到信任列表中,无需明确确认即可加载。
- 如果 ``True``,该仓库将被添加到信任列表中,无需明确确认即可加载。
- 如果为 ``True``,则该仓库将被添加到信任列表中,无需明确确认即可加载。
- 如果是 "check",则仓库将与列表进行核对
缓存中的受信任仓库。如果它不在该列表中,则行为将回退到 ``trust_repo=False`` 选项。
行为将回退到 ``trust_repo=False`` 选项。
- 如果为 ``None``:这将引发警告,邀请用户将 ``trust_repo`` 设置为 ``False``、``True`` 或 ``"check"``。
将 `trust_repo` 设置为 `False`、`True` 或 `"check"`。这
仅用于向后兼容,将在 v2.0 版本中删除。
v2.0 版本。
默认为 `None`,最终将在 v2.0 版本中更改为 `"check"`。
verbose(布尔值,可选):如果 ``False``,则静音关于命中本地缓存的提示
注意,关于首次下载的消息无法
禁音。默认为 ``True``。
返回值:
列表:可用的可调用入口点
示例:
>>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_HUB)
>>> entrypoints = torch.hub.list("pytorch/vision", force_reload=True)
"""
仓库目录 = _get_cache_or_reload(
github,
强制重新加载,
信任的仓库,
列表,
详细模式=
详细模式,
跳过验证=
跳过验证,
)
替换为
添加到系统路径(
仓库目录):
hubconf 路径 = os.
路径.
连接(
仓库目录,
模块配置中心)
模块库 =
导入模块(
模块配置中心,
配置路径)
我们将以下划线“_”开头的函数视为内部辅助函数
入口 = [
f
对于 f
进入
目录(
中心模块)
如果
可调用(getattr(
中心模块, f))
和 not f.
以...开头(
“_”)
]
返回
入口
[文档]
定义
帮助(github,
模型,
强制重新加载=False,
跳过验证=False,
信任的仓库=
无):
r""
显示入口点 `model` 的文档字符串。
参数:
github (str): 格式为 的字符串,ref 可选(一个标签或分支)。
如果未指定 ref,则默认分支为 `main`(如果存在),否则为 `master`。
默认分支为 `main`(如果存在),否则为 `master`。
示例: 'pytorch/vision:0.10'
模型 (str): 在 repo 的 ``hubconf.py`` 中定义的入口点名称字符串
force_reload (bool, optional): 是否丢弃现有缓存并强制重新下载。
默认为 ``False``。
跳过验证(bool,可选):如果为 ``False``,torchhub 将检查引用
指定给 ``github`` 参数的值应正确属于仓库所有者。这将使
请求 GitHub API;您可以通过设置非默认 GitHub 令牌来指定
GITHUB_TOKEN 环境变量。默认为 False。
trust_repo (布尔值、字符串或 None): ``"check"``, ``True``,``False`` 或 ``None``。
此参数自 v1.12 版本引入,有助于确保用户
只运行他们信任的仓库中的代码。
如果为 ``False``,则会提示用户是否应该信任该仓库。
如果为 ``True``,则该仓库将被添加到信任列表中,无需明确确认即可加载。
- 如果 ``True``,该仓库将被添加到信任列表中,无需明确确认即可加载。
- 如果为 ``True``,则该仓库将被添加到信任列表中,无需明确确认即可加载。
- 如果是 "check",则仓库将与列表进行核对
缓存中的受信任仓库。如果它不在该列表中,则行为将回退到 ``trust_repo=False`` 选项。
行为将回退到 ``trust_repo=False`` 选项。
- 如果为 ``None``:这将引发警告,邀请用户将 ``trust_repo`` 设置为 ``False``、``True`` 或 ``"check"``。
将 `trust_repo` 设置为 `False`、`True` 或 `"check"`。这
仅用于向后兼容,将在 v2.0 版本中删除。
v2.0 版本。
默认为 `None`,最终将在 v2.0 版本中更改为 `"check"`。
示例:
>>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_HUB)
>>> print(torch.hub.help("pytorch/vision", "resnet18", force_reload=True))
"""
仓库目录 = _get_cache_or_reload(
github,
强制重新加载,
信任的仓库,
帮助,
详细模式=True,
跳过验证=
跳过验证,
)
替换为
添加到系统路径(
仓库目录):
hubconf 路径 = os.
路径.
连接(
仓库目录,
模块配置中心)
模块库 =
导入模块(
模块配置中心,
配置路径)
条目 =
从中心配置加载条目(
中心模块,
模型)
返回
条目.__doc__
[文档]
定义
加载(
仓库或目录,
模型,
*参数,
源=
GitHub,
信任的仓库=
无,
强制重新加载=False,
详细模式=True,
跳过验证=False,
**关键字参数,
):
r""
从 GitHub 仓库或本地目录加载模型。
注意:加载模型是典型用例,但这也可用于加载其他对象,例如分词器、损失函数等。
用于加载其他对象,如分词器、损失函数等。
如果 `source` 是 'github',则期望 `repo_or_dir` 是以下形式
``repo_owner/repo_name[:ref]``,其中 `ref` 是可选的
引用(一个标签或分支)。
如果 `source` 是 'local',则期望 `repo_or_dir` 是一个
本地目录的路径。
参数:
repo_or_dir(字符串):如果 `source` 是 'github',
这应该对应一个格式为 ``repo_owner/repo_name[:ref]`` 的 GitHub 仓库
可选的 ref(标签或分支),例如 'pytorch/vision:0.10'。如果 ``ref`` 未指定,
则默认分支为 ``main``(如果存在),否则为 ``master``。
如果 ``source`` 是 'local',则它应该是本地目录的路径。
模型(字符串):在代码中定义的可调用(入口点)名称。
仓库/目录的 ``hubconf.py`` 文件。
*args(可选):对应于可调用 ``model`` 的参数。
源(字符串,可选):'github' 或 'local'。指定了如何
``repo_or_dir`` 需要被解释。默认为 'github'。
trust_repo (布尔值、字符串或 None): ``"check"``, ``True``,``False`` 或 ``None``。
此参数自 v1.12 版本引入,有助于确保用户
只运行他们信任的仓库中的代码。
如果为 ``False``,则会提示用户是否应该信任该仓库。
如果为 ``True``,则该仓库将被添加到信任列表中,无需明确确认即可加载。
- 如果 ``True``,该仓库将被添加到信任列表中,无需明确确认即可加载。
- 如果为 ``True``,则该仓库将被添加到信任列表中,无需明确确认即可加载。
- 如果是 "check",则仓库将与列表进行核对
缓存中的受信任仓库。如果它不在该列表中,则行为将回退到 ``trust_repo=False`` 选项。
行为将回退到 ``trust_repo=False`` 选项。
- 如果为 ``None``:这将引发警告,邀请用户将 ``trust_repo`` 设置为 ``False``、``True`` 或 ``"check"``。
将 `trust_repo` 设置为 `False`、`True` 或 `"check"`。这
仅用于向后兼容,将在 v2.0 版本中删除。
v2.0 版本。
默认为 `None`,最终将在 v2.0 版本中更改为 `"check"`。
强制重新加载(布尔值,可选):是否强制重新下载
无条件地打开 github 仓库。如果 source = 'local',则没有效果。
``source = 'local'``。默认为``False``。
verbose(布尔值,可选):如果 ``False``,则静音关于命中本地缓存的提示
注意,关于首次下载的消息无法
静音。如果 source = 'local',则没有效果。
默认为``True``。
skip_validation (bool, 可选): 如果为 ``False``,torchhub 将检查分支或提交
指定给 ``github`` 参数的值应正确属于仓库所有者。这将使
请求 GitHub API;您可以通过设置非默认 GitHub 令牌来指定
GITHUB_TOKEN 环境变量。默认为 False。
**kwargs(可选):用于调用 ``model`` 的相应 kwargs。
返回值:
当使用给定参数调用 ``model`` 可调用对象时,``model`` 的输出。
`*args` 和 `**kwargs`。
示例:
>>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_HUB)
>>> 来自 GitHub 仓库
>>> repo = "pytorch/vision"
>>> model = torch.hub.load(
... 仓库, "resnet50", weights="ResNet50_Weights.IMAGENET1K_V1"
... )
>>> # 从本地目录
>>> path = "/some/local/path/pytorch/vision"
>>> # xdoctest: +SKIP
>>> model = torch.hub.load(path, "resnet50", weights="ResNet50_Weights.DEFAULT")
"""
源 =
源.
小写()
如果
源 not
进入 (
GitHub,
本地):
抛出
值错误(
f未知来源:{
源}
允许的值: "github" | "本地"。
)
如果
源 ==
GitHub:
仓库或目录 = _get_cache_or_reload(
仓库或目录,
强制重新加载,
信任的仓库,
加载,
详细模式=
详细模式,
跳过验证=
跳过验证,
)
模型 =
加载本地(
仓库或目录,
模型, *
参数, **
关键字参数)
返回
模型
定义
加载本地(
配置目录,
模型, *
参数, **
关键字参数):
r""
从本地目录加载一个带有 `hubconf.py` 的模型。
参数:
配置目录 (str): 包含配置的本地目录路径
``hubconf.py``.
model (str): 该目录中定义的入口点的名称
``hubconf.py``.
*args(可选):对应于可调用 ``model`` 的参数。
**kwargs (可选): 可调用对象 ``model`` 对应的 kwargs 参数。
返回值:
单一模型及其对应的预训练权重。
示例:
>>> # xdoctest: +SKIP("stub local path")
>>> 路径 = "/some/local/path/pytorch/vision"
>>> model = _load_local(
... 路径,
... "resnet50",
... weights="ResNet50_Weights.IMAGENET1K_V1",
... )
"""
替换为
添加到系统路径(hubconf_dir):
hubconf 路径 = os.
路径.
连接(
hubconf_dir
库配置目录, 模块配置中心)
模块库 =
导入模块(
模块配置中心,
配置路径)
条目 =
从中心配置加载条目(
中心模块,
模型)
模型 =
条目(*
参数, **
关键字参数)
返回
模型
[文档]
定义
下载到文件的 URL(
网址: str,
目标: str,
哈希前缀:
可选[str] =
无,
进度:
布尔值 = True,
) -> 无:
r下载给定 URL 的对象到本地路径。
参数:
url(字符串):要下载的对象的 URL
dst (str):对象保存的完整路径,例如 ``/tmp/temporary_file``
hash_prefix (str, optional):如果非 None,则下载的 SHA256 文件应以 ``hash_prefix`` 开头。
默认:None
progress (bool, optional):是否在 stderr 中显示进度条
默认: True
示例:
>>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_HUB)
>>> # xdoctest: +REQUIRES(POSIX)
>>> torch.hub.download_url_to_file(
... "https://s3.amazonaws.com/pytorch/models/resnet18-5c106cde.pth",
... "/tmp/temporary_file",
... )
"""
文件大小 =
无
req = 请求(
网址,
头部信息={
用户代理:
torch.hub})
u = 打开网址(req)
元数据 = u.
信息()
如果
有属性(
元数据,
获取头部信息):
内容长度 =
元数据.
获取头部信息(
Content-Length)
否则:
内容长度 =
元数据.
获取所有(
Content-Length)
如果
内容长度
是 not
无
和
长度(
内容长度) > 0:
文件大小 = int(
内容长度[0])
我们故意将其保存在临时文件中,之后移动它
下载完成。这防止了本地工作检查点
# 被损坏的下载覆盖。
我们故意不使用 NamedTemporaryFile 以避免限制性
应用到下载文件的文件权限。
dst = os.路径.expanduser(
目标)
对于 _
在
范围(
临时文件.TMP_MAX):
tmp_dst = dst + "." + uuid.uuid4().十六进制 +
".部分"
尝试:
f = 打开(
tmp 目标, "w+b")
除了
文件已存在错误:
continue
断开
否则:
抛出
文件已存在错误(
错误号.
文件已存在,
没有找到可用的临时文件名)
尝试:
如果
哈希前缀
是 not
无:
sha256 = hashlib.sha256()
替换为 tqdm(
总计=file_size,
禁用=not
进度,
单位="B",
单位比例=True,
单位除数=1024,
) as 进度条:
当 True:
缓冲区 = u.
阅读(
读取数据块)
如果
长度(
缓冲区) == 0:
断开
f.写(
缓冲区) # type: ignore[possibly-undefined]
如果
哈希前缀
是
不
无:
sha256.更新(
缓冲区) # type: ignore[possibly-undefined]
进度条.
更新(
长度(
缓冲区))
f.关闭()
如果
哈希前缀
是
不
无:
摘要 = sha256.
摘要() # type: ignore[possibly-undefined]
如果
摘要
[
长度(
哈希前缀)] !=
哈希前缀:
抛出 RuntimeError(
f'无效的哈希值(预期 "'{
哈希前缀}
',实际得到 "'{
摘要}
')'
)
shutil.移动(f.
姓名,
目标)
最后:
f.关闭()
如果 os.
路径.
存在(f.
名称):
os.删除(f.
姓名)
用户手动压缩的 zip 文件中自动提取的 Hub。
旧版 zip 格式期望 zip 文件中只包含一个 torch.save() < 1.6 的文件。
由于 zipfile 现在是 torch.save()的默认 zip 格式,我们应该移除这个支持。
定义 _is_legacy_zip_format(
文件名: str) -> bool:
如果
压缩包.is_zipfile(
文件名):
infolist = 压缩包.ZipFile(
文件名).
信息列表()
返回
长度(
信息列表) == 1
和 not
信息列表[0].
是否为目录()
返回
假
@deprecated(
"回退到旧格式 < 1.6。此支持将被 "
"已弃用,改用从 1.6 版本引入的默认 zip 文件格式。"
"请重新执行 torch.save()以使用新的 zip 文件格式保存。",
类别=
未来警告,
)
定义 _legacy_zip_load(
文件名: str,
模型目录: str,
地图位置:
地图位置,
仅权重: bool,
) -> 字典[str,
任何
]
# 注意:extractall() 默认如果文件存在则覆盖。无需事先清理。
我们故意不处理 tarfile,因为我们的旧序列化格式是在 tar 中。
例如,广泛使用的 resnet18-5c106cde.pth。
替换为
压缩包.ZipFile(
文件名) as f:
成员 = f.
信息列表()
如果
长度(
会员) != 1:
抛出 RuntimeError(
"仅允许 zip 文件中有一个文件(不是目录)")
f.提取所有(
模型目录)
解压后的名称 =
会员[0].
文件名
提取的文件 = os.
路径.
连接(
模型目录,
提取名称)
返回
火炬.
加载(
提取文件,
地图位置=
地图位置,
仅权重=
仅权重
)
[文档]
定义
从 URL 加载状态字典(
网址: str,
模型目录:
可选[str] =
无,
地图位置:
地图位置 =
无,
进度:
布尔值 = True,
检查哈希:
布尔值 = False,
文件名:
可选[str] =
无,
仅权重:
布尔值 = False,
) -> 字典[str,
任何
]
r加载给定 URL 处的 Torch 序列化对象。
如果下载的文件是 zip 文件,它将被自动解压缩。
如果对象已存在于`model_dir`中,则进行反序列化。
如果对象已存在于`model_dir`中,则进行反序列化。
返回。
默认值 `model_dir` 是 `/checkpoints`
`hub_dir` 是由 :func:`~torch.hub.get_dir` 返回的目录。
参数:
url(字符串):要下载的对象的 URL
model_dir (str, 可选): 保存对象的目录
map_location (可选): 指定如何重映射存储位置的函数或字典(参见 torch.load)
progress (bool, 可选): 是否在 stderr 上显示进度条
默认: True
check_hash(bool, 可选): 如果为 True,URL 的文件名部分应遵循命名约定
``filename-.ext`` 其中 ```` 是文件内容 SHA256 哈希值的前八个或更多
位数字。该哈希用于确保名称唯一并验证文件内容。
确保名称唯一并验证文件内容。
默认:False
file_name (str, 可选): 下载文件的名称。如果未设置,将使用 ``url`` 中的文件名。
weights_only(bool, 可选): 如果为 True,则只加载权重,不加载复杂的 pickled 对象。
建议用于不受信任的来源。有关更多详细信息,请参阅 :func:`~torch.load`。
示例:
>>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_HUB)
>>> state_dict = torch.hub.load_state_dict_from_url(
... "https://s3.amazonaws.com/pytorch/models/resnet18-5c106cde.pth"
... )
"""
# Issue warning to move data if old env is set
如果 os.
获取环境变量("TORCH_MODEL_ZOO"):
警告.
警告(
"TORCH_MODEL_ZOO 已弃用,请使用 env TORCH_HOME 代替"
)
如果
模型目录
是
无:
仓库目录 =
获取目录()
模型目录 = os.
路径.
连接(
hub 目录,
检查点)
os.创建多级目录(
模型目录, exist_ok=True)
部分 = urlparse(
网址)
文件名 = os.
路径.basename(parts.
路径)
如果
文件名
是
不
无:
文件名 =
文件名
缓存文件 = os.
路径.
连接(
模型目录,
文件名)
如果
不 os.
路径.
存在(
缓存文件):
系统模块.
标准输出.
写(f
下载中:{
网址}
“到”{
缓存文件}
输入文本翻译为简体中文为:\n')
哈希前缀 =
无
如果
检查哈希:
r = HASH_REGEX.搜索(
文件名)
# r 是 Optional[Match[str]]
哈希前缀 = r.
组(1)
如果 r
否则
无
下载到文件的 URL(
网址,
缓存文件,
哈希前缀,
进度=
进度)
如果 _is_legacy_zip_format(
缓存文件):
返回 _legacy_zip_load(
缓存文件,
模型目录,
地图位置,
仅权重)
返回
火炬.
加载(
缓存文件,
地图位置=
地图位置,
仅权重=
仅权重)