你的第一个深度学习库不仅仅是为了让模型运行起来。它还会塑造你对梯度、层和数据流的思考方式。选错了库,你可能会花数周时间在与样板代码作斗争,而不是学习神经网络的实际行为。选对了库,概念会自然而然地衔接在一起,因为代码不会成为你的阻碍。
大多数初学者会将选择范围缩小到三个库:Keras、PyTorch 和 TensorFlow。虽然也有 JAX,但在你了解什么是雅可比矩阵(Jacobian)之前,最好先忽略它。
“对初学者友好”究竟意味着什么
一个库之所以友好,并不只是因为它的文档很厚。只有当代码读起来就像你在教程中看到的数学公式,并且当错误信息指向你的错误而不是抛出一个来自 C++ 后端的堆栈跟踪时,它才是友好的。你想要思考的是学习率和激活函数,而不是深埋在框架内部五层之下的张量形状不匹配问题。
Keras:从这里开始,快速见效
Keras 的构建基于一个简单的理念:你应该能够在喝一杯咖啡的时间内,从一个想法变成一个训练好的模型。它将反向传播和图优化的复杂性封装在简洁的 API 之后,因此一个功能完备的图像分类器通常只需要大约十几行 Python 代码。
你通过在 Sequential 对象中堆叠层来定义模型,调用 model.compile() 来附加优化器和损失函数,然后调用 model.fit() 进行训练。这种语法感觉就像在核对清单。输入形状?搞定。Dense 层?搞定。训练循环?已处理。这让你在早期就能专注于真正重要的事情。增加一层会有帮助吗?应该把 ReLU 换成 sigmoid 吗?改变 batch size 会发生什么?
如果你的目标是在不淹没在配置文件中的情况下学习层和优化器的作用,Keras 可以消除这种阻力。在安装完软件包后一小时内,你就可以运行一个处理真实图像的卷积网络。因为 Keras 默认构建在 TensorFlow 之上,你也可以在不离开高级 API 的情况下使用生产级的数据流水线。
当你走出铺好的道路时,权衡就出现了。如果你需要编写一个依赖于中间激活值的自定义损失函数,或者如果你想在训练期间修改反向传播过程,Keras 可能会让你感到受限。它虽然提供了“逃生口”,但使用它们通常意味着需要降级到原始的框架代码。对于自定义的研究逻辑,这种限制是真实存在的。
PyTorch:通过观察其内部构造来学习
PyTorch 将神经网络视为一个普通的 Python 程序。你通过继承 torch.nn.Module 来定义模型。前向传播只是一个描述输入如何变为输出的 Python 方法。你调用 loss.backward(),PyTorch 就会即时计算梯度。
这是因为 PyTorch 是动态构建其计算图的。有些框架要求你在任何数据接触模型之前就定义好整个模型结构。而 PyTorch 会等到你实际将一个 batch 传入网络时才开始工作。如果你的输入大小在不同 batch 之间发生变化,或者你想在前向传播过程中间打印一个张量以调试形状不匹配问题,框架也不会报错。你可以使用标准的调试器,或者在模型类中插入 print() 语句。当每个张量维度看起来都像个谜团时,这种简洁性非常重要,因为它让调试感觉就像普通的编程。
如果你想了解训练究竟是如何工作的——前向传播如何产生预测,反向传播如何分配误差,优化器如何更新权重——PyTorch 会迫使你深入了解其内部原理。这种透明度正是它目前在研究领域处于领先地位的原因,也是它出现在大多数新的 AI 职位招聘中的原因。当你阅读 arXiv 上的论文时,官方实现很可能就是用 PyTorch 编写的。
TensorFlow:考虑模型的落地场景
TensorFlow 过去的名声是冗长且学习曲线陡峭。但随着 Keras 成为其官方的高级 API,这一切都发生了很大变化。在现代版本中,当你导入 Keras 时,无论你是否注意到,你通常都在 TensorFlow 上运行。但由于模型训练后的应用场景,TensorFlow 作为一个独立的选择仍然具有重要意义。
该生态系统专为部署而构建。TensorFlow Lite 压缩模型,使其能够在内存受限的手机、微控制器和工业传感器上运行。TensorFlow.js 直接在浏览器中运行推理,无需将数据传输到服务器。TensorFlow Serving 在大型生产环境中处理模型版本管理和批量预测。
当您的项目面临严苛的物理
