keras 自定义层input_从4个方面介绍Keras和Pytorch,并给你选择其中一个学习库的理由...
對許多科學家、工程師和開發人員而言,TensorFlow是他們的第一個深度學習框架。
TensorFlow 1.0于2017年2月發布;但客觀來說,它對用戶不是非常友好。
過去幾年里,由于Keras和PyTorch比TensorFlow更容易使用,這兩個主要的深度學習庫已得到較廣的普及。
本文將從四個方面來介紹Keras和Pytorch,以及選擇其中一個學習庫的理由。
Keras
Keras自身并不是框架,它其實是一個位于其他高級學習框架之上的高級API。目前,它支持TensorFlow, Theano和CNTK。
Keras的吸引力在于使用簡單。它是目前為止啟動和運行最快且最簡單的框架。神經網絡的定義是直觀的,使用功能API則允許人們將函數定義為層次。
Pytorch
Pytorch是由Facebook AI 研究組開發的深度學習框架(如Tensorflow)。像Keras一樣,它也提煉了深度網絡編程的大多混亂部分。
就編碼風格的高級和低級而言,Pytorch介于Keras和TensorFlow之間。使用時,你有比Keras更多的靈活性和控制力,同時還無需冗長的聲明式編程。
應該使用哪一個編程框架,是深度學習練習者一直在爭論的問題。一般來說,這取決于個人偏好。但在做選擇時,需要記住Keras和Pytorch的這幾個方面的知識。
用于定義模型的類與函數
為了定義深度學習模型,Keras設置了功能API。在功能API的范疇里,神經網絡被定義為一組順序函數,需要接連使用。比如說,函數定義層1的輸出是函數定義層2的輸入。
img_input = layers.Input(shape=input_shape)x = layers.Conv2D(64, (3, 3), activation='relu')(img_input)x = layers.Conv2D(64, (3, 3), activation='relu')(x)x = layers.MaxPooling2D((2, 2), strides=(2, 2))(x)而Pytorch將網絡設置為一個類,該類拓展了Torch庫中的torch.nn模塊。與Keras類似,Pytorch使用的層為構建塊,但由于它們在Pytorch的類中,因此它們屬于‘__init__()’類下的一種字符,并由‘forward()’類執行。
class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, 3) self.conv2 = nn.Conv2d(64, 64, 3) self.pool = nn.MaxPool2d(2, 2) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool(F.relu(self.conv2(x))) return xmodel = Net()因為Pytorch允許訪問Python的所有的類功能而不是簡單的函數調用,所以定義網絡可以更清晰,包容量更多。這真沒有什么不好的,除非你認為,盡可能快地編寫網絡代碼對你來說是最重要的,那么Keras使用起來會更方便。
張量和計算圖對比標準數列
對于隨意的程序員來說,Keras API隱藏了許多混亂的細節。定義網絡層十分直觀,通常默認設置就足夠入門。
只有你處理到前沿的、或是奇特的模型時,才需要開始著手處理低級、細節的TensorFlow。
然而麻煩的是,當你處理到更低級別的TensorFlow時,隨之而來的是所有具有挑戰性的部分。必須保證排好所有的矩陣乘法。你甚至不用嘗試打印任何一個圖層輸出,因為你將在終端得到一個漂亮的Tensor定義。
Pytorch對這些方面的要求往往更加寬松。你必須知道每個層輸入和輸出的大小,但這是一個可以快速掌握的簡單技能。不必構建一個無法在調試中直觀看到的抽象計算圖。
Pytorch的另一個優點是可以在Torch Tensors和Numpy陣列之間來回切換。如果你要做一些自定義的東西,那么在TF張量和Numpy陣列之間來回切換可能會很麻煩。此時,開發人員需要對TensorFlow會話有充分的了解。
Pytorch的交互操作實際上更簡單。你只要知道兩個操作:一個是將Torch Tensor(一個變量對象)切換為Numpy,另一個就是切換到相反方向。
當然,如果你不需要執行任何花哨的東西,那么Keras就已經足夠好了,因為不會遇到任何TensorFlow的阻礙。但如果你需要執行復雜的編程,那么使用Pytorch可能會更順暢。
訓練模型
在Keras中訓練模型非常簡單!僅需一個的‘.fit()’,你就可以甩開步子,享受這場“編程之行”。
history = model.fit_generator( generator=train_generator, epochs=10, validation_data=validation_generator)在Pytorch中訓練模型包括幾個步驟:
1. 每批訓練開始時初始化梯度
2. 運行前進模式
3. 運行后退模式
4. 計算損失并更新權重
for epoch in range(2): # loop over the dataset multiple times running_loss = 0.0 for i, data in enumerate(trainloader, 0): # Get the inputs; data is a list of [inputs, labels] inputs, labels = data # (1) Initialise gradients optimizer.zero_grad() # (2) Forward pass outputs = net(inputs) loss = criterion(outputs, labels) # (3) Backward loss.backward() # (4) Compute the loss and update the weights optimizer.step()這些都不過是運行訓練的常見步驟!
如此一來,你總能意識到發生了什么。同時,由于這些模型訓練步驟在訓練不同模型時基本保持不變,因此它們顯得十分不必要。
控制CPU與GPU模式
如果安裝了tensorflow-gpu,你可以選擇用Keras的默認設置啟動并使用GPU。然后,如果你想把某些操作移動到CPU里,可以執行以下單行操作:
with tf.device('/cpu:0'): y = apply_non_max_suppression(x)至于Pytorch,你必須為每個torch張量和Numpy變量明確指定運行GPU。如果在CPU和GPU之間來回切換來進行不同的操作,這會使代碼變得混亂,且有可能容易出錯。
例如,要把以前的模型轉移到GPU上運行,我們必須執行以下操作:
# Get the GPU devicedevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # Transfer the network to GPUnet.to(device) # Transfer the inputs and labels to GPUinputs, labels = data[0].to(device), data[1].to(device)Keras贏在它的簡潔和良好的默認設置。
選擇框架的一般建議
通常我們建議從Keras入門。
Keras無疑是最容易使用,理解且快速啟動和運行的框架。你不用擔心它的GPU設置,不需要擺弄抽象代碼,總之,你不必做任何復雜的事情。你甚至可以在不觸及任何一行TensorFlow 的情況下,執行自定義圖層和損失函數的操作。
如果你開始深入了解深層網絡的更精細的方面,或者正在執行一些非標準化的東西,那么Pytorch就是首選深度學習庫。用Keras的話,就會多一些額外的工作,但不會太多,只不過這會使你的工作效率降低。可是,你依舊可以快速執行,訓練和檢測網絡,而且還能輕松調試!
留言 點贊 關注
我們一起分享AI學習與發展的干貨
歡迎關注全平臺AI垂類自媒體 “讀芯術”
總結
以上是生活随笔為你收集整理的keras 自定义层input_从4个方面介绍Keras和Pytorch,并给你选择其中一个学习库的理由...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vgh电压高了有什么_智能变频电源的功能
- 下一篇: a*算法的时间复杂度_数据结构(1)——