Tensorflow Keras自定义单元格无效参数:必须为占位符张量输入一个值

Tensorflow Keras自定义单元格无效参数:必须为占位符张量输入一个值,tensorflow,keras,keras-layer,invalidargumentexception,Tensorflow,Keras,Keras Layer,Invalidargumentexception,为了保存r和z门的值,我正在尝试实现一个定制的GRUCell。 该代码与原始keras.layer.returnal.py相同 唯一的区别是我添加了两个类变量来存储张量(第48-49行)和一个getter方法。张量保存在第189-190或235-236行 类GRUCellTweak(层): 定义初始值(自身、单位、, 激活='tanh', 反复发作的“乙状结肠”, 使用_bias=True, kernel\u initializer='glorot\u uniform', 循环式_初始值设定项

为了保存r和z门的值,我正在尝试实现一个定制的GRUCell。 该代码与原始keras.layer.returnal.py相同

唯一的区别是我添加了两个类变量来存储张量(第48-49行)和一个getter方法。张量保存在第189-190或235-236行


类GRUCellTweak(层):
定义初始值(自身、单位、,
激活='tanh',
反复发作的“乙状结肠”,
使用_bias=True,
kernel\u initializer='glorot\u uniform',
循环式_初始值设定项='正交',
偏差\u初始值设定项='零',
核正则化器=无,
递归正则化器=无,
偏差\正则化器=无,
内核约束=无,
循环约束=无,
偏差约束=无,
辍学率=0。,
经常性辍学=0。,
执行=2,
重置\u after=False,
**kwargs):
超级(GRUCellTweak,self)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(**kwargs)
self.units=单位
self.activation=activations.get(激活)
self.recurrent\u activation=activations.get(recurrent\u activation)
self.use\u bias=use\u bias
self.kernel\u initializer=initializers.get(kernel\u initializer)
self.returnal\u initializer=initializers.get(returnal\u initializer)
self.bias\u初始值设定项=初始值设定项.get(bias\u初始值设定项)
self.kernel\u正则化器=正则化器.get(kernel\u正则化器)
self.recurrent\u正则化器=正则化器.get(recurrent\u正则化器)
self.bias\u正则化器=正则化器.get(bias\u正则化器)
self.kernel\u constraint=constraints.get(kernel\u constraint)
self.recurrent\u constraint=constraints.get(recurrent\u constraint)
self.bias\u constraint=constraints.get(bias\u constraint)
自衰减=最小值(1,最大值(0,衰减))
自身复发性辍学=最小值(1,最大值(0,复发性辍学))
self.implementation=实现
self.reset\u after=reset\u after
self.state_size=self.units
self.output_size=self.units
self.\u dropout\u mask=无
自身。\经常性\辍学\屏蔽=无
self.reset_gate_history=[]
self.update\u gate\u history=[]
def构建(自我,输入_形状):
输入尺寸=输入形状[-1]
如果存在(self.u初始值设定项、初始值设定项、标识):
def标识(形状,增益=1,数据类型=无):
del数据类型
返回增益*np.concatenate(
[np.identity(形状[0])]*(形状[1]//形状[0]),轴=1)
self.recurrent\u初始值设定项=recurrent\u标识
self.kernel=self.add_weight(shape=(输入尺寸,self.units*3),
name='kernel',
初始值设定项=self.kernel\u初始值设定项,
正则化器=self.kernel\u正则化器,
constraint=self.kernel\u约束)
self.returnal\u kernel=self.add\u weight(
形状=(self.units,self.units*3),
name='returnal_kernel',
初始值设定项=自循环\u初始值设定项,
正则化器=自循环正则化器,
约束=自我循环(约束)
如果使用self.u偏差:
如果不是自复位,则在以下时间后复位:
偏差_形状=(3*自单位,)
其他:
#输入核和循环核的独立偏差
#注:形状有意不同于CuDNNGRU偏压
#`(2*3*self.units,)`,这样我们就可以区分这些类了
#加载和转换保存的权重时。
偏差形状=(2,3*自单位)
self.bias=self.add\u weight(形状=bias\u形状,
name='bias',
初始值设定项=self.bias\u初始值设定项,
正则化器=自偏移正则化器,
约束=自身偏差(约束)
如果不是自复位,则在以下时间后复位:
self.input\u bias,self.recurrent\u bias=self.bias,None
其他:
#注意:需要展平,因为CNTK中的切片提供2D阵列
self.input_bias=K.flatten(self.bias[0])
self.returnal_bias=K.flatten(self.bias[1])
其他:
自我偏见=无
#更新门
self.kernel_z=self.kernel[:,:self.units]
self.recurtive_kernel_z=self.recurtive_kernel[:,:self.units]
#复位门
self.kernel\u r=self.kernel[:,self.units:self.units*2]
self.recurtive_kernel_r=self.recurtive_kernel[:,
自我评价单位:
自我评价单位*2]
#新大门
self.kernel_h=self.kernel[:,self.units*2:]
self.recurtive_kernel_h=self.recurtive_kernel[:,self.units*2:]
如果使用self.u偏差:
#输入偏差
self.input_bias_z=self.input_bias[:self.units]
self.input\u bias\r=self.input\u bias[self.units:self.units*2]
self.input_bias_h=self.input_bias[self.units*2:]
#隐藏状态偏差-仅用于兼容性