基于encoder-decoder的非自回归Transformer时间序列预测Python程序

基于encoder-decoder的非自回归Transformer时间序列预测Python程序

 

特色:1、单变量,多变量输入,自由切换 

           2、单步预测,多步预测,自动切换

           3、基于Pytorch架构

           4、多个评估指标(MAE,MSE,R2,MAPE等)

           5、数据从excel文件中读取,更换简单

           6、标准框架,数据分为训练集、验证集,测试集

 

全部完整的代码,保证可以运行的代码看这里。

http://t.csdnimg.cn/El450

 

  !!!如果第一个链接打不开,请点击个人首页,查看我的个人介绍。

(搜索到的产品后,点头像,就能看到全部代码)

黑科技小土豆的博客_CSDN博客-深度学习,32单片机领域博主

4a8da666e5e04c0c84c52d06371bbf63.png

35214a41eb447f582783331dc17ef614.png

 

1、基于encoder-decoder的非自回归Transformer模型背景简介

Transformer是近年来应用广泛的神经网络模型,其基于自注意力机制实现了非常优秀的性能,能够很好地应用于序列到序列的任务,如机器翻译,文本摘要等。

而在非自回归模型中,模型输出的每个时间步都不依赖于之前的输出,这与传统的自回归模型有所不同。这种模型结构的优点是推理速度快,在准确率与速度之间权衡的情况下,非自回归模型会更加适用。

同时,模型采用了encoder-decoder架构,encoder通过自注意力网络将输入中的每个信息进行编码,decoder负责根据encoder传递的信息对其进行解码,最终输出预测结果。这种结构适用于序列到序列的任务,如机器翻译、对话系统等。非自回归模型可以避免序列逐步生成每个元素的高计算复杂度,加速推理速度。

因此,基于encoder-decoder的非自回归Transformer模型结合了Transformer的自注意力机制和非自回归模型的快速推理,能够更好地解决序列到序列的任务,并加快推理速度。

2、基于encoder-decoder的非自回归Transformer模型优点总结

本模型的优点有:

  • Transformer网络具有非常好的性能表现,能够很好地应用于序列到序列的任务,如机器翻译,文本摘要等;
  • 非自回归模型能够更快地进行推理,在对速度有要求的任务中表现更优;
  • encoder-decoder架构适用于序列到序列的任务,可以更好地处理输入和输出序列中的信息,提高模型的预测准确率。

 

train_ratio = 0.7  # 训练集比例
val_ratio = 0.15  # 验证集比例
test_ratio = 0.15  # 测试集比例
input_length = 48  # 输入数据长度,多步预测建议长,单步预测建议短
output_length = 1  # 输出数据长度,1为单步预测,1以上为多步预测 请注意,随着输出长度的增长,模型训练时间呈指数级增长
learning_rate = 0.1  # 学习率
estimators = 100  # 迭代次数
max_depth = 5  # 树模型的最大深度
interval_length = 2000  # 预测数据长度,最长不可以超过总数据条数
scalar = True  # 是否使用归一化
scalar_contain_labels = True  # 归一化过程是否包含目标值的历史数据
target_value = 'load'  # 需要预测的列名,可以在excel中查看

