Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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 在keras中共享层块的权重_Python_Python 3.x_Tensorflow_Keras_Deep Learning - Fatal编程技术网

Python 在keras中共享层块的权重

Python 在keras中共享层块的权重,python,python-3.x,tensorflow,keras,deep-learning,Python,Python 3.x,Tensorflow,Keras,Deep Learning,在中,可以在不同的输入层上重用密集层以实现权重共享。我现在想知道如何将这个原则扩展到整个层块;我的尝试如下: 从keras.layers导入输入、密集、批处理规范化、预处理 从keras.initializers导入常量 从keras导入后端为K def嵌入块(dim): 稠密=稠密(暗淡,激活=无,内核初始化器='glorot\u normal') activ=PReLU(alpha_初始值设定项=常数(值=0.25))(稠密) bnorm=BatchNormalization()(活动) 返

在中,可以在不同的输入层上重用密集层以实现权重共享。我现在想知道如何将这个原则扩展到整个层块;我的尝试如下:

从keras.layers导入输入、密集、批处理规范化、预处理
从keras.initializers导入常量
从keras导入后端为K
def嵌入块(dim):
稠密=稠密(暗淡,激活=无,内核初始化器='glorot\u normal')
activ=PReLU(alpha_初始值设定项=常数(值=0.25))(稠密)
bnorm=BatchNormalization()(活动)
返回bnorm
def嵌入_堆栈():
返回嵌入块(32)(嵌入块(16)(嵌入块(8)))
公共_嵌入=嵌入_堆栈()
在这里,我创建了一个“嵌入块”,其中包含一个密集的可变维度层,我试图将其串成一个“嵌入堆栈”,由维度不断增加的块组成。然后,我想将这种“公共嵌入”应用到几个输入层(它们都具有相同的形状),以便共享权重

上面的代码在以下情况下失败:

嵌入块(dim)中的

1个def嵌入块(dim):
2稠密=稠密(暗淡,激活=无,内核初始化器='glorot\u normal')
---->3 activ=PReLU(alpha_初始值设定项=常数(值=0.25))(稠密)
4 bnorm=BatchNormalization()(活动)
5返回bnorm
/localenv/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py in u_调用(self,*args,**kwargs)
980,带有操作名称\u范围\u v2(名称\u范围):
981如果不是自建的:
-->982自组装(输入)
983
984带操作。启用自动转换变量(自计算类型对象):
/构建中的localenv/lib/python3.8/site-packages/tensorflow/python/keras/engine/base\u layer.py(self,输入)
2641#操作。
2642带有tf_utils。可能是_init_作用域(self):
->2643 self.build(输入形状)#pylint:disable=不可调用
2644#我们还必须设置并确保层标记为已构建,并且构建
2645#由于用户定义的生成函数可能未调用,因此存储了shape
/包装器中的localenv/lib/python3.8/site-packages/tensorflow/python/keras/utils/tf_utils.py(实例,输入_形状)
321如果输入_形状不是无:
322输入形状=转换形状(输入形状,转换为元组=真)
-->323输出形状=fn(实例,输入形状)
324#将'fn'中的形状返回为张量形状。
325如果输出_形状不是无:
/localenv/lib/python3.8/site-packages/tensorflow/python/keras/layers/advanced\u activations.py in build(self,input\u shape)
138@tf_utils.shape_type_转换
139 def构建(自身,输入_形状):
-->140参数形状=列表(输入形状[1:])
141如果自共享_轴不是无:
142对于自共享_轴中的i:
TypeError:“非类型”对象不可下标

正确的方法是什么?谢谢

您需要将层实例化与模型创建分离

下面是一个使用for循环的简单方法:

from tensorflow.keras import layers, initializers, Model

def embedding_block(dim):
    dense = layers.Dense(dim, activation=None, kernel_initializer='glorot_normal')
    activ = layers.PReLU(alpha_initializer=initializers.Constant(value=0.25))
    bnorm = layers.BatchNormalization()
    return [dense, activ, bnorm]

stack = embedding_block(8) + embedding_block(16) + embedding_block(32)

inp1 = layers.Input((5,))
inp2 = layers.Input((5,))

x,y = inp1,inp2
for layer in stack:
    x = layer(x)
    y = layer(y)

concat_layer = layers.Concatenate()([x,y])
pred = layers.Dense(1, activation="sigmoid")(concat_layer)

model = Model(inputs = [inp1, inp2], outputs=pred)
我们首先创建每一层,然后使用函数API迭代它们来创建模型

您可以在中分析网络,以查看权重是否确实共享:


您可以扩展
tf.keras.Layer
并定义其中的“子层”。然后在扩展层中定义共享权重变量,并替换“子层”的权重。是否希望通过调用不同的参数(即
kernel\u size
stride
padding
等)在模型的不同阶段构建公共块并使用它。啊,我希望不用重新定义任何东西就可以做到…:/Hi@M.Innat这里的embedded_stack()函数只是为了方便起见-我想为模型定义一个这样的堆栈,并将不同的输入层传递给它,以便共享权重。然后,我可以从每个输入的嵌入中收集输出,将它们连接起来,然后进行处理。但是嵌入堆栈本身是在所有输入上与一组权重一起训练的。这有意义吗?我想我没有完全理解。但是,请您添加一张您想要的图表好吗?这将更加清楚。你可以检查一下,我几天前写的。请看一个小的inception模型的构建块,它是你想要的吗?谢谢!正是我所需要的:)而且我不知道netron,它真的很酷!