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 可以自动修正维度 我不太明白,请求各位指教
根据你提供的信息,可以看出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为测试集标签
这段代码会自动计算缺失的维度,从而使输入数据的形状正确地适应模型输入,避免错误提示。
希望这个解决方案能够帮助你解决问题!