![](/img/trans.png)
[英]ValueError: only one element tensors can be converted to Python scalars when using torch.Tensor on list of tensors
[英]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.