一、深度學習的基本概念
1.1 基本概念
神經網絡:?它從信息處理角度對人腦神經元網絡進行抽象, 建立某種簡單模型,按不同的連接方式組成不同的網絡。神經網絡是一種運算模型,由大量神經元之間相互聯接構成。學習如何構建和訓練神經網絡是入門的重要一步。
神經元:?神經元模型是一個包含輸入,輸出與計算功能的模型。
前向傳播和反向傳播:?它是神經網絡的基本運行方式,前向傳播用于計算輸出,反向傳播用于更新網絡參數。
激活函數:?激活函數決定神經元的輸出。學習不同的激活函數以及它們的作用。
損失函數:?損失函數用于衡量模型的預測與實際結果之間的差異。了解不同的損失函數和它們的適用場景。
優化算法:?優化算法用于更新神經網絡的參數以最小化損失函數。了解常用的優化算法,如隨機梯度下降法(SGD)和Adam。
1.2 深度學習框架
以下是一些常見的深度學習框架:
TensorFlow2:由 Google 開發的開源框架,簡單,模塊封裝比較好,容易上手,對新手比較友好。在工業界最重要的是模型落地,目前國內的大部分企業支持TensorFlow模型在線部署,不支持Pytorch。
PyTorch:由 Facebook 開發的開源框架,前沿算法多為PyTorch版本,如果是你高校學生or研究人員,建議學這個。相對于TensorFlow,Pytorch在易用性上更有優勢,更加方便調試。
Keras:是一個極簡的、高度模塊化的神經網絡庫,采用 Python(Python 2.7-3.5.)開發,能夠運行在 TensorFlow 和 Theano 任一平臺,旨在完成深度學習的快速開發。
TensorFlow 適合工業應用構建大型項目,PyTorch 適合學術研究構建小型項目。個人推薦使用 PyTorch,原因很簡單,因為簡單易懂。而且,它還彌補了 Tensorflow 靜態構圖的致命弱點。PyTorch 是可以構建動態計算圖。也就是說你可以隨時改變神經網絡的結構,而不影響其計算過程。而 Tensorflow 這種靜態圖模塊,一旦搭建好了神經網絡, 你想修改結構也不行。
1.3 經典模型
學習一些經典的深度學習模型和案例將幫助你更好地理解深度學習的應用和工作原理。包括:
卷積神經網絡(CNN):常用于圖像識別和計算機視覺任務的常用模型,是一種專門用來處理具有類似網格結構的數據的神經網絡。卷積網絡在圖像識別,自然語言處理,災難性氣候預測、圍棋人工智能等諸多應用領域都表現優異。卷積神經網絡通常由3個部分構成:卷積層,池化層,全連接層。簡單來說,卷積層負責提取圖像中的局部及全局特征;池化層用來大幅降低參數量級(降維);全連接層用于處理“壓縮的圖像信息”并輸出結果。
循環神經網絡(RNN):用于序列數據建模和自然語言處理任務的常用模型,傳統神經網絡的結構比較簡單,通常為:輸入層 – 隱藏層 – 輸出層。
生成對抗網絡(GAN):用于生成新的數據樣本的模型。是近年來深度學習領域的一個熱點方向。GAN并不指代某一個具體的神經網絡,而是指一類基于博弈思想而設計的神經網絡。GAN由兩個分別被稱為生成器(Generator)和判別器(Discriminator)的神經網絡組成。其中,生成器從某種噪聲分布中隨機采樣作為輸入,輸出與訓練集中真實樣本非常相似的人工樣本;判別器的輸入則為真實樣本或人工樣本,其目的是將人工樣本與真實樣本盡可能地區分出來。生成器和判別器交替運行,相互博弈,各自的能力都得到升。理想情況下,經過足夠次數的博弈之后,判別器無法判斷給定樣本的真實性,即對于所有樣本都輸出50%真,50%假的判斷。此時,生成器輸出的人工樣本已經逼真到使判別器無法分辨真假,停止博弈。這樣就可以得到一個具有“偽造”真實樣本能力的生成器。
Transformer:用于自然語言處理任務,如機器翻譯和文本生成。Transformer模型在2017年被google提出,直接基于 Self-Attention 結構,取代了之前NLP任務中常用的RNN神經網絡結構。與RNN這類神經網絡結構相比,Transformer一個巨大的優點是:模型在處理序列輸入時,可以對整個序列輸入進行并行計算,不需要按照時間步循環遞歸處理輸入序列。與seq2seq模型類似,Transformer模型結構中的左半部分為編碼器(encoder),右半部分為解碼器(decoder)。
二、經典入門Demo實戰
2.1 深度學習原理
“深度學習”這四個字拆解成兩個詞就是“深度”和“學習”?!皩W習”大概是我們學生時代接觸最頻繁的詞,那時候的學習就是上課、做題,最終通過考試。如果更抽象一點描述,學習就是認知的過程,從未知到已知的探索與思考過程。最早的學習,1+1=2,想想我們是怎么學習的?伸出一只手指,再伸出一只手指,數一數,兩只手指那就是2。
這里定義一個概念,輸入和輸出,輸入就是已知的信息,輸出就是由輸入獲得的認知的結果。我們將一個從已有的信息,通過計算、判斷和推理得到結果的認知過程統稱為“學習”。
如何讓機器也可以進行學習呢?學術界為此提出了“神經網絡”的概念。人腦中負責活動的基本單元是神經元,這些神經元互相連接成一個被稱為神經網絡的龐大結構。由此,學術界模仿人腦“神經網絡“建立一個人工神經網絡(ANN),我們通常也簡稱為神經網絡。
將1+1=2用神經網絡可以表示為如下結構。
我們將“1”、“+”、“1”與“2”同時作為輸入不斷訓練神經網絡(不斷告訴機器1+1=2),在訓練若干次后,神經網絡將會學會“1+1=2”。同樣的,我們將1+2=3放入神經網絡中去,不斷進行訓練,若干次后神經網絡也將學會1+2=3。如此循環往復,我們可以教會神經網絡進行加法運算,進而可以讓神經網絡學會算術運算,我們把這個過程稱為深度學習。
深度學習在生活中的應用不僅僅局限于此,在自動駕駛、語音識別、自動機器翻譯、即時視覺翻譯(拍照翻譯)、目標識別等等領域也都有重要應用,例如:手機上的小愛同學、地鐵口的人臉識別…
2.2 一個手寫數字的識別的實現過程Demo
下面我將通過一個手寫數字的識別的案例來進一步講解深度學習,帶領大家體驗一次完整的深度學習實現的全過程。
假設現在我們手上很多張手寫的數字圖片,需要通過深度學習讓機器“認識”這些圖片上的數字,然后告訴我們每一張圖片上的數字是多少。
那么我們應該如何實現呢?總體的思路如下:
我們先拿出 6 萬張圖片給機器進行學習(需要告訴機器每一個圖片上寫的是哪一個數字)。
在學習后,再拿出1萬張機器沒“見過”的圖片給它進行識別,讓它告訴我們,圖片上寫的是哪一個數字。
重復上面的過程,直到機器可以認識手寫的數字。
至此,完成便可實現手寫數字識別這一效果。
程序執行步驟:
① 學習6萬張圖片上的數字
② 用1萬張圖片測試機器的學習效果(這1萬張不參與①的訓練)
③ 重復①、②
現在你需要做的是:了解每一個模塊實現的功能,從整體上把握整份代碼。
開發環境:
語言環境:Python3.10.11
編譯器:Jupyter Notebook
深度學習框架:TensorFlow 2.4.1
1. 準備數據
導入數據
?
?
import tensorflow as tf from tensorflow.keras import datasets, layers, models # 加載數據集 (train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data() # 輸出數據形狀 train_images.shape, test_images.shape
((60000, 28, 28), (10000, 28, 28))
?
?
準備好 6 萬張帶有標簽的訓練圖片讓機器進行學習。1 萬張測試圖片讓機器進行識別,測試其是否學會了。(60000, 28, 28)?表示為:60000 張 28*28 像素的圖片。
可視化
這里我們用第三方庫?matplotlib?輸出手寫數字圖片,看看我們的手寫數字(數據集)是什么樣子的。
?
?
import matplotlib.pyplot as plt # 設置窗口大小為 20*12 單位英寸 plt.figure(figsize=(20,12)) for i in range(20): # 設置子圖行數為5,列數為10,i+1表示第幾個子圖 plt.subplot(5,10,i+1) # 去掉坐標軸刻度 plt.xticks([]) plt.yticks([]) # 顯示圖片 plt.imshow(train_images[i], cmap=plt.cm.binary) # 顯示標簽 plt.xlabel(train_labels[i]) plt.show()
?
?
調整圖片格式
需要將圖片調整為特定格式程序才可以進行學習
?
?
#調整數據到我們需要的格式train_images = train_images.reshape((60000, 28, 28, 1))test_images = test_images.reshape((10000, 28, 28, 1))# 輸出數據sahpetrain_images.shape,test_images.shape,train_labels.shape,test_labels.shape
((60000, 28, 28, 1), (10000, 28, 28, 1), (60000,), (10000,))
?
?
(60000, 28, 28, 1):表示為:60000張 28*28 的灰度圖片,最后一個數字為1時,代表灰度圖片;為3時代表彩色圖片。
2. 構建神經網絡模型
我們將圖片輸入到網絡,圖片首先會將其數字化,緊接著通過卷積層提取圖片上這個數字的特征,最后通過數字的特征判斷這個數字是哪一個。結構圖如下:
上面的結構圖中,向我們展示了五層結構,那么每一層具體是用來做什么的呢?
輸入層:用于將數據輸入到神經網絡
卷積層:使用卷積核提取圖片特征,卷積核相當于一個小型的“特征提取器”
Flatten層:將多維的輸入一維化,常用在卷積層到全連接層的過渡
全連接層:起到“特征提取器”的作用
輸出層:輸出結果
卷積核與全連接層從某些方面上講都有提取特征的作用,但是所采用的方法是不同的。
這部分為深度學習的核心內容,就是構建模型,先不管這快,現在我們主要任務是跑通整個程序,從整體上了解一下深度學習是什么。
?
?
model = models.Sequential([ # layers.Conv2D(32, (3, 3), input_shape=(28, 28, 1)), # 卷積層:提取圖片特征 layers.Flatten(), # Flatten層:將二維圖片壓縮為一維形式 layers.Dense(100), # 全連接層:將特征進行進一步壓縮 layers.Dense(10) # 輸出層:輸出結果 ]) #?打印網絡結構
?
?
3. 編譯模型
在這一步,我們需要設置模型的優化器,損失函數、評價函數:
優化器:幫助模型更好的訓練
損失函數:用于估量預測值與真實值的不一致程度
評價函數:評價模型的質量
?
?
model.compile(optimizer='adam', # adam是優化器的一種 loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), # 損失函數的一種計算方法 ??????????????metrics=['accuracy'])??#采用準確率來評價模
?
?
4. 訓練模型
將數據傳入模型進行訓練,傳入的數據分為訓練數據、驗證數據兩部分。訓練數據(訓練集)用于訓練模型,驗證數據(驗證集)用于監測模型的效果。epochs?表示模型的學習輪數(次數)。
?
?
""" train_images :訓練數據的圖片 train_labels :訓練圖片對應的標簽 epochs :訓練輪數 validation_data:驗證數據 """ history = model.fit(train_images, train_labels, epochs=3, validation_data=(test_images, test_labels))
?
?
5. 預測
?
?
# 打印我們想要進行預測的圖片 plt.imshow(test_images[1])
?
?
輸出測試集中第一張圖片的預測數組
?
?
pre = model.predict(test_images) pre[1]
array([ 12.474585 , 1.1173537, 21.654232 , 16.206923 , -10.989567 , 17.235504 , 19.404213 , -22.553476 , 13.221286 , -10.19972 ], dtype=float32)
?
?
這組浮點數對應著0~9,最大的浮點數對應著的數字就是神經網絡的預測結果。
?
?
import numpy as np # 輸出預測結果 pre_num = np.argmax(pre[1]) print("模型的預測結果為:",pre_num)
模型的預測結果為:2
?
?
總結
我們通過算術學習、手寫數字識別了解了什么是深度學習,也用TensorFlow2實現了手寫數字識別,從整體上了解了一個深度學習程序是什么樣子的,應該有哪些步驟
審核編輯:黃飛
?
評論
查看更多