A. 神經網路結構搜索(Neural Architecture search)
神經網路搜索是生成和優化網路結構的有效工具 Neural Architecture Search 。
在不確定網路的長度和結構的情況下,使用一個循環神經網路(recurrent network)作為控制器來生成網路結構的欄位,用來構建子神經網路。將訓練子網路之後的准確率作為控制器回饋信號(reward signal),通過計算策略梯度(policy gradient)更新控制器,這樣不斷的迭代循環。在下一次迭代中,控制器將有更高的概率提出一個高准確率的網路結構。總之,伴隨著時間的推移,控制器將通過不斷的學習來提高搜索結果。如下圖所示就是網路結構搜索。
神經結構搜索中,我們使用控制器產生神經網路的超參數。控制器使用的是一個循環神經網路。假設我們希望預測只有卷積層的前饋神經網路,就可以使用控制器來生成這些超參數的序列。
控制器可以看到代理(agent),生成的超參數序列(網路結構的描述字元串)可以被看做代理一系列的動作(actions) 。子網路在收斂後將達到准確率 。隨後,將 作為回饋信號並使用增強學習訓練控制器。具體的說,為了優化的結構,需要讓控制器最大化期望回饋,期望回饋可以表示為 :
由於 不可微分,因此不能使用傳統的BP演算法。我們需要使用回饋更新代理的策略參數 ,進而實現回饋的最優化。這里我們使用 Williams 提出的REINFORCE,這個公式關聯了回饋 和策略參數 :
上述數值的可以近似表示為:
是控制器一個批樣本網路模型的數量, 是控制器生成的網路結構的超參數數量。 是第 個神經網路模型的准確率。
上述更新的梯度是梯度的無偏估計,但是方差很大。為了減小方差,我們使用了一個基線函數: 。
只要 不依賴與當前的動作,這個梯度導數將始終是無偏估計。這里,我們的 是准確率的指數移動平均值 EMA 。
在神經網路搜索中,訓練一個子網路可能需要幾個小時的時間。使用分布式訓練和並行參數更新可以加速控制器的學習過程。我們使用參數伺服器保存所有參數,伺服器將參數分發給控制器,控制器被分成 個,每一個控制器使用得到的參數進行模型的構建,由於得到的參數可能不同,構建模型的策略也是隨機的,導致每次構建的網路結構也會不同。每個控制器會構建一個batch, 個子網路,然後並行訓練子網路得到准確率。計算出參數的梯度。然後計算完梯度的控制器將梯度傳遞到參數伺服器,分別對自己負責的參數進行更新。接下來控制器得到更新的參數開始構建新的神經網路模型。這里,每一個控制器獨立的發送自己的梯度更新伺服器參數,不需要控制器之間同步,這及時非同步更新。這里子網路的訓練次數固定(epochs)。這種並行架構如下圖所示
為了讓控制器產生跳躍連接。在第 層中,添加一個錨點(anchor point)表示是否和前面的網路層連接:
表示控制器第 層網路錨點的隱藏狀態, 介於0到 之間。根據這些sigmoids的結果來決定哪些網路層被用作當前層的輸入。 , 和 是可訓練參數。[圖片上傳失敗...(image-feb8fe-1558488967580)]
為了產生循環元胞。控制器需要找到一個公式,以 和 作為輸入, 作為結果。最簡單的方式 ,這是一個基本的循環細胞的公式。一個更復雜的公式是廣泛應用的LSTM循環元胞。
基礎RNN和LSTM都可以描述為一個樹形結構,輸入 和 ,產生 ,這些變數作為葉子。控制器RNN需要標明樹上的每個節點的結合方法(相加,按元素相乘等)和激活函數,用於融合兩個輸入並產生一個輸出。然後兩個節點輸出又被作為樹上下一個節點的輸入。為了控制器可以選擇這些方法和函數,我們將樹上的節點以一定的順序編號,這樣控制器可以順序的預測。
B. 第五章 神經網路
神經網路 :神經網路是由具有適應性的簡單單元組成的廣泛並行互連的網路,它的組織能夠模擬生物神經系統對真實世界物體所作出的交互反應。
神經網路中最基本的成分便是 神經元模型 。
M-P神經元模型:
感知機由兩層神經元組成,分別為輸入層、輸出層。
以下是具體過程:
多層神經網路的拓撲結構如圖:
如上圖可知,多層網路由輸入層、隱含層和輸出層組成,頂層是輸出層,底層是輸入層,中間的便是隱含層。隱含層與輸出層都具有功能神經元。
多層前饋神經網路的結構需要滿足:
1、每層神經元必須與下一層完全互連
2、神經元之間不存在同層連接
3、神經元不可跨層連接
只需包含一個足夠多神經元的隱層,就能以任意精度逼近任意復雜度的連續函數
BP神經網路由於學習能力太強大比較榮譽造成過擬合問題,故有兩種策略來減緩過擬合的問題:
1、早停:將數據分成訓練集和驗證集,訓練集學習,驗證集評估性能,在訓練過程中,若訓練集的累積誤差降低,而驗證集的累積誤差提高,則終止訓練;
2、引入正則化:其基本思想是在誤差目標函數中增加一個用於描述網路復雜程度的部分,有如連接權和閾值的平方和:
其中λ∈(0,1)用於對累積經驗誤差與網路復雜度這兩項進行折中,常通過交叉驗證法來估計。
神經網路的訓練過程可看作一個參數尋優的過程,即尋找到適當的參數使得E最小。於是我們時常會談及「全局最小」和「局部最小」。
1、全局最小:即全局最小解,在參數空間中,所有其他點的誤差函數值均大於該點;
2、局部最小:即局部最小解,在參數空間中,其鄰近的點的誤差函數值均大於該點。
我們要達到局部極小點,很容易,只要滿足梯度為零的點便是了,局部極小點可以有多個,但全局最小點只有一個。顯然,我們追求的是全局最小,而非局部極小,於是人們通常採用以下策略來試圖「跳出」局部極小,使其接近全局最小:
1、以多組不同參數值初始化多個神經網路,按標准方法訓練,在迭代停止後,取其中誤差最小的解作為最終參數;
2、使用隨機梯度下降(在計算梯度時加入了隨機因素),使得在局部最小時,計算的梯度仍可能不為0,從而可能跳出局部極小,繼續進行迭代;
3、「模擬退火」技術,在每一步都以一定的概率接受比當前解更差的結果,但接受「次優解」的概率要隨著迭代進行,時間推移而逐漸減低以確保演算法的穩定。
1、RBF網路
單隱層前饋神經網路 ,使用徑向基函數作為隱層神經元激活函數,輸出層是對隱層神經元輸出的線性組合。RBF網路可表示為:
2、ART網路
競爭型學習 (神經網路中一種常用的 無監督學習 策略),由 比較層、識別層、識別閾值和重置模塊 組成。接收到比較層的輸入信號後,識別層神經元相互競爭以產生獲勝神經元,最簡單的方式就是計算輸入向量與每個識別層神經元所對應的模式類代表向量間的距離,距離小者獲勝。若獲勝神經元對應的代表向量與輸入向量間 相似度大於識別閾值 ,則將輸入樣本歸為該代表向量所屬類別,網路 連接權 也會進行 更新 以保證後面接收到相似的輸入樣本時該模式類會計算出更大的相似度,使得這樣的樣本能夠歸於一類;如果 相似度不大於識別閾值 ,則 重置模塊 會在 識別層 加一個神經元,其 代表向量 就 設置 為當前 輸入向量 。
3、SOM網路
競爭型學習的無監督神經網路 ,將高維輸入數據映射到低維空間(通常是二維),且保持輸入數據在高維空間的拓撲結構。
4、級聯相關網路
結構自適應網路 。
5、Elman網路
遞歸神經網路 。
6、Boltzmann機
基於能量的模型,其神經元分為顯層與隱層,顯層用於數據輸入輸出,隱層被理解為數據的內在表達。其神經元皆為布爾型,1為激活,0為抑制。
理論上,參數越多的模型其復雜程度越高,能完成更加復雜的學習任務。但是復雜模型的訓練效率低下,容易過擬合。但由於大數據時代、雲計算,計算能力大幅提升緩解了訓練效率低下,而訓練數據的增加則可以降低過擬合風險。
於是如何增加模型的復雜程度呢?
1、增加隱層數;
2、增加隱層神經元數.
如何有效訓練多隱層神經網路?
1、無監督逐層訓練:每次訓練一層隱節點,把上一層隱節點的輸出當作輸入來訓練,本層隱結點訓練好後,輸出再作為下一層的輸入來訓練,這稱為預訓練,全部預訓練完成後,再對整個網路進行微調。「預訓練+微調」即把大量的參數進行分組,先找出每組較好的設置,再基於這些局部最優的結果來訓練全局最優;
2、權共享:令同一層神經元使用完全相同的連接權,典型的例子是卷積神經網路。這樣做可以大大減少需要訓練的參數數目。
深度學習 可理解為一種特徵學習或者表示學習,是通過 多層處理 ,逐漸將初始的 低層特徵表示 轉化為 高層特徵表示 後,用 簡單模型 即可完成復雜的分類等 學習任務 。
C. 卷積神經網路的結構、尺寸
(摘錄源於: CS231n課程筆記 )
最常見的形式就是將一些卷積層和ReLU層放在一起,其後緊跟池化層,然後重復如此直到圖像在空間上被縮小到一個足夠小的尺寸,在某個地方過渡成全連接層也較為常見。最後的全連接層得到輸出,比如分類評分等。
換句話說,最常見的卷積神經網路結構如下:
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
其中*指的是重復次數,POOL?指的是一個可選的匯聚層。其中N >=0,通常N<=3,M>=0,K>=0,通常K<3。例如,下面是一些常見的網路結構規律:
輸入層(包含圖像的)應該能被2整除很多次。常用數字包括32(比如CIFAR-10),64,96(比如STL-10)或224(比如ImageNet卷積神經網路),384和512。
最常用的設置是用用2x2感受野,步長為1。
———·———·———·———·———·———·———·———·———·———·——
(以下)直接全復制,供查閱參考。
———·———·———·———·———·———·———·———·———·———·——
下面是卷積神經網路領域中比較有名的幾種結構:
VGGNet的細節: 我們進一步對 VGGNet 的細節進行分析學習。整個VGGNet中的卷積層都是以步長為1進行3x3的卷積,使用了1的零填充,匯聚層都是以步長為2進行了2x2的最大值匯聚。可以寫出處理過程中每一步數據體尺寸的變化,然後對數據尺寸和整體權重的數量進行查看:
注意,大部分的內存和計算時間都被前面的卷積層佔用,大部分的參數都用在後面的全連接層,這在卷積神經網路中是比較常見的。在這個例子中,全部參數有140M,但第一個全連接層就包含了100M的參數。
一旦對於所有這些數值的數量有了一個大略估計(包含激活數據,梯度和各種雜項),數量應該轉化為以GB為計量單位。把這個值乘以4,得到原始的位元組數(因為每個浮點數佔用4個位元組,如果是雙精度浮點數那就是佔用8個位元組),然後多次除以1024分別得到佔用內存的KB,MB,最後是GB計量。如果你的網路工作得不好,一個常用的方法是降低批尺寸(batch size),因為絕大多數的內存都是被激活數據消耗掉了。
D. Matlab神經網路實現後的這個圖怎麼分析那些英文單詞都代表著什麼thx!
這是一個神經網路的一般性結構圖
綠色
Input:
輸入端
output:
輸出端
藍色
Hidden:
隱含層
Output:
輸出層
w:
權值
b:
偏置(bias)
E. bp神經網路模型示意圖,從哪找
你什麼意思啊?不怎麼理解你的意思?你的意思是matlab 裡面的神經網路工具箱怎麼用么?
F. 請問誰知道vs中如何查看這樣的類結構視圖,還是用其他軟體打開的
點擊「類視圖」右上角那個倒置小三角形「▼」,選擇「自動隱藏」,它就會隱藏在側邊的咯!附圖:
G. 利用Python實現卷積神經網路的可視化
在本文中,將探討如何可視化卷積神經網路(CNN),該網路在計算機視覺中使用最為廣泛。首先了解CNN模型可視化的重要性,其次介紹可視化的幾種方法,同時以一個用例幫助讀者更好地理解模型可視化這一概念。
正如上文中介紹的癌症腫瘤診斷案例所看到的,研究人員需要對所設計模型的工作原理及其功能掌握清楚,這點至關重要。一般而言,一名深度學習研究者應該記住以下幾點:
1.1 理解模型是如何工作的
1.2 調整模型的參數
1.3 找出模型失敗的原因
1.4 向消費者/終端用戶或業務主管解釋模型做出的決定
2.可視化CNN模型的方法
根據其內部的工作原理,大體上可以將CNN可視化方法分為以下三類:
初步方法:一種顯示訓練模型整體結構的簡單方法
基於激活的方法:對單個或一組神經元的激活狀態進行破譯以了解其工作過程
基於梯度的方法:在訓練過程中操作前向傳播和後向傳播形成的梯度
下面將具體介紹以上三種方法,所舉例子是使用Keras深度學習庫實現,另外本文使用的數據集是由「識別數字」競賽提供。因此,讀者想復現文中案例時,請確保安裝好Kears以及執行了這些步驟。
研究者能做的最簡單的事情就是繪制出模型結構圖,此外還可以標注神經網路中每層的形狀及參數。在keras中,可以使用如下命令完成模型結構圖的繪制:
model.summary()_________________________________________________________________Layer (type) Output Shape Param #
=================================================================conv2d_1 (Conv2D) (None, 26, 26, 32) 320_________________________________________________________________conv2d_2 (Conv2D) (None, 24, 24, 64) 18496_________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64) 0_________________________________________________________________dropout_1 (Dropout) (None, 12, 12, 64) 0_________________________________________________________________flatten_1 (Flatten) (None, 9216) 0_________________________________________________________________dense_1 (Dense) (None, 128) 1179776_________________________________________________________________dropout_2 (Dropout) (None, 128) 0_________________________________________________________________preds (Dense) (None, 10) 1290
=================================================================Total params: 1,199,882Trainable params: 1,199,882Non-trainable params: 0
還可以用一個更富有創造力和表現力的方式呈現模型結構框圖,可以使用keras.utils.vis_utils函數完成模型體系結構圖的繪制。
另一種方法是繪制訓練模型的過濾器,這樣就可以了解這些過濾器的表現形式。例如,第一層的第一個過濾器看起來像:
top_layer = model.layers[0]plt.imshow(top_layer.get_weights()[0][:, :, :, 0].squeeze(), cmap='gray')
一般來說,神經網路的底層主要是作為邊緣檢測器,當層數變深時,過濾器能夠捕捉更加抽象的概念,比如人臉等。
為了理解神經網路的工作過程,可以在輸入圖像上應用過濾器,然後繪制其卷積後的輸出,這使得我們能夠理解一個過濾器其特定的激活模式是什麼。比如,下圖是一個人臉過濾器,當輸入圖像是人臉圖像時候,它就會被激活。
from vis.visualization import visualize_activation
from vis.utils import utils
from keras import activations
from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 6)
# Utility to search for layer index by name.
# Alternatively we can specify this as -1 since it corresponds to the last layer.
layer_idx = utils.find_layer_idx(model, 'preds')
# Swap softmax with linear
model.layers[layer_idx].activation = activations.linear
model = utils.apply_modifications(model)
# This is the output node we want to maximize.filter_idx = 0
img = visualize_activation(model, layer_idx, filter_indices=filter_idx)
plt.imshow(img[..., 0])
同理,可以將這個想法應用於所有的類別,並檢查它們的模式會是什麼樣子。
for output_idx in np.arange(10):
# Lets turn off verbose output this time to avoid clutter and just see the output.
img = visualize_activation(model, layer_idx, filter_indices=output_idx, input_range=(0., 1.))
plt.figure()
plt.title('Networks perception of {}'.format(output_idx))
plt.imshow(img[..., 0])
在圖像分類問題中,可能會遇到目標物體被遮擋,有時候只有物體的一小部分可見的情況。基於圖像遮擋的方法是通過一個灰色正方形系統地輸入圖像的不同部分並監視分類器的輸出。這些例子清楚地表明模型在場景中定位對象時,若對象被遮擋,其分類正確的概率顯著降低。
為了理解這一概念,可以從數據集中隨機抽取圖像,並嘗試繪制該圖的熱圖(heatmap)。這使得我們直觀地了解圖像的哪些部分對於該模型而言的重要性,以便對實際類別進行明確的區分。
def iter_occlusion(image, size=8):
# taken from https://www.kaggle.com/blargl/simple-occlusion-and-saliency-maps
occlusion = np.full((size * 5, size * 5, 1), [0.5], np.float32)
occlusion_center = np.full((size, size, 1), [0.5], np.float32)
occlusion_padding = size * 2
# print('padding...')
image_padded = np.pad(image, ( \ (occlusion_padding, occlusion_padding), (occlusion_padding, occlusion_padding), (0, 0) \ ), 'constant', constant_values = 0.0)
for y in range(occlusion_padding, image.shape[0] + occlusion_padding, size):
for x in range(occlusion_padding, image.shape[1] + occlusion_padding, size):
tmp = image_padded.()
tmp[y - occlusion_padding:y + occlusion_center.shape[0] + occlusion_padding, \
x - occlusion_padding:x + occlusion_center.shape[1] + occlusion_padding] \ = occlusion
tmp[y:y + occlusion_center.shape[0], x:x + occlusion_center.shape[1]] = occlusion_center yield x - occlusion_padding, y - occlusion_padding, \
tmp[occlusion_padding:tmp.shape[0] - occlusion_padding, occlusion_padding:tmp.shape[1] - occlusion_padding]i = 23 # for exampledata = val_x[i]correct_class = np.argmax(val_y[i])
# input tensor for model.predictinp = data.reshape(1, 28, 28, 1)# image data for matplotlib's imshowimg = data.reshape(28, 28)
# occlusionimg_size = img.shape[0]
occlusion_size = 4print('occluding...')heatmap = np.zeros((img_size, img_size), np.float32)class_pixels = np.zeros((img_size, img_size), np.int16)
from collections import defaultdict
counters = defaultdict(int)for n, (x, y, img_float) in enumerate(iter_occlusion(data, size=occlusion_size)):
X = img_float.reshape(1, 28, 28, 1)
out = model.predict(X)
#print('#{}: {} @ {} (correct class: {})'.format(n, np.argmax(out), np.amax(out), out[0][correct_class]))
#print('x {} - {} | y {} - {}'.format(x, x + occlusion_size, y, y + occlusion_size))
heatmap[y:y + occlusion_size, x:x + occlusion_size] = out[0][correct_class]
class_pixels[y:y + occlusion_size, x:x + occlusion_size] = np.argmax(out)
counters[np.argmax(out)] += 1
正如之前的坦克案例中看到的那樣,怎麼才能知道模型側重於哪部分的預測呢?為此,可以使用顯著圖解決這個問題。顯著圖首先在這篇文章中被介紹。
使用顯著圖的概念相當直接——計算輸出類別相對於輸入圖像的梯度。這應該告訴我們輸出類別值對於輸入圖像像素中的微小變化是怎樣變化的。梯度中的所有正值告訴我們,像素的一個小變化會增加輸出值。因此,將這些梯度可視化可以提供一些直觀的信息,這種方法突出了對輸出貢獻最大的顯著圖像區域。
class_idx = 0indices = np.where(val_y[:, class_idx] == 1.)[0]
# pick some random input from here.idx = indices[0]
# Lets sanity check the picked image.from matplotlib import pyplot as plt%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 6)plt.imshow(val_x[idx][..., 0])
from vis.visualization import visualize_saliency
from vis.utils import utilsfrom keras import activations# Utility to search for layer index by name.
# Alternatively we can specify this as -1 since it corresponds to the last layer.
layer_idx = utils.find_layer_idx(model, 'preds')
# Swap softmax with linearmodel.layers[layer_idx].activation = activations.linear
model = utils.apply_modifications(model)grads = visualize_saliency(model, layer_idx, filter_indices=class_idx, seed_input=val_x[idx])
# Plot with 'jet' colormap to visualize as a heatmap.plt.imshow(grads, cmap='jet')
# This corresponds to the Dense linear layer.for class_idx in np.arange(10):
indices = np.where(val_y[:, class_idx] == 1.)[0]
idx = indices[0]
f, ax = plt.subplots(1, 4)
ax[0].imshow(val_x[idx][..., 0])
for i, modifier in enumerate([None, 'guided', 'relu']):
grads = visualize_saliency(model, layer_idx, filter_indices=class_idx,
seed_input=val_x[idx], backprop_modifier=modifier)
if modifier is None:
modifier = 'vanilla'
ax[i+1].set_title(modifier)
ax[i+1].imshow(grads, cmap='jet')
類別激活映射(CAM)或grad-CAM是另外一種可視化模型的方法,這種方法使用的不是梯度的輸出值,而是使用倒數第二個卷積層的輸出,這樣做是為了利用存儲在倒數第二層的空間信息。
from vis.visualization import visualize_cam
# This corresponds to the Dense linear layer.for class_idx in np.arange(10):
indices = np.where(val_y[:, class_idx] == 1.)[0]
idx = indices[0]f, ax = plt.subplots(1, 4)
ax[0].imshow(val_x[idx][..., 0])
for i, modifier in enumerate([None, 'guided', 'relu']):
grads = visualize_cam(model, layer_idx, filter_indices=class_idx,
seed_input=val_x[idx], backprop_modifier=modifier)
if modifier is None:
modifier = 'vanilla'
ax[i+1].set_title(modifier)
ax[i+1].imshow(grads, cmap='jet')
本文簡單說明了CNN模型可視化的重要性,以及介紹了一些可視化CNN網路模型的方法,希望對讀者有所幫助,使其能夠在後續深度學習應用中構建更好的模型。 免費視頻教程:www.mlxs.top
H. 如何查看matlab訓練後的神經網路結構
如果是bp網路的話,有兩個傳遞函數,表示是
1、輸入層到隱含層的傳遞函數
2、隱含層到輸出層的傳遞函數
這樣看:
net.layers{1}.transferfcn
net.layers{2}.transferfcn
給滿分把!
I. 如何查看matlab訓練生成的神經網路的結構和參數。
語句view (net)便可以查看建立的當前神經結構
J. 如何畫出神經網路的結構圖
回復 wpanys 的帖子感謝您的回復~~確實如你所說,用各種繪圖軟體都可以畫~~最後我選擇matlab畫出動態結構~嘿嘿