在人工智能项目开发的过程中,我们通常会使用到很多机器学习、深度学习框架、各种数据处理库和一些工具。好用的库很多,但对于初学者来说先聚焦在一些比较常用的框架、库或者工具,有利于提高效率。下面主要分享一些常用的人工智能相关的内容,包括:模型训练、数据处理、参数优化、实验跟踪、特定领域库以及一些工具。
一、模型训练
1.PyTorch
PyTorch是Facebook开发并于2017年开源的深度学习框架,这个框架基于开源Torch包,目前是业界使用最广泛的深度学习框架。
目前PyTorch生态系统已经比较完善,并具有各种专用库,例如:
torchvision(https://pytorch.org/vision/stable/index.html)或torchaudio(https://pytorch.org/audio/stable/index.html)。因此,PyTorch支持用于几乎所有类型的机器学习。
PyTorch的数据结构是Tensor对象,用于保存模型训练和推理过程使用到的多维数据。Tensor的概念与NumPy ndarray相似。PyTorch还支持CUDA功能的NVIDIA GPU,ROCm,Metal API和TPU等来提高训练效率。
PyTorch库最重要的部分是nn modules,它包含了层和工具,可以轻松地构建复杂的模型。
下面是一个PyTorch实现简单神经网络示例。
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10),
)
def forward(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
目前,PyTorch 已经发布了2.0,相比过去,这个版本更快、更接近Python、更灵活。
2.PyTorch Lightning
PyTorch Lightning是PyTorch框架的一个“扩展”,旨在减少编写模型所需的代码量。
Lightning基于hook(钩子)的概念,这种方法允许我们在特定时间执行回调函数,比如训练结束后执行一些收尾的工作或者输出。
Trainers Lighting将许多必须在PyTorch中处理的功能自动化实现了,例如:循环、硬件调用或零梯度。
下面是PyTorch(左)与PyTorch Lightning(右)的代码片段对比。
3.TensorFlow
TensorFlow是由Google Brain团队开发并于2015年发布的深度学习库,TensorFlow2.0版本于2019年发布。它支持Java、C++、Python以及JavaScript等多种开发语言。
TensorFlow与PyTorch类似,也是一个非常流行的框架。并且也有一个相当丰富的生态,包括工具和库,例如:优化工具包TensorBoard、编译器等。
tf.nn是TensorFlow的核心模块,它提供了训练模型所需的构建块。Tensorflow拥有自己的用于保存用于深度学习的向量数据的Tensor对象。另外,它也支持所有常见的加速器,如CUDA或RoCm,Metal API和TPU。
class NeuralNetwork(models.Model):
def __init__(self):
super().__init__()
self.flatten = layers.Flatten()
self.linear_relu_stack = models.Sequential([
layers.Dense(512, activation='relu'),
layers.Dense(512, activation='relu'),
layers.Dense(10)
])
def call(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
4.Keras
Keras是一个基于TensorFlow框架,但却提供了比TensorFlow更高级的接口的机器学习框架,有点像PyTorch Lightning 。Keras由François Chollet开发并于2015年发布,它只支持Python开发语言。Keras也有自己的一整套Python库和特定领域库,例如:KerasCV用于CV领域、KerasNLP用于NLP领域。
在Keras2.4版本之前,Keras支持的后端不仅仅是TensorFlow,但在之后的版本只支持TensorFlow。由于Keras只是TensorFlow上层接口,它支持的加速器也和TensorFlow类似。下面是Keras代码例子。
class NeuralNetwork(models.Model):
def __init__(self):
super().__init__()
self.flatten = layers.Flatten()
self.linear_relu_stack = models.Sequential([
layers.Dense(512, activation='relu'),
layers.Dense(512, activation='relu'),
layers.Dense(10)
])
def call(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
Keras、TensorFlow、PyTorch、PyTorch Lightning 之间的区别
深度学习框架很多,所以给深度学习项目选择正确的框架可能会有点纠结。PyTorch、PyTorch Lightning 、TensorFlow、Keras 都是目前比较流行的框架,
其实,这四个框架的基础只有PyTorch和TensorFlow两个方向。这些框架基本上能够满足数据科学家和初学者的需求,但由于每个项目的要求都不一样,每个开发人员也有不一样使用习惯,大家都有自己在专业领域的优先考虑方向。
PyTorch 和 TensorFlow这两个框架之间的主要区别在于它们对模型的定义方式和执行过程不同。
(1) PyTorch
PyTorch使用动态计算图,这意味着图是在执行过程中动态定义的。这使得代码调试更加灵活性和直观,优点是,开发人员可以在运行时修改图并轻松检查中间过程的输出,缺点是,这种方法可能比静态图效率低,特别是对于复杂模型。然而,PyTorch 2.0开始通过torch.compile和FX图来解决这些问题。
(2) TensorFlow
TensorFlow使用静态计算图,这些图在执行之前被编译。这使得执行效率更高,因为这种方式可以针对目标硬件进行优化图或者并行化图。但是,它的调试更加困难,因为不容易观察中间结果。
根据2023年HuggingFace的模型数量统计 pytorch已经大大超过tensorflow。
二、数据处理库
1.pandas
pandas可以说是最著名的数据处理 Python库。最初于2008年发布,在2012年发布了1.0版本。它提供了过滤、聚合、数据转换以及数据集合并等功能。这个库的核心是DataFrame对象,这个对象是任何类型数据的多维表。有些功能是用纯C编写的,所以该库性能非常好。除了性能之外,pandas还提供了数据清洗和预处理、删除重复项、填充空值或nan值、时间序列分析、重采样、加窗、时移等方面的功能。此外,它还可以执行各种输入/输出操作:例如:读写.csv或.xlsx文件、数据库查询、GCP BigQuery数据加载
2.NumPy
NumPy也是一个开源的数据处理库,使用BSD许可证。NumPy最重要的功能是ndarray,ndarray是一个表示多维数字数组的结构。除了ndarray,NumPy还提供了许多用于处理数据的高级数学函数和数学运算。NumPy还非常注重性能,包含许多预实现的算法,以减少NumPy函数的执行时间。
3.SciPy
SciPy是一个专注于科学计算的库。ndarray是SciPy的基本数据结构。除此之外,该库还添加了优化、线性代数、信号处理、插值和备用矩阵等功能。它比NumPy更高级,因此可以提供更复杂的功能。
三、超参数优化
1.Ray Tune
Ray Tune是Ray工具集的一部分,Ray工具集是用于构建机器学习和Python的分布式应用程序的库。ML库中的Tune部分,通过提供多种搜索算法,以优化超启动功能。例如网格搜索、超频带或贝叶斯优化。
Ray Tune的主要概念包括:
- Trainables :用于向我们要优化的模型传递的Tune对象参数。
- Search space:包含我们要在当前试验中检查的所有超参数值
- Tuner :一个执行调用tuner.fit()的返回对象。启动搜索最佳超参数集的过程。它至少需要传递一个可训练对象和搜索空间
- Trial :每个Trial表示来自搜索空间的精确参数集,Trial由Ray Tune Tuner生成。因为它代表运行调谐器的输出,所以Trial包含用于特定试验的配置、Trial ID 等信息。
- Search algorithms :用于Tuner.fit执行的一种算法。默认情况下Ray Tune将使用Radom Search作为默认值。
- Schedulers:一组负责管理运行的对象。他们可以暂停、停止和在执行过程中测试。可以提高效率、减少运行时间。默认情况下Tune选择FIFO作为默认值,像经典队列一样逐个执行。
- Run analyses :以ResultGrid对象的形式包装Tuner.fit执行结果的对象。它包含与运行相关的所有数据,例如所有试验中的最佳结果或来自所有试验的数据。
2.BoTorch
BoTorch是一个基于PyTorch的库,是PyTorch生态系统的一部分。它专注于贝叶斯算法的超参数优化。作为需要与PyTorch配合使用,还处于测试版和密集的开发中,因此可能会出现一些意想不到的问题。
四、跟踪监测工具
1.Neptune.ai
Neptune.ai是一个网页工具,既可以作为跟踪监测也可以作为模型注册表。该工具基于云平台,采用SaaS服务模式。
Neptune.ai提供了一个仪表板,可以观察模型训练的结果,还可以用于存储运行参数以及运行参数的版本化。
Neptune.ai还可以控制模型的版本。该工具与库无关,可以托管使用任何库创建的模型。为了支持系统集成,Neptune还公开了一个REST API,并配套完善的API文档,用户可以通过pip安装客户端库。
可惜的是,该工具需要付费的。但是,如果只是个人项目或者研究机构,也可以申请免费使用。
2.Weights & Biases
Weights & Biases也称为WandB或W&B,这是一个基于Web的工具,它提供了可用作跟踪监测工具和模型注册表的所有需要的功能,与neptune.ai功能类似。然而相比neptune.ai,Weights & Biases的可视化效果更佳。此外,WandB似乎更专注于为个人项目和研究人员提供服务,并不太强调协作。
Weights Biases还公开了一个REST的API来支持系统集成。与Neptune.ai不同的是,它的客户端库是Java包而不是Python库,这就要求机器学习模型是java开发的。
3.TensorBoard
TensorBoard是TensorFlow生态的可视化工具包。用于算法运行监测和指标可视化。但它也可以与Keras或者PyTorch一起使用。
此外,它是免费的,免费的,免费的,重要的事说三遍。然而,TensorBoard并没有模型注册表功能。由于它是TensorFlow生态的一个工具,因此它与Keras或TensorFlow的集成比其他工具都更加顺畅。
五、特定领域库
1.OpenCV
OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。
opencv主要用于解决以下几个领域的问题:
- 增强现实
- 人脸识别
- 手势识别
- 人机交互
- 动作识别
- 运动跟踪
- 物体识别
- 图像分割
- 机器人
2.GeoPandas
GeoPandas是一个建立在pandas之上的开源项目,是用来处理地理空间数据的python第三方库。支持以GeJSON,shapefile格式读写数据,或从PostGIS系统读取数据。除了依赖于pandas,它还依赖于PyGEOS、GeoPy或Shapely等空间数据库。
六、其他工具
1.Matplotlib
顾名思义,Matplotlib是一个用于创建各种图表的库。它支持创建各种复杂的图表:直线图、直方图、3D形状或极坐标图等等。它还允许自定义图表的颜色或标签之类的内容。
2.Seaborn
Seaborn提供的功能与Matplotlib提供的功能类似。然而,Seaborn的API更加高级,代码量更少、调色板更柔和、外观设计更好看。此外,Seaborn还很容易与pandas集成。
以下分别是使用Matplotlib和Seaborn创建的热图的代码。
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
data = np.random.rand(5, 5)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)
ax.set_xticks(np.arange(data.shape[0])+0.5, minor=False)
ax.set_yticks(np.arange(data.shape[1])+0.5, minor=False)
ax.set_xticklabels(np.arange(1, data.shape[0]+1), minor=False)
ax.set_yticklabels(np.arange(1, data.shape[1]+1), minor=False)
plt.title("Heatmap")
plt.xlabel("X axis")
plt.ylabel("Y axis")
cbar = plt.colorbar(heatmap)
plt.show()
sns.heatmap(data, cmap="Blues", annot=True)
# Set plot title and axis labels
plt.title("Heatmap")
plt.xlabel("X axis")
plt.ylabel("Y axis")
# Show plot
plt.show()
3.Hydra
为了项目的灵活性,很多内容都需要形成可配置参数。像Answer工具可以将参数值存放到.env文件中。但是,如果如果参数比较复杂,项目可配置参数实现起来就没有那么简单了。Hydra是一个开源工具,用于管理和运行基于Python的应用程序的配置参数。它基于OmegaConf库,能够创建分层配置,并通过配置文件和命令行覆盖它,允许更清晰地分离配置文件。
4.coolname
coolname是一个开源标示符生成库。如果你不喜欢UUID,或者只是想让ID更具可读性,那么coolname就是一个很好的工具。它能够生成长度从2到4个单词不等的唯一标识符用于生成一个惟一的标识符。不同的长度有不同的组合的数量:4字长度标识符有1010个组合;3字长度标识符有108种组合;2字长度标识符有105种组合显然数量明显低于UUID,因此冲突的概率也更高。所以只能用于特定的场景。
5.tqdm
tqdm库为应用程序的执行过程提供了一个进度条功能,这个库只需要Python即可独立执行。Tqdm还能够预测任务的剩余时间,并且没有明显的性能开销。可以为执行重要任务的过程,实现进度反馈和剩余时间预测。
6.Jupyter Notebook (+JupyterLab)
Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享程序文档,支持实时代码,数学方程,可视化和 markdown。
以上这些内容都是我们在深度学习入门过程中经常会用到的基本工具。