Параметризованный поздний синтез между двумя сетями - PullRequest
0 голосов
/ 01 декабря 2019

Я хотел бы объединить две сети, чьи выходы похожи, но чьи входы отличаются. Входами являются соответственно версии Optical flow и RGB для одних и тех же видеоклипов.

Я уже использовал для успешного объединения этих двух сетей, но я хотел бы использовать своего рода параметр слияния, чтобы экспериментировать с возможностями, которыеГлобальная сеть обучается с разной степенью важности для подсетей.

Поскольку мои сети реализованы в Керасе, я не знаю, как это сделать, используя эти функции https://keras.io/layers/merge/

1 Ответ

1 голос
/ 01 декабря 2019

Вы можете создать просто обучаемое умножение на слой параметров ...

class MultiplyByTrainable(Layer):
    def __init__(self, **kwargs):
        super(MultiplyByTrainable, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(name='kernel', 
                                      shape=(1,),
                                      initializer='ones',
                                      trainable=True)

        #optional self.bias = self.add_weight(name='kernel', 
        #                              shape=(1,),
        #                              initializer='zeros',
        #                              trainable=True)

        self.built = True

    def call(self, inputs):
        return inputs * self.kernel # + self.bias

    def compute_output_shape(self, input_shape):
        return input_shape

И попробовать что-то вроде:

out1 = MultiplyByTrainable(name='net_mult_1')(net1_output)
out2 = MultiplyByTrainable(name='net_mult_2')(net2_output)
outputs = Add()([out1, out2]) #or Concatenate()([out1, out2])

Или вы можете просто использовать оченьосновной лямбда-слой:

w1 = someWeight
w2 = 1 - w1
out = Lambda(lambda x: w1 * x[0] + w2 * x[1])([net1_output, net2_output])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...