本文目錄一覽:
- 1、BPNN神經網絡的Python實現
- 2、從零開始用Python構建神經網絡
- 3、python定義的神經網絡類裡面的一個函數,手機提問沒有顯示縮進,都是一個函數下的,見諒一下
- 4、如何用Python和深度神經網絡尋找相似圖像
- 5、怎樣用python構建一個卷積神經網絡
BPNN神經網絡的Python實現
關於前置的數學知識,可以查看
首先是bpnn.py,實現了BPNeuralNetwork類。
然後是__init__.py,使用mnist手寫數字數據集對我們的BPNN進行測試,準確率可達97%以上。
從零開始用Python構建神經網絡
從零開始用Python構建神經網絡
動機:為了更加深入的理解深度學習,我們將使用 python 語言從頭搭建一個神經網絡,而不是使用像 Tensorflow 那樣的封裝好的框架。我認為理解神經網絡的內部工作原理,對數據科學家來說至關重要。
這篇文章的內容是我的所學,希望也能對你有所幫助。
神經網絡是什麼?
介紹神經網絡的文章大多數都會將它和大腦進行類比。如果你沒有深入研究過大腦與神經網絡的類比,那麼將神經網絡解釋為一種將給定輸入映射為期望輸出的數學關係會更容易理解。
神經網絡包括以下組成部分
? 一個輸入層,x
? 任意數量的隱藏層
? 一個輸出層,?
? 每層之間有一組權值和偏置,W and b
? 為隱藏層選擇一種激活函數,σ。在教程中我們使用 Sigmoid 激活函數
下圖展示了 2 層神經網絡的結構(注意:我們在計算網絡層數時通常排除輸入層)
2 層神經網絡的結構
用 Python 可以很容易的構建神經網絡類
訓練神經網絡
這個網絡的輸出 ? 為:
你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數。
因此 W 和 b 的值影響預測的準確率. 所以根據輸入數據對 W 和 b 調優的過程就被成為訓練神經網絡。
每步訓練迭代包含以下兩個部分:
? 計算預測結果 ?,這一步稱為前向傳播
? 更新 W 和 b,,這一步成為反向傳播
下面的順序圖展示了這個過程:
前向傳播
正如我們在上圖中看到的,前向傳播只是簡單的計算。對於一個基本的 2 層網絡來說,它的輸出是這樣的:
我們在 NeuralNetwork 類中增加一個計算前向傳播的函數。為了簡單起見我們假設偏置 b 為0:
但是我們還需要一個方法來評估預測結果的好壞(即預測值和真實值的誤差)。這就要用到損失函數。
損失函數
常用的損失函數有很多種,根據模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數。
誤差平方和是求每個預測值和真實值之間的誤差再求和,這個誤差是他們的差值求平方以便我們觀察誤差的絕對值。
訓練的目標是找到一組 W 和 b,使得損失函數最好小,也即預測值和真實值之間的距離最小。
反向傳播
我們已經度量出了預測的誤差(損失),現在需要找到一種方法來傳播誤差,並以此更新權值和偏置。
為了知道如何適當的調整權值和偏置,我們需要知道損失函數對權值 W 和偏置 b 的導數。
回想微積分中的概念,函數的導數就是函數的斜率。
梯度下降法
如果我們已經求出了導數,我們就可以通過增加或減少導數值來更新權值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。
但是我們不能直接計算損失函數對權值和偏置的導數,因為在損失函數的等式中並沒有顯式的包含他們。因此,我們需要運用鏈式求導發在來幫助計算導數。
鏈式法則用於計算損失函數對 W 和 b 的導數。注意,為了簡單起見。我們只展示了假設網絡只有 1 層的偏導數。
這雖然很簡陋,但是我們依然能得到想要的結果—損失函數對權值 W 的導數(斜率),因此我們可以相應的調整權值。
現在我們將反向傳播算法的函數添加到 Python 代碼中
為了更深入的理解微積分原理和反向傳播中的鏈式求導法則,我強烈推薦 3Blue1Brown 的如下教程:
Youtube:
整合併完成一個實例
既然我們已經有了包括前向傳播和反向傳播的完整 Python 代碼,那麼就將其應用到一個例子上看看它是如何工作的吧。
神經網絡可以通過學習得到函數的權重。而我們僅靠觀察是不太可能得到函數的權重的。
讓我們訓練神經網絡進行 1500 次迭代,看看會發生什麼。 注意觀察下面每次迭代的損失函數,我們可以清楚地看到損失函數單調遞減到最小值。這與我們之前介紹的梯度下降法一致。
讓我們看看經過 1500 次迭代後的神經網絡的最終預測結果:
經過 1500 次迭代訓練後的預測結果
我們成功了!我們應用前向和方向傳播算法成功的訓練了神經網絡並且預測結果收斂於真實值。
注意預測值和真實值之間存在細微的誤差是允許的。這樣可以防止模型過擬合併且使得神經網絡對於未知數據有着更強的泛化能力。
下一步是什麼?
幸運的是我們的學習之旅還沒有結束,仍然有很多關於神經網絡和深度學習的內容需要學習。例如:
? 除了 Sigmoid 以外,還可以用哪些激活函數
? 在訓練網絡的時候應用學習率
? 在面對圖像分類任務的時候使用卷積神經網絡
我很快會寫更多關於這個主題的內容,敬請期待!
最後的想法
我自己也從零開始寫了很多神經網絡的代碼
雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學習框架方便的搭建深層網絡而不需要完全理解其內部工作原理。但是我覺得對於有追求的數據科學家來說,理解內部原理是非常有益的。
這種練習對我自己來說已成成為重要的時間投入,希望也能對你有所幫助
python定義的神經網絡類裡面的一個函數,手機提問沒有顯示縮進,都是一個函數下的,見諒一下
我知道你這個代碼,你沒有貼全,源頭是GitHub上的對吧。
self.hidden_layer.inspect(),這裡面的inspect應該不是遞歸,不然感覺會遞歸到時間盡頭的。
應該是:
def inspect(self):
# print該層神經元的信息
print(‘Neurons:’, len(self.neurons))
for n in range(len(self.neurons)):
print(‘ Neuron’, n)
for w in range(len(self.neurons[n].weights)):
print(‘ Weight:’, self.neurons[n].weights[w])
print(‘ Bias:’, self.bias)
上面這段代碼的inspect。
所以,
self.hidden_layer.inspect()
是輸出隱層的層數和偏置項
有的代碼要藉助ide才能理解的,手機看有點勉強了。
如何用Python和深度神經網絡尋找相似圖像
代碼
首先,讀入TuriCreate軟件包
import turicreate as tc
我們指定圖像所在的文件夾image,讓TuriCreate讀取所有的圖像文件,並且存儲到data數據框
data = tc.image_analysis.load_images(‘./image/’)
我們來看看,data數據框的內容:
data
data包含兩列信息,第一列是圖片的地址,第二列是圖片的長寬描述。
下面我們要求TuriCreate給數據框中每一行添加一個行號。這將作為圖片的標記,方便後面查找圖片時使用,並輸出查看data。
data = data.add_row_number()
data
下面,是重頭戲。我們讓TuriCreate根據輸入的圖片集合,建立圖像相似度判別模型。
model = tc.image_similarity.create(data)
這個語句執行起來,可能需要一些時間。如果你是第一次使用TuriCreate,它可能還需要從網上下載一些數據。請耐心等待。
經過或長或短的等待,模型已經成功建立。
下面,我們來嘗試給模型一張圖片,讓TuriCreate幫我們從目前的圖片集合里,挑出最為相似的10張來。
為了方便,我們就選擇第一張圖片作為查詢輸入。
我們利用show()函數展示一下這張圖片。
tc.Image(data[0][‘path’]).show()
下面我們來查詢,我們讓模型尋找出與這張圖片最相似的10張。
similar_images = model.query(data[0:1], k=10)
我們把結果存儲在了similar_images變量裡面,下面我們來看看其中都有哪些圖片。
similar_images
返回的結果一共有10行。跟我們的要求一致。
每一行數據,包含4列。分別是:
查詢圖片的標記
獲得結果的標記
結果圖片與查詢圖片的距離
結果圖片與查詢圖片近似程度排序值
有了這些信息,我們就可以查看到底哪些圖片與輸入查詢圖片最為相似了。
注意其中的第一張結果圖片,其實就是我們的輸入圖片本身。考慮它沒有意義。
我們提取全部結果圖片的標記(索引)值,忽略掉第一張(自身)。
similar_image_index = similar_images[‘reference_label’][1:]
把上面9張圖片的標記在所有圖片的索引列表中過濾出來:
filtered_index = data[‘id’].apply(lambda x : x in similar_image_index)
filtered_index
驗證完畢以後,請執行以下語句。我們再次調用TuriCreate的explore()函數,展現相似度查詢結果圖片。
data[filtered_index].explore()
怎樣用python構建一個卷積神經網絡
用keras框架較為方便首先安裝anaconda,然後通過pip安裝keras以下轉自wphh的博客。#coding:utf-8”’GPUruncommand:THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32pythoncnn.pyCPUruncommand:pythoncnn.py2016.06.06更新:
原創文章,作者:HRKP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/149924.html