一、深度學習的基本概念
1.1 基本概念
神經(jīng)網(wǎng)絡:?它從信息處理角度對人腦神經(jīng)元網(wǎng)絡進行抽象, 建立某種簡單模型,按不同的連接方式組成不同的網(wǎng)絡。神經(jīng)網(wǎng)絡是一種運算模型,由大量神經(jīng)元之間相互聯(lián)接構成。學習如何構建和訓練神經(jīng)網(wǎng)絡是入門的重要一步。
神經(jīng)元:?神經(jīng)元模型是一個包含輸入,輸出與計算功能的模型。
前向傳播和反向傳播:?它是神經(jīng)網(wǎng)絡的基本運行方式,前向傳播用于計算輸出,反向傳播用于更新網(wǎng)絡參數(shù)。
激活函數(shù):?激活函數(shù)決定神經(jīng)元的輸出。學習不同的激活函數(shù)以及它們的作用。
損失函數(shù):?損失函數(shù)用于衡量模型的預測與實際結果之間的差異。了解不同的損失函數(shù)和它們的適用場景。
優(yōu)化算法:?優(yōu)化算法用于更新神經(jīng)網(wǎng)絡的參數(shù)以最小化損失函數(shù)。了解常用的優(yōu)化算法,如隨機梯度下降法(SGD)和Adam。
1.2 深度學習框架
以下是一些常見的深度學習框架:
TensorFlow2:由 Google 開發(fā)的開源框架,簡單,模塊封裝比較好,容易上手,對新手比較友好。在工業(yè)界最重要的是模型落地,目前國內(nèi)的大部分企業(yè)支持TensorFlow模型在線部署,不支持Pytorch。
PyTorch:由 Facebook 開發(fā)的開源框架,前沿算法多為PyTorch版本,如果是你高校學生or研究人員,建議學這個。相對于TensorFlow,Pytorch在易用性上更有優(yōu)勢,更加方便調(diào)試。
Keras:是一個極簡的、高度模塊化的神經(jīng)網(wǎng)絡庫,采用 Python(Python 2.7-3.5.)開發(fā),能夠運行在 TensorFlow 和 Theano 任一平臺,旨在完成深度學習的快速開發(fā)。
TensorFlow 適合工業(yè)應用構建大型項目,PyTorch 適合學術研究構建小型項目。個人推薦使用 PyTorch,原因很簡單,因為簡單易懂。而且,它還彌補了 Tensorflow 靜態(tài)構圖的致命弱點。PyTorch 是可以構建動態(tài)計算圖。也就是說你可以隨時改變神經(jīng)網(wǎng)絡的結構,而不影響其計算過程。而 Tensorflow 這種靜態(tài)圖模塊,一旦搭建好了神經(jīng)網(wǎng)絡, 你想修改結構也不行。
1.3 經(jīng)典模型
學習一些經(jīng)典的深度學習模型和案例將幫助你更好地理解深度學習的應用和工作原理。包括:
卷積神經(jīng)網(wǎng)絡(CNN):常用于圖像識別和計算機視覺任務的常用模型,是一種專門用來處理具有類似網(wǎng)格結構的數(shù)據(jù)的神經(jīng)網(wǎng)絡。卷積網(wǎng)絡在圖像識別,自然語言處理,災難性氣候預測、圍棋人工智能等諸多應用領域都表現(xiàn)優(yōu)異。卷積神經(jīng)網(wǎng)絡通常由3個部分構成:卷積層,池化層,全連接層。簡單來說,卷積層負責提取圖像中的局部及全局特征;池化層用來大幅降低參數(shù)量級(降維);全連接層用于處理“壓縮的圖像信息”并輸出結果。
循環(huán)神經(jīng)網(wǎng)絡(RNN):用于序列數(shù)據(jù)建模和自然語言處理任務的常用模型,傳統(tǒng)神經(jīng)網(wǎng)絡的結構比較簡單,通常為:輸入層 – 隱藏層 – 輸出層。
生成對抗網(wǎng)絡(GAN):用于生成新的數(shù)據(jù)樣本的模型。是近年來深度學習領域的一個熱點方向。GAN并不指代某一個具體的神經(jīng)網(wǎng)絡,而是指一類基于博弈思想而設計的神經(jīng)網(wǎng)絡。GAN由兩個分別被稱為生成器(Generator)和判別器(Discriminator)的神經(jīng)網(wǎng)絡組成。其中,生成器從某種噪聲分布中隨機采樣作為輸入,輸出與訓練集中真實樣本非常相似的人工樣本;判別器的輸入則為真實樣本或人工樣本,其目的是將人工樣本與真實樣本盡可能地區(qū)分出來。生成器和判別器交替運行,相互博弈,各自的能力都得到升。理想情況下,經(jīng)過足夠次數(shù)的博弈之后,判別器無法判斷給定樣本的真實性,即對于所有樣本都輸出50%真,50%假的判斷。此時,生成器輸出的人工樣本已經(jīng)逼真到使判別器無法分辨真假,停止博弈。這樣就可以得到一個具有“偽造”真實樣本能力的生成器。
Transformer:用于自然語言處理任務,如機器翻譯和文本生成。Transformer模型在2017年被google提出,直接基于 Self-Attention 結構,取代了之前NLP任務中常用的RNN神經(jīng)網(wǎng)絡結構。與RNN這類神經(jīng)網(wǎng)絡結構相比,Transformer一個巨大的優(yōu)點是:模型在處理序列輸入時,可以對整個序列輸入進行并行計算,不需要按照時間步循環(huán)遞歸處理輸入序列。與seq2seq模型類似,Transformer模型結構中的左半部分為編碼器(encoder),右半部分為解碼器(decoder)。
二、經(jīng)典入門Demo實戰(zhàn)
2.1 深度學習原理
“深度學習”這四個字拆解成兩個詞就是“深度”和“學習”。“學習”大概是我們學生時代接觸最頻繁的詞,那時候的學習就是上課、做題,最終通過考試。如果更抽象一點描述,學習就是認知的過程,從未知到已知的探索與思考過程。最早的學習,1+1=2,想想我們是怎么學習的?伸出一只手指,再伸出一只手指,數(shù)一數(shù),兩只手指那就是2。

