|
本文目錄:
一、TensorFlow深度學(xué)習(xí)框架
二、PyTorch深度學(xué)習(xí)框架
三、Keras深度學(xué)習(xí)框架
四、Caffe深度學(xué)習(xí)框架
五、中國深度學(xué)習(xí)開源框架狀況
六、幾種框架的對比
七、其他統(tǒng)計數(shù)據(jù)
當(dāng)下,有許多主流的開源深度學(xué)習(xí)框架供開發(fā)者使用。
主要包括TensorFlow、PyTorch、Keras、Caffe等。
下面是對這幾種框架的詳細(xì)介紹和對比:
一、TensorFlow深度學(xué)習(xí)框架

TensorFlow(谷歌出品):
TensorFlow 是最受歡迎和廣泛使用的深度學(xué)習(xí)框架之一。
TensorFlow是一個由Google Brain團(tuán)隊開發(fā)的開源深度學(xué)習(xí)框架。它允許開發(fā)者創(chuàng)建多種機(jī)器學(xué)習(xí)模型,包括卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)和深度神經(jīng)網(wǎng)絡(luò)等。
TensorFlow使用數(shù)據(jù)流圖來表示計算圖,其中節(jié)點(diǎn)表示數(shù)學(xué)操作,邊表示數(shù)據(jù)流動。使用TensorFlow可以利用GPU和分布式計算來加速訓(xùn)練過程。
該框架有著廣泛的應(yīng)用場景,包括圖像識別、自然語言處理、語音識別、推薦系統(tǒng)等。同時,TensorFlow也有著豐富的社區(qū)支持和文檔資源,使其容易學(xué)習(xí)和使用。
- 適合各種應(yīng)用,包括計算機(jī)視覺、自然語言處理和推薦系統(tǒng)等。
- 提供了豐富的工具和庫,用于構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型。
- 支持靜態(tài)計算圖和動態(tài)計算圖??梢栽趫D構(gòu)建階段進(jìn)行優(yōu)化
- 具有強(qiáng)大的分布式計算能力。
- 支持多種語言接口,包括Python、C++、Java等
- 提供了許多高級操作,如自動微分、數(shù)據(jù)并行性等
- 易于在各種硬件平臺上部署和運(yùn)行
- 有強(qiáng)大的社區(qū)支持和豐富的文檔
Tensorflow有三種計算圖的構(gòu)建方式:靜態(tài)計算圖,動態(tài)計算圖,以及Autograph. TensorFlow1.0時代,采用的是靜態(tài)計算圖,需要先使用TensorFlow的各種算子創(chuàng)建計算圖,再開啟一個會話Session,顯示執(zhí)行計算圖。
TensorFlow2.0時代,采用的是動態(tài)計算圖,即每使用一個算子后,該算子會被動態(tài)加入到隱含的默認(rèn)計算圖中立即執(zhí)行得到結(jié)果,而無需開啟Session。 TensorFlow2.0默認(rèn)動態(tài)計算圖(Eager Excution) 使用動態(tài)計算圖的好處是方便調(diào)試程序。 使用動態(tài)計算圖的缺點(diǎn)是運(yùn)行效率相對會低一些。
如果需要在TensorFlow2.0中使用靜態(tài)圖,可以使用@tf.function裝飾器,將普通Python函數(shù)轉(zhuǎn)換成對應(yīng)的TensorFlow計算圖構(gòu)建代碼。運(yùn)行該函數(shù)就相當(dāng)于在TensorFlow1.0中用Session執(zhí)行代碼。 TensorFlow2.0為了確保對老版本tensorflow項目的兼容性,在tf.compat.v1子模塊中保留了對TensorFlow1.0靜態(tài)計算圖構(gòu)建風(fēng)格的支持。已經(jīng)不推薦使用了。 tf.Variable在計算圖中是一個持續(xù)存在的節(jié)點(diǎn),不受作用域的影響,一般的方法是把tf.Variable當(dāng)做類屬性來調(diào)用 靜態(tài)圖盡量使用tf.Tensor做參數(shù),tensorflow會根據(jù)Python原生數(shù)據(jù)類型的值不同,而重復(fù)創(chuàng)建圖,導(dǎo)致速度變慢 靜態(tài)圖tf.Tensor比值比的是tensor的hash值,而不是原本的值 tf自帶數(shù)學(xué)大小函數(shù) 大于 tf.math.greater(a, b) 等于 tf.math.equal(a, b) 小于 tf.math.less(a, b)
使用tf.function構(gòu)建靜態(tài)圖的方式叫做 Autograph。
TensorFlow深度學(xué)習(xí)例子
以下是一個使用TensorFlow保存當(dāng)前訓(xùn)練模型并在測試集上進(jìn)行測試的樣例代碼: 代碼中,我們使用了一個簡單的線性模型,并在訓(xùn)練過程中將模型保存到了當(dāng)前目錄下的my_model.ckpt文件中。在訓(xùn)練完成后,我們使用測試集進(jìn)行了模型的測試,輸出了測試集上的損失值。
# 初始化數(shù)據(jù)和標(biāo)簽 train_data = np.random.rand(1000, 10) train_labels = np.random.rand(1000, 1) test_data = np.random.rand(200, 10) test_labels = np.random.rand(200, 1) input_ph = tf.placeholder(tf.float32, shape=[None, 10]) labels_ph = tf.placeholder(tf.float32, shape=[None, 1]) weights = tf.Variable(tf.zeros([10, 1])) bias = tf.Variable(tf.zeros([1])) output = tf.matmul(input_ph, weights) + bias loss = tf.reduce_mean(tf.square(output - labels_ph)) # 創(chuàng)建訓(xùn)練操作和初始化操作 train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss) init_op = tf.global_variables_initializer() with tf.Session() as sess: _, loss_val = sess.run([train_op, loss], feed_dict={input_ph: train_data, labels_ph: train_labels}) print("Epoch {}: loss = {}".format(i+1, loss_val)) saver.save(sess, "./my_model.ckpt") test_loss_val = sess.run(loss, feed_dict={input_ph: test_data, labels_ph: test_labels}) print("Test loss = {}".format(test_loss_val))

