深度學習——keras教程系列基礎知識

2021-02-25 Python知識學堂

有你想要的精彩

                

大家好,本期我們將開始一個新的專題的寫作,因為有一些小夥伴想了解一下深度學習框架Keras的知識,恰好本人也會一點這個知識,因此就開始嘗試著寫一寫吧。本著和大家一起學習的態度,有什麼寫的不是很好的地方還請大家多多指教。這裡我默認大家已經搭建好了深度學習的實踐環境了。

Keras介紹

關於什麼是深度學習,我這裡就不多說明了,大家Google就能知道答案。關於深度學習的框架有很多:Tensorflow、Keras、PyTorch、 MXNet、PaddlePaddle等等,那麼為什麼我這裡就開講Keras呢,因為它簡潔好用啊。

它的簡潔在於:Keras是一個高級深度學習API,使用Python語言進行編寫的。Keras能夠在TensorFlow、Theano或CNTK上運行,這個意思就是Keras的後端引擎可以是這三者之一,用戶可以進行顯式的選擇。重要的是Keras提供了一個簡單和模塊化的API來構建和訓練我們需要的神經網絡,比如卷積神經網絡,循環神經網絡等等。還有一個優點就是使用Keras可以不用關心大部分函數實現的複雜細節,可真的太棒了。

Keras有四個特性:模塊性、易擴展、用戶友好和基於Python,以下的介紹來自Keras的中文文檔。

模塊化。模型被理解為由獨立的、完全可配置的模塊構成的序列或圖。這些模塊可以以儘可能少的限制組裝在一起。特別是神經網絡層、損失函數、優化器、初始化方法、激活函數、正則化方法,它們都是可以結合起來構建新模型的模塊。

易擴展性。新的模塊是很容易添加的(作為新的類和函數),現有的模塊已經提供了充足的示例。由於能夠輕鬆地創建可以提高表現力的新模塊,因此其更加適合高級研究。

用戶友好。Keras 是為人類而不是為機器設計的 API。它把用戶體驗放在首要和中心位置。Keras 遵循減少認知困難的最佳實踐:它提供一致且簡單的 API,將常見用例所需的用戶操作數量降至最低,並且在用戶錯誤時提供清晰和可操作的反饋。

基於 Python 實現。Keras 沒有特定格式的單獨配置文件。模型定義在 Python 代碼中,這些代碼緊湊,易於調試,並且易於擴展。

溫馨提示:如果大家對機器學習不清楚的話,可以先學習機器學習的相關知識,這對於本專題的學習是非常有利的。

迭深度學習的"Hello World"

在跟學習其他語言一樣,學習Keras的時候,我們也要學習它的基礎知識。深度學習的「Hello World」知識就是使用深度學習來識別手寫字識別。在學習之前,我們來看一些其他儲備知識:

安裝依賴的庫和深度學習庫

Numpy、scipy、scikit-learn、matplotlib、pandas、graphviz、pydot、h5py、Theano、Tensofflow、Keras。

安裝庫的方式比較簡單,打開cmd,輸入pip install packagename即可。

設置下載源

大家下載庫的時候,如果速度很慢,可以修改下載源,本人電腦中文件的

修改路徑和修改方式如下,大家根據自己的電腦找到相應的路徑:

設置Kreas後端

之前說過,我們可以更換Keras的後端引擎的。本人電腦文件和修改如下:

此時,「backend」:「tensorflow」,可修改tensorflow為Theano. 一般推薦 TensorFlow 後端,大家根據自己的電腦找到相應的路徑:


加載數據

1、 加載數據


深度學習重要的就是數據,那麼手寫字體的數據是怎樣的呢?

我們先看一下這個手寫數字體的數據形式:

   

from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
print(X_train.shape)
print(y_train.shape)

上述使用mnist.load_data()加載文件的方式會在從連結:

https://s3.amazonaws.com/img-datasets/mnist.npz

上下載數據集,控制臺的部分輸出如下:

這個下載的過程是很漫長的,甚至下載不了這個數據集,因此我們將採用其他的方式進行數據下載:

方法一:先從網絡上下載好這個數據集,然後傳入文件路徑:

   

from keras.datasets import mnist
path = r'C:\Users\LEGION\Desktop\datasets\mnist.npz'

(X_train, y_train), (X_test, y_test) = mnist.load_data(path)
print(X_train.shape)
print(y_train.shape)

輸出(60000, 28, 28)和(60000,)

方法二:通過numpy來進行搭橋,當然了也要事先下載好數據集:

   

# 加載keras包含的mnist的數據集
import numpy as np
from keras.datasets import mnist
def load_data(path):
   numpy_load= np.load(path)
   X_train, y_train = numpy_load['x_train'], numpy_load['y_train']
   X_test, y_test = numpy_load['x_test'], numpy_load['y_test']
   numpy_load.close()
   return (X_train, y_train), (X_test, y_test)

