Tensorflow、Caffe、Pytorch與Keras深度學習庫總結

尊敬的讀者您好:筆者很高興自己的文章能被閱讀,但原創與編輯均不易,所以轉載請必須註明本文出處並附上本文地址超鏈接以及博主博客地址:https://blog.csdn.net/vensmallzeng。若覺得本文對您有益處還請幫忙點個贊鼓勵一下,筆者在此感謝每一位讀者,如需聯繫筆者,請記下郵箱:[email protected],謝謝合作!

 

 

 

在做自然語言處理項目時,大多時間多在使用Tensorflow,很少接觸其他流行的深度學習庫如 Caffe、Pytorch、Keras、MXNet與Theano等,爲了對各大主流深度學習庫也要有所瞭解,下面就對各大深度學習庫做一個小結。

 

一、Tensorflow的使用方法(先定義再執行)

① 定義參與構建計算圖的變量(包括接受輸入數據的變量);
② 定義網絡結構:隱含層與輸出層;
③ 定義loss表達式並選擇optimizer來優化loss函數;
④ 創建sess來執行計算圖(即對所有變量進行初始化,同時採用sess.run optimizer進行多次迭代學習以使loss達到最小)
 

二、Caffe的使用方法( 流水線寫網絡 )

① Convert data(run a script) 把圖像處理成Caffe支持的格式,如 LMDB格式等
② Define net ( edit proto.txt ) 定義網絡結構
③ Define solver and parameter (edit proto.txt ) 定義優化器與參數,如學習率,迭代次數等
④ Train  ( run a script.sh ) 訓練
⑤ Test ( run a script.sh ) 測試

 

三、Keras的使用方法( 號稱10行代碼搭建神經網絡 )

① 選擇模型 model = Sequential()
② 定義網絡結構,通過model.add()函數進行構建網絡,如

model.add(Dense(500,input_shape=(784,))) # 輸入層,28*28=784 
model.add(Activation('tanh')) # 激活函數是tanh 
model.add(Dropout(0.5)) # 採用50%的dropout
model.add(Dense(500)) # 隱藏層節點500個 
model.add(Activation('tanh')) 
model.add(Dropout(0.5))
model.add(Dense(10)) # 輸出結果是10個類別,所以維度是10 
model.add(Activation('softmax')) # 最後一層用softmax作爲激活函數

③ 選擇優化函數並編譯,如

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 優化函數,設定學習率(lr)等參數 
model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵作爲loss函數

④ 訓練網絡與調參(batch_size:對總的樣本數進行分組,每組包含的樣本數量;epochs:訓練次數;shuffle:是否把數據隨機打亂之後再進行訓練;validation_split:拿出百分之多少用來做交叉驗證;verbose: 屏顯模式 0: 不輸出  1:輸出進度  2:輸出每次的訓練結果)

(X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自帶的mnist工具讀取數據(第一次需要聯網)
 
#由於mist的輸入數據維度是(num, 28, 28),這裏需要把後面的維度直接拼起來變成784維 
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2])
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2]) 
Y_train = (numpy.arange(10) == y_train[:, None]).astype(int)
Y_test = (numpy.arange(10) == y_test[:, None]).astype(int)
model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3)
model.evaluate(X_test, Y_test, batch_size=200, verbose=0)

⑤ 測試網絡

print("test set")
scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0)
print("")
print("The test loss is %f" % scores)
result = model.predict(X_test,batch_size=200,verbose=0)
result_max = numpy.argmax(result, axis = 1)
test_max = numpy.argmax(Y_test, axis = 1)
result_bool = numpy.equal(result_max, test_max)
true_num = numpy.sum(result_bool)
print("")
print("The accuracy of the model is %f" % (true_num/len(result_bool)))

四、Pytorch的使用方法( 先定義再執行 )

① 定義參與構建計算圖的變量(包括接受輸入數據的變量);
② 定義網絡結構:隱含層與輸出層;
③ 定義loss表達式並選擇optimizer來優化loss函數;
④ 執行計算圖時,前向後向分開處理,如:

//樣本數40000
for i in range(40000):
    //將模型中參數的梯度設爲0
    optimzer.zero_grad()
    //計算網絡前向傳播輸出
    out = net(x)
    //計算損失函數
    loss = loss_func(out, y)
    //計算網絡反向傳播輸出
    loss.backward()
    //調用該方法以更新參數
    optimzer.step()

小結一下:大體來看,使用Pytorch和TensorFlow是一樣的套路,但兩者還是有一點區別:Pytorch是一個動態的框架,而TensorFlow是一個靜態的框架。TensorFlow構建的計算圖一旦定義好就不能夠變了,只能傳入不同的數據進行計算,然而TensorFlow固定了計算的流程,勢必會帶來不靈活性,倘若想要改變計算的邏輯,或者說計算邏輯是隨着時間變化的,那麼對於這樣的動態計算而言,TensorFlow是無法實現的,即便能實現也很麻煩,而Pytorch就可以很好的解決這個問題。

 



日積月累,與君共進,增增小結,未完待續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章