這里定義一個概念,輸入和輸出,輸入就是已知的信息,輸出就是由輸入獲得的認知的結果。我們將一個從已有的信息,通過計算、判斷和推理得到結果的認知過程統(tǒng)稱為“學習”。
如何讓機器也可以進行學習呢?學術界為此提出了“神經(jīng)網(wǎng)絡”的概念。人腦中負責活動的基本單元是神經(jīng)元,這些神經(jīng)元互相連接成一個被稱為神經(jīng)網(wǎng)絡的龐大結構。由此,學術界模仿人腦“神經(jīng)網(wǎng)絡“建立一個人工神經(jīng)網(wǎng)絡(ANN),我們通常也簡稱為神經(jīng)網(wǎng)絡。
將1+1=2用神經(jīng)網(wǎng)絡可以表示為如下結構。

我們將“1”、“+”、“1”與“2”同時作為輸入不斷訓練神經(jīng)網(wǎng)絡(不斷告訴機器1+1=2),在訓練若干次后,神經(jīng)網(wǎng)絡將會學會“1+1=2”。同樣的,我們將1+2=3放入神經(jīng)網(wǎng)絡中去,不斷進行訓練,若干次后神經(jīng)網(wǎng)絡也將學會1+2=3。如此循環(huán)往復,我們可以教會神經(jīng)網(wǎng)絡進行加法運算,進而可以讓神經(jīng)網(wǎng)絡學會算術運算,我們把這個過程稱為深度學習。

深度學習在生活中的應用不僅僅局限于此,在自動駕駛、語音識別、自動機器翻譯、即時視覺翻譯(拍照翻譯)、目標識別等等領域也都有重要應用,例如:手機上的小愛同學、地鐵口的人臉識別…
2.2 一個手寫數(shù)字的識別的實現(xiàn)過程Demo
下面我將通過一個手寫數(shù)字的識別的案例來進一步講解深度學習,帶領大家體驗一次完整的深度學習實現(xiàn)的全過程。
假設現(xiàn)在我們手上很多張手寫的數(shù)字圖片,需要通過深度學習讓機器“認識”這些圖片上的數(shù)字,然后告訴我們每一張圖片上的數(shù)字是多少。

那么我們應該如何實現(xiàn)呢?總體的思路如下:
我們先拿出 6 萬張圖片給機器進行學習(需要告訴機器每一個圖片上寫的是哪一個數(shù)字)。
在學習后,再拿出1萬張機器沒“見過”的圖片給它進行識別,讓它告訴我們,圖片上寫的是哪一個數(shù)字。
重復上面的過程,直到機器可以認識手寫的數(shù)字。
至此,完成便可實現(xiàn)手寫數(shù)字識別這一效果。

