Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python kera在自定义层之间共享权重_Python_Tensorflow_Keras_Deep Learning - Fatal编程技术网

Python kera在自定义层之间共享权重

Python kera在自定义层之间共享权重,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我正在使用胶囊网络的keras capsnet实现,并尝试将同一层应用于每个样本的30张图像 权重在类的init和构建参数中初始化,如下所示。我已经成功地在只使用tf.layers.conv2d的主要路由层之间共享了权重,在这里我可以为它们指定相同的名称并设置reuse=True 有人知道如何在Keras自定义层中初始化权重,以便重用吗?我对tensorflow API比对Keras API更熟悉 def __init__(self, num_capsule, dim_capsule, rout

我正在使用胶囊网络的keras capsnet实现,并尝试将同一层应用于每个样本的30张图像

权重在类的init和构建参数中初始化,如下所示。我已经成功地在只使用tf.layers.conv2d的主要路由层之间共享了权重,在这里我可以为它们指定相同的名称并设置reuse=True

有人知道如何在Keras自定义层中初始化权重,以便重用吗?我对tensorflow API比对Keras API更熟悉

def __init__(self, num_capsule, dim_capsule, routings=3,
             kernel_initializer='glorot_uniform',
             **kwargs):
    super(CapsuleLayer, self).__init__(**kwargs)
    self.num_capsule = num_capsule
    self.dim_capsule = dim_capsule
    self.routings = routings
    self.kernel_initializer = initializers.get(kernel_initializer)

def build(self, input_shape):
    assert len(input_shape) >= 3, "The input Tensor should have shape=[None, input_num_capsule, input_dim_capsule]"
    self.input_num_capsule = input_shape[1]
    self.input_dim_capsule = input_shape[2]

    # Weights are initialized here each time the layer is called
    self.W = self.add_weight(shape=[self.num_capsule, self.input_num_capsule,
                                    self.dim_capsule, self.input_dim_capsule],
                             initializer=self.kernel_initializer,
                             name='W')
    self.built = True

答案很简单。设置一个层而不在输入时调用它,然后使用该构建层单独调用数据。

在tensorflow中如何执行该操作?该层是Keras自定义层,因此我不知道如何在tensorflow中执行该操作。我习惯于手动创建权重矩阵并在层中使用它(不必使用self.add\u weight参数),或者使用相同的名称范围并传递“reuse=tf.AUTO\u reuse”-Keras文档没有提到自定义层中的层共享,不幸的是()文档中说,kera应该通过在不同的输入上多次调用同一层来共享权重。Like layer=密集(2),layer1=层(输入),layer2=层(输入2)。我在这个例子中试过了,它说张量是不可调用的,因为层返回张量。你能给我们展示一下你所描述的代码吗?这正是Keras的做法,也许在设置图层的方式上存在问题。你能发布一些示例代码吗?我对此也很感兴趣。谢谢