У меня есть набор из 512 фильтров 3x3 и 512-канальная карта объектов nxn, над которой я хотел бы свертывать фильтры (в пользовательском слое Keras). Однако я не хочу, чтобы каждый из 512 фильтров включал глубину 512 в свертку, а просто сворачивал соответствующее измерение в карте объектов. Например, 0-й фильтр 3x3 будет свертываться по 0-му каналу карты объектов для создания одномерного канала nxn (при условии одинакового заполнения), 1-й фильтр будет выполняться по 1-му каналу карты объектов до 511-й фильтр запускается над 511-й картой объектов. Таким образом, результатом этой операции будет другая 512-канальная карта объектов nxn.
Это общая структура, которую я имею до сих пор:
import tensorflow.keras.backend as K
class MyClass(Layer):
def __init__(self, **kwargs):
super(MyClass, self).__init__(**kwargs)
def build(self, input_shape):
self.filt = self.add_weight(name='filter',
shape=input_shape,
initializer='uniform',
trainable=True)
def call(self, inputs):
# This is the problem line - how to make this on a channel-by-channel basis?:
return K.conv2d(inputs, self.filt, padding='same')