import os import sys import numpy as np import numpy # def conv_(img, conv_filter, stride = 1): """ img: wxh 二维图像 conv_filter: kxk 二维卷积核(eg. 3x3) """ filter_size = conv_filter.shape[1] out_w = np.uint16((img.shape[0]-conv_filter.shape[0]) / stride + 1) out_h = np.uint16((img.shape[1]-conv_filter.shape[1]) / stride + 1) result = np.zeros((out_w, out_h)) for r in range(out_w): for c in range(out_h): cur_img_region = img[r*stride:r*stride+filter_size, c*stride:c*stride+filter_size] cur_result = cur_img_region * conv_filter conv_sum = np.sum(cur_result) result[r, c] = conv_sum return result def conv(img, conv_filter, padding=0, stride=1): if len(img.shape) != len(conv_filter.shape) - 1: print("Error: Number of dimensions in conv filter and image do not match.") exit() out_w = np.int((img.shape[0] - conv_filter.shape[1] + 2*padding) / stride + 1) out_h = np.int((img.shape[1] - conv_filter.shape[2] + 2*padding) / stride + 1) out_c = conv_filter.shape[0] feature_maps = np.zeros((out_w, out_h, out_c)) if padding>0:# 先对img进行padding new_img = np.zeros((img.shape[0] + 2*padding, img.shape[1] + 2*padding,img.shape[2])) new_img[padding:-padding, padding:-padding, :] = img.copy() img = new_img for filter_num in range(conv_filter.shape[0]): cur_filter = conv_filter[filter_num, :] if len(cur_filter.shape) > 2: conv_map = conv_(img[:, :, 0], cur_filter[:, :, 0]) for ch_num in range(1, cur_filter.shape[-1]): conv_map = conv_map + conv_(img[:, :, ch_num], cur_filter[:, :, ch_num]) else: conv_map = conv_(img, cur_filter) feature_maps[:, :, filter_num] = conv_map # Holding feature map with the current filter. return feature_maps def pooling(feature_map, kernel_size=2, stride=2): out_w = np.int((feature_map.shape[0] - kernel_size) / stride + 1) out_h = np.int((feature_map.shape[1] - kernel_size) / stride + 1) out_c = feature_map.shape[2] pool_out = np.zeros((out_w, out_h, out_c)) for ch_num in range(out_c): for r in range(out_w): for c in range(out_h): pool_out[r, c, ch_num] = np.max(feature_map[r*stride:r*stride+kernel_size, c*stride:c*stride+kernel_size]) return pool_out def relu(feature_map): for ch_num in range(feature_map.shape[2]): for r in range(feature_map.shape[0]): for c in range(feature_map.shape[1]): feature_map[r,c,ch_num] = max(0, feature_map[r,c,ch_num]) return feature_map def conv_Test(): img = np.random.randint(1, 10, (8,8)) print(img) conv_filter = np.random.randint(1, 10, (5,5)) print(conv_filter) r1 = conv_(img, conv_filter) print(r1.shape) print(r1) # r2 = conv2_(img, conv_filter) # print(r2.shape) # print(r2) def convTest(): img = np.random.randint(1, 10, (8,8,3)) print(img.shape) conv_filter = np.random.randint(1, 10, (6,5,5,3)) print(conv_filter.shape) r1 = conv(img, conv_filter) print(r1) print(r1.shape) import NumPyCNN r2 = NumPyCNN.conv(img, conv_filter) print(r2) print(r2.shape) def poolingTest(): img = np.random.randint(1, 100, (6,6,1)) print(img[:,:,0]) print(img.shape) pool_out = pooling(img) print(pool_out[:,:,0]) print(pool_out.shape) # convTest() poolingTest() # https://www.linkedin.com/pulse/building-convolutional-neural-network-using-numpy-from-ahmed-gad/