关于Autoformer时间嵌入代码中day_size设为32的疑问
关于Autoformer时间嵌入代码中day_size设为32的疑问
嘿,我来帮你捋清楚Autoformer里这个时间嵌入的小细节~
先看你提到的TemporalEmbedding类的部分代码片段:
class TemporalEmbedding(nn.Module): def __init__(self, d_model, embed_type='fixed', freq='h'): super(TemporalEmbedding, self).__init__() minute_size = 4 hour_size = 24 day_size = 32 month_size = 13 # 后续嵌入层定义逻辑...
为什么day_size要设成32而不是实际最多的31天?其实这是时间序列嵌入里很实用的小技巧,原因主要有两个:
- 避免索引越界:日历里一个月最多31天,但我们用原始日期数值(比如1-31)直接当嵌入层的索引时,
nn.Embedding的num_embeddings参数要求索引范围是0到num_embeddings-1。如果设day_size=31,那最大合法索引是30,31号的索引就会超出范围报错;设成32的话,索引0到31都合法,刚好覆盖1-31号的所有情况,不用额外做day-1的转换。 - 代码简洁性:和
month_size=13是一个道理——月份是1-12,设13就能直接用原始月份数值当索引,不用预处理转成0开始的序列,减少了代码里的额外步骤,逻辑更直观。
Autoformer的时间嵌入逻辑是把年、月、日、时、分这些时间特征分别做嵌入后拼接,这种“特征值+1”的嵌入层大小设置,刚好适配了人类习惯的1开始的时间计数方式,挺巧妙的对吧?
备注:内容来源于stack exchange,提问作者prem
相关产品推荐
相关产品推荐

