繁体   English   中英

训练回归量时ValueError:只有一个元素张量可以转换为Python Scarlars

[英]When training regressor ValueError: only one element tensors can be converted to Python Scarlars

我是 pytorch 的新手。 我想要做的是将图像转换为 numpy 数组作为回归 model 的输入。 所以我将图像转移到 numpy 数组中,然后转移到张量中。 哪个是变量 x_train。 但后来我收到如下错误:

x_train = torch.FloatTensor(x_train)
ValueError: only one element tensors can be converted to Python scalars

下面是训练回归器的代码。

def train_scalereg(network):

   #0) prepare data
   f = open('C:/workspace/darknet/data/scale_train.txt','r')

   path = 'C:/workspace/darknet/data/MSCOCO/val2017/class'
   os.chdir(path)
   files = os.listdir(path)


   print("transforming image data...")
   x_train =[]
   for image_name in files : 
       img = Image.open(image_name)

       data = np.array(img)
       imgToTensorTransformer = transforms.ToTensor()
       tensorFromImg = imgToTensorTransformer(data)
       x_train.append(tensorFromImg)


   x_train = torch.FloatTensor(x_train)
   y_train = genfromtxt('C:/workspace/darknet/data/scale_train.txt', delimiter ='\n')#scale

   n_features = 5000


   #1) model
   input_size = n_features
   output_size = 1 
   model = nn.Linear(input_size, output_size)

   #2) loss and optimizer 
   learning_rate = 0.001 
   criterion = nn.MSELoss()
   optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)

   #3) training loop 
   num_epochs = 2 
   print("training model...")
   for epoch in range(num_epochs): 
       #forward pass and loss 
       y_predicted = model(x_train)
       loss = criterion(y_predicted, y_train)

       #backward pass
       loss.backward()

       #update 
       optimizer.step()

       optimizer.zero_grad()

       if (epoch+1)%10 == 0 : 
          print(f'epoch: {epoch+1} , loss = {loss.item():.4f}') 

   #plot 
   y_predicted = model(x_train).detach().numpy()
   plt.plot(x_train, y_train, "ro")
   plt.plot(x_train, y_predicted,"b")
   plt.show()


   return model

请帮我。 或者,如果有其他方法可以用输入图像训练回归器,如果你能给我建议,我会很高兴。

torch.FloatTensor只有在张量列表只包含一个元素的情况下才能处理它们的转换。 例如:

l = [torch.tensor(3.)] * 3  # creates a list with three one-element tensors

torch.FloatTensor(l)  # returns tensor([3., 3., 3.])

在您的情况下,您的张量不是单元素张量,因此您必须使用不同的方法,例如torch.stack

l = [torch.tensor([3., 4])] * 3

torch.stack(l)  # returns tensor([[3., 4.], [3., 4.], [3., 4.]])

为了使它起作用,请确保列表中的张量具有相同的大小,例如使用transforms.Resize

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM