Я пытаюсь написать CNN самостоятельно (с Tesorflow, Keras, PyTorch) в python. И я преподаю в https://www.coursera.org/learn/convolutional-neural-networks/. CNN:
In deep learning, a convolutional neural network (CNN, or ConvNet) is a class of deep neural networks, most commonly applied to analyzing visual imagery. They are also known as shift invariant or space invariant artificial neural networks (SIANN), based on their shared-weights architecture and translation invariance characteristics. They have applications in image and video recognition, recommender systems, image classification, medical image analysis, natural language processing, and financial time series.
Я создал zero_padding и single_conv_step. Теперь я остановился на подаче Convolutional Layer. Я написал это, но без векторизации. И, как вы знаете, без него слой Conv2D будет вычисляться очень поздно. Я протестировал numpy .convolve, scipy.signals.fftconvolve, spice.ndimage.filters.convolve и .... Но они не помогают мне. Моя функция (Conv2D) принимает параметры A_prev (Prev_Layer), W (веса), шаг, заполнение. A_prev.shape = (training_exam, высота, ширина, канал) W.shape = (filter_size, filter_size, channel, filter_num) Это то, что будет свернуто. A_prev будет дополнен нулями с дополнением аргумента. Мне нужна векторизованная версия алгоритма.
Код:
def conv_forward(A_prev,W,b,stride,pad):
(m, n_Hp, n_Wp, n_Cp) = A_prev.shape
(f,f,n_Cp,n_C) = W.shape
n_H = int((n_Hp - f + 2*pad)/stride+1)
n_W = int((n_Wp - f + 2*pad)/stride+1)
Z = np.zeros((m,n_H,n_W,n_C))
A_prev_pad = zero_pad(A_prev,pad)
for i in range(m):
a_prev_pad = A_prev_pad[i]
for h in range(n_H):
vert_start = stride*h
vert_end = vert_start+f
for w in range(n_W):
hori_start = stride*w
hori_end = hori_start+f
for c in range(n_C):
a_slice_prev = a_prev_pad[vert_start:vert_end,hori_start:hori_end,:]
we=W[:,:,:,c]
bi=b[:,:,:,c]
Z[i,h,w,c] = conv_simple_step(a_slice_prev,we,bi)
cache=(Z,W,b,stride,pad)
return Z,cache
def zero_pad(X,pad):
x_pad = np.pad(X,((0,0),(pad,pad),(pad,pad),(0,0)),mode='constant',constant_values=(0,0))
return x_pad
def conv_simple_step(a_prev,W,b):
s = np.multiply(a_prev,W)
Z = s.sum()
Z = Z+ float(b)
return Z
Итак, моя проблема в том, как преобразовать приведенный выше код в векторизованную версию (с использованием только функций numpy, так как они очень быстро разветвляются)