我在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,它也使用这个原则
目前没有回答
相关问题 更多 >
编程相关推荐