ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TensorFlow 中文版 PDF:离线查阅、版本对齐与 API 速查

TensorFlow 中文版 PDF:离线查阅、版本对齐与 API 速查 简介TensorFlow官方文档中文版.pdf 面向机器学习初学者与算法工程师源自 Google 开源机器学习系统 TensorFlow 官方文档的协同翻译项目可帮助读者在缺少英文阅读条件时快速理解框架运作机制并上手建模实践。资源包共 1 个文件为单一 PDF 文档压缩包约 5.45MB下载后可离线阅读。目录覆盖下载安装、基本用法、MNIST 机器学习入门、TensorFlow 运作方式、变量创建与保存加载、TensorBoard 可视化与图表、读取数据、线程与队列、添加新的 Op、自定义数据读取及 GPU 共享变量等章节并依次展开卷积神经网络、递归神经网络、字词向量表示与偏微分方程等进阶主题。文档另附术语表、常见问题汇总、BibTex 引用示例与相关资源索引便于按知识点检索与查漏补缺。目前已有 777 人学习适合希望系统梳理基础概念、理解计算图与变量机制并借助示例完成入门到进阶过渡的读者参考。1. 为什么一线工程师还需要手里有一份 TensorFlow 官方文档中文版 PDF内网开发机不联网tensorflow 安装包是离线 wheel 喂进去的环境跑通了下一步却卡在查 API——官网打不开浏览器缓存里那几页英文教程还是两年前的版本。这才是 TensorFlow 官方文档中文版 PDF 真正的使用场景它不是用来替代在线阅读的而是把教程、指南和 API 参考装订成一个能全文检索、能划重点、能打印的离线副本。它解决三件事教程页和 API 页不用在十几个标签之间来回跳术语的中英对照集中在一处代码块复制出来不会丢掉缩进。刚装完 tensorflow 找不到入口的人需要它在封闭环境里维护存量模型的人更需要它。近几年 tensorflow 与 pytorch 的流行趋势怎么来回拉扯那是选型会议上的话题手上的项目跑在哪个框架上才是今天要翻文档的理由。2. TensorFlow 官方文档中文版 PDF 的版本对齐与章节构成拿到一份 PDF 之后最容易犯的错是把它当成一本不带版本信息的通用手册。TensorFlow 的文档是按分支发布的r2.15的教程和r2.16的教程在 Keras 入口上就不是一回事。这一章先把版本锚点定下来再看这份 PDF 里到底有哪些内容、按什么顺序读最后给出教程能跑但 API 签名对不上时的排查路径。2.1 从 tensorflow 安装版本反推该拿哪一版文档第一步永远是先把本地环境里的真实版本打出来而不是凭记忆。很多人以为自己装的是最新版实际上虚拟环境里还留着半年前的 wheel# 一次把框架版本和解释器版本都打出来排查报错时经常要用 python -c import tensorflow as tf, sys; print(tf, tf.__version__); print(py, sys.version)输出的2.15.0这类字符串前两位就是文档分支的锚点。如果环境里已经有多个虚拟环境记得先which python确认自己激活的是哪一个否则会拿着 A 环境的版本号去翻开 B 环境的文档。pip 包版本对应文档分支标识读的时候要留意什么2.13 及更早r2.13 及更早tf.keras是唯一入口示例代码基本能直接跑2.14 / 2.15r2.14 / r2.15CPU 与 GPU 安装包开始拆分安装章节需要按平台对号2.16 及以上r2.16 及以上默认后端切到 Keras 3大量旧写法的模型构建代码需要改写提示不要拿 2.x 的中文版 PDF 去对照 1.x 的存量代码。tf.Session、tf.placeholder这些符号在 2.x 文档里已经查不到翻半天只会怀疑自己记错了。确定版本之后把对应分支的 PDF 按r2.15这样的标识重命名存一份比如tf_docs_zh_r2.15.pdf。同一台机器上并存两三个版本是常事文件名不带分支标识半年后自己都分不清哪份是哪份。2.2 中文版 PDF 的章节构成与推荐阅读顺序一份完整的 TensorFlow 官方文档中文版 PDF正文通常由四块组成安装与快速入门、教程Tutorials、指南Guides、API 参考。这四块的信息密度差别极大——教程适合照着敲指南适合理解设计意图API 参考只适合当字典查从头读到尾没有任何意义。推荐的顺序是先跑通最短的那个端到端示例建立“数据进、模型出”的直觉再读tf.data和模型保存加载这两块指南然后才开始翻 API 参考自定义训练循环、分布式策略这类内容放到最后按需查阅。想快速确认手里这份 PDF 到底收了哪些章节可以先把它自己的目录抽出来看看比一页页翻快得多import fitz # PyMuPDF装法pip install pymupdf doc fitz.open(tf_docs_zh_r2.15.pdf) toc doc.get_toc() # 返回 [[层级, 标题, 页码], ...] print(f总页数 {doc.page_count}目录条目 {len(toc)}) for level, title, page in toc: if level 2: # 只打一级和二级避免目录本身就刷屏 print( * (level - 1) f{title} (p.{page}))get_toc()读的是 PDF 内嵌的书签结构如果输出是空列表说明这份文件在生成时没有写入书签那就只能靠全文检索定位章节了。2.3 版本漂移教程能跑、API 签名对不上怎么排查最典型的症状是AttributeError: module tensorflow has no attribute xxx或者参数名对得上但关键字不认。这类问题的九成原因是文档版本和 pip 版本错位剩下一成是自己记混了。与其盯着 PDF 里的参数表反复看不如直接问运行时的解释器要签名。pip 包里的 docstring 和当前环境是严格同步的它才是唯一的真相来源import inspect import tensorflow as tf def show_signature(obj_path: str) - None: 按点号路径取出 tf 下的对象打印它的调用签名 obj tf for part in obj_path.split(.)[1:]: # 跳过开头的 tf obj getattr(obj, part) print(obj_path) print( , inspect.signature(obj)) show_signature(tf.keras.optimizers.Adam) show_signature(tf.data.Dataset.from_tensor_slices) show_signature(tf.keras.layers.Dense)inspect.signature返回的是真实的参数列表包含默认值和关键字约束。把它和 PDF 里的参数表逐项比对差异通常集中在两类一类是新增的必需参数另一类是被重命名或废弃的关键字。确认差异之后回到 PDF 里搜那个函数名看看所在章节标注的版本号是不是和你本地一致。注意help(tf.keras.layers.Dense)输出的内容比inspect.signature更啰嗦但包含示例代码和参数含义适合查“这个参数到底怎么用”签名只适合快速确认“有没有这个参数”。3. 从官方 docs 站点生成 TensorFlow 官方文档中文版 PDF 的流水线现成的 PDF 不一定覆盖你需要的分支有时候要的只是某一组教程页按自己的顺序装订成册。这一章讲完整链路定向抓取 HTML、清洗正文、选择渲染方案、处理中文字体和代码块换行。整条链路都是可复现的改几个变量就能套到别的文档站点上。3.1 用 requests BeautifulSoup 定向抓取教程页抓取之前先明确边界只抓自己要读的那几页不遍历全站请求之间留出间隔。文档站点通常有 robots.txt 和版权声明个人离线查阅和批量再分发是两回事别越线。import time from pathlib import Path import requests from bs4 import BeautifulSoup BASE https://www.tensorflow.org OUT Path(tf_docs_html) OUT.mkdir(exist_okTrue) # 固定 UA方便对方站点识别来源超时设短一点避免卡死 HEADERS {User-Agent: Mozilla/5.0 (offline-docs-reader; personal use)} def fetch(path: str) - str: url f{BASE}{path} resp requests.get(url, headersHEADERS, timeout20) resp.raise_for_status() time.sleep(1.2) # 限速别给对方站点压力 return resp.text def save(path: str) - None: html fetch(path) name path.strip(/).replace(/, _) or index (OUT / f{name}.html).write_text(html, encodingutf-8) print(saved, name)time.sleep(1.2)每秒不到一个请求对站点几乎无感timeout20防止个别慢响应把整个批处理拖住raise_for_status()让 404 直接抛异常而不是把错误页当成正文存下来——错误页混进 PDF 之后非常难排查。3.2 pdf 解析的第一步剥离导航、侧边栏和无效锚点从网页渲染出来的 PDF最常见的三种脏数据是侧边栏目录混进正文、代码块丢失语言标记导致排版全变、正文里的锚点链接变成一堆#。这三件事在抽取阶段一次处理掉比事后在 PDF 里返工划算得多。def extract_main(html: str) - str: soup BeautifulSoup(html, html.parser) main soup.select_one(article) or soup.select_one(main) if main is None: return # 导航、侧栏、脚本、样式全部从树里摘掉 for tag in main.select(nav, aside, script, style, .devsite-nav): tag.decompose() # 给代码块打上语言标记后面排版样式靠它生效 for pre in main.find_all(pre): code pre.find(code) classes code.get(class, []) if code else [] lang next((c.split(-)[-1] for c in classes if c.startswith(language-)), text) pre[data-lang] lang return str(main)select_one的选择器要按目标站点的实际结构调很多文档站的正文章节容器类名是稳定的。decompose()会把节点从文档树里彻底移除比extract()更干净。给pre打># 单页转 PDF--print-media-type 会启用网页自带的打印样式表 wkhtmltopdf \ --enable-local-file-access \ --encoding utf-8 \ --print-media-type \ --footer-center [page] / [topage] \ --margin-top 18mm --margin-bottom 18mm \ chapter01.html chapter01.pdf--print-media-type是最容易被忽略的一个文档站点通常写了media print规则专门用来隐藏悬浮导航和“跳转到顶部”按钮加上这个参数这些元素会自动消失。--enable-local-file-access允许 HTML 引用同目录下的本地字体和图片不加的话相对路径资源会全部加载失败。--footer-center [page] / [topage]给每页加页码几百页的 PDF 没有页码基本没法用。逐页生成之后再用pdfunite chapter*.pdf tf_docs_zh.pdf合并成一本。3.4 中文字体嵌入与代码块换行这两个必调参数中文渲染出方块或者直接丢字根因通常是渲染器在系统里找不到中文字形然后静默回退到一个不含中日韩字形的字体。它不会报错只会让结果不可用所以字体必须在样式里显式声明。/* print.css —— 渲染时通过 --user-style-sheet 引入 */ body { font-family: Noto Sans CJK SC, Source Han Sans SC, PingFang SC, sans-serif; line-height: 1.7; } pre, code { font-family: JetBrains Mono, Noto Sans Mono CJK SC, monospace; white-space: pre-wrap; /* 长代码行换行否则右侧会被裁掉 */ word-break: break-all; background: #f6f8fa; padding: 8px 10px; border-radius: 4px; }white-space: pre-wrap是长文档的硬需求。一行超过页宽的训练脚本代码如果不换行右半边会被直接裁掉而且裁掉的部分没有任何提示。word-break: break-all保证像tf.keras.layers.experimental.preprocessing这种超长标识符也能断开。字体装到服务器上之后记得刷新一次字体缓存否则配置改了但渲染进程还是用旧的索引# 把字体文件放进用户字体目录后刷新缓存 mkdir -p ~/.fonts cp NotoSansCJKsc-Regular.otf ~/.fonts/ fc-cache -fv fc-list :langzh | head # 确认中文家族已经被识别到fc-list :langzh这条确认命令很关键。如果输出为空说明系统层面没认到中文字体这时候再怎么改 CSS 都没用。4. PDF 解析与本地检索把中文版 PDF 变成可查询的知识库装订成册只是第一步。一份几百页的 PDF如果只能靠阅读器的搜索框效率还是低。这一章把它拆开抽出结构化文本、建本地全文索引、再转出一份术语对照表让查文档这件事从“翻”变成“查”。4.1 PyMuPDF 三种抽取模式怎么选同一个页面抽取模式不同拿到的结果差别很大。选错模式会让后面的检索要么漏字要么多出莫名其妙的坐标模式返回内容适用场景get_text(text)纯文本按阅读顺序拼接全文检索、术语统计get_text(blocks)段落块 边界框坐标段落级高亮、重排get_text(words)每个词 坐标 字号关键词定位、字体分析import fitz doc fitz.open(tf_docs_zh_r2.15.pdf) page doc[120] plain page.get_text(text) blocks page.get_text(blocks) print(f纯文本 {len(plain)} 字段落块 {len(blocks)} 个) for x0, y0, x1, y1, text, *_ in blocks[:3]: # 坐标是 PDF 的用户空间单位原点在左上角 print(f[{x0:.0f},{y0:.0f}] {text[:40]!r})段落块的坐标是给高亮用的知道关键词在哪个块里就能反推出它在页面上的矩形区域配合阅读器做定位跳转。纯文本模式不做这个但拼接顺序更接近自然阅读顺序做检索最省事。4.2 SQLite FTS5 中文全文检索分词器这个坑绕不开SQLite 自带的 FTS5 模块开箱即用不用装任何额外服务建索引的代码短到可以贴进脚本里。问题在于默认的unicode61分词器按空白和标点切词中文整段没有空格会被当成一个超长 token搜什么都是零结果。import sqlite3 import fitz doc fitz.open(tf_docs_zh_r2.15.pdf) conn sqlite3.connect(tf_docs.db) # trigram 分词器按连续三字符切片中文不需要预先分词就能命中 conn.execute( CREATE VIRTUAL TABLE IF NOT EXISTS pages USING fts5(page_no, body, tokenize trigram) ) rows [(i, p.get_text(text)) for i, p in enumerate(doc, start1)] conn.executemany(INSERT INTO pages (page_no, body) VALUES (?, ?), rows) conn.commit() # 合并索引段检索前跑一次否则碎片多的时候会慢 conn.execute(INSERT INTO pages (pages) VALUES (optimize)) conn.commit() print(索引完成页数, len(rows))建好之后查询就是一条 SQL-- 找同时出现「混合精度」和「梯度」的页按相关度排序 SELECT page_no, snippet(pages, 1, [, ], …, 16) AS ctx FROM pages WHERE pages MATCH 混合精度 AND 梯度 ORDER BY rank LIMIT 10;trigram分词器有个必须记住的限制查询词至少要三个字符。搜两字词比如“张量”会命中不到任何结果得改写成“张量流”或者“张量 维度”这类三字以上的组合。用snippet()输出上下文比整页贴出来好读得多它的四个参数分别是列索引、左标记、右标记、省略号、上下文词数。ORDER BY rank用的是 FTS5 内置的 BM25 相关度不需要自己算。提示如果索引建好之后发现某几页搜不到先检查那几页是不是扫描图。图像页get_text()返回空字符串需要先过一遍 OCR 才有文本可索引。4.3 pdf 转 word / markdown 之后的术语对照表需要批注、改公式、或者把文档贴进笔记软件时pdf 转 word 是常见需求但转换后代码缩进基本保不住建议只转正文部分代码块单独用文本方式抽取。纯文本抽取阶段用pdftotext更快# -layout 保留原始排版适合看表格纯检索场景去掉它效果更好 pdftotext -layout -enc UTF-8 tf_docs_zh_r2.15.pdf tf_full.txt # 不带 layout 的版本段落拼接更自然适合喂给检索脚本 pdftotext -enc UTF-8 tf_docs_zh_r2.15.pdf tf_plain.txt拿到纯文本之后把出现频率最高的 API 名统计出来基本就等于这份文档的知识大纲import re from collections import Counter # pdf 里的长标识符可能被换行切断先做一次归一化 text open(tf_plain.txt, encodingutf-8).read() text text.replace(-\n, ).replace(\n, ) api_pat re.compile(r\btf\.[a-zA-Z0-9_.]{2,}) counter Counter(api_pat.findall(text)) for name, n in counter.most_common(25): print(f{n:6} {name})出现的次数越多说明它在文档里被引用的场景越广优先级越高。把这份统计和团队里常用的几十个 API 求交集得到的就是该重点核对中文译名的那批函数。术语译名一旦统一评审代码时的沟通成本会明显下降。5. 用 PyMuPDF 给中文版 PDF 做一个 API 速查脚本前面几章把 PDF 拆成了可检索的文本最后一步把它变成一个能随时调用的速查工具。目标很明确命令行里敲一个 API 名直接打印出它在 PDF 里出现的页码和上下文不用打开阅读器。import sys import re import fitz def normalize(text: str) - str: PDF 里长标识符常被换行切断先拼回来再匹配 return text.replace(-\n, ).replace(\n, ).replace( , ) def lookup(pdf_path: str, api_name: str, ctx: int 400, limit: int 5) - None: doc fitz.open(pdf_path) hits 0 for page_no, page in enumerate(doc, start1): raw page.get_text(text) flat normalize(raw) # 归一化后再找避免跨行漏匹配 key normalize(api_name) pos flat.find(key) while pos ! -1 and hits limit: start max(0, pos - ctx // 2) print(f--- 第 {page_no} 页 ---) print(flat[start:start ctx].strip()) print() hits 1 pos flat.find(key, pos 1) if hits 0: print(f没找到 {api_name}试试更短的片段比如 tf.keras.layers) if __name__ __main__: lookup(tf_docs_zh_r2.15.pdf, sys.argv[1])参数上的取舍值得说清楚。ctx控制输出上下文长度设太大一屏看不完设太小又判断不出这个 API 的用途400 字左右是个比较顺手的默认值。limit限制命中页数因为像tf.constant这种基础函数会在几十页里反复出现全打出来没有意义。归一化函数是整个脚本里最关键的一步也是手工写检索脚本时最容易漏掉的一步。PDF 抽出来的文本会在页宽边界处插入换行tf.keras.layers.Dense很可能变成tf.keras.lay换行ers.Dense。不去掉换行和连字符直接匹配命中率会低得让人以为脚本写错了。归一化时顺便把空格也去掉代价是输入也要用同样的规则处理所以代码里对api_name也调了一次。一个顺手可以加的改进第一次运行之后把每页的归一化文本缓存进字典后续查询就不用重复解析 PDF。索引换成一个倒排表之后同一批关键词的查询能压到毫秒级——查文档这件事从翻页到敲回车差别就在这里。本文还有配套的精品资源点击获取
返回列表