深度學習之Hopfield神經網路(五)

深度學習之Hopfield神經網路(五)

5 人贊了文章

hopfield可以分為離散型神經網路和連續型神經網路(DHNN CHNN)

在之前的文章中講過的單層感知器和BP都是離散的,目前連續的神經網路可能還沒有碰見。

本文章是通過《人工神經網路理論、設計及應用——第2版》的例子講解離散型Hopfield,離散型反饋網路的拓撲結果如下圖所示:

所有神經元排列成一層,感覺像單層的,沒有分層的概率。每一層都有輸入,x1、x2 .。 圖中沒有標記偏置值,但我們清楚知道每個神經元都有一個權值。T值代表控制輸入的信息,需要達到某種強度才會對神經元做出反應。跟其他神經網路一樣,都有輸入和輸出,不一樣的地方就是輸出的x1有一個反饋的迴路送到x2、x3,沒有送給x1,可以把他反饋給自己的權值當作0。也可以變形畫成如下環的形式,就是一種全連接。

環狀全連接:

具體的推導過程你們可以看書中的第120頁。本文章主要講如何利用python對hopfield進行分類。

比如我們有兩張圖片,分別是0和1,如下圖:

下面我們用添加了噪點的1,如下圖,並通過hopfield進行迭代運算,找到1的吸引子,進行分類。

參考了neurolab包: Hopfield Recurrent network (newhop)

代碼如下:

from PIL import Imageimport numpy as npimport matplotlib.pyplot as pltimport neurolab as nlimg0 = np.array(Image.open(D:\pythoncode\learn1\lesson1\zero.jpg).convert(L))img1 = np.array(Image.open(D:\pythoncode\learn1\lesson1\one.jpg).convert(L))def normalize_data(data): # 0.1<=data[i][j]<=0.9 data = (data - np.mean(data)) / np.std(data) rows,cols = data.shape for i in range(rows): for j in range(cols): if (data[i,j] >= 0): data[i,j] = 1 else: data[i,j] = -1 return dataimg0 = normalize_data(img0)img1 = normalize_data(img1)ax = plt.subplot(2, 2, 1)ax.set_title("0")plt.imshow(img0, cmap=gray)ax = plt.subplot(2, 2, 2)ax.set_title("1")plt.imshow(img1, cmap=gray)chars = [zero, one]nrows,ncols = img0.shapeimg0 = img0.reshape(1,nrows*ncols)nrows,ncols = img1.shapeimg1 = img1.reshape(1,nrows*ncols)target = np.concatenate((img0,img1))target = np.asfarray(target)# Create and train networknet = nl.net.newhop(target)output = net.sim(target)print("Test on train samples:")for i in range(len(target)): print(chars[i], (output[i] == target[i]).all())print("
Test on defaced one:")data = np.ones((1,nrows*ncols))#給數字1添加噪點for col in range(len(img1[0])): if col%10 == 0: data[0][col] = 1 else: data[0][col] = img1[0][col]data1 = data.reshape(nrows,ncols)ax = plt.subplot(2, 2, 4)ax.set_title("norise points")plt.imshow(data1, cmap=gray)plt.gray()plt.show()#測試代碼out = net.sim([data[0]])for i in range(len(target)): if (out[0] == target[i]).all(): print("char is ", chars[i])

該部分是通過訓練的審計網路,進行分類:最後知道該圖片是1.

但是hopfield在進行迭代過程中會有一些問題。例子如下:

比如現在我們有兩個吸引子分別是101和000,通過《人工神經網路理論、設計及應用——第2版》的第124頁的例子6.1, 我們也畫出網路演變過程圖,如下圖:

比如說在箭頭指向的100這個點, 他有1/3會演變為101,也有1/3概率演變為000。所以在用hopfield進行分類或者預測過程中,也容易產生誤判。


推薦閱讀:

【Python3網路爬蟲開發實戰】7.3-Splash負載均衡配置
這或許是對小白最友好的python入門了吧——14,遍歷字典
0基礎學Python之二十二:文件操作(下)
怎樣用 Matlab 寫出優雅的代碼?
【Python3網路爬蟲開發實戰】3.3-正則表達式

TAG:機器學習 | Python |