Python 正在尝试将png图像导入torchvision

Python 正在尝试将png图像导入torchvision,python,pytorch,Python,Pytorch,我正在尝试导入用于torch和torchvision的图像。但我收到了这个错误: TypeError: Caught TypeError in DataLoader worker process 0. Original Traceback (most recent call last): File "c:\python38\lib\site-packages\torch\utils\data\_utils\worker.py", line 178, in _worker_

我正在尝试导入用于torch和torchvision的图像。但我收到了这个错误:

TypeError: Caught TypeError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\worker.py", line 178, in _worker_loop
    data = fetcher.fetch(index)
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\fetch.py", line 47, in fetch
    return self.collate_fn(data)
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\collate.py", line 79, in default_collate
    return [default_collate(samples) for samples in transposed]
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\collate.py", line 79, in <listcomp>
    return [default_collate(samples) for samples in transposed]
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\collate.py", line 81, in default_collate
    raise TypeError(default_collate_err_msg_format.format(elem_type))
TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'PIL.Image.Image'>
ValueError                                Traceback (most recent call last)
<ipython-input-6-aa72392b67e8> in <module>
      1 for i, data in enumerate(dataloader, 0):
----> 2     Tensor = torch.tensor(data)
      3     tensor_dataset.append(Tensor.flatten)

ValueError: only one element tensors can be converted to Python scalars
num_epochs = 10
loss_values = list()

for epoch in range(1, num_epochs):
    for i, data in enumerate(train_array, 0):     
        outputs = model(data.unsqueeze(0))
        loss = criterion(outputs,data.unsqueeze(0))
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
        print('Epoch - %d, loss - %0.5f '%(epoch, loss.item()))
        loss_values.append(loss.item())
第一部分是最后一部分,但我没有成功。我尝试加载的数据来自以下位置:

我怎样才能解决这个问题

更新:

谢谢,但现在我发现这个错误:

TypeError: Caught TypeError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\worker.py", line 178, in _worker_loop
    data = fetcher.fetch(index)
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\fetch.py", line 47, in fetch
    return self.collate_fn(data)
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\collate.py", line 79, in default_collate
    return [default_collate(samples) for samples in transposed]
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\collate.py", line 79, in <listcomp>
    return [default_collate(samples) for samples in transposed]
  File "c:\python38\lib\site-packages\torch\utils\data\_utils\collate.py", line 81, in default_collate
    raise TypeError(default_collate_err_msg_format.format(elem_type))
TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'PIL.Image.Image'>
ValueError                                Traceback (most recent call last)
<ipython-input-6-aa72392b67e8> in <module>
      1 for i, data in enumerate(dataloader, 0):
----> 2     Tensor = torch.tensor(data)
      3     tensor_dataset.append(Tensor.flatten)

ValueError: only one element tensors can be converted to Python scalars
num_epochs = 10
loss_values = list()

for epoch in range(1, num_epochs):
    for i, data in enumerate(train_array, 0):     
        outputs = model(data.unsqueeze(0))
        loss = criterion(outputs,data.unsqueeze(0))
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
        print('Epoch - %d, loss - %0.5f '%(epoch, loss.item()))
        loss_values.append(loss.item())
火炬尺寸([1,16,198,660]) 火炬尺寸([1,32,97328]) 火炬尺寸([1018112])

运行时错误回溯(最近一次调用)
在里面
4对于范围内的历元(1,num_历元):
5对于i,枚举中的数据(列_数组,0):
---->6个输出=模型(数据未查询(0))
7损失=标准(输出、数据、未查询(0))
8.
c:\python38\lib\site packages\torch\nn\modules\module.py在调用中(self,*input,**kwargs)
548结果=self.\u slow\u forward(*输入,**kwargs)
549其他:
-->550结果=自转发(*输入,**kwargs)
551用于钩住自身。\u向前\u钩住.values():
552钩子结果=钩子(自身、输入、结果)
前进中(自我,x)
29打印(输出形状)
30
--->31 out=self.fc(out)
32打印(输出形状)
33
c:\python38\lib\site packages\torch\nn\modules\module.py在调用中(self,*input,**kwargs)
548结果=self.\u slow\u forward(*输入,**kwargs)
549其他:
-->550结果=自转发(*输入,**kwargs)
551用于钩住自身。\u向前\u钩住.values():
552钩子结果=钩子(自身、输入、结果)
c:\python38\lib\site packages\torch\nn\modules\linear.py in forward(self,input)
85
86 def前进档(自身,输入):
--->87返回F线性(输入、自重、自偏压)
88
89 def额外报告(自身):
c:\python38\lib\site packages\torch\nn\functional.py(输入、重量、偏差)
1608如果input.dim()==2且偏差不是无:
1609#fused op稍微快一点
->1610 ret=火炬.addmm(偏差、输入、重量.t())
1611其他:
1612输出=输入.matmul(weight.t())
运行时错误:大小不匹配,m1:[1 x 1018112],m2:[512 x 10]位于C:\w\b\windows\pytorch\aten\src\TH/generic/THTensorMath.cpp:41

我意识到如果你有m1:[a*b]和m2:[c*d],那么b和c必须是相同的值,但我不确定,调整图像大小的最佳方法是什么?

你的
transform
变量未使用,它应该传递给数据集构造函数:

`dataset = torchvision.datasets.ImageFolder('datasets', transform=transform)`

因此,
ToTensor
永远不会应用于您的数据,因此它们仍然是PIL图像,而不是张量。

请注意,我想自动将目录中的所有PNG图像作为pytorch张量加载。我以前看过这样的帖子(以及许多其他网页):

但是我最终使用了这个,我使用的是
图像。在目录中的所有图像上逐个打开
,而不是
火炬数据加载器

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

image = Image.open("datasets/image_02/data/my_image.png").convert('RGB')

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import transforms as tf

transforms = tf.Compose([tf.Resize(400), 
                        tf.ToTensor()])

img_tensor = transforms(image)

我不确定我是否理解这里的意思。此代码与您的问题完全不同,您实际使用的是哪一个?为什么您选择不使用pytorch数据集/数据加载器并最终使用此代码?最初我尝试使用torch.utils.data.DataLoader,但由于我在问题中提到的错误,无法使其工作,因此我选择使用Image.open。