Я хочу реализовать Гиперсеть , поэтому сеть B
, которая создает весовые коэффициенты для другой сети A
.Таким образом, сеть A
выполняет свертку, но вместо использования своих собственных весов она принимает выходные данные сети B
.B
создает разные веса для каждого входа.
Я думал об использовании лямбда-слоя и просто определил функцию следующим образом:
def conv2d(tensors):
import keras.backend as K
image_tensor, template_tensor = tensors
template_tensor = K.expand_dims(template_tensor, -1) # kernel must be of shape (k1, k2, in_channel, out_channel)
return K.conv2d(image_tensor, template_tensor, padding="same")
Проблема заключается в размерности пакета.template_tensor
имеет форму [None, kernel_1, kernel_2, in_channels, out_channels]
, но K.conv2d
ожидает ядро с формой [kernel_1, kernel_2, in_channels, out_channels]
.
Так что было бы хорошо иметь что-то вроде этого:
def conv2d(tensors):
import keras.backend as K
image_tensor, template_tensor = tensors
template_tensor = K.expand_dims(template_tensor, -1) # kernel must be of shape (k1, k2, in_channel, out_channel)
out_tensor = np.zeros_like(image_tensor)
for i in template_tensor.shape[0]:
out_tensor[i] = conv2d(image_tensor[i], template_tensor[i], padding="same")
return out_tensor
или реализовать еголюбым другим способом (например, в качестве слоя).
Спасибо