Я пытаюсь создать слой Conv2D
в Keras (с бэкэндом тензорного потока), и я заметил, что его вывод упорядочен по возрастанию.
Например, рассмотрим простой ввод, такой как этот:
_input = np.arange(2 * 2).reshape(2, 2)
, что приводит к:
[[0 1]
[2 3]]
Если мы передадим переменную _input
в сверточный слой, подобный этому:
from keras.layers import Input, Conv2D
from keras.activations import relu
from keras import Model
import numpy as np
filters = 2
filter_size = 1
_weights = [np.reshape([[2 for _ in range(filters)] for _ in range(filter_size*filter_size)], (filter_size, filter_size, 1, filters)), np.reshape([0 for _ in range(filters)], (filters,))] # weights for Keras, main weight is array of 2`s while bias weight is array of 0's
keras_input = Input(shape=(2, 2, 1), dtype='float32')
keras_conv = Conv2D(filters=filters, kernel_size=filter_size, strides=(1, 1), activation=relu, padding='valid')(keras_input)
model = Model(inputs=[keras_input], outputs=keras_conv)
model.layers[1].set_weights([_weights[0], _weights[1]])
print(model.predict([_input.reshape(1, 2, 2, 1)]))
Мы получили бы упорядоченный вывод:
[[[[0. 0.]
[2. 2.]]
[[4. 4.]
[6. 6.]]]]
Похоже, тензор потока делает что-то вроде этого:
- выполняет умножение матриц на входе с каждым фильтром
- addсмещение матрицы с первого шага
- выполнить упорядочение по возрастанию на выходе второго шага
Я хочу исключить шаг 3-й , чтобы яполучить что-то вроде этого:
[[[[0. 2.]
[4. 6.]]
[[0. 2.]
[4. 6.]]]]
Например, Caffe пропустит упорядочивающую часть, и его выходные данные будут точно такими же, как и вышеприведенные.
Вот как Caffe будет выполнять "свертку"":
[[[[(0*2) + 0 (1*2) + 0]
[(2*2) + 0 (3*2) + 0]]
[[(0*2) + 0 (1*2) + 0]
[(2*2) + 0 (3*2) + 0]]]]
, что равно:
[[[[0. 2.]
[4. 6.]]
[[0. 2.]
[4. 6.]]]]
Это сделано, без изменения порядка нашего ввода, как вы можете видеть.
Кратко
Как мне остановить Tensorflow (или Keras) от упорядочения активации сверточных слоев?Есть ли какой-нибудь параметр, который я могу передать, чтобы устранить этот возрастающий порядок?
Большое спасибо!