path = r'C:\Users\LEGION\Desktop\datasets\mnist.npz'
(X_train, y_train), (X_test, y_test) = load_data(path)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

X_train.shape 的形狀為(60000, 28, 28)
y_train.shape的形狀為(60000,)
X_test.shape的形狀為(10000, 28, 28)
y_test.shape的形狀為(10000,)

可以看到每條樣本是一個28*28的矩陣(畢竟是圖片),共有訓練數據60000個,測試數據10000個,y_train和y_test是諸如這樣的列表[7 2 1 ... 4 5 6],其中數字代表每個數據樣本的真實值。

2、 數據樣本展示


我們可以通過代碼來查看一下樣本的真實樣貌:

   

from keras.datasets import mnist
import matplotlib.pyplot as plt
path = r'C:\Users\LEGION\Desktop\datasets\mnist.npz'
(X_train, y_train), (X_test, y_test) = mnist.load_data(path)
for each in range(4):
   plt.subplot(2,2,each+1)
   plt.imshow(X_train[each], cmap=plt.get_cmap('gray'), interpolation='none')
   plt.title("Class {}".format(y_train[each]))
plt.show()

輸出顯示如下:可以看出每一個樣本的是gray形式的圖片,像素的灰度值在[0,255]

接下來我們的工作就是在訓練集(X_train和y_train)上訓練我們識別手寫字體的模型,在測試集上進行測試。

3、 重塑維度並歸一化


由於我們的任務是進行識別,實際上也就是進行分類,因此我們有必要對數據進行歸一化的操作。另外由於X_train.shape 的形狀為(60000, 28, 28),也就是說樣本是二維形狀的數據,在識別的時候是不好處理的,因此我們將數據轉換一維,並進行歸一化的處理。具體做法如下:

   

from keras.datasets import mnist
path = r'C:\Users\LEGION\Desktop\kerasdatasets\mnist.npz'
(X_train, y_train), (X_test, y_test) = mnist.load_data(path)
X_train = X_train.reshape(len(X_train), -1)
X_test = X_test.reshape(len(X_test), -1)
print(X_train.shape)
print(X_test.shape)

輸出: (60000, 784)和(10000, 784)

如果大家知道這個樣本(圖像的大小,如28*28),那麼餓哦們可以使用另外一個方法進行reshape操作:

   

X_train = X_train.reshape(len(X_train),784)
X_test = X_test.reshape(len(X_test), 784)

兩者效果是等效的,大家可以查看reshape函數的功能,就能明白這是為什麼了。

歸一化的操作很簡單,我們根據像素值的範圍進行歸一化,我們先看看數據的類型:

   

print(X_train.dtype)  # uint8

print(X_test.dtype)   # uint8

他們是uint8型的,由於要進行歸一化,歸一化的數據是float32類型的,因此我們將使用astype()進行轉換,轉換後進行歸一化:

   

X_train = X_train.astype('float32')/255
X_test = X_test.astype('float32')/255

之前我們說到標籤數據(也就是樣本的真實類別)y_train和y_test是諸如這樣的列表[7 2 1 ... 4 5 6],我們在此需要進行One-hot encoding的操作,不懂One-hot encoding編碼的同學可以查閱下資料:

   

from keras.utils import np_utils
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

至此我們的數據就處理結束了,接下來我們來搭建神經網絡模型並訓練。

4、 構建模型

關於這一步驟,我先給出構建模型的代碼,然後在進行解釋:

   

