我希望你能帮我创建自定义层。 我要做的事情实际上相当简单:生成一个具有“stateful”变量的输出层,即在每个批次更新值的张量。
为了使一切更加清晰,请看下面的代码片段:
这里的想法非常简单:
这里的问题是,如果我试图将该层的输出定义为:
尽管我已经强制将
你们有解决办法来实现这个吗?我相信这不应该很难,因为状态RNN也具有“类似”的功能。
提前感谢你的帮助!
为了使一切更加清晰,请看下面的代码片段:
def call(self, inputs)
c = self.constant
m = self.extra_constant
update = inputs*m + c
X_new = self.X_old + update
outputs = X_new
self.X_old = X_new
return outputs
这里的想法非常简单:
- 在
def__init__(self, ...)
中,将X_old
初始化为0 update
根据层输入计算得出- 计算层输出(即
X_new
) - 将
X_old
的值设置为X_new
,以便在下一批次中,X_old
不再等于零,而是等于前一批次中的X_new
K.update
可以完成这项工作,如示例所示: X_new = K.update(self.X_old, self.X_old + update)
这里的问题是,如果我试图将该层的输出定义为:
outputs = X_new
return outputs
当我尝试使用model.fit()时,会收到以下错误:
ValueError: An operation has `None` for gradient. Please make sure that all of your ops have
gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
尽管我已经强制将
layer.trainable = False
,并且没有为该层定义任何偏置或权重,但我仍然遇到了这个错误。另一方面,如果我只是执行self.X_old = X_new
,X_old
的值并不会得到更新。你们有解决办法来实现这个吗?我相信这不应该很难,因为状态RNN也具有“类似”的功能。
提前感谢你的帮助!
on_epoch_end
。您可以在那里访问模型及其所有层,我尚未测试过,但您可能能够在那里将其重置为零。 - Mohammad Jafar Mashhadi