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