cnn-lstm数据维度问题


class cnn_lstm(nn.Module):
    def __init__(self,window_size,feature_number):
        super(cnn_lstm, self).__init__()
        self.window_size=window_size
        self.feature_number=feature_number
        self.conv1 = Conv2d(in_channels=1, out_channels=64, kernel_size=3, stride=1, padding=1)
        self.relu1 = ReLU()
        self.maxpooling1 = MaxPool2d(3, stride=1,padding=1)
        self.dropout1 = Dropout(0.3)
        self.lstm1 = nn.LSTM(input_size=64 * feature_number, hidden_size=128, num_layers=1, batch_first=True)
        self.lstm2 = nn.LSTM(input_size=128, hidden_size=64, num_layers=1, batch_first=True)
        self.fc = nn.Linear(in_features=64, out_features=32)
        self.relu2 = nn.ReLU()
        self.head = nn.Linear(in_features=32, out_features=1)

    def forward(self, x):

            x = x.reshape([x.shape[0], 1, self.window_size, self.feature_number])
            # x = x.transpose(-1, -2)
            x = self.conv1(x)
            x = self.relu1(x)
            x = self.maxpooling1(x)
            x = self.dropout1(x)

            x = x.reshape([x.shape[0], self.window_size, -1])
            # x = x.transpose(-1, -2)  #
            x, (h, c) = self.lstm1(x)
            x, (h, c) = self.lstm2(x)
            x = x[:, -1, :]  # 最后一个LSTM只要窗口中最后一个特征的输出
            x = self.fc(x)
            x = self.relu2(x)
            x = self.head(x)

            return x

训练集x的形状是: torch.Size([6969, 10, 9])
测试集y的形状是: torch.Size([6969, 1])
测试集x的形状是: torch.Size([2978, 10, 9])
测试集y的形状是: torch.Size([2978, 1])

在这一行: x = x.reshape([x.shape[0], 1, self.window_size, self.feature_number])报错,
内容为shape '[6969, 1, 9, 9]' is invalid for input of size 627210
请问怎么修改维度 我看很多都是直接定义-1 可以自动修正维度 我不太明白,请求各位指教

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    根据你提供的信息,可以看出CNN-LSTM模型需要的输入形状为[batch_size, sequence_length, feature_number],而你目前的输入形状为[batch_size, sequence_length, feature_number]。

    根据你提供的代码,可以看出你尝试将数据维度reshape为[batch_size, 1, sequence_length, feature_number],但出现了错误。

    根据错误提示信息,获取了输入的size(627210),发现该值与期望值(6969 x 1 x 10 x 9 = 625620)不匹配。因此,无法使用所提供的reshape方法。

    为了避免出现这种错误,你可以使用numpy中的-1参数自动计算缺失维度。

    具体来说,你可以使用以下代码:

    import numpy as np
    
    x_train = np.reshape(x_train, (-1, 1, 10, 9)) # x_train为训练集输入数据,括号中的参数分别表示batch_size、sequence_length、feature_number
    x_test = np.reshape(x_test, (-1, 1, 10, 9)) # x_test为测试集输入数据,括号中的参数分别表示batch_size、sequence_length、feature_number
    y_train = np.reshape(y_train, (-1, 1)) # y_train为训练集标签
    y_test = np.reshape(y_test, (-1, 1)) # y_test为测试集标签
    

    这段代码会自动计算缺失的维度,从而使输入数据的形状正确地适应模型输入,避免错误提示。

    希望这个解决方案能够帮助你解决问题!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^