如何在 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 加载保存的模型? (错误: : TypeError: __init__() 得到了一个意外的关键字参数“可训练”)