【发布时间】:2020-06-20 16:25:48
【问题描述】:
我想请您帮忙创建我的自定义图层。 我想做的其实很简单:生成一个带有“有状态”变量的输出层,即每批更新其值的张量。
为了让一切更清楚,这里是我想做的一个sn-p:
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
这里的想法很简单:
-
X_old在def__ init__(self, ...)中初始化为 0 -
update是根据层的输入计算得出的 - 计算层的输出(即
X_new) -
X_old的值设置为等于X_new,这样在下一批中,X_old不再等于 0,而是等于上一批中的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 也有“类似”的功能。
提前感谢您的帮助!
【问题讨论】:
标签: tensorflow keras recurrent-neural-network layer stateful