CS131 homework1 使用numpy實現卷積
預備
import numpy as np
def zero_pad(image, pad_height , pad_width):
H,W = image.shape
out = None
###
out = np.zeros((H+2*pad_height, W+2*pad_width))
for i in range(H):
for j in range(W):
out[i+pad_height,j+pad_width] = image[i,j]
### end
return out
conv_nested
使用最基礎的四重巢狀for迴圈進行計算,分別遍歷圖片和卷積核
def conv_nested(image, kernel):
Hi, Wi = image.shape
Hk, Wk = kernel.shape
out = np.zeros((Hi, Wi))
### YOUR CODE HERE
for m in range(Hi):
for n in range(Wi):
for i in range(Hk):
for j in range(Wk):
if(m - i + Hk//2 >= 0 and n - j + Wk//2 >= 0) and (m - i + Hk//2 < Hi and n - j + Wk//2 <Wi):
out[m,n] += kernel[i,j] * image[m - i + Hk//2, n - j + Wk//2]
### END YOUR CODE
return out
conv_fast
題目給了提示使用np.flip()
和np.sum()
函式簡化計算,將四重for迴圈減少為兩重,同時也不需要去計算卷積核和圖片在計算時對應的位置
def conv_fast(image, kernel):
Hi, Wi = image.shape
Hk, Wk = kernel.shape
out = np.zeros((Hi, Wi))
#print(Hi,Wi,Hk,Wk)
### YOUR CODE HERE
pad_img = zero_pad(image,Hk//2,Wk//2)
#print(pad_img.shape)
kernel_fliped = np.flip(np.flip(kernel,0),1)
for m in range(Hi):
for n in range(Wi):
out[m,n] = np.sum(pad_img[m: m+Hk, n : n+Wk] * kernel_fliped)
### END YOUR CODE
return out
conv_faster
將pad過後的影像矩陣每次要和卷積核進行元素相乘的部分單獨抽出來作為新矩陣的一行的資料,依次填充得到一個新的矩陣大小為
(
H
i
∗
W
i
,
H
k
∗
W
k
)
(H_i*W_i,H_k*W_k)
(Hi∗Wi,Hk∗Wk),然後將卷積核也reshape
為
(
H
k
∗
W
k
,
1
)
(H_k*W_k,1)
(Hk∗Wk,1),使用矩陣相乘可以大大縮短計算時間。GPU對矩陣計算進行了優化。
def conv_faster(image, kernel):
Hi, Wi = image.shape
Hk, Wk = kernel.shape
out = np.zeros((Hi, Wi))
### YOUR CODE HERE
pad_image = zero_pad(image, Hk//2, Wk//2)
kernel_filp = np.flip(np.flip(kernel, 0), 1)
mat = np.zeros((Hi*Wi, Hk*Wk))
for i in range(Hi*Wi):
row = i // Wi
col = i % Wi
# 將需要計算的卷積核大小的資料填充到第i行
mat[i, :] = pad_image[row: row+Hk, col: col+Wk].reshape(1, Hk*Wk)
out = mat.dot(kernel_flip.reshape(Hk*Wk, 1)).reshape(Hi, Wi)
### END YOUR CODE
return out
相關文章
- 深度學習基礎-基於Numpy的卷積神經網路(CNN)實現深度學習卷積神經網路CNN
- 全卷積網路(FCN)實戰:使用FCN實現語義分割卷積
- 使用卷積神經網路實現圖片去摩爾紋卷積神經網路
- [譯] 使用 Python 和 Keras 實現卷積神經網路PythonKeras卷積神經網路
- Keras上實現卷積神經網路CNNKeras卷積神經網路CNN
- verilog實現矩陣卷積運算矩陣卷積
- 利用 TensorFlow 實現卷積自編碼器卷積
- 迴圈碼、卷積碼及其python實現卷積Python
- 如何實現高速卷積?深度學習庫使用了這些「黑魔法」卷積深度學習
- TensorFlow上實現卷積神經網路CNN卷積神經網路CNN
- Java 實現高斯模糊和影像的空間卷積Java卷積
- Java 實現高斯模糊和影象的空間卷積Java卷積
- 利用Tensorflow實現卷積神經網路模型卷積神經網路模型
- 【python實現卷積神經網路】卷積層Conv2D反向傳播過程Python卷積神經網路反向傳播
- 5.2.1.1 卷積卷積
- 卷積核卷積
- 《卷積神經網路的Python實現》筆記卷積神經網路Python筆記
- 卷積神經網路的原理及Python實現卷積神經網路Python
- CNN使用小卷積核而非大卷積的好處CNN卷積
- 圖卷積實戰——文字分類卷積文字分類
- homework1
- OctConv:八度卷積復現卷積
- 數字訊號處理:線性卷積、迴圈卷積、圓周卷積計算卷積
- 【python實現卷積神經網路】開始訓練Python卷積神經網路
- 40行Python程式碼,實現卷積特徵視覺化Python卷積特徵視覺化
- 值得收藏 | 深度剖析 TensorCore 卷積運算元實現原理卷積
- 圖卷積神經網路分類的pytorch實現卷積神經網路PyTorch
- 卷積神經網路四種卷積型別卷積神經網路型別
- 5.2.1.3 卷積層卷積
- 1*1卷積卷積
- 卷積步長卷積
- 影像處理中的valid卷積與same卷積卷積
- 卷積神經網路:卷積層和池化層卷積神經網路
- 利用Python實現卷積神經網路的視覺化Python卷積神經網路視覺化
- 使用NumPy演示實現神經網路過程神經網路
- 深度可分離卷積卷積
- 卷積自編碼卷積
- 2.0 卷積網路卷積