Python 虽然形状相同,但类型错误:如果不是(target.size()==input.size()):';int';对象不可调用
这是我收到的错误消息。在第一行中,我输出了Python 虽然形状相同,但类型错误:如果不是(target.size()==input.size()):';int';对象不可调用,python,pytorch,Python,Pytorch,这是我收到的错误消息。在第一行中,我输出了predicted和target的形状。根据我的理解,错误来自于那些形状不一样,但在这里它们显然是一样的 torch.Size([6890, 3]) torch.Size([6890, 3]) Traceback (most recent call last): File "train.py", line 251, in <module> main() File "train.py", line 230, in main
predicted
和target
的形状。根据我的理解,错误来自于那些形状不一样,但在这里它们显然是一样的
torch.Size([6890, 3]) torch.Size([6890, 3])
Traceback (most recent call last):
File "train.py", line 251, in <module>
main()
File "train.py", line 230, in main
train(net, training_dataset, targets, device, criterion, optimizer, epoch, args.epochs)
File "train.py", line 101, in train
loss = criterion(predicted, target.detach().cpu().numpy())
File "/home/hb119056/.local/lib/python3.6/site-packages/torch/nn/modules/module.py", line 493, in __call__
result = self.forward(*input, **kwargs)
File "/home/hb119056/.local/lib/python3.6/site-packages/torch/nn/modules/loss.py", line 443, in forward
return F.mse_loss(input, target, reduction=self.reduction)
File "/home/hb119056/.local/lib/python3.6/site-packages/torch/nn/functional.py", line 2244, in mse_loss
if not (target.size() == input.size()):
TypeError: 'int' object is not callable
条件
是nn.MSELoss()
它可能意味着当具有相同名称的属性可用时,您正试图调用一个方法。如果这确实是问题所在,那么解决办法很容易。只需将方法调用更改为属性访问
如果按以下方式进行比较:
compare = (X.method() == Y.method())
将其更改为:
compare = (X.method == Y.method)
如果这不能回答您的问题,请分享您用于比较形状的代码。这可能意味着您试图在具有相同名称的属性可用时调用方法。如果这确实是问题所在,那么解决办法很容易。只需将方法调用更改为属性访问 如果按以下方式进行比较:
compare = (X.method() == Y.method())
将其更改为:
compare = (X.method == Y.method)
如果这不能回答您的问题,请分享您用于比较形状的代码。这是因为您的
目标
是一个numpy
对象
File "train.py", line 101, in train:
target.detach().cpu().numpy()
在代码中,将target
类型更改为numpy
尝试改变
loss = criterion(predicted, target.detach().cpu().numpy()) ## error occurs here
到
例如:
In [6]: b = np.ones(3)
In [7]: b.size
Out[7]: 3
In [8]: b.size()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-365705555409> in <module>
----> 1 b.size()
TypeError: 'int' object is not callable
[6]中的:b=np.one(3)
In[7]:b.尺寸
Out[7]:3
在[8]:b.大小()
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
---->1 b.尺寸()
TypeError:“int”对象不可调用
这是因为您的目标
是一个numpy
对象
File "train.py", line 101, in train:
target.detach().cpu().numpy()
在代码中,将target
类型更改为numpy
尝试改变
loss = criterion(predicted, target.detach().cpu().numpy()) ## error occurs here
到
例如:
In [6]: b = np.ones(3)
In [7]: b.size
Out[7]: 3
In [8]: b.size()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-365705555409> in <module>
----> 1 b.size()
TypeError: 'int' object is not callable
[6]中的:b=np.one(3)
In[7]:b.尺寸
Out[7]:3
在[8]:b.大小()
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
---->1 b.尺寸()
TypeError:“int”对象不可调用
有点晚了,但可能会帮助其他人。为我自己解决了同样的问题
正如Alpha在回答中所说,我们不能为numpy数组调用.size()
。
但是我们可以调用.size()
作为张量。
因此,我们需要把目标变成张量。您可以这样做:
target = torch.from_numpy(target)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
target = target.to(device)
我正在使用GPU,所以我还需要将我的目标发送到GPU。您可以这样做:
target = torch.from_numpy(target)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
target = target.to(device)
然后损失函数必须能很好地工作。有点晚了,但它可能会帮助其他人。为我自己解决了同样的问题 正如Alpha在回答中所说,我们不能为numpy数组调用
.size()
。
但是我们可以调用.size()
作为张量。
因此,我们需要把目标变成张量。您可以这样做:
target = torch.from_numpy(target)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
target = target.to(device)
我正在使用GPU,所以我还需要将我的目标发送到GPU。您可以这样做:
target = torch.from_numpy(target)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
target = target.to(device)
然后损失函数必须完美工作。看起来
size
不是一个方法,而是一个属性。如果target.size!=输入。大小:。虽然这个问题出现在图书馆里确实很奇怪。可能您使用的是不兼容的依赖项版本?@tobias_ktarget.size
确实不等于input.size
。但是我不知道依赖关系。看起来size
不是一个方法,而是一个属性。如果target.size!=输入。大小:。虽然这个问题出现在图书馆里确实很奇怪。可能您使用的是不兼容的依赖项版本?@tobias_ktarget.size
确实不等于input.size
。不过我不知道依赖关系。谢谢,但我看不出我的代码中发生了这种情况。所以我只想附加这段代码。你能确保预测变量和目标变量都是numpy数组吗?计算预测时,只需使用np.asarray()。如果不起作用,请尝试将两个数组重塑为相同的形状。预测的
不能是一个numpy数组,因为我必须反向传播其渐变。然后将预测的和目标的形状重塑为您期望的形状。请再试一次loss=criteria(predicted.reformate(6890,3),target.detach().cpu().numpy().reformate(6890,3))
谢谢,但我看不出这是我的代码中发生的事情。所以我只想附加这段代码。你能确保预测变量和目标变量都是numpy数组吗?计算预测时,只需使用np.asarray()。如果不起作用,请尝试将两个数组重塑为相同的形状。predicted
不能是numpy数组,因为我必须反向传播其渐变