【问题标题】:When training regressor ValueError: only one element tensors can be converted to Python Scarlars训练回归量时ValueError:只有一个元素张量可以转换为Python Scarlars
【发布时间】:2022-01-12 17:27:47
【问题描述】:

我是 pytorch 的新手。我想要做的是将图像转换为 numpy 数组作为回归模型的输入。所以我将图像转换为 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

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

【问题讨论】:

    标签: python pytorch regression


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 2021-03-16
      • 1970-01-01
      • 2019-02-04
      • 2021-07-23
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多