Python 嵌入带有接受更多参数的_init_uu的自定义RNN单元(3对1)

Python 嵌入带有接受更多参数的_init_uu的自定义RNN单元(3对1),python,tensorflow,keras,recurrent-neural-network,Python,Tensorflow,Keras,Recurrent Neural Network,我试图创建一个与本文中提出的模型类似的模型: 自定义单元格代码位于: 但是,我无法将这个自定义单元嵌入任何RNN模型,我假设这是因为init接受3个参数,而不是标准的“num_单位” 我试着在下面的例子: 但我有一个错误: TypeError回溯(最近一次调用上次) 在2 x=keras.输入((无, 5) )3层=RNN(单元)-->4 y=层(x) ~/.local/lib/python3.5/site-packages/keras/layers/returnal.py in 调用(自身、输

我试图创建一个与本文中提出的模型类似的模型:

自定义单元格代码位于:

但是,我无法将这个自定义单元嵌入任何RNN模型,我假设这是因为init接受3个参数,而不是标准的“num_单位”

我试着在下面的例子:

但我有一个错误:

TypeError回溯(最近一次调用上次) 在2 x=keras.输入((无, 5) )3层=RNN(单元)-->4 y=层(x)

~/.local/lib/python3.5/site-packages/keras/layers/returnal.py in 调用(自身、输入、初始状态、常数,**kwargs)539 540如果 初始_状态为无,常量为无:-->541返回超级(RNN, 如果初始状态或 已指定常数,且为Keras

~/.local/lib/python3.5/site-packages/keras/engine/base\u layer.py in 调用(self,input,**kwargs)487#实际调用层,488# 正在收集输出、掩码和形状。-->489输出= 自我调用(输入,**kwargs)490输出屏蔽= self.compute_掩码(输入,前一个_掩码)491

~/.local/lib/python3.5/site-packages/keras/layers/returnal.py in 调用(自身、输入、掩码、训练、初始状态、常量)680 掩码=掩码,681展开=自我展开,-->682输入长度=时间步长)683 如果self.stateful:684更新=[]

~/.local/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py 在rnn中(步进功能、输入、初始状态、后退、屏蔽、, 常数,展开,输入长度)3101常数=常数,3102 展开=展开,->3103输入长度=输入长度)3104可到达= tf_utils.get_reachable_from_input([learning_phase()]),3105 目标=[最后的输出])

~/.local/lib/python3.5/site-packages/tensorflow/python/keras/backend.py 在rnn中(步进功能、输入、初始状态、后退、屏蔽、, 常量、展开、输入长度、时间、零输出(用于掩码) 3730#该值被丢弃。3731输出时间零点= 步进函数(->3732输入时间0,元组(初始状态)+ 元组(常数)3733输出=元组(3734 张量数组(

~/.local/lib/python3.5/site-packages/keras/layers/returnal.py in 步骤(输入,状态)671其他:672 def步骤(输入,状态):-->673 返回self.cell.call(输入、状态,**kwargs)674 675最后输出, 输出,状态=K.rnn(步骤

TypeError:call()接受2个位置参数,但给出了3个

你能帮我弄清楚这是初始化问题、呼叫问题还是我需要为这个自定义单元格定义一个自定义层吗

我试着在互联网上寻找答案,但对于如何在RNN模型中嵌入自定义单元,我却没有任何明确的答案

提前谢谢大家,


Sam

当我将keras直接导入程序时,我能够重新创建您的问题。请参见下文

%tensorflow_version 1.x
import keras
from keras import backend as K
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.layers import RNN

class MinimalRNNCell(keras.layers.Layer):

    def __init__(self, units, **kwargs):
        self.units = units
        self.state_size = units
        super(MinimalRNNCell, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
                                      initializer='uniform',
                                      name='kernel')
        self.recurrent_kernel = self.add_weight(
            shape=(self.units, self.units),
            initializer='uniform',
            name='recurrent_kernel')
        self.built = True

    def call(self, inputs, states):
        prev_output = states[0]
        h = K.dot(inputs, self.kernel)
        output = h + K.dot(prev_output, self.recurrent_kernel)
        return output, [output]

# Let's use this cell in a RNN layer:

cell = MinimalRNNCell(32)
x = keras.Input((None, 5))
layer = RNN(cell)
y = layer(x)
输出-

TensorFlow is already loaded. Please restart the runtime to change versions.
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-0f3bed686a7d> in <module>()
     34 x = keras.Input((None, 5))
     35 layer = RNN(cell)
---> 36 y = layer(x)

5 frames
/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in symbolic_fn_wrapper(*args, **kwargs)
     73         if _SYMBOLIC_SCOPE.value:
     74             with get_graph().as_default():
---> 75                 return func(*args, **kwargs)
     76         else:
     77             return func(*args, **kwargs)

TypeError: __call__() takes 2 positional arguments but 3 were given
I Ran Successfully
输出-

TensorFlow is already loaded. Please restart the runtime to change versions.
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-0f3bed686a7d> in <module>()
     34 x = keras.Input((None, 5))
     35 layer = RNN(cell)
---> 36 y = layer(x)

5 frames
/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in symbolic_fn_wrapper(*args, **kwargs)
     73         if _SYMBOLIC_SCOPE.value:
     74             with get_graph().as_default():
---> 75                 return func(*args, **kwargs)
     76         else:
     77             return func(*args, **kwargs)

TypeError: __call__() takes 2 positional arguments but 3 were given
I Ran Successfully

希望这能回答你的问题。学习愉快。

@SCoder-如果答案能回答你的问题,请接受并投票。谢谢。