Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何修复“;类型错误:';张量';对象不可调用”;Pytork中的错误?_Image Processing_Pytorch - Fatal编程技术网

Image processing 如何修复“;类型错误:';张量';对象不可调用”;Pytork中的错误?

Image processing 如何修复“;类型错误:';张量';对象不可调用”;Pytork中的错误?,image-processing,pytorch,Image Processing,Pytorch,我试图计算一个线性函数,一个图像的像素,然后是log softmax(用于分类任务)。我不知道如何做到这一点而不出错。以下是相关代码: ... torch.nn.functional.nll_loss(output, target) # error happens here ... def __init__(self): super(NetLin, self).__init__() self.in_out = torch.nn.Linear(28, 2) def forwar

我试图计算一个线性函数,一个图像的像素,然后是log softmax(用于分类任务)。我不知道如何做到这一点而不出错。以下是相关代码:

...
torch.nn.functional.nll_loss(output, target) # error happens here
...

def __init__(self):
    super(NetLin, self).__init__()
    self.in_out = torch.nn.Linear(28, 2)

def forward(self, input):
    out_sum = self.in_out(input)
    output = torch.nn.LogSoftmax(out_sum)
    return output
我得到的完整错误信息是:

Traceback (most recent call last):
  File "copy.py", line 98, in <module>
    main()
  File "copy.py", line 94, in main
    train(args, net, device, train_loader, optimizer, epoch)
  File "copy.py", line 21, in train
    loss = torch.nn.functional.nll_loss(output, target)
  File "/usr/local/lib/python3.7/site-packages/torch/nn/functional.py", line 2107, in nll_loss
    dim = input.dim()
TypeError: 'Tensor' object is not callable
现在我的错误消息是:

Traceback (most recent call last):
  File "copy.py", line 102, in <module>
    main()
  File "copy.py", line 98, in main
    train(args, net, device, train_loader, optimizer, epoch)
  File "copy.py", line 24, in train
    output = loss(model(input), target)
  File "/usr/local/lib/python3.7/site-packages/torch/nn/modules/module.py", line 550, in __call__
    result = self.forward(*input, **kwargs)
  File "/Users/.../copy.py", line 15, in forward
    input = input.view(-1, 28 * 28)
AttributeError: 'builtin_function_or_method' object has no attribute 'view'
回溯(最近一次呼叫最后一次):
文件“copy.py”,第102行,在
main()
文件“copy.py”,第98行,主
列车(参数、网络、设备、列车装载机、优化器、epoch)
列车中第24行的文件“copy.py”
输出=损失(模型(输入)、目标)
文件“/usr/local/lib/python3.7/site packages/torch/nn/modules/module.py”,第550行,在调用中__
结果=自我转发(*输入,**kwargs)
文件“/Users/../copy.py”,第15行,向前
input=input.view(-1,28*28)
AttributeError:“内置函数”或“方法”对象没有属性“视图”

正如您可以看到的,
数据
目标
是从文件中读取的(它们实际上来自KMNIST),因此我无法精确控制它们的格式,但我知道图像大小都是[1,28,28],即28*28灰度图像。此外,批量大小为64以防出现问题。

您是否记得使用
model.train()
在列车循环中将模型设置为训练模式?另外,
nll\u loss
接受2个张量,但是第一个条目(输入张量)在通过模型之前需要有
requires\u grad=True
,这也是为什么需要在训练之前设置
model.train()

所以你会有这样的想法:

model = NetLin()
model.train()
loss = nn.NLLLoss()
input = torch.randn(7, 4, requires_grad=True) # your input image (tensor)
target = torch.tensor([1, 0]) # image label for image belonging to first class
output = loss(model(input), target)
我也有点担心你的
self.in\u out=torch.nn.Linear(28,2)
。这意味着你的线性层需要28个特征,这意味着你的输入图像要么是7x4,要么是14x2,要么是28x1,这在我看来是不对的?您不是在使用大小为28x28的图像(在本文中是非常典型的大小)吗?在这种情况下,您的线性层将被修改为
self.In\u out=torch.nn.linear(28*28,2)
,您的向前传球必须修改如下:

def forward(self, input):
    input = input.view(-1, 28*28)
    out_sum = self.in_out(input)
    output = torch.nn.LogSoftmax(out_sum)
    return output

您是否记得使用
model.train()
,在列车循环中将模型设置为训练模式?另外,
nll\u loss
接受2个张量,但是第一个条目(输入张量)在通过模型之前需要有
requires\u grad=True
,这也是为什么需要在训练之前设置
model.train()

所以你会有这样的想法:

model = NetLin()
model.train()
loss = nn.NLLLoss()
input = torch.randn(7, 4, requires_grad=True) # your input image (tensor)
target = torch.tensor([1, 0]) # image label for image belonging to first class
output = loss(model(input), target)
我也有点担心你的
self.in\u out=torch.nn.Linear(28,2)
。这意味着你的线性层需要28个特征,这意味着你的输入图像要么是7x4,要么是14x2,要么是28x1,这在我看来是不对的?您不是在使用大小为28x28的图像(在本文中是非常典型的大小)吗?在这种情况下,您的线性层将被修改为
self.In\u out=torch.nn.linear(28*28,2)
,您的向前传球必须修改如下:

def forward(self, input):
    input = input.view(-1, 28*28)
    out_sum = self.in_out(input)
    output = torch.nn.LogSoftmax(out_sum)
    return output

什么是
output
output.dim
?请不要破坏您的问题。您可以在下面发布一个答案,描述问题的原因和解决方案。什么是
output
output.dim
?请不要破坏您的问题。您可以在下面发布一个答案,描述问题的原因和解决方案。谢谢Emile。我的火车循环中有
model.train()
,你说得对,图像分辨率是28*28。我已经尽可能地按照你的建议去做了,我已经添加了我的代码现在看起来像什么,以及我在主帖子上看到的错误消息。没关系,我认为我已经修复了它,非常感谢!谢谢你,埃米尔。我的火车循环中有
model.train()
,你说得对,图像分辨率是28*28。我已经尽可能地按照你的建议去做了,我已经添加了我的代码现在看起来像什么,以及我在主帖子上看到的错误消息。没关系,我认为我已经修复了它,非常感谢!