2026/4/18 15:28:59
网站建设
项目流程
Php做网站创业,如何编写一份网站开发需求文档,wordpress防偷代码,外贸营销策略三维卷积神经网络和门控循环单元加上注意力机制#xff08;3D CNN-GRU-Att#xff09;的结合上构建的#xff0c;此代码可以运用到负荷预测、PM2.5预测、光伏预测中等等#xff0c;只需要替换你自己的数据即可跑所有实验图都是代码跑出来的江湖上一直流传着时空预测的传说3D CNN-GRU-Att的结合上构建的此代码可以运用到负荷预测、PM2.5预测、光伏预测中等等只需要替换你自己的数据即可跑所有实验图都是代码跑出来的江湖上一直流传着时空预测的传说今天咱们来盘一盘这个能打十个的3D CNN-GRU-Attention组合拳。这玩意儿在电力负荷预测里能把传统模型按在地上摩擦在PM2.5预测战场上也能七进七出。不整虚的直接上代码先看这个时空特征提取的狠角色——3D卷积。咱们用Keras实现起来跟切菜似的from keras.layers import Conv3D, Reshape input_layer Input(shape(24, 5, 5, 1)) # 24小时历史数据5x5空间网格 # 第一层3D卷积暴力提取特征 conv1 Conv3D(filters64, kernel_size(3, 3, 3), activationrelu)(input_layer)这里用3x3x3的核在时空维度上滑动就像拿着探照灯在时空立方体里找规律。注意输出的形状会自动保持时间维度这是后续接GRU的关键。接下来是时间序列处理的扛把子GRU配上注意力机制简直如虎添翼from keras.layers import GRU, Dense, Multiply # 把卷积输出压平时间步长 reshape Reshape((22, -1))(conv1) # 24-3122个时间步 # GRU捕捉时间依赖 gru_out, gru_state GRU(128, return_sequencesTrue, return_stateTrue)(reshape) # 注意力机制搞事情 attention Dense(1, activationtanh)(gru_out) attention Flatten()(attention) attention Activation(softmax)(attention) context Multiply()([gru_out, attention])这段代码暗藏玄机GRU不仅返回最终状态还把每个时间步的输出都吐出来。注意力层就像个智能聚光灯自动找到关键时间点重点关照。整个模型拼装起来就像搭乐高from keras.models import Model # 拼接输出层 output Dense(24)(context) # 预测未来24个时间点 model Model(inputsinput_layer, outputsoutput) model.compile(optimizeradam, lossmape)这里输出层直接预测多个时间点比传统递归预测更高效。注意损失函数用了MAPE对负荷预测这种相对误差敏感的场景特别合适。数据预处理才是真功夫以电力负荷数据为例def create_dataset(data, look_back24, pred_steps24): X, Y [], [] for i in range(len(data)-look_back-pred_steps): # 3D输入需要空间维度假设有5x5区域数据 X.append(data[i:ilook_back].reshape(look_back,5,5,1)) Y.append(data[ilook_back:ilook_backpred_steps]) return np.array(X), np.array(Y)这个reshape操作把一维时间序列变成伪3D数据实际业务中可能需要根据传感器位置调整空间维度。比如把不同变电站的数据排成网格。训练时记得用时空数据增强from keras.preprocessing.image import ImageDataGenerator datagen ImageDataGenerator( rotation_range20, # 空间旋转增强 width_shift_range0.2, height_shift_range0.2) model.fit_generator(datagen.flow(X_train, y_train, batch_size32), steps_per_epochlen(X_train)/32, epochs100)这里把图像增强技术用在时空数据上相当于给模型喂了时空扭曲的特训套餐大幅提升泛化能力。预测的时候玩点花的——滚动预测未来多步def rolling_prediction(model, init_data, steps24): preds [] current_batch init_data.reshape(1, 24, 5, 5, 1) for _ in range(steps): pred model.predict(current_batch)[0] preds.append(pred[0]) # 更新输入数据类似滑动窗口 current_batch np.concatenate([current_batch[:,1:], pred.reshape(1,1,5,5,1)], axis1) return np.array(preds)这个滚动预测相当于让模型自己续写时间序列每次预测下一步时都把最新预测值塞回输入窗口适合长期预测场景。在光伏预测中实测发现加入注意力机制后模型对日出日落的时间点特别敏感。比如当注意力权重突然在早晨6点暴增说明模型自动捕捉到了光伏发电的启动时刻。代码里有个暗坑要注意3D卷积会压缩时间维度。比如用kernel_size(3,3,3)时输入24个时间步经过卷积后会变成22个时间步。所以在GRU层前面要确保时间步数量合理别被卷没了。最后说句大实话这套模型在1080Ti上跑起来确实有点烫手建议把空间维度不要超过10x10。实际工业部署时可以改用 separable convolution 省显存这个在另一个版本里实现了点赞过500就放出来