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.
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 utilizandotransforms.ToTensor()
. Cuando pasasx_train
atorch.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íneax_train = torch.FloatTensor(x_train)
conx_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: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()
onp.flatten()
antes de convertirlo en un tensor de PyTorch.