代碼運(yùn)行結(jié)果:
Epoch 1: loss = 0.33758699893951416
Epoch 2: loss = 0.11031775921583176
Epoch 3: loss = 0.09063640236854553
Epoch 4: loss = 0.0888814628124237
Epoch 5: loss = 0.08867537975311279
Epoch 6: loss = 0.08860388398170471
Epoch 7: loss = 0.0885448306798935
Epoch 8: loss = 0.0884876698255539
Epoch 9: loss = 0.0884314551949501
Epoch 10: loss = 0.08837611228227615
Epoch 11: loss = 0.08832161128520966
Epoch 12: loss = 0.08826790004968643
Epoch 13: loss = 0.08821499347686768
Epoch 14: loss = 0.0881628543138504
Epoch 15: loss = 0.08811149001121521
Epoch 16: loss = 0.08806086331605911
Epoch 17: loss = 0.08801095187664032
Epoch 18: loss = 0.08796177059412003
Epoch 19: loss = 0.08791326731443405
Epoch 20: loss = 0.08786546438932419
Epoch 21: loss = 0.08781831711530685
Epoch 22: loss = 0.08777181059122086
Epoch 23: loss = 0.08772596716880798
Epoch 24: loss = 0.08768074214458466
Epoch 25: loss = 0.08763613551855087
Epoch 26: loss = 0.08759212493896484
Epoch 27: loss = 0.08754870295524597
Epoch 28: loss = 0.08750586211681366
Epoch 29: loss = 0.08746359497308731
Epoch 30: loss = 0.08742187172174454
Epoch 31: loss = 0.08738070726394653
Epoch 32: loss = 0.08734006434679031
Epoch 33: loss = 0.08729996532201767
Epoch 34: loss = 0.08726035058498383
Epoch 35: loss = 0.08722126483917236
Epoch 36: loss = 0.0871826633810997
Epoch 37: loss = 0.08714456111192703
Epoch 38: loss = 0.08710692077875137
Epoch 39: loss = 0.08706976473331451
Epoch 40: loss = 0.08703305572271347
Epoch 41: loss = 0.08699680119752884
Epoch 42: loss = 0.08696100115776062
Epoch 43: loss = 0.08692563325166702
Epoch 44: loss = 0.08689068257808685
Epoch 45: loss = 0.0868561640381813
Epoch 46: loss = 0.08682206273078918
Epoch 47: loss = 0.0867883637547493
Epoch 48: loss = 0.08675506711006165
Epoch 49: loss = 0.08672215789556503
Epoch 50: loss = 0.08668963611125946
Epoch 51: loss = 0.08665750920772552
Epoch 52: loss = 0.08662573993206024
Epoch 53: loss = 0.0865943431854248
Epoch 54: loss = 0.08656331896781921
Epoch 55: loss = 0.08653264492750168
Epoch 56: loss = 0.0865023210644722
Epoch 57: loss = 0.08647233247756958
Epoch 58: loss = 0.08644269406795502
Epoch 59: loss = 0.08641338348388672
Epoch 60: loss = 0.08638441562652588
Epoch 61: loss = 0.0863557755947113
Epoch 62: loss = 0.0863274559378624
Epoch 63: loss = 0.08629942685365677
Epoch 64: loss = 0.0862717255949974
Epoch 65: loss = 0.08624432235956192
Epoch 66: loss = 0.0862172394990921
Epoch 67: loss = 0.08619043231010437
Epoch 68: loss = 0.08616391569375992
Epoch 69: loss = 0.08613769710063934
Epoch 70: loss = 0.08611176162958145
Epoch 71: loss = 0.08608610183000565
Epoch 72: loss = 0.08606073260307312
Epoch 73: loss = 0.08603561669588089
Epoch 74: loss = 0.08601076900959015
Epoch 75: loss = 0.08598621189594269
Epoch 76: loss = 0.08596190065145493
Epoch 77: loss = 0.08593783527612686
Epoch 78: loss = 0.08591403067111969
Epoch 79: loss = 0.08589048683643341
Epoch 80: loss = 0.08586718887090683
Epoch 81: loss = 0.08584412187337875
Epoch 82: loss = 0.08582130074501038
Epoch 83: loss = 0.0857987329363823
Epoch 84: loss = 0.08577638119459152
Epoch 85: loss = 0.08575427532196045
Epoch 86: loss = 0.08573239296674728
Epoch 87: loss = 0.08571072667837143
Epoch 88: loss = 0.08568929135799408
Epoch 89: loss = 0.08566807210445404
Epoch 90: loss = 0.08564707636833191
Epoch 91: loss = 0.08562628924846649
Epoch 92: loss = 0.08560571074485779
Epoch 93: loss = 0.0855853483080864
Epoch 94: loss = 0.08556520193815231
Epoch 95: loss = 0.08554524928331375
Epoch 96: loss = 0.0855254977941513
Epoch 97: loss = 0.08550594002008438
Epoch 98: loss = 0.08548659086227417
Epoch 99: loss = 0.08546742796897888
Epoch 100: loss = 0.08544846624135971
Test loss = 0.09260907769203186
二、PyTorch深度學(xué)習(xí)框架
PyTorch(Facebook開源):

