PyTorch入门必学:用dir()和help()快速摸清API与环境配置 1. 两个内置函数凭什么成为PyTorch入门的探照灯很多同学第一次打开 PyTorch 官方文档时心态基本是崩溃的——满屏的torch.xxx、torch.Tensor.xxx看两行就想关掉。我当初跟《PyTorch深度学习》这套教程学的时候第 1 节还在折腾 Python 和 PyTorch 安装第 2 节作者就直接抛出一个特别反直觉的结论Python 里最该先学透的不是 numpy不是 matplotlib而是自带的dir()和help()。这两个函数看着不起眼但它们是打开一切陌生库的钥匙。深度学习框架更新太快网上博客很容易过时可你本机安装的这个 torch 版本它的属性和说明是写在代码里的永远和当前版本对得上。学会用dir()看它有什么用help()看它怎么用才是真正的一劳永逸。不信的话可以对比一下遇到陌生 API 时的几种常见做法遇到不认识的函数时典型做法实际结果盲猜或者照抄别人代码看到squeeze就用行为完全看运气后续一改参数就懵去搜索引擎翻博客花十几分钟找教程版本旧、讲偏、经常浪费时间先用 dir/help 本地确认看签名和参数说明几分钟内就知道自己该试什么别小看这个顺序问题。很多人学 PyTorch 卡住不是因为不够努力而是因为找答案的方法不对。把dir()和help()当成查字典的工具后面你再遇到Dataset、DataLoader、transforms、nn.Module、optim这些概念时就不是等着别人喂答案而是自己动手把它们翻个底朝天。这篇笔记正好对应教程笔记 2 的内容我会结合自己踩过的坑把 Python 环境、PyCharm 环境调用、dir()、help()的实用场景完整梳理一遍。所有代码都能直接在 PyCharm 里跑你不用额外装任何东西。2. 动手之前把Python环境、PyCharm和PyTorch的关系理清2.1 Python解释器、PyCharm、PyTorch到底是什么关系新手最容易搞混的就是这三者的关系。打个比方Python 解释器是发动机PyTorch 是装进发动机里的工具箱而 PyCharm 是驾驶室里的仪表盘。仪表盘本身不能当发动机用它只是调用发动机如果发动机里没装工具箱你在仪表盘上按一万次按钮也没用。这句话翻译成实际报错就是你在 PyCharm 里运行import torch结果ModuleNotFoundError: No module named torch但你在终端用命令pip list又能看到 torch。出现这种矛盾几乎都是因为 PyCharm 里选中的 Python 解释器和安装 PyTorch 时用的 Python 解释器不是同一个。所以环境配置的第一原则是先确定一个解释器安装 PyTorch、让 PyCharm 引用都在同一个解释器上操作。2.2 一套稳一点的环境搭建顺序如果你是完全零基础直接按下面这套来能避开大部分环境坑安装 Python建议 3.8 到 3.10 这个区间太老的版本对不上新版 PyTorch太新的版本有些轮子还没跟上。安装 PyCharm Community Edition社区版去官网下载就行学习阶段用社区版完全够。打开 PyCharm 新建项目时注意看右下角或者弹窗里的Python Interpreter选项不要直接用默认的虚拟环境尽量选择你刚安装的那个 Python。在 PyCharm 底部打开 Terminal执行安装命令安装 PyTorchpip install torch torchvision torchaudio如果电脑没有 NVIDIA 显卡或者暂时不想折腾 GPU可以装 CPU 版pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu这里专门解释一下为什么要用--index-urlPyTorch 官网会把 CPU 版和 GPU 版放在不同的 wheel 仓库里如果你直接pip install torch默认装的很可能是 GPU 版。等运行torch.cuda.is_available()时输出False新手容易慌觉得自己装坏了。其实没坏只是你没显卡或者没装驱动而已。如果你愿意用 Anaconda 管理环境也可以这样建一个独立环境conda create -n torchlearn python3.9 -y conda activate torchlearn conda install pytorch torchvision torchaudio cpuonly -c pytorch我个人比较推荐新手用 Anaconda因为环境隔离做得清楚装坏了直接删掉重建不污染系统 Python。2.3 安装完之后怎么验证在 PyCharm 里新建一个 Python 文件比如check_env.py写这几行import torch print(PyTorch 版本:, torch.__version__) print(CUDA 是否可用:, torch.cuda.is_available())如果能打印出版本号说明解释器、IDE、库已经全部打通。这一步你以后每次新建项目都要做一遍不要嫌烦这是排查装完却调不起来最快的方法。2.4 关于 pip 报 ResolutionImpossible 的经验搜索结果里经常能看到这样一条报错ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/to...我第一次看到也愣了半天翻译过来就是pip 在你指定的这些包约束里找不到一组能同时满足所有要求的版本组合。出现这个问题主要有两种情况。一种是你在一个已经有很多包的环境里硬装某个旧版本比如pip install torch1.13.1但环境里又有 numpy、pillow 等高版本包彼此要求冲突pip 解析器直接放弃。另一种是混用了多个镜像源比如一部分包来自默认 PyPI一部分来自镜像导致解析时版本对不上。处理办法不是去跟 pip 搏斗而是直接新建一个干净环境然后只装必要包python -m venv .venv如果是 Windows激活.venv\Scripts\activate如果是 macOS 或 Linuxsource .venv/bin/activate激活后升级一下 pip再单独安装 PyTorch。这样基本不会再遇到 ResolutionImpossible。下面这张表是我见过的高频安装报错汇总建议直接收藏报错现象常见原因处理方向ModuleNotFoundError: No module named torchPyCharm 解释器选错或 torch 没装进当前解释器检查 PyCharm Settings 里的 Python InterpreterERROR: ResolutionImpossible版本依赖冲突或镜像源混用新建干净环境只装必需包torch.cuda.is_available()返回False装的是 CPU 版或无 N 卡驱动按需换 GPU 版或直接用 CPU 版学习下载速度极慢访问国外源网络不稳定在基础环境里配置国内 PyPI 镜像并保持单一源pip不是内部或外部命令Python 未加入系统 PATH重装 Python 时勾选 Add to PATH或改用python -m pip3. dir()把模块翻个底朝天找出你想用的东西3.1 dir() 到底返回什么dir()的作用很简单把某个对象的属性名全部罗列出来。它可以作用在模块上、类上、对象上甚至是函数上。先看最直观的例子import torch # 去掉下划线开头的内容看起来更清爽 public [name for name in dir(torch) if not name.startswith(_)] print(torch 公共接口数量:, len(public)) print(public)运行后你会看到一长串名字里面包含add、cat、conv2d、rand、tensor之类的内容。这就是 torch 模块对外暴露的家门谱你想知道这个模块能干什么先扫一眼这个列表比什么都强。不过老实说直接打印整个列表还是有点吓人因为太多了。这时候可以用过滤条件缩小范围。3.2 用关键词过滤精准定位候选函数比如我现在想创建一个随机张量但记不住到底是rand、random还是randn。那就直接把带rand的名字全过滤出来import torch rand_related [name for name in dir(torch) if name.startswith(rand)] print(rand_related)输出会是类似[rand, rand_like, randint, randn, randperm]看到这一小撮候选人心里就有底了torch.rand生成 0 到 1 之间均匀分布的随机数torch.randn生成标准正态分布的随机数torch.randint生成整数随机数torch.randperm生成 0 到 n-1 的随机排列还没看官方文档光凭命名习惯你就能猜个八九不离十。接下来再用help()去确认细节就行。这个按关键词过滤的思路非常通用。以后你想找和均值相关的mean_related [name for name in dir(torch) if mean in name.lower()] print(mean_related)想找和拼接相关的cat_related [name for name in dir(torch) if cat in name.lower()] print(cat_related)你会发现dir()不是一个死板的列表它更像一个本地搜索引擎。参数里的关键词就是你的搜索词。3.3 在张量和模型对象上使用 dir()dir()不止能查模块还能查具体的张量对象。比如import torch x torch.tensor([1.0, 2.0, 3.0]) methods [name for name in dir(x) if not name.startswith(_)] print(methods)你会看到abs、add、cpu、cuda、mean、numpy、reshape、sum等方法。这会告诉你这个张量对象本身能做哪些事不需要额外调别的函数。在定义完一个模型之后这个技巧更有用import torch.nn as nn model nn.Linear(4, 2) model_attrs [name for name in dir(model) if not name.startswith(_)] print(model_attrs)你会看到train、eval、parameters、state_dict、forward这些方法。后边训练模型的时候经常要调用model.train()、model.eval()、model.state_dict()如果你早就用dir()瞄过一眼后面看代码就不会觉得陌生。3.4 一个小建议把接口清单导出成文件dir()返回的是字符串列表所以你可以非常方便地把它写进文本文件里方便随时翻import torch with open(torch_api.txt, w, encodingutf-8) as f: f.write(\n.join([name for name in dir(torch) if not name.startswith(_)]))这样你以后看到某个函数名想查它是干嘛的直接在文本编辑器里搜索就行比每次运行代码打印更快。这个小技巧帮我省了不少时间。4. help()把函数签名和参数说明读到懂4.1 help() 给你的是当前版本的说明书dir()告诉你有什么help()告诉你这个东西怎么用。它显示的内容其实就是对象的__doc__文档字符串外加函数的完整签名。比如查torch.tensorimport torch help(torch.tensor)你会看到一个非常典型的输出Help on built-in function tensor in module torch: tensor(data, *, dtypeNone, deviceNone, requires_gradFalse, pin_memoryFalse) - Tensor Constructs a tensor with data.第二部分不用全看重点看第一行签名。这一行会告诉你第一个参数是data必填可以是列表、numpy 数组等dtype是可选参数用来指定张量类型比如torch.float32device是可选参数指定放到 CPU 还是 GPUrequires_grad是布尔值如果设为TruePyTorch 会自动记录参与梯度计算的操作这是后续反向传播的基础有了这行签名你至少知道怎么构造一个张量了也大概知道梯度是怎么打开的。比较半天博客不如本地敲一次help(torch.tensor)来得准。4.2 同名函数没关系help() 能帮你对比差异PyTorch 里有个容易困扰新手的地方同一个功能既有函数式写法也有方法式写法。比如torch.max和torch.Tensor.maxhelp(torch.max)输出会提示torch.max有三种用法max(input) - Tensor max(input, dim, keepdimFalse, *, outNone) - (Tensor values, LongTensor indices) max(input, other) - Tensor这个信息太关键了。很多人一开始只会用torch.max(x)获取最大值却不知道加上dim参数后它会返回两个值一个是最大值一个是对应的下标。做分类任务时我们经常要拿到预测类别下标用的就是这个带dim的版本。如果你不看help()很难从名字猜到这个细节。再比如help(torch.Tensor.reshape) help(torch.reshape)两者签名差不多都是把张量形状改成目标形状但一个是张量对象直接调用一个是独立函数调用。你实际用哪个都行但明白它们的等价关系看别人代码时就不会被两种写法绕晕。4.3 help() 内容太长怎么办help()有时候输出特别长比如查torch.nn.Module几屏都翻不完。这很正常不要硬看。新手只需要抓两个重点第一行签名和每个参数的意思。如果你只想快速瞄一眼第一段说明可以直接打印文档字符串还能用切片控制长度print(torch.Tensor.reshape.__doc__)或者只看前 300 个字符print(torch.Tensor.reshape.__doc__[:300])不过我自己的习惯是遇到复杂 API先help()看签名然后去 PyCharm 里随便造一个最小样本跑一下看看输入输出形状。跑出来的结果比看十行文字都直观。4.4 在 PyCharm 控制台里体验更丝滑如果你使用的是 PyCharm 底部的 Python Console其实还有个更方便的方式。在控制台输入torch.tensor?回车后它和help(torch.tensor)效果类似但展示方式更友好签名和文档会直接列出来。如果输入两个问号torch.tensor??还能尝试展开源码。PyTorch 底层很多是 C 实现的Python 层可能只能看到签名看不到具体实现不过对使用来说已经足够了。还值得一提的是help()不仅对 torch 有效对你自己写的函数同样有效。你只要在函数里写了文档字符串def my_loss(pred, target): 计算预测值和真实值之间的均方误差。 return ((pred - target) ** 2).mean() help(my_loss)就会输出你写的那行...注释。这能帮你养成写注释的习惯也让你的代码更规范。5. PyCharm实战用一套查字典流程搞定陌生API5.1 打开 Python Console先别急着写完整代码我不建议你一上来就对着项目文件写大段脚本。遇到不认识的 API先在 PyCharm 的 Python Console 里试。在 PyCharm 里Python Console 就像一个交互式解释器你输入一行代码它立刻执行并返回结果非常适合做 API 探测。比如我想搞清楚 torch 里和loss相关的函数都有哪些import torch candidates [x for x in dir(torch) if loss in x.lower()] print(candidates)然后挑一个重点看help(torch.nn.functional.mse_loss)就这样一步一步把范围从整个模块缩小到某个具体函数再缩小到函数签名整个过程不超过两分钟。5.2 建议的查字典流程以后你碰到任何陌生模块都可以用同一套固定流程不用动脑子想下一步干什么根据名字猜意图。比如看到transforms猜它和数据预处理有关。用dir(模块)找到候选函数或候选类。用help(候选对象)看签名和关键参数。造一个最小例子跑一遍看输入输出。如果还不行再跳到官方文档或者 Ctrl点击函数名看源码。这套流程的价值在于它把我要搜索一个问题变成了我要执行一套本地侦察动作。搜索是发散且看运气的而本地侦察是确定性的结果永远来自你的当前版本。5.3 完整演示用 dir/help 看懂 transforms.Compose我拿教程后面必然遇到的transforms来演示一遍完整流程。先在控制台输入from torchvision import transforms names [x for x in dir(transforms) if Compose in x or Resize in x] print(names)输出类似[Compose, Resize]再查Composehelp(transforms.Compose)你会看到它的核心说明这个类会把多个 transform 按顺序组合成一个整体。于是你立刻明白一段典型代码为什么是这么写的from torchvision import transforms from PIL import Image img Image.new(RGB, (64, 64)) t transforms.Compose([ transforms.Resize((32, 32)), transforms.ToTensor(), ]) out t(img) print(out.shape)运行后如果输出torch.Size([3, 32, 32])就说明你的猜测完全正确输入是一张 HWC 的图像经过组合变换后变成了 CHW 的张量尺寸也变成了 32×32。整个过程里我没有查任何网页全部答案都来自本机的dir()、help()和小实验。遇到新版本 API 变更时这种方法永远不会因为博客过时给你错误信息。5.4 在编辑器里用快捷键辅助除了手写dir()和help()PyCharm 本身也提供了几条捷径在编辑器中输入torch.后按Ctrl Space会自动弹出属性列表。这相当于一个实时的dir()。把鼠标悬停在某个函数名上PyCharm 会浮窗显示它的文档摘要相当于轻量版help()。把光标放在某个函数名上按Ctrl Q会弹出完整的 quick documentation比悬停信息更详细。按住Ctrl再点击函数名会跳转到这个函数的源码或类型存根文件。这里特别说一下最后一条。很多时候你 Ctrl点击torch.cat看到的不是传统 Python 源码而是一个.pyi文件内容只有函数签名和注释。不要慌这不是装错了.pyi是类型存根文件就是给 IDE 和开发者看接口用的。PyTorch 大部分底层是 C 或 CUDA 实现Python 层只是一个封装外壳所以你能看到的最细致 Python 信息往往就是这些签名。6. 我踩过的三个坑以及给你的一套入门练法6.1 坑一装完 torchPyCharm 却报 ModuleNotFoundError有一次我在系统 Python 里用pip install torch装好了库然后新建 PyCharm 项目一运行import torch就报错。我折腾了大半天重装了好几次最后才发现 PyCharm 默认给新项目创建了一个全新的虚拟环境根本不是我装 torch 的那个解释器。正确的做法是在 PyCharm 里打开File - Settings - Project - Python Interpreter看一眼当前选中的解释器路径。如果不是你安装 torch 的那个解释器点右上角的齿轮选择 Add Interpreter然后选 Existing 或 Conda Environment指向正确的环境。排查的时候最快的方法是先打印当前解释器路径import sys print(sys.executable)再在终端里用同样的解释器去检查 torchpython -c import torch; print(torch.__version__)如果这行命令输出正常而 PyCharm 里运行报错那问题一定出在解释器匹配上不要再重装 torch 了。6.2 坑二在终端执行 pip install但装的不是当前环境Windows 下特别容易遇到这种情况你在任意文件夹打开命令行输入pip install torch结果它安装到了系统的某个 Python 环境里而 PyCharm 项目使用的是 Anaconda 环境两边根本不通。我现在的习惯是不直接用裸pip而是用python -m pippython -m pip install torch torchvision torchaudio这样能够保证安装到当前激活环境对应的 Python 里。如果你用 Anaconda更稳妥的是先激活环境再安装conda activate torchlearn python -m pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu6.3 坑三在终端输入 help() 后卡住不知道怎么退出如果你在自己电脑的终端里运行python help(torch)进去以后屏幕可能停在一大段文档里按什么键都没反应你以为死机了。其实它是在分页显示文档按一下q就能退出。在 PyCharm 的 Python Console 里一般不会这样但如果你习惯了在终端操作这个q一定要记住。还有如果你只在终端输入了help()没带参数它会进入交互式帮助模式提示符变成help。想退出的话直接输入q然后回车或者按Ctrl C。6.4 一套只靠 dir/help 完成的入门小练习光看不练没效果。我提供一个练习要求很简单不许查网页不许用搜索引擎只准用dir()、help()和少量打印代码完成下面四个任务创建一个形状为[3, 4]的均匀分布随机张量。把它变换成[4, 3]的形状。计算所有元素的平均值。找出沿dim1方向的最大值及对应下标。如果你卡住了就按这个线索走import torch # 先找随机函数 rand_names [x for x in dir(torch) if x.startswith(rand)] print(rand_names) # 再找形状变换和方法 print([x for x in dir(torch.Tensor) if reshape in x or view in x]) # 最后查看 max 的帮助 help(torch.max)参考答案可以是这样import torch x torch.rand(3, 4) print(随机张量:, x.shape) y x.reshape(4, 3) print(变换后的形状:, y.shape) print(所有元素的均值:, y.mean()) values, indices y.max(dim1) print(dim1 方向最大值:, values) print(dim1 方向最大值下标:, indices)练完这套你会发现一个明显变化看到陌生 API 的第一反应不再是到处搜而是直接在本地敲两行代码自己看。这个习惯一旦养成后面学Dataset、DataLoader、nn.Module、optim全都顺很多。我个人学完这套笔记后的体会是真正让入门速度差出几倍的不是谁记的函数多而是谁更会查。PyTorch 的函数成千上万你不可能全记住但只要你掌握dir()和help()这两个最基础的 Python 内置函数任何一个新出的模型库你都有能力自己把它拆开、看清楚、再用起来。这就是教程里反复强调两大法宝的原因。