如何使用 Theano 在 Keras 中实现 2 个相同的层分支共享相同的权重

How to implement 2 identical branches of layers sharing the same weights in Keras with Theano

我正在尝试实现 2 个相同的分支在一定程度上共享相同的权重。您在此处看到的图形 是我所拥有的简化模型。所以我有一个输入:一个负数和一个正数,从 conv1_1_x 到 Rpn 的所有层都应该具有相同的权重。到目前为止我尝试实现的是:

    def create_base_network(input_shape, branch, input_im, img_input, roi_input):
            def creat_conv_model(input_shape):
                branch = Sequential()
                branch.add(Conv2D(64,filter_size,subsample = strides, input_shape=input_shape  ,  activation='relu',kernel_initializer='glorot_uniform' ,name='conv1_1_'+str(branch)))
                branch.add(Conv2D(64,filter_size, subsample = strides,  activation='relu', kernel_initializer='glorot_uniform',name='conv1_2_1'+str(branch)))
                branch.add(MaxPooling2D(pool_size=(2,2), strides=pool_stride, name='pool1_'+str(branch)))
                branch.add(Conv2D(128,filter_size,subsample = strides, activation='relu', kernel_initializer='glorot_uniform',name='conv2_1_'+str(branch)))

                return branch
            shared_layers =  creat_conv_model(input_shape)
            rpn_output = rpn(shared_layers(input_im),9,branch)   
            model = Model([img_input, roi_input], rpn_output[:2])

            return model


Branch_left = create_base_network((64, 64, 3), 1, img_input_left, img_input, roi_input)
Branch_right = create_base_network((64, 64, 3), 2, img_input_right, img_input, roi_input)    

当我 运行 执行此操作时,出现以下错误:

RuntimeError: Graph disconnected: cannot obtain value for tensor /input_2 at layer "input_2". The following previous layers were accessed without issue: []

有人可以帮忙吗?

对于共享权重的模型,您必须只创建一次。您不能创建两个模型。

shared_model = creat_conv_model((64, 64, 3), left)

如果rpn也是要分享的模型,您只能创建一次:

rpn_model = create_rpn(...)

然后你传递输入:

img_neg_out = shared_model(img_input_left)
img_neg_out = rpn_model(img_neg_out)

img_pos_out = shared_model(img_input_right)
img_pos_out = rpn_model(img_pos_out)

关于创建模型 branch_leftbranch_right,这取决于你想做什么以及你想如何训练。