我已经训练了一个分类器,现在正在尝试加载它并运行一些预测。我遇到了下面的错误:
.... return self._conv_forward(input, self.weight, self.bias) File "/usr/local/lib/python3.9/site-packages/torch/nn/modules/conv.py", line 439, in _conv_forward return F.conv2d(input, weight, bias, self.stride,TypeError: conv2d() received an invalid combination of arguments - got (list, Parameter, Parameter, tuple, tuple, tuple, int), but expected one of: * (Tensor input, Tensor weight, Tensor bias, tuple of ints stride, tuple of ints padding, tuple of ints dilation, int groups) didn't match because some of the arguments have invalid types: (list, Parameter, Parameter, tuple, tuple, tuple, int) * (Tensor input, Tensor weight, Tensor bias, tuple of ints stride, str padding, tuple of ints dilation, int groups) didn't match because some of the arguments have invalid types: (list, Parameter, Parameter, tuple, tuple, tuple, int)
这是我的代码:
变换器 – 用于编码图像
transformer = transforms.Compose([ transforms.RandomHorizontalFlip(0.5), transforms.ToTensor(), ])
获取文件并转换为张量
def get_file_as_tensor(file_path): with np.load(file_path) as f: melspec_image_array = f['arr_0'] image = Image.fromarray(melspec_image_array, mode='RGB') image_tensor = transformer(image).div_(255).float() return image_tensor.clone().detach()
预测函数,错误发生在运行model([tensor])
时
def predict(tensor, model): yhat = model([tensor]) yhat = yhat.clone().detach() return yhatclass ConvBlock(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.conv1 = nn.Sequential( nn.Conv2d(in_channels, out_channels, 3, 1, 1), nn.BatchNorm2d(out_channels), nn.ReLU(), ) self.conv2 = nn.Sequential( nn.Conv2d(out_channels, out_channels, 3, 1, 1), nn.ReLU(), nn.Dropout(0.5) ) self._init_weights() def _init_weights(self): for m in self.modules(): if isinstance(m, nn.Conv2d): nn.init.kaiming_normal_(m.weight) if m.bias is not None: nn.init.zeros_(m.bias) elif isinstance(m, nn.BatchNorm2d): nn.init.constant_(m.weight, 1) nn.init.zeros_(m.bias) def forward(self, x): x = self.conv1(x) x = self.conv2(x) x = F.avg_pool2d(x, 2) return xclass Classifier(nn.Module): def __init__(self, num_classes=10): super().__init__() self.conv = nn.Sequential( ConvBlock(in_channels=3, out_channels=64), ConvBlock(in_channels=64, out_channels=128), ConvBlock(in_channels=128, out_channels=256), ConvBlock(in_channels=256, out_channels=512), ) self.fc = nn.Sequential( nn.Dropout(0.4), nn.Linear(512, 128), nn.PReLU(), #nn.BatchNorm1d(128), nn.Dropout(0.2), nn.Linear(128, num_classes), ) def forward(self, x): x = self.conv(x) x = torch.mean(x, dim=3) x, _ = torch.max(x, dim=2) x = self.fc(x) return xPATH = "models/model.pt"model = Classifier()model.load_state_dict(torch.load(PATH))model.eval()cry_file_path = "processed_np/car_file.npz"car_tensor = get_file_as_tensor(car_file_path)no_car_file_path = "raw_negative_processed/nocar-1041.npz"no_car_tensor = get_file_as_tensor(no_car_file_path)car_prediction = predict(car_tensor, model)no_cry_prediction = predict(no_car_tensor, model)print("car", car_prediction)print("no car", no_car_prediction)
代码本身已经很清楚了,但 Stack Overflow 要求更多文本。我是机器学习的新手,非常希望能得到一些帮助。
回答:
def predict(tensor, model): yhat = model(tensor.unsqueeze(0)) yhat = yhat.clone().detach() return yhat
你应该使用这个方法定义来替换你自己的定义。