如何在 Keras 模型中实现一些可训练的参数,例如 Pytorch 中的 nn.Parameters()?

Posted

技术标签:

【中文标题】如何在 Keras 模型中实现一些可训练的参数,例如 Pytorch 中的 nn.Parameters()?【英文标题】:How to implement some trainable parameters in the model of Keras like nn.Parameters() in Pytorch? 【发布时间】:2020-02-17 15:35:48 【问题描述】:

我只想用 Keras 在我的模型中实现一些可训练的参数。在 Pytorch 中,我们可以使用如下所示的 torch.nn.Parameter() 来实现:

self.a = nn.Parameter(torch.ones(8))
self.b = nn.Parameter(torch.zeros(16,8))

我认为通过在 pytorch 中执行此操作,可以将一些可训练的参数添加到模型中。现在我想知道,如何在keras中实现类似的操作? 欢迎任何建议或意见!

谢谢! :)

附言我只是在 Keras 中编写了一个自定义层,如下所示:

class Mylayer(Layer):

    def __init__(self,input_dim,output_dim,**kwargs):
        self.input_dim = input_dim
        self.output_dim = output_dim
        super(Mylayer,self).__init__(**kwargs)

    def build(self):

        self.kernel = self.add_weight(name='pi',
                                      shape=(self.input_dim,self.output_dim),
                                      initializer='zeros',
                                      trainable=True)
        self.kernel_2 = self.add_weight(name='mean',
                                        shape=(self.input_dim,self.output_dim),
                                        initializer='ones',
                                        trainable=True)

        super(Mylayer,self).build()

    def call(self,x):
        return x,self.kernel,self.kernel_2

我想知道如果我没有改变通过层的张量,我应该写函数def compute_output_shape()吗?

【问题讨论】:

【参考方案1】:

您需要在自定义层中创建可训练的权重:

class MyLayer(Layer):
    def __init__(self, my_args, **kwargs):
        #do whatever you need with my_args

        super(MyLayer, self).__init__(**kwargs) 

    #you create the weights in build:
    def build(self, input_shape):
        #use the input_shape to infer the necessary shapes for weights
        #use self.whatever_you_registered_in_init to help you, like units, etc. 

        self.kernel = self.add_weight(name='kernel', 
                                  shape=the_shape_you_calculated,
                                  initializer='uniform',
                                  trainable=True)

        #create as many weights as necessary for this layer

        #build the layer - equivalent to self.built=True
        super(MyLayer, self).build(input_shape)

    #create the layer operation here
    def call(self, inputs):
        #do whatever operations are needed
        #example:
        return inputs * self.kernel #make sure the shapes are compatible

    #tell keras about the output shape of your layer
    def compute_output_shape(self, input_shape):
        #calculate the output shape based on the input shape and your layer's rules
        return calculated_output_shape

现在在模型中使用您的层。


如果您在 tensorflow 上使用渴望执行并创建自定义训练循环,您可以使用与 PyTorch 几乎相同的方式工作,您可以使用 tf.Variable 在层外创建权重,将它们作为参数传递给梯度计算方法。

【讨论】:

谢谢!我想也许我应该使用 Keras 中的自定义层来这样做。 我还有两个问题:1)如果我希望自定义层在整个模型中不对张量进行任何操作,而是创建一个新的可训练参数(例如张量/加权向量) ,我可以用上面的方式来实现吗?2)我觉得用tf.variable是清晰简洁的,但是如果我的模型是Keras(使用TensorFlow后端),我可以用这种方法直接建立一个可训练的模型吗?跨度> 你可以。您可以将该层破解为return inputs, self.kernel(输入通过该层而不做任何更改,您也可以获得内核)。或者您可以创建一个虚拟输入以传递给层,如dummy_input = Input(tensor=tf.Variable(1)),只需在call 中丢弃此输入。 如果您正在使用 Eager 模式并创建自定义训练循环,则可以使用 tf.Variable。 tensorflow.org/tutorials/customization/… 好的,我只是在上面放了一个新代码,你能帮我回答问题吗?

以上是关于如何在 Keras 模型中实现一些可训练的参数,例如 Pytorch 中的 nn.Parameters()?的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 中实现模型。如何解释填充/步幅值?

Cnn keras模型没有经过训练的参数表示和改进模型

从经过训练的 keras 模型中获取训练超参数

如何使用 keras 加载保存的模型? (错误: : TypeError: __init__() 得到了一个意外的关键字参数“可训练”)

如何在 keras 模型中实现汉明损失作为自定义指标

在 keras 中实现三元组损失的准确性