使用需要更多参数的 _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
希望这能回答您的问题。快乐学习。
我正在尝试创建一个类似于本文中提出的模型: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
希望这能回答您的问题。快乐学习。