使用PyTorch实现一个组合模型CNN+LSTM模型 实现交通流量预测

组合模型通常指的是将多个模型集成在一起,以提高整体性能。在交通流量预测的场景中,可以使用多个不同的神经网络或机器学习模型来处理不同的特征或任务。以下是一个简单的例子,使用PyTorch实现一个组合模型,其中包括卷积神经网络 (CNN) 和长短时记忆网络 (LSTM)。 

import torch
import torch.nn as nn
import torch.optim as optim

# 定义CNN模型
class CNNModel(nn.Module):
    def __init__(self):
        super(CNNModel, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, padding=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(64 * 64 * 64, 128)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.pool(x)
        x = x.view(-1, 64 * 64 * 64)
        x = self.fc1(x)
        return x

# 定义LSTM模型
class LSTMModel(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super(LSTMModel, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        _, (h_n, _) = self.lstm(x)
        x = self.fc(h_n[-1, :, :])
        return x

# 定义组合模型
class CombinedModel(nn.Module):
    def __init__(self, cnn_model, lstm_model):
        super(CombinedModel, self).__init__()
        self.cnn_model = cnn_model
        self.lstm_model = lstm_model
        self.fc = nn.Linear(128 + lstm_model.hidden_size, 1)

    def forward(self, cnn_input, lstm_input):
        cnn_output = self.cnn_model(cnn_input)
        lstm_output = self.lstm_model(lstm_input)
        combined_input = torch.cat((cnn_output, lstm_output), dim=1)
        output = self.fc(combined_input)
        return output

# 设置模型参数
cnn_model = CNNModel()
lstm_model = LSTMModel(input_size=10, hidden_size=64, num_layers=2, output_size=128)
combined_model = CombinedModel(cnn_model, lstm_model)

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(combined_model.parameters(), lr=0.001)

# 示例数据
cnn_input = torch.randn(32, 1, 64, 64)
lstm_input = torch.randn(32, 10, 10)

# 前向传播和反向传播
output = combined_model(cnn_input, lstm_input)
target = torch.randn(32, 1)
loss = criterion(output, target)
loss.backward()
optimizer.step()

import torch
import torch.nn as nn
import torch.optim as optim

# 定义CNN模型
class CNNModel(nn.Module):
    def __init__(self):
        super(CNNModel, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, padding=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(64 * 64 * 64, 128)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.pool(x)
        x = x.view(-1, 64 * 64 * 64)
        x = self.fc1(x)
        return x

# 定义LSTM模型
class LSTMModel(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super(LSTMModel, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        _, (h_n, _) = self.lstm(x)
        x = self.fc(h_n[-1, :, :])
        return x

# 定义组合模型
class CombinedModel(nn.Module):
    def __init__(self, cnn_model, lstm_model):
        super(CombinedModel, self).__init__()
        self.cnn_model = cnn_model
        self.lstm_model = lstm_model
        self.fc = nn.Linear(128 + lstm_model.hidden_size, 1)

    def forward(self, cnn_input, lstm_input):
        cnn_output = self.cnn_model(cnn_input)
        lstm_output = self.lstm_model(lstm_input)
        combined_input = torch.cat((cnn_output, lstm_output), dim=1)
        output = self.fc(combined_input)
        return output

# 设置模型参数
cnn_model = CNNModel()
lstm_model = LSTMModel(input_size=10, hidden_size=64, num_layers=2, output_size=128)
combined_model = CombinedModel(cnn_model, lstm_model)

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(combined_model.parameters(), lr=0.001)

# 示例数据
cnn_input = torch.randn(32, 1, 64, 64)
lstm_input = torch.randn(32, 10, 10)

# 前向传播和反向传播
output = combined_model(cnn_input, lstm_input)
target = torch.randn(32, 1)
loss = criterion(output, target)
loss.backward()
optimizer.step()