@[toc] 卷積神經網路重要的輔助函式***im2col***
卷積神經網路裡的一重要步驟需要把多維的資料扁平化成一行一行組成矩陣,然後可以快速的跟濾波器權重和偏置進行矩陣點積運算。這個步驟由***im2col***函式實現。雖然大部分的框架都提供了這個函式,我認為非常值得去花點時間去弄明白這個函式是怎麼樣實現的,至少它能加深了解numpy的多維矩陣賦值功能,已經如何對6維矩陣進行適當的轉置以達到必要的目的。
#**1
函式的實現一般上都有多種方法,im2col也不例外。最容易讓人想到的方法使用多層for迴圈,把對應的資料部分逐一挖取出來,壓平,然後把它們加到新的矩陣裡:
def im2col(x, kernel):kernel_shape = kernel.shape[0]
rows =
# assuming padding = 0, stride = 1
for row in range(x.shape[0] - 1):
for col in range(x.shape[1] - 1):
window = x[row: row + kernel_shape, col: col + kernel_shape]
return np.transpose(np.array(rows))
def im2col(input_data, filter_h, filter_w, stride=1, pad=0):「」"transform 4 dimensional images to 2 dimensional array.
parameters
----------
input_data : 4 dimensional input images
(the number of images, the number of channels,
height, widht)
filter_h : height of filter
filter_w : width of fiter
stride : the interval of stride
pad : the interval of padding
returns
-------
col : 2 dimnesional array
"""n, c, h, w = input_data.shape
out_h = (h + 2 * pad - filter_h) // stride + 1
out_w = (w + 2 * pad - filter_w) // stride + 1
img = np.pad(input_data,
[(0, 0), (0, 0), (pad, pad), (pad, pad)],
'constant')
col = np.zeros((n, c, filter_h, filter_w, out_h, out_w))
for y in range(filter_h):
y_max = y + stride * out_h
for x in range(filter_w):
x_max = x + stride * out_w
#多維賦值
col[:, :, y, x, :, :] = \
img[:, :, y:y_max:stride, x:x_max:stride]
#多維轉置
col = col.transpose(0, 4, 5, 1, 2, 3).reshape(n * out_h * out_w, -1)
return col
卷積神經網路 有趣的卷積神經網路
一 前言 最近一直在研究深度學習,聯想起之前所學,感嘆數學是一門樸素而神奇的科學。f g m1 m2 r 萬有引力描述了宇宙星河運轉的規律,e mc 描述了恆星發光的奧秘,v h d哈勃定律描述了宇宙膨脹的奧秘,自然界的大部分現象和規律都可以用數學函式來描述,也就是可以求得乙個函式。神經網路 簡單又...
神經網路 卷積神經網路
這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了...
神經網路 卷積神經網路
1.卷積神經網路概覽 來自吳恩達課上一張,通過對應位置相乘求和,我們從左邊矩陣得到了右邊矩陣,邊緣是白色寬條,當畫素大一些時候,邊緣就會變細。觀察卷積核,左邊一列權重高,右邊一列權重低。輸入,左邊的部分明亮,右邊的部分灰暗。這個學到的邊緣是權重大的寬條 都是30 表示是由亮向暗過渡,下面這個圖左邊暗...