如何创建具有相同权重的两层,其中一层是另一层的转置? - python

我正在Tensorflow 2.0中使用Keras API。

例如,假设我想在模型中有两个密集层,分别称为layer1layer2。但是我想约束它们的权重,以使layer1中的权重矩阵始终等于layer2中的权重矩阵的转置。

我怎样才能做到这一点?

参考方案

您可以为此定义一个定制的Keras层,在其中可以传递参考Dense层。

自定义密集层:

class CustomDense(Layer):
    def __init__(self, reference_layer):
      super(CustomDense, self).__init__()
      self.ref_layer = reference_layer

    def call(self, inputs):
        weights = self.ref_layer.get_weights()[0]
        bias = self.ref_layer.get_weights()[1]
        weights = tf.transpose(weights)
        x = tf.linalg.matmul(inputs, weights) + bias
        return x

现在,您可以使用Functional-API将此层添加到模型中。

inp = Input(shape=(5))
dense = Dense(5)
transposed_dense = CustomDense(dense)

#model
x = dense(inp)
x = transposed_dense(x)
model = Model(inputs=inp, outputs=x)
model.summary()
'''
Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         [(None, 5)]               0         
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 30        
_________________________________________________________________
custom_dense_1 (CustomDense) (None, 5)                 30        
=================================================================
Total params: 30
Trainable params: 30
Non-trainable params: 0
_________________________________________________________________
'''

如您所见,densecustom_dense共享30个参数。在这里,custom_dense只是使用dense层的权重进行密集的操作,它没有自己的参数。

编辑1:在评论中回答问题(子类别层如何获取#params?):

图层类跟踪所有传递给其__init__方法的对象。

transposed_dense._layers
# [<tensorflow.python.keras.layers.core.Dense at 0x7fc3e0874f28>]

上面的参数将给出被跟踪的相关层。
所有子级属性权重可以视为:

transposed_dense._gather_children_attribute("weights")
#[<tf.Variable 'dense_9/kernel:0' shape=(10, 5) dtype=float32>,
# <tf.Variable 'dense_9/bias:0' shape=(5,) dtype=float32>]

因此,当我们调用model.summary()时,它会在内部为每个count_params()调用Layer,这将对所有trainable_variable进行计数,包括self和child属性。

Keras:ModelCheckpoint保存到变量而不是文件? - python

我想针对X个时期训练我的模型,并以最小的验证错误获得最佳结果。我发现的解决方案是使用ModelCheckpoint回调,如果当前纪元的结果更好,则可以将其配置为覆盖模型保存。但是,在最坏的情况下,这意味着在每个时期都将模型写入硬盘驱动器,这会产生巨大的时间开销。是否可以将模型保存到变量中,所以我只需要保存一次?还是我可以做另一种优化? 参考方案 根据save…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Keras Tensorboard用于DQN强化学习 - python

我正在使用keras构建DQN,并使用具有经验重播记忆的经典DQN算法对其进行训练。由于在dqn中需要多次调用model.fit,这意味着每次从重播内存中采样批数据时,使用keras的model.fit( .... callbacks=TensorBoard(...))时,每次拟合都会生成新的事件日志文件。它会产生两个问题,首先,它会生成过于笨拙的事件日志文…

python:ConfigParser对象,然后再阅读一次 - python

场景:我有一个配置文件,其中包含要执行的自动化测试的列表。这些测试是长期循环执行的。   配置文件的设计方式使ConfigParser可以读取它。由于有两个三个参数,因此我需要通过每个测试。现在,此配置文件由script(s1)调用,并且按照配置文件中的列表执行测试。Script(s1)第一次读取配置,并且在每次测试完成后都会执行。阅读两次的要求:由于可能会…