使用需要更多参数的 _init_ 嵌入自定义 RNN 单元(3 对 1)

Embed custom RNN cell with _init_ that takes more arguments (3 vs 1)

我正在尝试创建一个类似于本文中提出的模型:https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8738842

自定义单元格代码位于:https://github.com/SungjoonPark/DenoisingRNN/blob/master/dgrud.py

但是,我无法将此自定义单元嵌入任何 RNN 模型,我假设这是因为 init 采用 3 个参数而不是标准 "num_units".

我尝试按照 https://keras.io/layers/recurrent/ 中的示例进行操作:

cell = MinimalRNNCell(32)

x = keras.Input((None, 5))

layer = RNN(cell)

y = layer(x)

但我得到一个错误:

TypeError Traceback (most recent call last) in 2 x = keras.Input((None, 5)) 3 layer = RNN(cell) ----> 4 y = layer(x)

~/.local/lib/python3.5/site-packages/keras/layers/recurrent.py in call(self, inputs, initial_state, constants, **kwargs) 539 540 if initial_state is None and constants is None: --> 541 return super(RNN, self).call(inputs, **kwargs) 542 543 # If any of initial_state or constants are specified and are Keras

~/.local/lib/python3.5/site-packages/keras/engine/base_layer.py in call(self, inputs, **kwargs) 487 # Actually call the layer, 488 # collecting output(s), mask(s), and shape(s). --> 489 output = self.call(inputs, **kwargs) 490 output_mask = self.compute_mask(inputs, previous_mask) 491

~/.local/lib/python3.5/site-packages/keras/layers/recurrent.py in call(self, inputs, mask, training, initial_state, constants) 680 mask=mask, 681 unroll=self.unroll, --> 682 input_length=timesteps) 683 if self.stateful: 684 updates = []

~/.local/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py in rnn(step_function, inputs, initial_states, go_backwards, mask, constants, unroll, input_length) 3101 constants=constants, 3102 unroll=unroll, -> 3103 input_length=input_length) 3104 reachable = tf_utils.get_reachable_from_inputs([learning_phase()], 3105 targets=[last_output])

~/.local/lib/python3.5/site-packages/tensorflow/python/keras/backend.py in rnn(step_function, inputs, initial_states, go_backwards, mask, constants, unroll, input_length, time_major, zero_output_for_mask) 3730 # the value is discarded. 3731 output_time_zero, _ = step_function( -> 3732 input_time_zero, tuple(initial_states) + tuple(constants)) 3733 output_ta = tuple( 3734 tensor_array_ops.TensorArray(

~/.local/lib/python3.5/site-packages/keras/layers/recurrent.py in step(inputs, states) 671 else: 672 def step(inputs, states): --> 673 return self.cell.call(inputs, states, **kwargs) 674 675 last_output, outputs, states = K.rnn(step,

TypeError: call() takes 2 positional arguments but 3 were given

你能帮我弄清楚这是 init 问题,call 问题还是我需要定义自定义层对于这个自定义单元格?

我尝试在整个互联网上寻找答案,但我无法弄清楚应该如何在 RNN 模型中嵌入自定义单元格。

提前谢谢你,

山姆

当我将 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

导入 keras 时错误消失 from tensorflow import keras。代码在 tensorflow 版本 1.x 和 2.x 上成功运行。修改您的代码如下 -

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

# First, let's define a RNN Cell, as a layer subclass.

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)

print("I Ran Successfully")

输出-

I Ran Successfully

希望这能回答您的问题。快乐学习。