PyTorch 是另一個非常受歡迎的深度學(xué)習(xí)框架。
PyTorch是一個由Facebook開源的深度學(xué)習(xí)框架,是目前市場上最流行的深度學(xué)習(xí)框架之一。它基于Python語言,提供了強(qiáng)大的GPU加速功能和動態(tài)計算圖的支持。
PyTorch的應(yīng)用范圍非常廣泛,包括圖像和語音識別、自然語言處理、計算機(jī)視覺、推薦系統(tǒng)等領(lǐng)域。
PyTorch具有易于使用、靈活性高和代碼可讀性好等特點(diǎn),使得它成為深度學(xué)習(xí)研究和應(yīng)用的首選框架之一。
- 易于在GPU上加速訓(xùn)練,具有出色的 GPU 加速性能。
- 提供了廣泛的預(yù)訓(xùn)練模型和工具包,
- 張量庫,用于使用 GPU 和 CPU 進(jìn)行深度學(xué)習(xí)。
- 強(qiáng)調(diào)動態(tài)計算圖的構(gòu)建,可以更靈活地進(jìn)行模型調(diào)整和調(diào)試,使得模型構(gòu)建和調(diào)試更加直觀。
- 它在靈活性和易用性方面表現(xiàn)出色,特別適合研究和原型開發(fā)。
- 具有豐富的工具和庫,如Torch方便使用。
- 提供簡潔靈活的API,減少代碼編寫量
- 有活躍的社區(qū)和詳細(xì)的文檔支持
PyTorch深度學(xué)習(xí)例子
#使用 PyTorch 張量將三階多項式擬合到正弦函數(shù)。手動實現(xiàn)轉(zhuǎn)發(fā) 并向后通過網(wǎng)絡(luò):
#使用 PyTorch 張量將三階多項式擬合到正弦函數(shù)。 #手動實現(xiàn)轉(zhuǎn)發(fā) 并向后通過網(wǎng)絡(luò): device = torch.device("cpu") # device = torch.device("cuda:0") # Uncomment this to run on GPU # Create random input and output data x = torch.linspace(-math.pi, math.pi, 2000, device=device, dtype=dtype) # Randomly initialize weights a = torch.randn((), device=device, dtype=dtype) b = torch.randn((), device=device, dtype=dtype) c = torch.randn((), device=device, dtype=dtype) d = torch.randn((), device=device, dtype=dtype) # Forward pass: compute predicted y y_pred = a + b * x + c * x ** 2 + d * x ** 3 loss = (y_pred - y).pow(2).sum().item() # Backprop to compute gradients of a, b, c, d with respect to loss grad_y_pred = 2.0 * (y_pred - y) grad_a = grad_y_pred.sum() grad_b = (grad_y_pred * x).sum() grad_c = (grad_y_pred * x ** 2).sum() grad_d = (grad_y_pred * x ** 3).sum() # Update weights using gradient descent a -= learning_rate * grad_a b -= learning_rate * grad_b c -= learning_rate * grad_c d -= learning_rate * grad_d print(f'Result: y = {a.item()} + {b.item()} x + {c.item()} x^2 + {d.item()} x^3')

