Переводя тензорные потоки в операции numpy / scipy? - PullRequest
0 голосов
/ 28 ноября 2018

Это документация для tf.nn.conv2d: с учетом входного тензора формы [batch, in_height, in_width, in_channels] и тензора фильтра / ядра формы [filter_height, filter_width, in_channels, out_channels], эта операция выполняетследующее

  1. Сглаживает фильтр в двумерной матрице с формой [filter_height * filter_width * in_channels,
  2. Извлекает патчи изображения из входного тензора для формирования виртуального тензора формы [batch, out_height, out_width, filter_height * filter_width * in_channels].
  3. Для каждого патча, умножает вправо матрицу фильтра и вектор патча изображения.

Другими словами, требуетсяв тензор из n изображений и делает свертку с фильтрами out_channel.

Я пытаюсь перевести на код, который использует только пустые операции, и код выглядит следующим образом:

def my_conv2d(x, kernel):
   nf = kernel.shape[-1]  # number of filters
   rf = kernel.shape[0]  # filter size
   w = kernel
   s = 1 # stride

   h_range = int((x.shape[2] - rf) / s) + 1  # (W - F + 2P) / S
   w_range = int((x.shape[1] - rf) / s) + 1  # (W - F + 2P) / S
   np_o = np.zeros((1, h_range, w_range, nf))
   for i in range(x.shape[0]):
     for z in range(nf):
       for _h in range(h_range):
         for _w in range(w_range):
           np_o[0, _h, _w, z] = np.sum(x[i, _h * s:_h * s + rf, _w * s:_w * s 
                                + rf, * w[:, :, :, z])                     
    return np_o

Проблема в том, что код очень медленный.Существуют ли какие-нибудь непонятные или скупые функции, которые могут копировать то, что делает conv2d в tenorflows, с такой же эффективностью?Я посмотрел на https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve2d.html, и это делает свертку ОДНАЖДЫ, что означает, что я должен передать 2-мерный тензор вместе с 2-мерным ядром (он не выполняет несколько фильтров).Ни один из предыдущих вопросов stackoverflow не очень помог в этом.

Спасибо

Редактировать: я провел некоторое тестирование, и мой код примерно на 44000% медленнее, чем tf.nn.conv2d!

1 Ответ

0 голосов
/ 29 ноября 2018

Все идет медленно, потому что вы используете петли.Реализация с векторными операциями будет намного быстрее, но не настолько эффективной, как высокоуровневые API, такие как tf.nn.conv2d или tf.nn.convolution.Этот пост должен помочь вам в векторной реализации того же самого в numpy: https://wiseodd.github.io/techblog/2016/07/16/convnet-conv-layer/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...