1from keras.models import Sequential
2from keras.layers import Dense,Activation
3model = Sequential()
4model.add(Dense(512, input_shape=(28*28,),activation='relu'))
5model.add(Dense(10,activation='softmax'))
6model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
7model.fit(X_train, y_train, epochs=10, batch_size=64, verbose=1, validation_split=0.05)
8Testloss, Testaccuracy = model.evaluate(X_test, y_test)
9print('Testloss ', Testloss)
10print(『Testaccuracy:', Testaccuracy)

上述代碼中:

第三行代碼表示使用Keras中的Sequential 順序模型。

第四行代碼表示增加一個全連接層(密集層),這層有512個神經元,輸入形狀是(28*28,)此處的輸入形狀也可以寫為:input_dim=28*28。Activation表示這層的激活函數使用是relu,不同的激活函數有不同的效果,大家可以自己學習。

第五行代碼增加一個全連接層,這層有10個神經元,這於我們的期望輸出個數一致(10個數字),激活函數使用softmax。

第六行代碼表示編譯我們之前構建的模型,優化器選擇adam,損失函數為categorical_crossentropy,指標度量選擇accuracy精度。

第七行代碼表示使用訓練集數據來訓練我們的模型,epochs表示模型的訓練的時期數,每個epoch是對x,y的整個迭代,這裡迭代10次。batch_size代表每個梯度更新的樣本數,默認值為32. verbose:日誌顯示verbose = 0為不在標準輸出流輸出日誌信息,verbose = 1為輸出進度條記錄,verbose=2為每個epoch輸出一行記錄,默認為1。validation_split按一定比例從訓練集中取出一部分作為驗證集。最後一行控制臺輸出:loss: 0.0109 - acc: 0.9964 - val_loss: 0.0862 - val_acc: 0.9823

第八行代碼表示對已經訓練好的模型在驗證集上進行評價,列印出驗證集上的損失和精度為:loss 0.0794 ,Accuracy: 0.9784。

可以看出在測試集上的精度要比訓練集上的精度高,這說明我們訓練的模型過擬合了,過擬合是指機器學習模型在新數據上的性能往往比在訓練數據上要差。

至此,我們就完成了使用Keras完成了深度學習的「Hello World」項目,後期我們將構建卷積神經網絡來進一步提升模型的精度。有興趣的小夥伴可以自己畫一個樣本,然後進行識別。

構建訓練模型的整個代碼如下:

   

from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Activation
path = r'C:\Users\LEGION\Desktop\kerasdatasets\mnist.npz'
(X_train, y_train), (X_test, y_test) = mnist.load_data(path)

X_train = X_train.reshape(len(X_train),-1)
X_test = X_test.reshape(len(X_test), -1)
X_train = X_train.astype('float32')/255
X_test = X_test.astype('float32')/255

y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

model = Sequential()
model.add(Dense(512, input_shape=(28*28,),activation='relu'))
model.add(Dense(10,activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=64, verbose=1, validation_split=0.05)
loss, accuracy = model.evaluate(X_test, y_test)
Testloss, Testaccuracy = model.evaluate(X_test, y_test)
print('Testloss:', Testloss)
print('Testaccuracy:', Testaccuracy)

總結

Keras實現一個深度學習的模型還是非常簡單的,對於Keras大家是不是有點了解了呢?學習Keras最重要的就是需要多寫,多看官方的API。當然了最重要的是大家要有機器學習或者深度學習的一些理論基礎。下次推文我們來介紹Keras中的模型的種類,即Sequential 順序模型和Model 模型。

往期精選(👇猛戳可查看)




相關焦點

  • 深度學習 | Keras 簡介
    再者,keras已經比較成熟了,有良好的社區維護,大家在開發的過程中遇到的問題也能通過社區得到答案,同時我們也可以通過圖 4.1的深度學習框架熱度對比看出,Keras使用人數也是非常多的,僅次於Tensorflow。因此,為了能夠用最快的速度寫出最優雅的代碼,筆者在這推薦大家使用Keras。本書大部分深度學習代碼均基於Keras神經網絡框架編寫。
  • MLK | Keras 入門深度學習逢看必會
    > MLK,即Machine Learning Knowledge,本專欄在於對機器學習的重點知識做一次梳理
  • Keras深度學習框架配置
    項目代碼是在Windows 7上運行的,主要用到的Matlab R2013a和Python,其中Matlab用於patch的分割和預處理,卷積神經網絡搭建用到了根植於Python和Theano的深度學習框架Keras。
  • Keras 深度學習模型可視化
    深度學習可視化深度學習的過程是一個黑盒子,模型通過大量的權重去學習擬合輸入的數據和學習目標,模型的性能很大程度上取決於模型的輸入的數據;深度學習的擬合效果往往出乎我們的的想像,但是模型如何擬合數據和學習目標之間的關係,我們知之甚少。
  • Python安裝TensorFlow 2、tf.keras和深度學習模型的定義
    p=15826 深度學習的預測建模是現代開發人員需要了解的一項技能。TensorFlow是Google開發和維護的首要的開源深度學習框架。儘管直接使用TensorFlow可能具有挑戰性,但現代的tf.keras API使得Keras在TensorFlow項目中的使用簡單易用。使用tf.keras,您可以設計,擬合,評估和使用深度學習模型,從而僅用幾行代碼即可做出預測。
  • 深度學習第17講:keras入門和快速上手指南
    作者:魯偉一個數據科學踐行者的學習日記。
  • 深度學習中的多任務學習(Multi-task-learning)——keras實現
    (Multi-task learning)簡介多任務學習(Multi-task learning)是遷移學習(Transfer Learning)的一種,而遷移學習指的是將從源領域的知識(source domin)學到的知識用於目標領域(target domin),提升目標領域的學習效果。
  • Python 深度學習,你的 Keras 準備好了嗎?
    該書是由 Keras 作者寫的,所以全書基本圍繞著 Keras 講深度學習的各種實現,從 CNN,RNN 到 GAN 等,偏入門,但理論和實戰部分都講的還不錯,承載著很多作者對深度學習整體性的思考。總之,Keras 非常適合大家快速上手深度學習項目。好了,今天從基礎開始,教大家在 win10 系統中,使用 Anaconda + TensorFlow + Keras,快速搭建一個 Keras 的開發環境(CPU 版本),非常容易。1.
  • 用 Keras 功能 API 進行深度學習
    Keras Python庫可快速輕鬆地創建深度學習模型。順序API允許您針對大多數問題逐層創建模型。它的局限性在於它不允許您創建共享圖層或具有多個輸入或輸出的模型。Keras中的功能性API是創建模型的替代方法,它提供了更大的靈活性,包括創建更複雜的模型。在本教程中,您將發現如何在Keras中使用更靈活的功能API來定義深度學習模型。
  • Keras vs PyTorch:誰是第一深度學習框架?
    兩大框架的連結:  Keras:https://github.com/keras-team/keras (https://keras.io/)  PyTorch:https://github.com/pytorch/pytorch  你想學習深度學習嗎?
  • 從零開始深度學習第17講:keras入門及快速上手指南
    深度學習到這個進度,筆者覺得有必要開始對一些優秀的深度學習框架進行介紹了。Tensorflow 雖然很強大,但語法和使用便利性上對於新手來說並不是那麼的友好,所以到這裡筆者需要給大家介紹 keras 了。      keras 是一款使用純 python 編寫的神經網絡 API,使用 keras 能夠快速實現你的深度學習方案,所以 keras 有著為快速試驗而生的美稱。ker
  • Keras: 基於 Python 的深度學習庫 PDF版發布啦~
    如果你在以下情況下需要深度學習庫,請使用 Keras:截至2018年6月,Keras擁有超過250,000名個人用戶。與其他任何深度學習框架相比,Keras在行業和研究領域的應用率更高(除 TensorFlow 之外,且Keras API 是 TensorFlow 的官方前端,通過 tf.keras 模塊使用)
  • 深度學習第51講:自編碼器(AutoEncoder)及其keras實現
    從現有情況來看,無監督學習很有可能是一把決定深度學習未來發展方向的鑰匙,在缺乏高質量打標數據的監督機器學習時代,若是能在無監督學習方向上有所突破對於未來深度學習的發展意義重大。從自編碼器到生成對抗網絡,筆者將和大家一起來探索深度學習中的無監督學習。
  • TensorFlow 1.9 新增 tf.keras 官方入門教程(Keras與TF的深度集成)
    【導讀】Keras是深度學習框架中最適合工程化的框架之一,具有簡單友好的接口。
  • Keras 教程: Python 深度學習終極入門指南
    開始之前, 請注意, 本指南是面向對應用深度學習感興趣的初學者的.我們旨在向你介紹一個最流行的同時也是功能最強大的, 用於建立神經網絡的 Python 庫. 這意味著我們將跳過許多理論與數學知識, 但我們還是會向你推薦一些學習這些的極好的資源.
  • 【DS】Keras深度學習介紹
    筆者邀請您,先思考:1 您使用過哪些深度學習框架?
  • 【深度學習】Keras vs PyTorch vs Caffe:CNN實現對比
    編譯 | VK 來源 | Analytics Indiamag在當今世界,人工智慧已被大多數商業運作所應用,而且由於先進的深度學習框架,它非常容易部署。這些深度學習框架提供了高級編程接口,幫助我們設計深度學習模型。
  • 資料|Keras 圖像深度學習實戰
    它是一款非常流行的深度學習計算框架,利用keras只要十幾行代碼就能寫出一個簡單的神經網絡訓練模型。Keras本身並不提供深度學習的計算引擎,實際它是利用TensorFlow或者Theano作為後端計算引擎的,但它封裝了眾多API接口,使用者只要了解其封裝層的特性就能靈活應用於各種應用場景,是作為深度學習開發者的編程利器。
  • 用Python將Keras深度學習模型部署為Web應用程式
    我們想要的是將深度學習模型部署為世界上任何人都可以訪問的Web應用程式。在本文中,我們將看到如何編寫一個Web應用程式,該應用程式使用經過訓練的Keras遞歸神經網絡,並允許用戶生成新的專利文摘。這個項目建立在遞歸神經網絡的基礎上,但是了解如何創建RNN是不必要的。現在我們將其視為黑匣子:我們按一個開始的順序進行操作,它輸出一個全新的專利文摘,可以在瀏覽器中顯示!
  • Keras TensorFlow教程:如何從零開發一個複雜深度學習模型
    在這個教程中,我們將學習以下幾個方面:1. 為什麼選擇 Keras?為什麼 Keras 被認為是深度學習的未來?2. 在Ubuntu上面一步一步安裝Keras。3. Keras TensorFlow教程:Keras基礎知識。4. 了解 Keras 序列模型4.1 實際例子講解線性回歸問題5.