代碼運(yùn)行結(jié)果:
99 2351.4306640625
199 1585.7086181640625
299 1071.2376708984375
399 725.2841796875
499 492.4467468261719
599 335.59881591796875
699 229.84210205078125
799 158.46621704101562
899 110.2466812133789
999 77.63826751708984
1099 55.56399154663086
1199 40.60529327392578
1299 30.45751953125
1399 23.5659236907959
1499 18.880510330200195
1599 15.69140911102295
1699 13.518349647521973
1799 12.035942077636719
1899 11.023494720458984
1999 10.331212043762207
Result: y = 0.030692655593156815 + 0.8315182328224182 x + -0.005294993054121733 x^2 + -0.08974269032478333 x^3
三、Keras深度學(xué)習(xí)框架
Keras(谷歌):

Keras(谷歌)(最初由Fran?ois Chollet開發(fā),現(xiàn)在為TensorFlow官方API):
Keras 是一個易用且功能強(qiáng)大的,用 Python 編寫的高級神經(jīng)網(wǎng)絡(luò) API,它能夠以 TensorFlow, CNTK, 或者 Theano 作為后端運(yùn)行。
Keras 的開發(fā)重點(diǎn)是支持快速的實驗。能夠以最小的時延把你的想法轉(zhuǎn)換為實驗結(jié)果,是做好研究的關(guān)鍵。
- Keras支持多個后端引擎,可以在 Tensorflow、Theano、CNTK 等框架上運(yùn)行。
- 提供簡潔易用的高級API,尤其適合初學(xué)者和快速原型設(shè)計
- 具有廣泛的模型庫、預(yù)訓(xùn)練模型和各種工具包,使得模型構(gòu)建更加高效。
- 可以無縫切換到TensorFlow,以享受其強(qiáng)大的功能和生態(tài)系統(tǒng)
- 允許簡單而快速的原型設(shè)計(由于用戶友好,高度模塊化,可擴(kuò)展性)。
- 同時支持卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò),以及兩者的組合。
- 在 CPU 和 GPU 上無縫運(yùn)行。
指導(dǎo)原則
- 用戶友好。 Keras 是為人類而不是為機(jī)器設(shè)計的 API。它把用戶體驗放在首要和中心位置。Keras 遵循減少認(rèn)知困難的最佳實踐:它提供一致且簡單的 API,將常見用例所需的用戶操作數(shù)量降至最低,并且在用戶錯誤時提供清晰和可操作的反饋。
- 模塊化。 模型被理解為由獨(dú)立的、完全可配置的模塊構(gòu)成的序列或圖。這些模塊可以以盡可能少的限制組裝在一起。特別是神經(jīng)網(wǎng)絡(luò)層、損失函數(shù)、優(yōu)化器、初始化方法、激活函數(shù)、正則化方法,它們都是可以結(jié)合起來構(gòu)建新模型的模塊。
- 易擴(kuò)展性。 新的模塊是很容易添加的(作為新的類和函數(shù)),現(xiàn)有的模塊已經(jīng)提供了充足的示例。由于能夠輕松地創(chuàng)建可以提高表現(xiàn)力的新模塊,Keras 更加適合高級研究。
- 基于 Python 實現(xiàn)。 Keras 沒有特定格式的單獨(dú)配置文件。模型定義在 Python 代碼中,這些代碼緊湊,易于調(diào)試,并且易于擴(kuò)展。
四、Caffe深度學(xué)習(xí)框架
Caffe(伯克利)

Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,意為“用于特征提取的卷積架構(gòu)”,它是一個清晰、高效的深度學(xué)習(xí)框架,核心語言是C++。
Caffe是一種流行的深度學(xué)習(xí)框架,是由加州大學(xué)伯克利分校的研究人員開發(fā)的,用于卷積神經(jīng)網(wǎng)絡(luò)(CNN)和其他深度學(xué)習(xí)模型的訓(xùn)練和部署。
Caffe的主要優(yōu)點(diǎn)是速度快、易于使用和高度可移植性。
它已被廣泛應(yīng)用于計算機(jī)視覺、自然語言處理和語音識別等領(lǐng)域。
Caffe還具有一個強(qiáng)大的社區(qū),提供了許多預(yù)訓(xùn)練的模型和可視化工具,使用戶可以輕松地構(gòu)建自己的深度學(xué)習(xí)模型。
- Caffe 是一個基于 C++ 的深度學(xué)習(xí)框架,旨在高效地進(jìn)行卷積運(yùn)算。
- 它特別適合計算機(jī)視覺任務(wù),并在圖像分類和物體檢測方面表現(xiàn)出色。
- Caffe 提供了簡單的配置文件來定義網(wǎng)絡(luò)結(jié)構(gòu)和超參數(shù)。
- 具有高效的 GPU 加速,適合在大規(guī)模數(shù)據(jù)集上訓(xùn)練模型。
五、中國深度學(xué)習(xí)開源框架狀況
- 中國深度學(xué)習(xí)開源框架市場形成三強(qiáng)格局

