我尝试在没有CUDA的情况下运行下面的代码来解决图像分割问题,因为我没有GPU。我已经使用pytorch在CPU上训练了我的模型,但在预测级别上,我得到了
AttributeError: 'NoneType' object has no attribute 'size'
下面是代码:
idx = 20
model.load_state_dict(torch.load('/content/best_model.pt'))
image, mask = validset[idx]
image = image.unsqueeze_(0)
print(type(image))
# logits_mask = model(image.to(DEVICE).unsqueeze(0)) # (c,h,w) -> (1,c,h,w)
logits_mask = model(image) # (c,h,w) py-> (1,c,h,w)
输出中产生的错误位于第8行:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-56-edf3f0fae49c> in <module>
6 print(type(image))
7 # logits_mask = model(image.to(DEVICE).unsqueeze(0)) # (c,h,w) -> (1,c,h,w)
----> 8 logits_mask = model(image) # (c,h,w) py-> (1,c,h,w)
9
10 pred_mask = torch.sigmoid(logits_mask)
3 frames
/usr/local/lib/python3.7/dist-packages/segmentation_models_pytorch/losses/dice.py in forward(self, y_pred, y_true)
57 def forward(self, y_pred: torch.Tensor, y_true: torch.Tensor) -> torch.Tensor:
58
---> 59 assert y_true.size(0) == y_pred.size(0)
60
61 if self.from_logits:
AttributeError: 'NoneType' object has no attribute 'size'
3条答案
按热度按时间s71maibg1#
assert y_true.size(0) == y_pred.size(0)
错误表示y_true
或y_pred
为None,因此您可以尝试分别检查image, model(image), & mask
的类型。IMO,这可能是根本原因:
image = image.unsqueeze_(0)
unsqueze_
是一个原地运算符,这意味着它将不返回任何内容,并原地更改Tensorimage
。cngwdvgl2#
print(type(image))
的输出是什么?由于
model(image)
的错误为nonetype,因此推测问题与模型加载有关,或者在以下行中对图像进行索引时出现问题:EDIT:print(image.size())和print(image)的输出是什么?
t.大小()
cedebl8k3#
您需要将掩码作为第二个参数传递以避免NoneType.
# logits_mask = model(image.to(DEVICE).unsqueeze(0), mask(DEVICE).unsqueeze(0)) # (c,h,w) -> (1,c,h,w) #or# logits_mask = model(image, mask) # (c,h,w) py-> (1,c,h,w)