programing

RuntimeError "스칼라 유형 Float의 예상 개체이지만 인수에 대해 스칼라 유형 Double을 받았습니다"를 수정하는 방법은 무엇입니까?

javajsp 2023. 7. 28. 21:48

RuntimeError "스칼라 유형 Float의 예상 개체이지만 인수에 대해 스칼라 유형 Double을 받았습니다"를 수정하는 방법은 무엇입니까?

PyTorch를 통해 분류기를 훈련하려고 합니다.그러나 모델에게 교육 데이터를 제공할 때 교육에 문제가 있습니다.이 오류가 발생했습니다.y_pred = model(X_trainTensor):

RuntimeError: 스칼라 유형 Float의 개체가 필요하지만 #4 'mat1' 인수에 대해 스칼라 유형 Double을 받았습니다.

내 코드의 주요 부분은 다음과 같습니다.

# Hyper-parameters 
D_in = 47  # there are 47 parameters I investigate
H = 33
D_out = 2  # output should be either 1 or 0
# Format and load the data
y = np.array( df['target'] )
X = np.array( df.drop(columns = ['target'], axis = 1) )
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.8)  # split training/test data

X_trainTensor = torch.from_numpy(X_train) # convert to tensors
y_trainTensor = torch.from_numpy(y_train)
X_testTensor = torch.from_numpy(X_test)
y_testTensor = torch.from_numpy(y_test)
# Define the model
model = torch.nn.Sequential(
    torch.nn.Linear(D_in, H),
    torch.nn.ReLU(),
    torch.nn.Linear(H, D_out),
    nn.LogSoftmax(dim = 1)
)
# Define the loss function
loss_fn = torch.nn.NLLLoss() 
for i in range(50):
    y_pred = model(X_trainTensor)
    loss = loss_fn(y_pred, y_trainTensor)
    model.zero_grad()
    loss.backward()
    with torch.no_grad():       
        for param in model.parameters():
            param -= learning_rate * param.grad

github 이슈에서 나온 참조입니다.

오류가 다음과 같은 경우RuntimeError: Expected object of scalar type Float but got scalar type Double for argument #4 'mat1'당신은 그것을 사용해야 할 것입니다..float()라고 되어 있기 때문에 기능Expected object of scalar type Float.

따라서 솔루션이 변화하고 있습니다.y_pred = model(X_trainTensor)로.y_pred = model(X_trainTensor.float()).

마찬가지로, 다음과 같은 오류가 발생할 때loss = loss_fn(y_pred, y_trainTensor)니가 필요한y_trainTensor.long()오류 메시지가 표시되므로Expected object of scalar type Long.

당신은 또한 할 수 있습니다.model.double()@Paddy가 제안한 것처럼.

로 변환하기 전에Tensor이것을 먹어보세요.

X_train = X_train.astype(np.float32)

이 문제는 입력 데이터 유형을 Double로 설정하여 해결할 수 있습니다.torch.float32

당신의 데이터 유형이 다음과 같아서 문제가 발생했으면 합니다.torch.float64.

다른 답변 중 하나에서 설명한 것처럼 데이터를 설정하는 동안 이러한 상황을 방지하거나 모델 유형을 데이터와 동일하게 만들 수 있습니다. 즉, float64 또는 float32를 사용합니다.

디버그의 경우 obj.dtype을 인쇄하고 일관성을 확인합니다.

그렇게 하죠.

df['target'] = df['target'].astype(np.float32)

x개의 기능에 대해서도

이 문제는 잘못된 손실 함수를 선택한 경우에도 발생할 수 있습니다.예를 들어 회귀 문제가 있지만 교차 엔트로피 손실을 사용하려고 하는 경우입니다.그러면 MSE에서 손실 함수를 변경하여 해결됩니다.

target = target을 사용합니다.float () # target은 오류의 이름입니다.

파이토치가 처음입니다.어떤 이유로, 전화를 하는 것.torch.set_default_dtype()필요한 데이터 유형을 사용하는 것이 Google Colab에서 제게 도움이 되었습니다.network.double()/network.float()그리고.tensor.double()/tensor.float()어떤 이유에서인지 아무런 효과가 없었습니다.

다음 예제를 사용해 보십시오.

from sentence_transformers import SentenceTransformer, util
import numpy as np
import torch

a = np.array([0, 1,2])
b = [[0, 1,2], [4, 5,6], [7,8,9]]

bb = np.zeros((3,3))
for i in range(0, len(b)):
    bb[i,:] = np.array(b[i])


a = torch.from_numpy(a)
b = torch.from_numpy(bb)

a= a.float()
b = b.float()

cosine_scores = util.pytorch_cos_sim(b, a)
print(cosine_scores)

언급URL : https://stackoverflow.com/questions/56741087/how-to-fix-runtimeerror-expected-object-of-scalar-type-float-but-got-scalar-typ