適合初學(xué)者的一些常用的機(jī)器學(xué)習(xí)庫(kù)
在人工智能項(xiàng)目開(kāi)發(fā)的過(guò)程中,我們通常會(huì)使用到很多機(jī)器學(xué)習(xí)、深度學(xué)習(xí)框架、各種數(shù)據(jù)處理庫(kù)和一些工具。好用的庫(kù)很多,但對(duì)于初學(xué)者來(lái)說(shuō)先聚焦在一些比較常用的框架、庫(kù)或者工具,有利于提高效率。下面主要分享一些常用的人工智能相關(guān)的內(nèi)容,包括:模型訓(xùn)練、數(shù)據(jù)處理、參數(shù)優(yōu)化、實(shí)驗(yàn)跟蹤、特定領(lǐng)域庫(kù)以及一些工具。
一、模型訓(xùn)練
1.PyTorch
PyTorch是Facebook開(kāi)發(fā)并于2017年開(kāi)源的深度學(xué)習(xí)框架,這個(gè)框架基于開(kāi)源Torch包,目前是業(yè)界使用最廣泛的深度學(xué)習(xí)框架。
目前PyTorch生態(tài)系統(tǒng)已經(jīng)比較完善,并具有各種專用庫(kù),例如:
torchvision(https://pytorch.org/vision/stable/index.html)或torchaudio(https://pytorch.org/audio/stable/index.html)。因此,PyTorch支持用于幾乎所有類型的機(jī)器學(xué)習(xí)。
PyTorch的數(shù)據(jù)結(jié)構(gòu)是Tensor對(duì)象,用于保存模型訓(xùn)練和推理過(guò)程使用到的多維數(shù)據(jù)。Tensor的概念與NumPy ndarray相似。PyTorch還支持CUDA功能的NVIDIA GPU,ROCm,Metal API和TPU等來(lái)提高訓(xùn)練效率。
PyTorch庫(kù)最重要的部分是nn modules,它包含了層和工具,可以輕松地構(gòu)建復(fù)雜的模型。
下面是一個(gè)PyTorch實(shí)現(xiàn)簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)示例。
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 已經(jīng)發(fā)布了2.0,相比過(guò)去,這個(gè)版本更快、更接近Python、更靈活。
2.PyTorch Lightning
PyTorch Lightning是PyTorch框架的一個(gè)“擴(kuò)展”,旨在減少編寫(xiě)模型所需的代碼量。
Lightning基于hook(鉤子)的概念,這種方法允許我們?cè)谔囟〞r(shí)間執(zhí)行回調(diào)函數(shù),比如訓(xùn)練結(jié)束后執(zhí)行一些收尾的工作或者輸出。
Trainers Lighting將許多必須在PyTorch中處理的功能自動(dòng)化實(shí)現(xiàn)了,例如:循環(huán)、硬件調(diào)用或零梯度。
下面是PyTorch(左)與PyTorch Lightning(右)的代碼片段對(duì)比。
3.TensorFlow
TensorFlow是由Google Brain團(tuán)隊(duì)開(kāi)發(fā)并于2015年發(fā)布的深度學(xué)習(xí)庫(kù),TensorFlow2.0版本于2019年發(fā)布。它支持Java、C++、Python以及JavaScript等多種開(kāi)發(fā)語(yǔ)言。
TensorFlow與PyTorch類似,也是一個(gè)非常流行的框架。并且也有一個(gè)相當(dāng)豐富的生態(tài),包括工具和庫(kù),例如:優(yōu)化工具包TensorBoard、編譯器等。
tf.nn是TensorFlow的核心模塊,它提供了訓(xùn)練模型所需的構(gòu)建塊。Tensorflow擁有自己的用于保存用于深度學(xué)習(xí)的向量數(shù)據(jù)的Tensor對(duì)象。另外,它也支持所有常見(jiàn)的加速器,如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是一個(gè)基于TensorFlow框架,但卻提供了比TensorFlow更高級(jí)的接口的機(jī)器學(xué)習(xí)框架,有點(diǎn)像PyTorch Lightning 。Keras由Fran?ois Chollet開(kāi)發(fā)并于2015年發(fā)布,它只支持Python開(kāi)發(fā)語(yǔ)言。Keras也有自己的一整套Python庫(kù)和特定領(lǐng)域庫(kù),例如:KerasCV用于CV領(lǐng)域、KerasNLP用于NLP領(lǐng)域。
在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 之間的區(qū)別
深度學(xué)習(xí)框架很多,所以給深度學(xué)習(xí)項(xiàng)目選擇正確的框架可能會(huì)有點(diǎn)糾結(jié)。PyTorch、PyTorch Lightning 、TensorFlow、Keras 都是目前比較流行的框架,
其實(shí),這四個(gè)框架的基礎(chǔ)只有PyTorch和TensorFlow兩個(gè)方向。這些框架基本上能夠滿足數(shù)據(jù)科學(xué)家和初學(xué)者的需求,但由于每個(gè)項(xiàng)目的要求都不一樣,每個(gè)開(kāi)發(fā)人員也有不一樣使用習(xí)慣,大家都有自己在專業(yè)領(lǐng)域的優(yōu)先考慮方向。
PyTorch 和 TensorFlow這兩個(gè)框架之間的主要區(qū)別在于它們對(duì)模型的定義方式和執(zhí)行過(guò)程不同。
(1) PyTorch
PyTorch使用動(dòng)態(tài)計(jì)算圖,這意味著圖是在執(zhí)行過(guò)程中動(dòng)態(tài)定義的。這使得代碼調(diào)試更加靈活性和直觀,優(yōu)點(diǎn)是,開(kāi)發(fā)人員可以在運(yùn)行時(shí)修改圖并輕松檢查中間過(guò)程的輸出,缺點(diǎn)是,這種方法可能比靜態(tài)圖效率低,特別是對(duì)于復(fù)雜模型。然而,PyTorch 2.0開(kāi)始通過(guò)torch.compile和FX圖來(lái)解決這些問(wèn)題。
(2) TensorFlow
TensorFlow使用靜態(tài)計(jì)算圖,這些圖在執(zhí)行之前被編譯。這使得執(zhí)行效率更高,因?yàn)檫@種方式可以針對(duì)目標(biāo)硬件進(jìn)行優(yōu)化圖或者并行化圖。但是,它的調(diào)試更加困難,因?yàn)椴蝗菀子^察中間結(jié)果。
根據(jù)2023年HuggingFace的模型數(shù)量統(tǒng)計(jì) pytorch已經(jīng)大大超過(guò)tensorflow。
二、數(shù)據(jù)處理庫(kù)
1.pandas
pandas可以說(shuō)是最著名的數(shù)據(jù)處理 Python庫(kù)。最初于2008年發(fā)布,在2012年發(fā)布了1.0版本。它提供了過(guò)濾、聚合、數(shù)據(jù)轉(zhuǎn)換以及數(shù)據(jù)集合并等功能。這個(gè)庫(kù)的核心是DataFrame對(duì)象,這個(gè)對(duì)象是任何類型數(shù)據(jù)的多維表。有些功能是用純C編寫(xiě)的,所以該庫(kù)性能非常好。除了性能之外,pandas還提供了數(shù)據(jù)清洗和預(yù)處理、刪除重復(fù)項(xiàng)、填充空值或nan值、時(shí)間序列分析、重采樣、加窗、時(shí)移等方面的功能。此外,它還可以執(zhí)行各種輸入/輸出操作:例如:讀寫(xiě).csv或.xlsx文件、數(shù)據(jù)庫(kù)查詢、GCP BigQuery數(shù)據(jù)加載
2.NumPy
NumPy也是一個(gè)開(kāi)源的數(shù)據(jù)處理庫(kù),使用BSD許可證。NumPy最重要的功能是ndarray,ndarray是一個(gè)表示多維數(shù)字?jǐn)?shù)組的結(jié)構(gòu)。除了ndarray,NumPy還提供了許多用于處理數(shù)據(jù)的高級(jí)數(shù)學(xué)函數(shù)和數(shù)學(xué)運(yùn)算。NumPy還非常注重性能,包含許多預(yù)實(shí)現(xiàn)的算法,以減少NumPy函數(shù)的執(zhí)行時(shí)間。
3.SciPy
SciPy是一個(gè)專注于科學(xué)計(jì)算的庫(kù)。ndarray是SciPy的基本數(shù)據(jù)結(jié)構(gòu)。除此之外,該庫(kù)還添加了優(yōu)化、線性代數(shù)、信號(hào)處理、插值和備用矩陣等功能。它比NumPy更高級(jí),因此可以提供更復(fù)雜的功能。
三、超參數(shù)優(yōu)化
1.Ray Tune
Ray Tune是Ray工具集的一部分,Ray工具集是用于構(gòu)建機(jī)器學(xué)習(xí)和Python的分布式應(yīng)用程序的庫(kù)。ML庫(kù)中的Tune部分,通過(guò)提供多種搜索算法,以優(yōu)化超啟動(dòng)功能。例如網(wǎng)格搜索、超頻帶或貝葉斯優(yōu)化。
Ray Tune的主要概念包括:
- Trainables :用于向我們要優(yōu)化的模型傳遞的Tune對(duì)象參數(shù)。
- Search space:包含我們要在當(dāng)前試驗(yàn)中檢查的所有超參數(shù)值
- Tuner :一個(gè)執(zhí)行調(diào)用tuner.fit()的返回對(duì)象。啟動(dòng)搜索最佳超參數(shù)集的過(guò)程。它至少需要傳遞一個(gè)可訓(xùn)練對(duì)象和搜索空間
- Trial :每個(gè)Trial表示來(lái)自搜索空間的精確參數(shù)集,Trial由Ray Tune Tuner生成。因?yàn)樗磉\(yùn)行調(diào)諧器的輸出,所以Trial包含用于特定試驗(yàn)的配置、Trial ID 等信息。
- Search algorithms :用于Tuner.fit執(zhí)行的一種算法。默認(rèn)情況下Ray Tune將使用Radom Search作為默認(rèn)值。
- Schedulers:一組負(fù)責(zé)管理運(yùn)行的對(duì)象。他們可以暫停、停止和在執(zhí)行過(guò)程中測(cè)試??梢蕴岣咝省p少運(yùn)行時(shí)間。默認(rèn)情況下Tune選擇FIFO作為默認(rèn)值,像經(jīng)典隊(duì)列一樣逐個(gè)執(zhí)行。
- Run analyses :以ResultGrid對(duì)象的形式包裝Tuner.fit執(zhí)行結(jié)果的對(duì)象。它包含與運(yùn)行相關(guān)的所有數(shù)據(jù),例如所有試驗(yàn)中的最佳結(jié)果或來(lái)自所有試驗(yàn)的數(shù)據(jù)。
2.BoTorch
BoTorch是一個(gè)基于PyTorch的庫(kù),是PyTorch生態(tài)系統(tǒng)的一部分。它專注于貝葉斯算法的超參數(shù)優(yōu)化。作為需要與PyTorch配合使用,還處于測(cè)試版和密集的開(kāi)發(fā)中,因此可能會(huì)出現(xiàn)一些意想不到的問(wèn)題。
四、跟蹤監(jiān)測(cè)工具
1.Neptune.ai
Neptune.ai是一個(gè)網(wǎng)頁(yè)工具,既可以作為跟蹤監(jiān)測(cè)也可以作為模型注冊(cè)表。該工具基于云平臺(tái),采用SaaS服務(wù)模式。
Neptune.ai提供了一個(gè)儀表板,可以觀察模型訓(xùn)練的結(jié)果,還可以用于存儲(chǔ)運(yùn)行參數(shù)以及運(yùn)行參數(shù)的版本化。
Neptune.ai還可以控制模型的版本。該工具與庫(kù)無(wú)關(guān),可以托管使用任何庫(kù)創(chuàng)建的模型。為了支持系統(tǒng)集成,Neptune還公開(kāi)了一個(gè)REST API,并配套完善的API文檔,用戶可以通過(guò)pip安裝客戶端庫(kù)。
可惜的是,該工具需要付費(fèi)的。但是,如果只是個(gè)人項(xiàng)目或者研究機(jī)構(gòu),也可以申請(qǐng)免費(fèi)使用。
2.Weights & Biases
Weights & Biases也稱為WandB或W&B,這是一個(gè)基于Web的工具,它提供了可用作跟蹤監(jiān)測(cè)工具和模型注冊(cè)表的所有需要的功能,與neptune.ai功能類似。然而相比neptune.ai,Weights & Biases的可視化效果更佳。此外,WandB似乎更專注于為個(gè)人項(xiàng)目和研究人員提供服務(wù),并不太強(qiáng)調(diào)協(xié)作。
Weights Biases還公開(kāi)了一個(gè)REST的API來(lái)支持系統(tǒng)集成。與Neptune.ai不同的是,它的客戶端庫(kù)是Java包而不是Python庫(kù),這就要求機(jī)器學(xué)習(xí)模型是java開(kāi)發(fā)的。
3.TensorBoard
TensorBoard是TensorFlow生態(tài)的可視化工具包。用于算法運(yùn)行監(jiān)測(cè)和指標(biāo)可視化。但它也可以與Keras或者PyTorch一起使用。
此外,它是免費(fèi)的,免費(fèi)的,免費(fèi)的,重要的事說(shuō)三遍。然而,TensorBoard并沒(méi)有模型注冊(cè)表功能。由于它是TensorFlow生態(tài)的一個(gè)工具,因此它與Keras或TensorFlow的集成比其他工具都更加順暢。
五、特定領(lǐng)域庫(kù)
1.OpenCV
OpenCV的全稱是Open Source Computer Vision Library,是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺(jué)庫(kù)。OpenCV是由英特爾公司發(fā)起并參與開(kāi)發(fā),以BSD許可證授權(quán)發(fā)行,可以在商業(yè)和研究領(lǐng)域中免費(fèi)使用。OpenCV可用于開(kāi)發(fā)實(shí)時(shí)的圖像處理、計(jì)算機(jī)視覺(jué)以及模式識(shí)別程序。
opencv主要用于解決以下幾個(gè)領(lǐng)域的問(wèn)題:
- 增強(qiáng)現(xiàn)實(shí)
- 人臉識(shí)別
- 手勢(shì)識(shí)別
- 人機(jī)交互
- 動(dòng)作識(shí)別
- 運(yùn)動(dòng)跟蹤
- 物體識(shí)別
- 圖像分割
- 機(jī)器人
2.GeoPandas
GeoPandas是一個(gè)建立在pandas之上的開(kāi)源項(xiàng)目,是用來(lái)處理地理空間數(shù)據(jù)的python第三方庫(kù)。支持以GeJSON,shapefile格式讀寫(xiě)數(shù)據(jù),或從PostGIS系統(tǒng)讀取數(shù)據(jù)。除了依賴于pandas,它還依賴于PyGEOS、GeoPy或Shapely等空間數(shù)據(jù)庫(kù)。
六、其他工具
1.Matplotlib
顧名思義,Matplotlib是一個(gè)用于創(chuàng)建各種圖表的庫(kù)。它支持創(chuàng)建各種復(fù)雜的圖表:直線圖、直方圖、3D形狀或極坐標(biāo)圖等等。它還允許自定義圖表的顏色或標(biāo)簽之類的內(nèi)容。
2.Seaborn
Seaborn提供的功能與Matplotlib提供的功能類似。然而,Seaborn的API更加高級(jí),代碼量更少、調(diào)色板更柔和、外觀設(shè)計(jì)更好看。此外,Seaborn還很容易與pandas集成。
以下分別是使用Matplotlib和Seaborn創(chuàng)建的熱圖的代碼。
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
為了項(xiàng)目的靈活性,很多內(nèi)容都需要形成可配置參數(shù)。像Answer工具可以將參數(shù)值存放到.env文件中。但是,如果如果參數(shù)比較復(fù)雜,項(xiàng)目可配置參數(shù)實(shí)現(xiàn)起來(lái)就沒(méi)有那么簡(jiǎn)單了。Hydra是一個(gè)開(kāi)源工具,用于管理和運(yùn)行基于Python的應(yīng)用程序的配置參數(shù)。它基于OmegaConf庫(kù),能夠創(chuàng)建分層配置,并通過(guò)配置文件和命令行覆蓋它,允許更清晰地分離配置文件。
4.coolname
coolname是一個(gè)開(kāi)源標(biāo)示符生成庫(kù)。如果你不喜歡UUID,或者只是想讓ID更具可讀性,那么coolname就是一個(gè)很好的工具。它能夠生成長(zhǎng)度從2到4個(gè)單詞不等的唯一標(biāo)識(shí)符用于生成一個(gè)惟一的標(biāo)識(shí)符。不同的長(zhǎng)度有不同的組合的數(shù)量:4字長(zhǎng)度標(biāo)識(shí)符有1010個(gè)組合;3字長(zhǎng)度標(biāo)識(shí)符有108種組合;2字長(zhǎng)度標(biāo)識(shí)符有105種組合顯然數(shù)量明顯低于UUID,因此沖突的概率也更高。所以只能用于特定的場(chǎng)景。
5.tqdm
tqdm庫(kù)為應(yīng)用程序的執(zhí)行過(guò)程提供了一個(gè)進(jìn)度條功能,這個(gè)庫(kù)只需要Python即可獨(dú)立執(zhí)行。Tqdm還能夠預(yù)測(cè)任務(wù)的剩余時(shí)間,并且沒(méi)有明顯的性能開(kāi)銷??梢詾閳?zhí)行重要任務(wù)的過(guò)程,實(shí)現(xiàn)進(jìn)度反饋和剩余時(shí)間預(yù)測(cè)。
6.Jupyter Notebook (+JupyterLab)
Jupyter Notebook(此前被稱為 IPython notebook)是一個(gè)交互式筆記本,支持運(yùn)行 40 多種編程語(yǔ)言。Jupyter Notebook 的本質(zhì)是一個(gè) Web 應(yīng)用程序,便于創(chuàng)建和共享程序文檔,支持實(shí)時(shí)代碼,數(shù)學(xué)方程,可視化和 markdown。
以上這些內(nèi)容都是我們?cè)谏疃葘W(xué)習(xí)入門過(guò)程中經(jīng)常會(huì)用到的基本工具。