4D Convolution с 4D входом и 4D весами Python - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь написать 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, так как они очень быстро разветвляются)

...