es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cuando se produce un error de entrenamiento del regressor ValueError: solo se pueden convertir a escalares de Python tensores con un solo elemento.

Soy nuevo en pytorch. Lo que quiero hacer es convertir una imagen en un arreglo numpy como entrada para un modelo de regresión. Por lo tanto, convertí las imágenes en arreglos numpy y luego en tensores. El tensor resultante es la variable x_train.
Pero luego obtuve un error como se muestra a continuación:

x_train = torch.FloatTensor(x_train)
ValueError: solo se pueden convertir tensores con un solo elemento a escalares de Python

A continuación se muestra el código para entrenar el regresor.

def train_scalereg(network):

#0) preparar los datos
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(“transformando datos de imagen…”)
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’) #escala

n_features = 5000

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

#2) pérdida y optimizador
learning_rate = 0.001
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)

#3) bucle de entrenamiento
num_epochs = 2
print(“entrenando modelo…”)
for epoch in range(num_epochs):
#paso hacia adelante y pérdida
y_predicted = model(x_train)
loss = criterion(y_predicted, y_train)

   #paso hacia atrás
   loss.backward()

   #actualizar
   optimizer.step()

   optimizer.zero_grad()

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

#graficar
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

Por favor, ayúdame.
O si hay otra manera de entrenar un regresor con una imagen de entrada, sería un placer si me dieras un consejo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “ValueError: solo los tensores de un solo elemento pueden convertirse en escalares de Python” indica que el constructor torch.FloatTensor espera un objeto similar a un array como entrada, pero la forma del tensor de entrada es incorrecta.

    En tu código, x_train se está construyendo como una lista de tensores PyTorch utilizando transforms.ToTensor(). Cuando pasas x_train a torch.FloatTensor(), se espera un solo tensor con múltiples elementos, pero en cambio recibe una lista de tensores.

    Para solucionar este error, puedes utilizar el método torch.stack() de PyTorch para convertir una lista de tensores de igual tamaño en un solo tensor. Reemplaza la línea x_train = torch.FloatTensor(x_train) con x_train = torch.stack(x_train):

    x_train = torch.stack(x_train)
    

    Esto convertirá x_train de una lista de tensores a un solo tensor de PyTorch, permitiéndote pasarlo al método forward de tu regresor.

    Alternativamente, podrías utilizar np.concatenate() para concatenar los tensores de la lista antes de convertirlos en un tensor de PyTorch:

    x_train = np.concatenate(x_train, axis=0)
    x_train = torch.FloatTensor(x_train)
    

    Esto también debería convertir la lista de tensores en un solo tensor con la forma correcta.

    Finalmente, ten en cuenta que la regresión en datos de imagen generalmente se realiza aplanando la imagen en un vector antes de pasarlo al regresor. Puedes hacer esto utilizando np.ravel() o np.flatten() antes de convertirlo en un tensor de PyTorch.

Comments are closed.