嵌入带有_init_的自定义RNN单元格,该单元格需要更多参数(3比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(上次调用(在2 x=keras中。输入(无,5( (3层=RNN(小区(---->4 y=层(x(

~/.local/lib/python3.5/site-packages/keras/layers/recurrent.py调用(self、inputs、initial_state、constants、**kwargs(539 540如果initial_ state为None且constants为None:-->541 return super(RNN,self(.call(inputs,**kwargs(542 543#如果initial_state或指定了常数,并且是Keras

~/.local/lib/python3.5/site-packages/keras/engine/base_layer.pycall(self,inputs,**kwargs(487#实际调用层,488#正在收集输出、掩码和形状。-->489输出=self.call(inputs,**kwargs(490 output_mask=self.compute_mask(输入,previous_mask(491

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

~/.local/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py在rnn中(step_function,inputs,initial_state,go_backwards,mask,常量,展开,input_length(3101常量=常量,3102展开=展开,->3103输入长度=输入长度(3104可达=tf_utils.get_reachable_from_inputs([learning_phase((],3105targets=[last_output](

~/.local/lib/python3.5/site-packages/tensorflow/python/keras/backend.py在rnn中(step_function,inputs,initial_state,go_backwards,mask,常量,展开,input_length,time_major,zero_output_for_mask(3730#该值被丢弃。3731输出_时间_零,_=step_function(->3732 input_time_zero,元组(initial_state(+元组(常量((3733 output_ta=元组(3734tensor_array_ops.TensorArray(

~/.local/lib/python3.5/site-packages/keras/layers/recurrent.py步骤(输入,状态(671其他:672定义步骤(输入、状态(:-->673return self.cell.call(输入、状态、**kwargs(674 675 last_output,输出,状态=K.rnn(步长,

TypeError:call((接受2个位置参数,但有3个被赋予

你能帮我弄清楚这是init问题,还是调用的问题,或者我需要为这个自定义单元格定义一个自定义层吗?

我试着在互联网上寻找答案,但我无法明确如何在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

导入kerasfrom 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

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

相关内容

最新更新