文章目录
- 摘要
- GCN+CNNGA混合模型预测进水水质
- 代码
- 运行结果
- 文献阅读
- 题目
- 研究背景与意义
- 研究方法
- 数据采集与预处理
- GCN–CNNGA混合深度学习框架的构建
- 模型优化与实验
- 邻接矩阵的构建与效果分析
- 模型预测效果对比
- 多步预测性能
- 模型优势与应用前景
- 精度提升与处理效率
- 运营决策的优化支持
- 模型的适应性与可扩展性
- 结论
摘要
本周阅读了一篇基于基于图优化的工业废水进水水质预测混合深度学习框架的文章,并对文中提到的GCN+CNNGA混合模型进行实验,该模型整合图卷积网络(GCN)、卷积神经网络(CNN)、门控循环单元(GRU)和注意力机制,不仅能高效提取高维度数据的局部和全局特征,还能够捕捉长时间依赖性,进而提升进水水质预测的准确性和稳定性。
GCN+CNNGA混合模型预测进水水质
代码
- 设备配置
# 检查并配置GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
这段代码通过检查是否有可用的CUDA支持来决定是否使用GPU进行训练。torch.device("cuda")
指定在GPU上执行模型,如果没有GPU或CUDA不可用,则使用CPU (torch.device("cpu")
)。这有助于加速训练,特别是在数据集较大时。
- 数据生成
# 数据生成
def generate_data(num_samples=20000, num_features=5, sequence_length=10):"""生成模拟工业污水处理厂的数据,带有随机波动和非线性特征"""np.random.seed(42)data = np.random.randn(num_samples, num_features)for i in range(1, num_features):data[:, i] += 0.5 * data[:, i - 1]return data
这段代码模拟生成工业污水处理厂的数据。我们假设每个时间点的输入有5个特征(num_features=5
),数据集包含20000个样本(num_samples=20000
)。这里使用 np.random.randn()
生成一个均值为0、标准差为1的随机数据。然后,通过对每个特征应用一定的依赖关系(例如,data[:, i] += 0.5 * data[:, i - 1]
),我们模拟了特征之间的波动和非线性依赖。最终生成的 data
是一个大小为 (20000, 5)
的矩阵。
- 自定义数据集
# 数据预处理
class TimeSeriesDataset(Dataset):def __init__(self, data, sequence_length=10):self.data = torch.tensor(data, dtype=torch.float32)self.sequence_length = sequence_lengthdef __len__(self):return len(self.data) - self.sequence_lengthdef __getitem__(self, idx):x = self.data[idx:idx + self.sequence_length]y = self.data[idx + self.sequence_length]return x, y
在这段代码中,我们定义了一个自定义的PyTorch数据集类 TimeSeriesDataset
,继承自 torch.utils.data.Dataset
。该类用于处理时间序列数据,将数据拆分为输入 x
和目标输出 y
,每个样本的长度为 sequence_length
。
__init__
:将输入数据转化为PyTorch的tensor
类型,并指定时间序列的长度。__len__
:返回数据集中样本的数量(数据长度减去序列长度)。__getitem__
:根据索引idx
提取一个数据样本,返回一个序列长度为sequence_length
的输入x
和相应的目标输出y
。
这使得我们可以轻松加载和处理时间序列数据。
- 手动实现GCN层
# 手动实现GCN层
class GCNLayer(nn.Module):def __init__(self, in_features, out_features):super(GCNLayer, self).__init__()self.weights = nn.Parameter(torch.randn(in_features, out_features))def forward(self, x, adj):"""GCN的基本公式:H = A * X * Wx: 输入特征矩阵 (N, F)adj: 邻接矩阵 (N, N)"""return torch.relu(torch.matmul(torch.matmul(adj, x), self.weights))
GCNLayer
类实现了一个基本的图卷积层,功能是根据邻接矩阵 adj
对输入特征矩阵 x
进行图卷积操作。
__init__
:初始化权重矩阵self.weights
,它是一个训练参数,随机初始化形状为(in_features, out_features)
,即输入特征维度和输出特征维度。forward
:在前向传播中,输入的特征矩阵x
和邻接矩阵adj
会先进行矩阵相乘(torch.matmul(adj, x)
),再与权重矩阵self.weights
相乘,得到卷积后的结果。然后使用ReLU
激活函数进行非线性变换。
这是一个简单的图卷积层实现,用于提取图数据中的结构信息。
- 模型定义
# 模型定义
class GCN_CNNGA(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim):super(GCN_CNNGA, self).__init__()# CNN层self.cnn = nn.Conv1d(input_dim, hidden_dim, kernel_size=3, padding=1)# GCN层self.gcn = GCNLayer(hidden_dim, hidden_dim)# GRU层self.gru = nn.GRU(hidden_dim, hidden_dim, batch_first=True)# 注意力机制self.attention = nn.Linear(hidden_dim, hidden_dim)self.fc = nn.Linear(hidden_dim, output_dim)
GCN_CNNGA
是整个模型的核心,结合了 卷积神经网络(CNN)、图卷积网络(GCN)、门控循环单元(GRU) 和 注意力机制。
- CNN层:通过
nn.Conv1d
实现,用于提取时间序列数据的局部特征。输入和输出的特征维度分别为input_dim
和hidden_dim
,卷积核大小为3,padding设置为1。 - GCN层:如上所述,用于提取图结构数据的特征信息。
- GRU层:用于捕获时间序列数据中的长期依赖性,特别是在时序问题中,GRU能有效避免梯度消失问题。
- 注意力机制:通过
nn.Linear
实现,用来加权不同时间步的特征信息,从而增强模型对重要时间步的关注。
- 模型前向传播
def forward(self, x, adj):# CNN特征提取x = x.permute(0, 2, 1) # 转换为(N, C, L)x = torch.relu(self.cnn(x))x = x.permute(0, 2, 1) # 转回(N, L, C)# GCN特征聚合x = self.gcn(x, adj)# GRU处理时间依赖x, _ = self.gru(x)# 注意力机制attn_weights = torch.softmax(self.attention(x), dim=1)x = torch.sum(attn_weights * x, dim=1)# 输出层out = self.fc(x)return out
- CNN:首先将输入数据
x
转置为(N, C, L)
,然后应用CNN层提取局部特征,再转回(N, L, C)
以适应后续操作。 - GCN:将通过CNN提取的特征传入GCN层,使用邻接矩阵进行图卷积。
- GRU:对GCN处理后的特征序列应用GRU,以捕捉长期的时间依赖。
- 注意力机制:计算每个时间步的注意力权重,通过softmax归一化,并加权特征信息,最终进行加和。
- 输出层:经过GRU和注意力机制后的特征传入全连接层进行最终预测。
- 训练与评估
# 初始化模型、优化器和损失函数
model = GCN_CNNGA(input_dim=input_dim, hidden_dim=hidden_dim, output_dim=output_dim).to(device)
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()# 训练模型
num_epochs = 50
for epoch in range(num_epochs):model.train()train_loss = 0for x, y in train_loader:x, y = x.to(device), y.to(device) # 数据转移到GPUoptimizer.zero_grad()output = model(x, adj)loss = criterion(output, y)loss.backward()optimizer.step()train_loss += loss.item()print(f"Epoch {epoch+1}, Train Loss: {train_loss/len(train_loader):.4f}")
- 训练:模型使用Adam优化器(
optim.Adam
)和均方误差损失函数(nn.MSELoss
)进行训练。每个epoch中,通过将数据从CPU转移到GPU进行训练。在每个批次中,模型进行前向传播、损失计算、反向传播,并
优化参数。
- 评估与结果
# 模型评估
model.eval()
test_loss = 0
with torch.no_grad():for x, y in test_loader:x, y = x.to(device), y.to(device) # 数据转移到GPUoutput = model(x, adj)loss = criterion(output, y)test_loss += loss.item()print(f"Test Loss: {test_loss/len(test_loader):.4f}")
- 评估:在测试阶段,模型进入评估模式(
model.eval()
)。不计算梯度(torch.no_grad()
),减少内存消耗和加速计算。计算测试集的损失,得到模型的性能。
运行结果
总结
- 这段代码实现了一个包含CNN、GCN、GRU和注意力机制的复合模型,用于处理工业污水处理厂的数据。
- 使用自定义的数据集类
TimeSeriesDataset
,结合手动实现的GCN层,完成了图卷积操作。 - 通过优化器和损失函数,训练模型并评估其在测试集上的表现。
- 在GPU上加速训练,提高了训练效率,尤其是在数据集规模较大的情况下。
文献阅读
题目
A hybrid deep learning framework for predicting industrial wastewater influent quality based on graph optimisation
本文提出了一种名为GCN–CNNGA的混合深度学习框架,用于应对工业污水处理厂(IETP)进水水质预测中的复杂时空非线性特征。通过整合图卷积网络(GCN)、卷积神经网络(CNN)、门控循环单元(GRU)和注意力机制,该模型不仅能高效提取高维度数据的局部和全局特征,还能够捕捉长时间依赖性,进而提升进水水质预测的准确性和稳定性。研究通过实验对比和模型优化,验证了GCN-CNNGA在处理工业污水波动性强、参数间复杂依赖关系的问题上具有显著的优势。以下是具体的研究内容和方法、模型优化过程、实验结果和未来展望。
下面我将详细分析和解释上述代码中的各个部分,并说明每个部分的功能和它们如何相互配合实现图卷积网络(GCN)模型的训练和预测。
研究背景与意义
工业化的快速发展导致了环境污染的加剧,尤其是工业污水处理,因其成分复杂、污染物浓度高,对污水处理技术提出了更高的要求。工业污水处理厂(IETP)需满足更高的水质标准,以减少对环境的负面影响。然而,由于进水水质和水量波动较大,传统污水处理技术难以实现稳定的污染物去除效果【5†source】。随着深度学习技术的发展,基于数据驱动的预测方法成为了工业污水处理中的重要工具。通过预测污水处理厂的进水负荷与成分,管理者可以提前进行系统维护和优化操作,以应对可能的波动,保障出水水质。然而,由于工业污水数据的非线性、复杂性和高维度特征,单一的深度学习模型难以准确捕捉其特征和动态变化。因此,本文提出了一种基于GCN的混合深度学习框架,以实现对工业污水处理厂进水水质的高精度预测,从而为工业污水处理提供技术支持,保护生态环境并推动可持续发展。
研究方法
数据采集与预处理
本研究的数据来源于中国东部某工业园区内的一座工业污水处理厂,该园区包含52家以生产环氧树脂、聚酯树脂和苯酐等化工产品为主的企业。数据收集时间为2022年9月1日至2023年4月1日,每小时采集一次数据,共获得了5136条数据。数据内容涵盖了进水流量、化学需氧量(COD)、氨氮(NH3-N)、总磷(TP)和总氮(TN)等关键进水参数。
数据预处理过程中,由于在线监测系统在收集水质数据时可能受到设备故障或存储技术限制,导致数据存在缺失值或异常值,因此本文采用K近邻算法(KNN)对缺失数据进行插补。此外,数据在进入模型之前进行了线性归一化处理,将所有特征值标准化到[0, 1]的范围内,以避免输入特征间的数量级差异对模型性能的影响。
GCN–CNNGA混合深度学习框架的构建
该模型的结构超参数包含一个CNN层,具有32个神经元,内核大小为3,激活函数为ReLU。GCN层包含128个神经元,丢弃率为0.01。该模型包含两个GRU层,每层有258个和128个神经元。参与注意机制的神经元数量为256个。基于Adam optimiser进行模型训练,并将损失函数设置为平均绝对误差。Epochs设置为150,batch size设置为512。
GCN–CNNGA模型通过结合CNN、GCN、GRU和注意力机制来捕捉IETP进水数据的高维度特征和复杂非线性时空模式:
- 卷积神经网络(CNN): CNN通过局部连接和权重共享的机制提取进水时间序列数据的局部特征。通过卷积操作,逐层提取高维抽象特征,减少网络模型的复杂性,使模型能够集中在与预测目标最相关的特征上。
- 图卷积网络(GCN): 在GCN–CNNGA模型中,GCN用于捕捉进水参数间的拓扑信息。基于互信息(MuI)构建的特征邻接矩阵能够反映变量间的复杂依赖关系,从而更准确地揭示污染物之间的内在关联。在特征聚合过程中,GCN通过邻接特征的加权聚合来更新节点的特征表示,从而学习到局部拓扑结构与节点特征信息,提升模型对水质动态变化的预测能力。
- 门控循环单元(GRU): GRU模块用于捕捉数据的长期依赖特征。与长短期记忆网络(LSTM)相比,GRU参数较少,收敛速度快,并且具有较强的学习数据特征的能力,能够高效处理时间序列数据中的复杂依赖关系。
- 注意力机制: 为了进一步提升预测精度,注意力机制在GCN–CNNGA模型中用于优化权重分配,使模型更加关注关键的时间段信息,强化不同特征信息的时变影响,从而提高模型的预测效果。
模型优化与实验
邻接矩阵的构建与效果分析
在GCN–CNNGA模型中,邻接矩阵的构建是关键步骤。本文尝试了基于互信息(MuI)、皮尔逊相关系数(PCC)和斯皮尔曼相关系数(SCC)构建的不同邻接矩阵,评估了其对模型预测精度的影响。结果表明,基于MuI构建的邻接矩阵能够更全面地捕捉变量间的非线性和双向关系,比PCC和SCC在处理复杂非线性关系时更为有效。因此,使用MuI作为邻接矩阵能够显著提升GCN的学习效果,并优化模型的预测性能。
模型预测效果对比
本文将GCN–CNNGA模型与传统的时间序列预测模型(如SVM和RF)、经典深度学习模型(如ANN和LSTM)进行了对比。实验结果显示,GCN–CNNGA模型在IETP数据集的四种污染物指标(COD、NH3-N、TN和TP)的预测任务中,均取得了最优的RMSE、MAE和R²指标。此外,与CNNGA模型相比,GCN–CNNGA通过引入GCN显著提升了预测精度,尤其是在高维度特征的时空依赖关系处理上表现尤为突出。
多步预测性能
GCN–CNNGA模型在1至8小时的多步预测任务中表现优异。随着预测步长的增加,虽然预测误差逐步累积,但GCN–CNNGA总体上的预测效果仍然优于对比模型,尤其在COD和NH3-N指标的长期预测中表现尤为突出。相比于LSTM,GCN–CNNGA模型的平均RMSE在四种水质指标上减少了36%以上,说明GCN在长时间序列预测中的信息捕获能力更为显著。
模型优势与应用前景
精度提升与处理效率
GCN–CNNGA模型在IETP进水水质参数的预测中展现出显著的精度提升,使得污水处理厂能够提前预测水质变化,从而灵活调整处理工艺,提高资源利用效率。这种精准的预测能力在高污染环境中尤为重要。
运营决策的优化支持
通过准确的水质预测,污水处理厂能够在水质剧烈波动之前,灵活调整操作策略,例如调节生物处理单元的微生物活性或调整物理过滤系统的运行参数,有效保障处理效率并降低操作风险。
模型的适应性与可扩展性
GCN–CNNGA模型在处理水质显著波动和复杂条件方面表现出良好的适应性,具备推广到多种类型污水处理设施的潜力,为环境保护和资源管理提供了新的技术支持。未来,可以将该模型与多目标优化方法结合,以实现更高效的资源利用和环境保护。
结论
本文创新性地提出了一种基于GCN优化的混合深度学习框架GCN–CNNGA,用于预测IETP进水水质参数。实验结果表明,GCN–CNNGA在COD、NH3-N、TN和TP四项指标的预测任务中RMSE显著降低,平均降低幅度为10-74%。相比传统的单一模型和混合模型框架,GCN的引入有效提升了模型在捕捉变量间非线性复杂关系中的表现,使得该模型在环境波动剧烈的工业污水处理场景中表现出色。此外,该模型在IETP多步预测任务中的鲁棒性进一步证明了GCN–CNNGA在处理复杂时空依赖性问题中的适应性和广泛应用潜力。
未来研究中,GCN–CNNGA模型可以进一步与多目标优化策略集成,以平衡水质合规性和经济效益,从而推动更加智能的污水处理管理。此外,结合传统的机制模型增强模型的可解释性,将是提升深度学习在环境工程领域应用效果的重要方向。