在TensorFlow中用全局平均池(GAP)将CNN模型的时间序列归零有意义吗

2024-04-24 19:09:14 发布

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

我在TensorFlow中实现了多元时间序列的回归模型。输入特征数为9,序列长度可变。假设序列长度在32到512之间,但大多数序列更接近低端

据我所知,要以分批方式进行训练,所有样本都必须具有相同的长度。如果我选择所有样本的最大长度,数据张量将具有shape=[batch_size,512,9]。为了实现这一点,我需要用长度<;对每个样本进行零填充;512.

我的模型由一些简单的卷积和maxpool层组成:

    class MyModel(tf.keras.Model):
        def __init__(self, params):
            super(MyModel, self).__init__()
            self.params = params
        def build(self, inputs_shape):
            self.conv1 = tf.keras.layers.Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=inputs_shape[1:])
            self.pool1 = tf.keras.layers.MaxPool1D(pool_size=2)
            self.conv2 = tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu')
            self.pool2 = tf.keras.layers.MaxPool1D(pool_size=2)        
            self.conv3 = tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu')
            self.gpool1 = tf.keras.layers.GlobalAveragePooling1D()
            self.dense2 = tf.keras.layers.Dense(32, activation='relu')
            self.dense3 = tf.keras.layers.Dense(1)
        def call(self, x):
        ...

所以我用512的序列长度训练我的模型。在我的测试集中,我的最大序列长度只有128。所以我只需要少垫一点。
不同的输入序列长度对结果有影响吗?因为当单个序列的大部分样本被填充时,卷积层的大部分输出将为零。这意味着,全局平均池的输入将由许多零组成(取决于填充的样本数量)。建立平均值时,许多零的存在将改变总体结果。
这意味着,不同长度的输入样本将有不同的输出

所以我的问题是:
有没有办法绕过这个问题?通过A:掩蔽填充样品以备日后纠正?或者B:用1的批量训练我的模型,所以我不需要填充任何样本--&燃气轮机;这是可能的,因为模型的输入张量对于每个训练步骤都是不同的

据我所知,在使用全局最大池时不应出现这种情况,因为在集合之后的附加零不应产生影响。然而,我的实验表明,根据填充大小确实存在差异。
现在,我不确定我的想法是否正确,或者我是否遗漏了什么

对于推断,也可能发生从未见过的样本甚至超过512个时间戳的情况。这意味着我需要将样本的原始尺寸输入到模型中

全局平均池的概念在许多不同的网络模型中使用,我想实现TimeInception network,它也使用这个原则


Tags: 模型selfsizelayerstfdef序列params