3b6eadb0210c4946bfd54e910aa2fa84.png

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer模型可以用于时间序列预测,以下是一个使用Python和TensorFlow对时间序列进行预测的示例: 首先,导入必要的库和数据集: ```python import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 生成数据集 def generate_time_series(): frequency1, frequency2, offset1, offset2 = np.random.rand(4) * 0.5 time = np.linspace(0, 1, 200) series = offset1 + np.sin((frequency1 * 10 + time) * 2 * np.pi) * 0.2 + \ offset2 + np.sin((frequency2 * 20 + time) * 2 * np.pi) * 0.1 return series[..., np.newaxis].astype(np.float32) # 划分数据集 data = generate_time_series() train_data = data[:150] val_data = data[150:175] test_data = data[175:] # 可视化数据集 plt.plot(np.arange(200), data) plt.show() ``` 接下来,构建Transformer模型: ```python class Transformer(tf.keras.Model): def __init__(self, num_layers, units, d_model, num_heads, dropout, name='transformer'): super(Transformer, self).__init__(name=name) self.encoder = tf.keras.layers.Dense(units, activation='relu') self.decoder = tf.keras.layers.Dense(1) self.pos_encoding = positional_encoding(200, d_model) self.num_layers = num_layers self.d_model = d_model self.dec_layers = [DecoderLayer(d_model, num_heads, units, dropout, name='dec_layer_{}'.format(i)) for i in range(num_layers)] self.dropout = tf.keras.layers.Dropout(dropout) def call(self, inputs, training=False): # 编码器 x = self.encoder(inputs) # (batch_size, input_seq_len, d_model) x *= tf.math.sqrt(tf.cast(self.d_model, tf.float32)) x += self.pos_encoding[:, :tf.shape(x)[1], :] # 解码器 for i in range(self.num_layers): x = self.dec_layers[i](x, training=training) x = self.decoder(x) # (batch_size, input_seq_len, 1) return x # 解码器层 class DecoderLayer(tf.keras.layers.Layer): def __init__(self, d_model, num_heads, units, dropout, name='dec_layer'): super(DecoderLayer, self).__init__(name=name) self.mha1 = MultiHeadAttention(d_model, num_heads) self.mha2 = MultiHeadAttention(d_model, num_heads) self.ffn = point_wise_feed_forward_network(units, d_model) self.layernorm1 = tf.keras.layers.LayerNormalization(epsilon=1e-6) self.layernorm2 = tf.keras.layers.LayerNormalization(epsilon=1e-6) self.layernorm3 = tf.keras.layers.LayerNormalization(epsilon=1e-6) self.dropout1 = tf.keras.layers.Dropout(dropout) self.dropout2 = tf.keras.layers.Dropout(dropout) self.dropout3 = tf.keras.layers.Dropout(dropout) def call(self, inputs, training=False): # 第一层多头注意力 attn1 = self.mha1(inputs, inputs, inputs) attn1 = self.dropout1(attn1, training=training) out1 = self.layernorm1(inputs + attn1) # 第二层多头注意力 attn2 = self.mha2(out1, out1, out1) attn2 = self.dropout2(attn2, training=training) out2 = self.layernorm2(out1 + attn2) # 前馈神经网络 ffn_output = self.ffn(out2) ffn_output = self.dropout3(ffn_output, training=training) out3 = self.layernorm3(out2 + ffn_output) return out3 # 多头注意力机制 class MultiHeadAttention(tf.keras.layers.Layer): def __init__(self, d_model, num_heads, name='multi_head_attention'): super(MultiHeadAttention, self).__init__(name=name) self.num_heads = num_heads self.d_model = d_model assert d_model % self.num_heads == 0 self.depth = d_model // self.num_heads self.wq = tf.keras.layers.Dense(d_model) self.wk = tf.keras.layers.Dense(d_model) self.wv = tf.keras.layers.Dense(d_model) self.dense = tf.keras.layers.Dense(d_model) def split_heads(self, x, batch_size): x = tf.reshape(x, (batch_size, -1, self.num_heads, self.depth)) return tf.transpose(x, perm=[0, 2, 1, 3]) def call(self, v, k, q): batch_size = tf.shape(q)[0] q = self.wq(q) # (batch_size, seq_len, d_model) k = self.wk(k) # (batch_size, seq_len, d_model) v = self.wv(v) # (batch_size, seq_len, d_model) q = self.split_heads(q, batch_size) # (batch_size, num_heads, seq_len_q, depth) k = self.split_heads(k, batch_size) # (batch_size, num_heads, seq_len_k, depth) v = self.split_heads(v, batch_size) # (batch_size, num_heads, seq_len_v, depth) scaled_attention, attention_weights = scaled_dot_product_attention(q, k, v) scaled_attention = tf.transpose(scaled_attention, perm=[0, 2, 1, 3]) concat_attention = tf.reshape(scaled_attention, (batch_size, -1, self.d_model)) output = self.dense(concat_attention) return output # 缩放点积注意力机制 def scaled_dot_product_attention(q, k, v): matmul_qk = tf.matmul(q, k, transpose_b=True) dk = tf.cast(tf.shape(k)[-1], tf.float32) scaled_attention_logits = matmul_qk / tf.math.sqrt(dk) # 掩码 mask = tf.linalg.band_part(tf.ones_like(scaled_attention_logits), -1, 0) scaled_attention_logits += (mask * -1e9) attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1) output = tf.matmul(attention_weights, v) return output, attention_weights # 位置编码 def get_angles(pos, i, d_model): angle_rates = 1 / np.power(10000, (2 * (i // 2)) / np.float32(d_model)) return pos * angle_rates def positional_encoding(position, d_model): angle_rads = get_angles(np.arange(position)[:, np.newaxis], np.arange(d_model)[np.newaxis, :], d_model) # 将 sin 应用于数组中的偶数索引(indices);2i angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2]) # 将 cos 应用于数组中的奇数索引;2i+1 angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2]) pos_encoding = angle_rads[np.newaxis, ...] return tf.cast(pos_encoding, dtype=tf.float32) # 前馈神经网络 def point_wise_feed_forward_network(d_model, diff): return tf.keras.Sequential([ tf.keras.layers.Dense(diff, activation='relu'), tf.keras.layers.Dense(d_model) ]) ``` 接下来,定义损失函数和优化器,并进行模型训练: ```python # 损失函数 loss_object = tf.keras.losses.MeanSquaredError() # 优化器 optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4) # 指标 train_loss = tf.keras.metrics.Mean(name='train_loss') val_loss = tf.keras.metrics.Mean(name='val_loss') # 训练步骤 @tf.function def train_step(inputs, targets): with tf.GradientTape() as tape: predictions = transformer(inputs, training=True) loss = loss_object(targets, predictions) gradients = tape.gradient(loss, transformer.trainable_variables) optimizer.apply_gradients(zip(gradients, transformer.trainable_variables)) train_loss(loss) # 验证步骤 @tf.function def val_step(inputs, targets): predictions = transformer(inputs, training=False) loss = loss_object(targets, predictions) val_loss(loss) # 训练模型 num_epochs = 2000 transformer = Transformer(num_layers=4, units=64, d_model=128, num_heads=8, dropout=0.1) for epoch in range(num_epochs): train_loss.reset_states() val_loss.reset_states() for input_series in range(len(train_data) - 10): inputs = train_data[input_series:input_series + 10] targets = train_data[input_series + 10] train_step(inputs, targets) for input_series in range(len(val_data) - 10): inputs = val_data[input_series:input_series + 10] targets = val_data[input_series + 10] val_step(inputs, targets) if epoch % 100 == 0: print('Epoch {}, Train Loss: {:.4f}, Val Loss: {:.4f}'.format(epoch, train_loss.result(), val_loss.result())) ``` 最后,使用训练好的模型进行预测并可视化: ```python # 预测 predictions = [] for input_series in range(len(test_data) - 10): inputs = test_data[input_series:input_series + 10] prediction = transformer(inputs[np.newaxis, ...], training=False)[0, -1].numpy() predictions.append(prediction) # 可视化预测结果 plt.plot(np.arange(175, 200), np.array(predictions), label='Predictions') plt.plot(np.arange(175, 200), test_data[10:], label='Real Data') plt.legend() plt.show() ``` 这里的示例是基于一个简单的时间序列预测问题,你可以根据自己的数据集和需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值