程序執(zhí)行步驟:
① 學習6萬張圖片上的數(shù)字
② 用1萬張圖片測試機器的學習效果(這1萬張不參與①的訓練)
③ 重復①、②
現(xiàn)在你需要做的是:了解每一個模塊實現(xiàn)的功能,從整體上把握整份代碼。
開發(fā)環(huán)境:
語言環(huán)境:Python3.10.11
編譯器:Jupyter Notebook
深度學習框架:TensorFlow 2.4.1
1. 準備數(shù)據(jù)
導入數(shù)據(jù)
?
?
import tensorflow as tf from tensorflow.keras import datasets, layers, models # 加載數(shù)據(jù)集 (train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data() # 輸出數(shù)據(jù)形狀 train_images.shape, test_images.shape
((60000, 28, 28), (10000, 28, 28))
?
?
準備好 6 萬張帶有標簽的訓練圖片讓機器進行學習。1 萬張測試圖片讓機器進行識別,測試其是否學會了。(60000, 28, 28)?表示為:60000 張 28*28 像素的圖片。
可視化
這里我們用第三方庫?matplotlib?輸出手寫數(shù)字圖片,看看我們的手寫數(shù)字(數(shù)據(jù)集)是什么樣子的。
?
?
import matplotlib.pyplot as plt
# 設置窗口大小為 20*12 單位英寸
plt.figure(figsize=(20,12))
for i in range(20):
# 設置子圖行數(shù)為5,列數(shù)為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()
?
?

調(diào)整圖片格式
需要將圖片調(diào)整為特定格式程序才可以進行學習
?
?
#調(diào)整數(shù)據(jù)到我們需要的格式train_images = train_images.reshape((60000, 28, 28, 1))test_images = test_images.reshape((10000, 28, 28, 1))# 輸出數(shù)據(jù)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 的灰度圖片,最后一個數(shù)字為1時,代表灰度圖片;為3時代表彩色圖片。
2. 構建神經(jīng)網(wǎng)絡模型
我們將圖片輸入到網(wǎng)絡,圖片首先會將其數(shù)字化,緊接著通過卷積層提取圖片上這個數(shù)字的特征,最后通過數(shù)字的特征判斷這個數(shù)字是哪一個。結構圖如下:

上面的結構圖中,向我們展示了五層結構,那么每一層具體是用來做什么的呢?
輸入層:用于將數(shù)據(jù)輸入到神經(jīng)網(wǎng)絡
卷積層:使用卷積核提取圖片特征,卷積核相當于一個小型的“特征提取器”
Flatten層:將多維的輸入一維化,常用在卷積層到全連接層的過渡
全連接層:起到“特征提取器”的作用
輸出層:輸出結果
卷積核與全連接層從某些方面上講都有提取特征的作用,但是所采用的方法是不同的。
這部分為深度學習的核心內(nèi)容,就是構建模型,先不管這快,現(xiàn)在我們主要任務是跑通整個程序,從整體上了解一下深度學習是什么。
?
?
model = models.Sequential([ #
layers.Conv2D(32, (3, 3), input_shape=(28, 28, 1)), # 卷積層:提取圖片特征
layers.Flatten(), # Flatten層:將二維圖片壓縮為一維形式
layers.Dense(100), # 全連接層:將特征進行進一步壓縮
layers.Dense(10) # 輸出層:輸出結果
])
#?打印網(wǎng)絡結構
?
?
3. 編譯模型
在這一步,我們需要設置模型的優(yōu)化器,損失函數(shù)、評價函數(shù):
優(yōu)化器:幫助模型更好的訓練
損失函數(shù):用于估量預測值與真實值的不一致程度
評價函數(shù):評價模型的質(zhì)量
?
?
model.compile(optimizer='adam', # adam是優(yōu)化器的一種 loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), # 損失函數(shù)的一種計算方法 ??????????????metrics=['accuracy'])??#采用準確率來評價模
?
?
4. 訓練模型
將數(shù)據(jù)傳入模型進行訓練,傳入的數(shù)據(jù)分為訓練數(shù)據(jù)、驗證數(shù)據(jù)兩部分。訓練數(shù)據(jù)(訓練集)用于訓練模型,驗證數(shù)據(jù)(驗證集)用于監(jiān)測模型的效果。epochs?表示模型的學習輪數(shù)(次數(shù))。
?
?
"""
train_images :訓練數(shù)據(jù)的圖片
train_labels :訓練圖片對應的標簽
epochs :訓練輪數(shù)
validation_data:驗證數(shù)據(jù)
"""
history = model.fit(train_images, train_labels, epochs=3,
validation_data=(test_images, test_labels))
?
?
5. 預測
?
?
# 打印我們想要進行預測的圖片 plt.imshow(test_images[1])
?
?

輸出測試集中第一張圖片的預測數(shù)組
?
?
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)
?
?
這組浮點數(shù)對應著0~9,最大的浮點數(shù)對應著的數(shù)字就是神經(jīng)網(wǎng)絡的預測結果。
?
?
import numpy as np
# 輸出預測結果
pre_num = np.argmax(pre[1])
print("模型的預測結果為:",pre_num)
模型的預測結果為:2
?
?
總結
我們通過算術學習、手寫數(shù)字識別了解了什么是深度學習,也用TensorFlow2實現(xiàn)了手寫數(shù)字識別,從整體上了解了一個深度學習程序是什么樣子的,應該有哪些步驟
審核編輯:黃飛
?
電子發(fā)燒友App
















評論