Это документация для tf.nn.conv2d: с учетом входного тензора формы [batch, in_height, in_width, in_channels] и тензора фильтра / ядра формы [filter_height, filter_width, in_channels, out_channels], эта операция выполняетследующее
- Сглаживает фильтр в двумерной матрице с формой [filter_height * filter_width * in_channels,
- Извлекает патчи изображения из входного тензора для формирования виртуального тензора формы [batch, out_height, out_width, filter_height * filter_width * in_channels].
- Для каждого патча, умножает вправо матрицу фильтра и вектор патча изображения.
Другими словами, требуетсяв тензор из 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!