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_k
target.size
确实不等于
input.size
。但是我不知道依赖关系。看起来
size
不是一个方法,而是一个属性。如果target.size!=输入。大小:。虽然这个问题出现在图书馆里确实很奇怪。可能您使用的是不兼容的依赖项版本?@tobias_k
target.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数组,因为我必须反向传播其渐变