人工智能指的是一系列使機器能夠像人類一樣處理信息的技術(shù);機器學(xué)習(xí)是利用計算機編程從歷史數(shù)據(jù)中學(xué)習(xí),對新數(shù)據(jù)進行預(yù)測的過程,;神經(jīng)網(wǎng)絡(luò)是基于生物大腦結(jié)構(gòu)和特征的機器學(xué)習(xí)的計算機模型;深度學(xué)習(xí)是機器學(xué)習(xí)的一個子集,,它處理大量的非結(jié)構(gòu)化數(shù)據(jù),,如人類的語音、文本和圖像,。 因此,,這些概念在層次上是相互依存的,人工智能是最廣泛的術(shù)語,,而深度學(xué)習(xí)是最具體的: 為了大家能夠?qū)θ斯ぶ悄艹S玫?Python 庫有一個初步的了解,,以選擇能夠滿足自己需求的庫進行學(xué)習(xí),,對目前較為常見的人工智能庫進行簡要全面的介紹。 Python常用機器學(xué)習(xí)及深度學(xué)習(xí)庫介紹1,、 NumpyNumPy(Numerical Python)是 Python的一個擴展程序庫,,支持大量的維度數(shù)組與矩陣運算,此外也針對數(shù)組運算提供大量的數(shù)學(xué)函數(shù)庫,,Numpy底層使用C語言編寫,,數(shù)組中直接存儲對象,而不是存儲對象指針,,所以其運算效率遠高于純Python代碼,。 我們可以在示例中對比下純Python與使用Numpy庫在計算列表sin值的速度對比: import numpy as npimport mathimport randomimport timestart = time.time()for i in range(10): list_1 = list(range(1,10000)) for j in range(len(list_1)): list_1[j] = math.sin(list_1[j])print('使用純Python用時{}s'.format(time.time()-start))start = time.time()for i in range(10): list_1 = np.array(np.arange(1,10000)) list_1 = np.sin(list_1)print('使用Numpy用時{}s'.format(time.time()-start)) 從如下運行結(jié)果,可以看到使用 Numpy 庫的速度快于純 Python 編寫的代碼:
2,、 OpenCVOpenCV 是一個的跨平臺計算機視覺庫,,可以運行在 Linux、Windows 和 Mac OS 操作系統(tǒng)上,。它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,,同時也提供了 Python 接口,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法,。 下面代碼嘗試使用一些簡單的濾鏡,,包括圖片的平滑處理、高斯模糊等: import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('h89817032p0.png')kernel = np.ones((5,5),np.float32)/25dst = cv.filter2D(img,-1,kernel)blur_1 = cv.GaussianBlur(img,(5,5),0)blur_2 = cv.bilateralFilter(img,9,75,75)plt.figure(figsize=(10,10))plt.subplot(221),plt.imshow(img[:,:,::-1]),plt.title('Original')plt.xticks([]), plt.yticks([])plt.subplot(222),plt.imshow(dst[:,:,::-1]),plt.title('Averaging')plt.xticks([]), plt.yticks([])plt.subplot(223),plt.imshow(blur_1[:,:,::-1]),plt.title('Gaussian')plt.xticks([]), plt.yticks([])plt.subplot(224),plt.imshow(blur_1[:,:,::-1]),plt.title('Bilateral')plt.xticks([]), plt.yticks([])plt.show() 可以參考OpenCV圖像處理基礎(chǔ)(變換和去噪),,了解更多 OpenCV 圖像處理操作,。 3、 Scikit-imagescikit-image是基于scipy的圖像處理庫,,它將圖片作為numpy數(shù)組進行處理,。 例如,可以利用scikit-image改變圖片比例,,scikit-image提供了rescale,、resize以及downscale_local_mean等函數(shù)。
4,、 Python Imaging Library(PIL)Python Imaging Library(PIL) 已經(jīng)成為 Python 事實上的圖像處理標準庫了,,這是由于,PIL 功能非常強大,,但API卻非常簡單易用,。 但是由于PIL僅支持到 Python 2.7,再加上年久失修,,于是一群志愿者在 PIL 的基礎(chǔ)上創(chuàng)建了兼容的版本,,名字叫 Pillow,支持最新 Python 3.x,又加入了許多新特性,,因此,,我們可以跳過 PIL,直接安裝使用 Pillow,。 5,、 Pillow使用 Pillow 生成字母驗證碼圖片: from PIL import Image, ImageDraw, ImageFont, ImageFilterimport random# 隨機字母:def rndChar(): return chr(random.randint(65, 90))# 隨機顏色1:def rndColor(): return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))# 隨機顏色2:def rndColor2(): return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))# 240 x 60:width = 60 * 6height = 60 * 6image = Image.new('RGB', (width, height), (255, 255, 255))# 創(chuàng)建Font對象:font = ImageFont.truetype('/usr/share/fonts/wps-office/simhei.ttf', 60)# 創(chuàng)建Draw對象:draw = ImageDraw.Draw(image)# 填充每個像素:for x in range(width): for y in range(height): draw.point((x, y), fill=rndColor())# 輸出文字:for t in range(6): draw.text((60 * t + 10, 150), rndChar(), font=font, fill=rndColor2())# 模糊:image = image.filter(ImageFilter.BLUR)image.save('code.jpg', 'jpeg') 6、 SimpleCVSimpleCV 是一個用于構(gòu)建計算機視覺應(yīng)用程序的開源框架,。使用它,,可以訪問高性能的計算機視覺庫,如 OpenCV,,而不必首先了解位深度,、文件格式、顏色空間,、緩沖區(qū)管理,、特征值或矩陣等術(shù)語。但其對于 Python3 的支持很差很差,,在 Python3.7 中使用如下代碼:
會報如下錯誤,,因此不建議在 Python3 中使用: SyntaxError: Missing parentheses in call to 'print'. Did you mean print('unit test')? 7、 MahotasMahotas 是一個快速計算機視覺算法庫,,其構(gòu)建在 Numpy 之上,目前擁有超過100種圖像處理和計算機視覺功能,,并在不斷增長,。 使用 Mahotas 加載圖像,并對像素進行操作:
8,、 IlastikIlastik 能夠給用戶提供良好的基于機器學(xué)習(xí)的生物信息圖像分析服務(wù),,利用機器學(xué)習(xí)算法,輕松地分割,,分類,,跟蹤和計數(shù)細胞或其他實驗數(shù)據(jù)。大多數(shù)操作都是交互式的,,并不需要機器學(xué)習(xí)專業(yè)知識,。 9、 Scikit-learnScikit-learn 是針對 Python 編程語言的免費軟件機器學(xué)習(xí)庫,。它具有各種分類,,回歸和聚類算法,包括支持向量機,,隨機森林,,梯度提升,k均值和 DBSCAN 等多種機器學(xué)習(xí)算法,。 使用Scikit-learn實現(xiàn)KMeans算法: import timeimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.cluster import MiniBatchKMeans, KMeansfrom sklearn.metrics.pairwise import pairwise_distances_argminfrom sklearn.datasets import make_blobs# Generate sample datanp.random.seed(0)batch_size = 45centers = [[1, 1], [-1, -1], [1, -1]]n_clusters = len(centers)X, labels_true = make_blobs(n_samples=3000, centers=centers, cluster_std=0.7)# Compute clustering with Meansk_means = KMeans(init='k-means++', n_clusters=3, n_init=10)t0 = time.time()k_means.fit(X)t_batch = time.time() - t0# Compute clustering with MiniBatchKMeansmbk = MiniBatchKMeans(init='k-means++', n_clusters=3, batch_size=batch_size, n_init=10, max_no_improvement=10, verbose=0)t0 = time.time()mbk.fit(X)t_mini_batch = time.time() - t0# Plot resultfig = plt.figure(figsize=(8, 3))fig.subplots_adjust(left=0.02, right=0.98, bottom=0.05, top=0.9)colors = ['#4EACC5', '#FF9C34', '#4E9A06']# We want to have the same colors for the same cluster from the# MiniBatchKMeans and the KMeans algorithm. Let's pair the cluster centers per# closest one.k_means_cluster_centers = k_means.cluster_centers_order = pairwise_distances_argmin(k_means.cluster_centers_, mbk.cluster_centers_)mbk_means_cluster_centers = mbk.cluster_centers_[order]k_means_labels = pairwise_distances_argmin(X, k_means_cluster_centers)mbk_means_labels = pairwise_distances_argmin(X, mbk_means_cluster_centers)# KMeansfor k, col in zip(range(n_clusters), colors): my_members = k_means_labels == k cluster_center = k_means_cluster_centers[k] plt.plot(X[my_members, 0], X[my_members, 1], 'w', markerfacecolor=col, marker='.') plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=6)plt.title('KMeans')plt.xticks(())plt.yticks(())plt.show() 10,、 SciPySciPy 庫提供了許多用戶友好和高效的數(shù)值計算,,如數(shù)值積分、插值,、優(yōu)化,、線性代數(shù)等。 SciPy 庫定義了許多數(shù)學(xué)物理的特殊函數(shù),,包括橢圓函數(shù),、貝塞爾函數(shù)、伽馬函數(shù),、貝塔函數(shù),、超幾何函數(shù)、拋物線圓柱函數(shù)等等,。
11,、 NLTKNLTK 是構(gòu)建Python程序以處理自然語言的庫。它為50多個語料庫和詞匯資源(如 WordNet )提供了易于使用的接口,,以及一套用于分類,、分詞、詞干,、標記,、解析和語義推理的文本處理庫、工業(yè)級自然語言處理 (Natural Language Processing, NLP) 庫的包裝器,。 NLTK被稱為 “a wonderful tool for teaching, and working in, computational linguistics using Python”,。 import nltkfrom nltk.corpus import treebank# 首次使用需要下載nltk.download('punkt')nltk.download('averaged_perceptron_tagger')nltk.download('maxent_ne_chunker')nltk.download('words')nltk.download('treebank')sentence = '''At eight o'clock on Thursday morning Arthur didn't feel very good.'''# Tokenizetokens = nltk.word_tokenize(sentence)tagged = nltk.pos_tag(tokens)# Identify named entitiesentities = nltk.chunk.ne_chunk(tagged)# Display a parse treet = treebank.parsed_sents('wsj_0001.mrg')[0]t.draw() 12、 spaCyspaCy 是一個免費的開源庫,,用于 Python 中的高級 NLP,。它可以用于構(gòu)建處理大量文本的應(yīng)用程序;也可以用來構(gòu)建信息提取或自然語言理解系統(tǒng),,或者對文本進行預(yù)處理以進行深度學(xué)習(xí),。
nlp.pipe 生成 Doc 對象,因此我們可以對它們進行迭代并訪問命名實體預(yù)測: [('$9.4 million', 'MONEY'), ('the prior year', 'DATE'), ('$2.7 million', 'MONEY')][('twelve billion dollars', 'MONEY'), ('1b', 'MONEY')] 13,、 LibROSA librosa 是一個用于音樂和音頻分析的 Python 庫,,它提供了創(chuàng)建音樂信息檢索系統(tǒng)所必需的功能和函數(shù)。
14,、 PandasPandas 是一個快速,、強大、靈活且易于使用的開源數(shù)據(jù)分析和操作工具,, Pandas 可以從各種文件格式比如 CSV,、JSON、SQL、Microsoft Excel 導(dǎo)入數(shù)據(jù),,可以對各種數(shù)據(jù)進行運算操作,,比如歸并、再成形,、選擇,,還有數(shù)據(jù)清洗和數(shù)據(jù)加工特征。Pandas 廣泛應(yīng)用在學(xué)術(shù),、金融,、統(tǒng)計學(xué)等各個數(shù)據(jù)分析領(lǐng)域。 import matplotlib.pyplot as pltimport pandas as pdimport numpy as npts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))ts = ts.cumsum()df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))df = df.cumsum()df.plot()plt.show() 15,、 MatplotlibMatplotlib 是Python的繪圖庫,,它提供了一整套和 matlab 相似的命令 API,可以生成出版質(zhì)量級別的精美圖形,,Matplotlib 使繪圖變得非常簡單,,在易用性和性能間取得了優(yōu)異的平衡。 使用 Matplotlib 繪制多曲線圖:
16,、 SeabornSeaborn 是在 Matplotlib 的基礎(chǔ)上進行了更高級的API封裝的Python數(shù)據(jù)可視化庫,,從而使得作圖更加容易,應(yīng)該把 Seaborn 視為 Matplotlib 的補充,,而不是替代物,。 import seaborn as snsimport matplotlib.pyplot as pltsns.set_theme(style='ticks')df = sns.load_dataset('penguins')sns.pairplot(df, hue='species')plt.show() 17、 OrangeOrange 是一個開源的數(shù)據(jù)挖掘和機器學(xué)習(xí)軟件,,提供了一系列的數(shù)據(jù)探索,、可視化、預(yù)處理以及建模組件,。Orange 擁有漂亮直觀的交互式用戶界面,非常適合新手進行探索性數(shù)據(jù)分析和可視化展示,;同時高級用戶也可以將其作為 Python 的一個編程模塊進行數(shù)據(jù)操作和組件開發(fā),。 使用 pip 即可安裝 Orange,好評
安裝完成后,,在命令行輸入 orange-canvas 命令即可啟動 Orange 圖形界面: $ orange-canvas 啟動完成后,,即可看到 Orange 圖形界面,進行各種操作,。 18,、 PyBrainPyBrain 是 Python 的模塊化機器學(xué)習(xí)庫。它的目標是為機器學(xué)習(xí)任務(wù)和各種預(yù)定義的環(huán)境提供靈活,、易于使用且強大的算法來測試和比較算法,。PyBrain 是 Python-Based Reinforcement Learning, Artificial Intelligence and Neural Network Library 的縮寫。 我們將利用一個簡單的例子來展示 PyBrain 的用法,構(gòu)建一個多層感知器 (Multi Layer Perceptron, MLP),。 首先,,我們創(chuàng)建一個新的前饋網(wǎng)絡(luò)對象:
接下來,構(gòu)建輸入,、隱藏和輸出層: from pybrain.structure import LinearLayer, SigmoidLayerinLayer = LinearLayer(2)hiddenLayer = SigmoidLayer(3)outLayer = LinearLayer(1) 為了使用所構(gòu)建的層,,必須將它們添加到網(wǎng)絡(luò)中:
可以添加多個輸入和輸出模塊。為了向前計算和反向誤差傳播,,網(wǎng)絡(luò)必須知道哪些層是輸入,、哪些層是輸出。 這就需要明確確定它們應(yīng)該如何連接,。為此,,我們使用最常見的連接類型,全連接層,,由 FullConnection 類實現(xiàn): from pybrain.structure import FullConnectionin_to_hidden = FullConnection(inLayer, hiddenLayer)hidden_to_out = FullConnection(hiddenLayer, outLayer) 與層一樣,,我們必須明確地將它們添加到網(wǎng)絡(luò)中:
所有元素現(xiàn)在都已準備就位,最后,,我們需要調(diào)用.sortModules()方法使MLP可用: n.sortModules() 這個調(diào)用會執(zhí)行一些內(nèi)部初始化,,這在使用網(wǎng)絡(luò)之前是必要的。 19,、 MilkMILK(MACHINE LEARNING TOOLKIT) 是 Python 語言的機器學(xué)習(xí)工具包,。它主要是包含許多分類器比如 SVMS、K-NN,、隨機森林以及決策樹中使用監(jiān)督分類法,,它還可執(zhí)行特征選擇,可以形成不同的例如無監(jiān)督學(xué)習(xí),、密切關(guān)系傳播和由 MILK 支持的 K-means 聚類等分類系統(tǒng),。 使用 MILK 訓(xùn)練一個分類器:
20、 TensorFlowTensorFlow 是一個端到端開源機器學(xué)習(xí)平臺,。它擁有一個全面而靈活的生態(tài)系統(tǒng),,一般可以將其分為 TensorFlow1.x 和 TensorFlow2.x,TensorFlow1.x 與 TensorFlow2.x 的主要區(qū)別在于 TF1.x 使用靜態(tài)圖而 TF2.x 使用Eager Mode動態(tài)圖,。 這里主要使用TensorFlow2.x作為示例,,展示在 TensorFlow2.x 中構(gòu)建卷積神經(jīng)網(wǎng)絡(luò) (Convolutional Neural Network, CNN)。 import tensorflow as tffrom tensorflow.keras import datasets, layers, models# 數(shù)據(jù)加載(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()# 數(shù)據(jù)預(yù)處理train_images, test_images = train_images / 255.0, test_images / 255.0# 模型構(gòu)建model = models.Sequential()model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation='relu'))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation='relu'))model.add(layers.Flatten())model.add(layers.Dense(64, activation='relu'))model.add(layers.Dense(10))# 模型編譯與訓(xùn)練model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) 21,、 PyTorchPyTorch 的前身是 Torch,,其底層和 Torch 框架一樣,但是使用 Python 重新寫了很多內(nèi)容,,不僅更加靈活,,支持動態(tài)圖,,而且提供了 Python 接口。
22,、 TheanoTheano 是一個 Python 庫,,它允許定義、優(yōu)化和有效地計算涉及多維數(shù)組的數(shù)學(xué)表達式,,建在 NumPy 之上,。 在 Theano 中實現(xiàn)計算雅可比矩陣: import theanoimport theano.tensor as Tx = T.dvector('x')y = x ** 2J, updates = theano.scan(lambda i, y,x : T.grad(y[i], x), sequences=T.arange(y.shape[0]), non_sequences=[y,x])f = theano.function([x], J, updates=updates)f([4, 4]) 23、 KerasKeras 是一個用 Python 編寫的高級神經(jīng)網(wǎng)絡(luò) API,,它能夠以 TensorFlow, CNTK, 或者 Theano 作為后端運行,。Keras 的開發(fā)重點是支持快速的實驗,能夠以最小的時延把想法轉(zhuǎn)換為實驗結(jié)果,。
24,、 Caffe在 Caffe2 官方網(wǎng)站上,這樣說道:Caffe2 現(xiàn)在是 PyTorch 的一部分,。雖然這些 api 將繼續(xù)工作,,但鼓勵使用 PyTorch api。 25,、 MXNetMXNet 是一款設(shè)計為效率和靈活性的深度學(xué)習(xí)框架,。它允許混合符號編程和命令式編程,從而最大限度提高效率和生產(chǎn)力,。 使用 MXNet 構(gòu)建手寫數(shù)字識別模型: import mxnet as mxfrom mxnet import gluonfrom mxnet.gluon import nnfrom mxnet import autograd as agimport mxnet.ndarray as F# 數(shù)據(jù)加載mnist = mx.test_utils.get_mnist()batch_size = 100train_data = mx.io.NDArrayIter(mnist['train_data'], mnist['train_label'], batch_size, shuffle=True)val_data = mx.io.NDArrayIter(mnist['test_data'], mnist['test_label'], batch_size)# CNN模型class Net(gluon.Block): def __init__(self, **kwargs): super(Net, self).__init__(**kwargs) self.conv1 = nn.Conv2D(20, kernel_size=(5,5)) self.pool1 = nn.MaxPool2D(pool_size=(2,2), strides = (2,2)) self.conv2 = nn.Conv2D(50, kernel_size=(5,5)) self.pool2 = nn.MaxPool2D(pool_size=(2,2), strides = (2,2)) self.fc1 = nn.Dense(500) self.fc2 = nn.Dense(10) def forward(self, x): x = self.pool1(F.tanh(self.conv1(x))) x = self.pool2(F.tanh(self.conv2(x))) # 0 means copy over size from corresponding dimension. # -1 means infer size from the rest of dimensions. x = x.reshape((0, -1)) x = F.tanh(self.fc1(x)) x = F.tanh(self.fc2(x)) return xnet = Net()# 初始化與優(yōu)化器定義# set the context on GPU is available otherwise CPUctx = [mx.gpu() if mx.test_utils.list_gpus() else mx.cpu()]net.initialize(mx.init.Xavier(magnitude=2.24), ctx=ctx)trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.03})# 模型訓(xùn)練# Use Accuracy as the evaluation metric.metric = mx.metric.Accuracy()softmax_cross_entropy_loss = gluon.loss.SoftmaxCrossEntropyLoss()for i in range(epoch): # Reset the train data iterator. train_data.reset() for batch in train_data: data = gluon.utils.split_and_load(batch.data[0], ctx_list=ctx, batch_axis=0) label = gluon.utils.split_and_load(batch.label[0], ctx_list=ctx, batch_axis=0) outputs = [] # Inside training scope with ag.record(): for x, y in zip(data, label): z = net(x) # Computes softmax cross entropy loss. loss = softmax_cross_entropy_loss(z, y) # Backpropogate the error for one iteration. loss.backward() outputs.append(z) metric.update(label, outputs) trainer.step(batch.data[0].shape[0]) # Gets the evaluation result. name, acc = metric.get() # Reset evaluation result to initial state. metric.reset() print('training acc at epoch %d: %s=%f'%(i, name, acc)) 26,、 PaddlePaddle飛槳 (PaddlePaddle) 以百度多年的深度學(xué)習(xí)技術(shù)研究和業(yè)務(wù)應(yīng)用為基礎(chǔ),集深度學(xué)習(xí)核心訓(xùn)練和推理框架,、基礎(chǔ)模型庫,、端到端開發(fā)套件、豐富的工具組件于一體,。是中國首個自主研發(fā),、功能完備、開源開放的產(chǎn)業(yè)級深度學(xué)習(xí)平臺,。 使用 PaddlePaddle 實現(xiàn) LeNtet5:
27、 CNTKCNTK(Cognitive Toolkit) 是一個深度學(xué)習(xí)工具包,,通過有向圖將神經(jīng)網(wǎng)絡(luò)描述為一系列計算步驟,。在這個有向圖中,,葉節(jié)點表示輸入值或網(wǎng)絡(luò)參數(shù),而其他節(jié)點表示對其輸入的矩陣運算,。CNTK 可以輕松地實現(xiàn)和組合流行的模型類型,,如 CNN 等。 CNTK 用網(wǎng)絡(luò)描述語言 (network description language, NDL) 描述一個神經(jīng)網(wǎng)絡(luò),。 簡單的說,,要描述輸入的 feature,輸入的 label,,一些參數(shù),,參數(shù)和輸入之間的計算關(guān)系,以及目標節(jié)點是什么,。 NDLNetworkBuilder=[ run=ndlLR ndlLR=[ # sample and label dimensions SDim=$dimension$ LDim=1 features=Input(SDim, 1) labels=Input(LDim, 1) # parameters to learn B0 = Parameter(4) W0 = Parameter(4, SDim) B = Parameter(LDim) W = Parameter(LDim, 4) # operations t0 = Times(W0, features) z0 = Plus(t0, B0) s0 = Sigmoid(z0) t = Times(W, s0) z = Plus(t, B) s = Sigmoid(z) LR = Logistic(labels, s) EP = SquareError(labels, s) # root nodes FeatureNodes=(features) LabelNodes=(labels) CriteriaNodes=(LR) EvalNodes=(EP) OutputNodes=(s,t,z,s0,W0) ] ]
|
|