tf.keras:在自定义模型中处理可变长度序列上的迭代,无需自定义训练方法

2024-04-25 20:36:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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被传递,迭代失败

为什么会这样?在培训过程中,批次的序列长度肯定是已知的,为什么不传递给我的模型? 如果没有定制的培训方法,是否有可能解决这个问题? 如果有人能解释那里发生了什么我会很高兴


Tags: 函数in模型selfnonemodeltfdef
1条回答
网友
1楼 · 发布于 2024-04-25 20:36:09

第一件事:如果您的输入数据是一个序列,则馈送到Input的形状必须有两个值:(timesteps, features)timesteps可以是None,但features必须有一个固定的形状。如果您只有一个功能,请执行以下操作:

x = tf.keras.Input(shape=(None, 1))

其次,您可以在模型中使用可变时间步长,只需做一些更改;tf.unstack是您的朋友:

class MyDecoderModel(tf.keras.Model):
    def __init__(self, **kwargs):
        ...

    def call(self, x):
        seq_in, state_in = x
        step_number = 0
        steps_in = tf.unstack(seq_in, axis=SEQUENCE_AXIS)
        steps_out = []
        for step in batches_in:
            steps_out.append(do_stuff())
            step_number += 1
        return tf.stack(steps_out, axis=SEQUENCE_AXIS)

相关问题 更多 >

    热门问题