我正在尝试使用Tensorflow 2.1中的tf.keras
实现一个简单的递归神经网络体系结构,注意序列到序列任务。
我一直在关注这个问题,到目前为止,它正在发挥作用
但是,该指南使用了一个自行编写的培训函数,其中我希望使用各种tf.keras.Model
函数,如fit
,因此我尝试调整代码以允许我使用这些函数。
问题在于:
在解码器部分,由于注意结构的原因,必须手动迭代时间步,进行注意计算,并将结果提供给下一步。
我的解码器型号如下所示:
class MyDecoderModel(tf.keras.Model):
def __init__(self, **kwargs):
...
def call(self, x):
seq_in, state_in = x
batch_size, seq_len = seq_in.shape
for step in range(seq_len):
do_stuff()
最重要的是,必须定义输入的序列长度,而不是None
。但我想处理可变序列长度。
据我所知,这使得我通常使用的Keras函数API在这个模型中是不可能使用的,因为我编写了
x = tf.keras.Input(shape=(None,))
x = MyDecoderModel()(x)
将None
馈送到调用中。
所以我决定只使用模型子类化,编写一个主模型,如
class MyMainModel(tf.keras.Model):
...
def call(self, x):
enc_in, dec_in = x
state = self.my_encoder(enc_in)
dec_out = self.my_decoder((dec_in, state))
return dec_out
这在原则上似乎是可行的,使用输入数据调用此主模型可以成功地生成结果。
但是,在这个模型上使用fit()
方法时,发生了一些我不理解的事情:
首先,使用未知的批大小调用模型,但指定序列长度。
随后,仅使用指定的批处理大小调用它,但序列长度未知。
因此None
被传递,迭代失败
为什么会这样?在培训过程中,批次的序列长度肯定是已知的,为什么不传递给我的模型? 如果没有定制的培训方法,是否有可能解决这个问题? 如果有人能解释那里发生了什么我会很高兴
第一件事:如果您的输入数据是一个序列,则馈送到
Input
的形状必须有两个值:(timesteps, features)
。timesteps
可以是None
,但features
必须有一个固定的形状。如果您只有一个功能,请执行以下操作:其次,您可以在模型中使用可变时间步长,只需做一些更改;
tf.unstack
是您的朋友:相关问题 更多 >
编程相关推荐