【深度学习项目实战·06】Python项目必备基础:从会写语句到能读懂训练项目

发布时间:2026/10/30 2:29:36
【深度学习项目实战·06】Python项目必备基础:从会写语句到能读懂训练项目 文章目录01 本篇要解决什么问题02 背景看项目时先找到数据的流向03 实操把最常用的Python知识放回项目中1列表管理样本字典描述一个样本2函数要说清输入和返回值3路径问题先分清两个位置4参数放在命令行结果用JSON保存5主入口与导入为什么总有main判断6错误要留线索输出要可复查04 一个具体例子生成图像文件清单05 常见问题与自测06 本篇回顾与下一步01 本篇要解决什么问题前五篇把环境搭好了现在打开一个深度学习项目新的问题又来了入口文件在哪里args从哪里传进来同样一段代码为什么换个目录运行就找不到数据这些问题与网络有多少层关系不大却会直接影响后续每一个项目。本篇按“读取参数→定位数据→整理样本→保存结果”的顺序把项目里最常用的Python知识串起来。本篇关键词函数、列表与字典、Path、命令行参数、JSON、主入口。完成标志能写一个图像文件清单工具并解释它从哪里读、往哪里写。练习约定继续使用dl-course环境和dl-course-lab项目命令均从项目根目录运行。代码以Python 3.11及以上的常用语法为基线。02 背景看项目时先找到数据的流向学习Python时我们通常按变量、循环、函数、类的顺序学习。真正读训练项目时可以换一个角度程序接收什么经过哪些函数最后产生什么。dl-course-lab/ ├─ examples/ # 本部分练习脚本 │ └─ project_manifest.py ├─ data/ # 输入数据 │ └─ demo_images/ └─ artifacts/ # 清单、模型与实验输出其中data与artifacts是项目约定不是Python保留字。目录清楚之后再沿着入口读函数比从第一行逐字猜测更容易抓住主线。03 实操把最常用的Python知识放回项目中1列表管理样本字典描述一个样本samples[{id:img_000000,path:class_a/001.png},{id:img_000001,path:class_b/002.png},]paths[item[path]foriteminsamples]forindex,iteminenumerate(samples):print(index,item[id],item[path])列表保存有顺序的条目字典用字段名表达含义。比起让sample[0]同时承担“路径还是标签”的猜测sample[path]更容易读也方便后面增加字段。本篇先记录路径不从文件夹名称猜标签。标签的定义、类别映射和数据划分需要到具体任务中明确。清单中的编号也只是本次排序后的行号新增文件后可能改变长期追踪样本时应使用数据源提供的稳定标识。2函数要说清输入和返回值frompathlibimportPathdefis_supported_image(path:Path)-bool:returnpath.suffix.lower()in{.png,.jpg,.jpeg}类型标注帮助读代码和编辑器检查但不会自动把错误输入转换成正确类型。函数内部仍需在关键边界检查路径是否存在、数组形状是否合理。还有一个常见陷阱不要用可变列表作为需要“每次重新创建”的默认值例如def collect(items[])。默认对象会在调用之间复用可以改成itemsNone再在函数内部创建列表。3路径问题先分清两个位置frompathlibimportPathprint(当前工作目录,Path.cwd())print(脚本所在目录,Path(__file__).resolve().parent)Path(data)按当前工作目录解释脚本的位置由__file__提供。它们可能相同也可能不同。本篇的命令行相对路径统一按当前工作目录解释因此要求从项目根目录执行。如果项目选择“配置文件里的相对路径都相对配置文件位置”也完全可行但加载配置时必须显式拼接不能让两套规则混在一起。路径拼接优先用root / images具体操作见Python Path官方文档。4参数放在命令行结果用JSON保存argparse把命令行字符串转成程序里的参数json负责保存可交换的数据。它们分别解决“怎么控制这次运行”和“怎么记录这次运行”的问题。importargparsefrompathlibimportPath parserargparse.ArgumentParser()parser.add_argument(--input,typePath,requiredTrue)argsparser.parse_args()print(args.input.resolve())项目变大后可以用JSON管理一组参数再让命令行覆盖少量选项。无论采用哪种方式最终都应保存本次生效的配置避免只记得“好像改过学习率”。JSON不直接支持Path、NumPy数组、Tensor保存前需要转换成字符串、列表或普通数值。5主入口与导入为什么总有main判断if __name__ __main__:让脚本被直接执行时进入主程序被其他模块导入时保留函数定义避免导入就开始遍历数据或启动训练。自定义类的作用也可以从这里理解当多个函数需要共享配置、状态和行为时再把它们组织到类里。后面Dataset保存样本索引nn.Module保存模型参数都属于这种情形。如果项目使用包结构通常从根目录执行python -m package.module如果按本篇直接运行独立脚本就使用python examples/project_manifest.py。不要通过四处追加sys.path来掩盖导入结构的问题也不要把文件命名为torch.py、json.py等已有模块名。6错误要留线索输出要可复查找不到输入目录时直接报错比生成一个空清单继续训练更容易定位问题。批量处理坏文件时可以捕获具体异常并记录文件路径不要写except: pass把所有错误吞掉。交互练习用print即可。长期训练再使用logging记录时间、级别和上下文。另一个小细节是先排序文件再编号文件系统遍历顺序不应成为样本顺序的隐含依据。图本篇原创项目流程图。路径、函数和结果文件共同组成一个可检查的程序。04 一个具体例子生成图像文件清单将下面代码保存为examples/project_manifest.py。它只登记后缀匹配的文件不验证图像能否解码第07篇再处理像素数据。Build a deterministic image manifest; paths are relative to the input root.importargparseimportjsonfrompathlibimportPathdefcollect_images(root:Path)-list[dict[str,str]]:suffixes{.png,.jpg,.jpeg,.bmp,.tif,.tiff}pathssorted((pforpinroot.rglob(*)ifp.is_file()andp.suffix.lower()insuffixes),keylambdap:p.relative_to(root).as_posix(),)return[{id:fimg_{i:06d},path:p.relative_to(root).as_posix()}fori,pinenumerate(paths)]defmain():parserargparse.ArgumentParser(description__doc__)parser.add_argument(--input,typePath,requiredTrue)parser.add_argument(--output,typePath,defaultPath(artifacts/manifest.json))argsparser.parse_args()# Command-line relative paths are intentionally relative to the current directory.rootargs.input.resolve()ifnotroot.is_dir():parser.error(fInput directory does not exist:{root})rowscollect_images(root)ifnotrows:parser.error(No supported image files found)outputargs.output.resolve()# Avoid letting the manifest itself become a future image candidate.ifoutput.suffix.lower()!.json:parser.error(--output must end in .json)output.parent.mkdir(parentsTrue,exist_okTrue)payload{schema_version:1,count:len(rows),items:rows}output.write_text(json.dumps(payload,ensure_asciiFalse,indent2),encodingutf-8)print(fFound{len(rows)}images; manifest:{output})if__name____main__:main()准备至少一张图片到data/demo_images执行python examples/project_manifest.py--inputdata/demo_images--output artifacts/manifest.json这条命令在Linux Bash中也适用。输出文件包含count与items路径相对输入目录保存便于整体迁移数据。读取清单时仍需给出对应的数据根目录。没有现成图片时可以先运行第01篇的图像读写脚本再把--input指向它生成图片的目录也可以先运行第07篇的image_pipeline.py生成练习图片。不要把图片输出目录放入真实训练集后直接混用。05 常见问题与自测问题1代码没有改为什么换个终端就找不到数据先打印工作目录和输入路径的绝对位置。相对路径会随工作目录改变解释器正确不代表路径也正确。问题2清单里有文件就说明数据可以训练了吗还不够。清单只确认文件位置还要检查解码、尺寸、通道、标签对应关系及数据划分。问题3为什么同样的文件要先排序为了让同一组文件获得确定的输出顺序。但这不意味着新增文件后旧编号仍然稳定。问题4保存JSON时报“不能序列化”怎么办检查字段类型。Path转字符串NumPy数组转列表单个Tensor数值可用.item()不要把复杂对象直接塞进去。问题5学习深度学习前要先学完所有Python语法吗不必。先掌握本篇的数据结构、函数、路径和入口能读懂后续示例再按项目需要补充生成器、装饰器等内容。06 本篇回顾与下一步这篇的重点是建立项目意识入口接收参数函数承担明确任务路径采用统一规则结果保存到可复查的文件中。中文常见英文或写法当前工作目录Current Working Directory / CWD命令行参数Command-line Arguments文件清单Manifest序列化Serialization下一篇进入NumPy与图像处理把“文件路径”变成具有明确形状、类型和数值范围的数组。参考与延伸阅读Python教程数据结构Python教程模块与主入口argparse官方文档JSON官方文档

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询