國際權(quán)威數(shù)據(jù)調(diào)研機(jī)構(gòu)IDC發(fā)布《中國深度學(xué)習(xí)框架和平臺市場份額,2022H2》報告。報告顯示,百度穩(wěn)居中國深度學(xué)習(xí)平臺市場綜合份額第一,領(lǐng)先優(yōu)勢進(jìn)一步擴(kuò)大。中國深度學(xué)習(xí)開源框架市場形成三強(qiáng)格局,框架市場前三份額超過80%。
六、幾種框架的對比
幾種框架的對比表
目前最受歡迎的深度學(xué)習(xí)框架包括TensorFlow、PyTorch和Caffe。
據(jù)市場研究公司O'Reilly發(fā)布的《2019年AI和深度學(xué)習(xí)市場調(diào)查報告》顯示,TensorFlow是最受歡迎的深度學(xué)習(xí)框架,有57.2%的受訪者使用它。PyTorch緊隨其后,有37.1%的受訪者使用它。Caffe和Keras也很受歡迎,分別占據(jù)了16.2%和13.7%的市場份額。
| 幾種常見的深度學(xué)習(xí)框架在市場上的占比對比(2021) | | TensorFlow: | 超40%, | 是目前最流行的深度學(xué)習(xí)框架之一。 | | PyTorch: | 超25%, | 由Facebook開發(fā)并維護(hù),近年來逐漸受到關(guān)注和廣泛應(yīng)用。 | | Keras: | 超10%, | 經(jīng)常與TensorFlow一起使用,提供了一種更簡單易用的框架。 | | Caffe: | 約5%, | 市場適用于計算機(jī)視覺和圖像處理等領(lǐng)域。 | | MXNet: | 約5%, | 市場由亞馬遜開發(fā)并維護(hù),適用于大規(guī)模分布式深度學(xué)習(xí)。 |
這幾種框架的主要特點(diǎn)的簡單對比表
| | TensorFlow | PyTorch | Keras | | 計算圖 | 靜態(tài)圖 | 動態(tài)圖 | 靜態(tài)圖 | | 語言接口 | Python、C++、Java等 | Python | Python | | API | 豐富 | 簡潔 | 簡潔 | | 硬件支持 | 廣泛 | 動態(tài)圖 | 有限 | | 社區(qū)支持 | 強(qiáng)大 | 活躍 | 活躍 |
| 框架 | 靜態(tài)圖 /動態(tài)圖 | 多樣化 應(yīng)用領(lǐng)域 | 靈活性 與易用性 | GPU 加速性能 | 預(yù)訓(xùn)練模型 和工具包 | | TensorFlow | 靜態(tài)圖/動態(tài)圖 | 廣泛應(yīng)用 | 中等 | 優(yōu)秀 | 豐富 | | PyTorch | 動態(tài)圖 | 廣泛應(yīng)用 | 出色 | 優(yōu)秀 | 豐富 | | Keras | 靜態(tài)圖 | 廣泛應(yīng)用 | 優(yōu)秀 | 出色 | 豐富 | | Caffe | 靜態(tài)圖 | 計算機(jī)視覺 | 中等 | 中等 | 一般 |
需要注意的是,這些框架各有優(yōu)缺點(diǎn),并且在不同的應(yīng)用場景下可能有不同的最佳選擇。因此,在選擇框架時,建議應(yīng)根據(jù)項目需求和研究方向、編程技能和個人喜好來決定,進(jìn)行評估和比較,最后選擇具體的框架。
七、其他統(tǒng)計數(shù)據(jù)
.NET(5+) 用戶明年希望使用的前三個選項是 .NET(5+)、.NET MAUI 和 .NET Framework (1.0 - 4.8)。.NET 偏袒性很強(qiáng) 在他們的社區(qū)內(nèi)。


|