Я довольно новичок в pytorch, поэтому я не совсем уверен, является ли это ошибкой или просто ошибкой на моем конце.
Я пытаюсь построить простой модуль LogisticRegression на make_classification
набор данных в sklearn, но по какой-то причине я продолжаю получать это.
RuntimeError: Ожидаемый объект скалярного типа Double, но получил скалярный тип Float для аргумента # 2 'mat2'
Я пытался преобразовать обе мои переменные X и y в double
, но, похоже, он почему-то думает, что это число с плавающей точкой.
Вот мой код:
X, y = make_classification(n_samples=60000,n_features=10, n_redundant=0, n_informative=2)
X_train,y_train, X_test, y_test = train_test_split(X, y, stratify=y, random_state=42)
X_train = Variable(torch.from_numpy(X_train)).double()
y_train = Variable(torch.from_numpy(y_train)).double()
X_test = Variable(torch.from_numpy(X_test)).double()
y_test = Variable(torch.from_numpy(y_test)).double()
Вот сеть
input_dim = 40000
output_dim = 2
criterion = nn.CrossEntropyLoss()
learning_rate = 0.001
batch_size = 100
n_iters = 3000
num_epochs = int(n_iters / (len(X_train) / batch_size))
model = SingleLayeredNetwork(input_dim, output_dim)
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
class SingleLayeredNetwork(nn.Module):
def __init__(self, input_dimension, output_dimension):
super(SingleLayeredNetwork, self).__init__()
self.layer = nn.Linear(input_dimension, output_dimension)
def forward(self, x):
out = self.layer(x)
return out
Вот цикл обучения
iter = 0
for epoch in range(num_epochs):
for train, test in zip(X_train, y_train):
train = train.double()
print(train)
print(train.dtype)
print(torch.typename(train))
optimizer.zero_grad()
outputs = model(train)
loss = criterion(outputs, test)
loss.backward()
# Updating parameters
optimizer.step()
iter += 1
if iter % 500 == 0:
# Calculate Accuracy
correct = 0
total = 0
# Iterate through test dataset
for tra, tes in zip(X_test, y_test):
# Load images to a Torch Variable
tra = tra
# Forward pass only to get logits/output
outputs = model(tra)
# Get predictions from the maximum value
# 100 x 1
_, predicted = torch.max(train, 1)
# Total number of labels
total += labels.size(0)
# Total correct predictions
correct += (predicted == test).sum()
accuracy = 100 * correct.item() / total
# Print Loss
print('Iteration: {}. Loss: {}. Accuracy: {}'.format(iter, loss.item(), accuracy))
Вот ошибка, которую я продолжаю получать
RuntimeError Traceback (последний вызов последнего) в 10 optimizer.zero_grad () 11 ---> 12 выходов = модель (поезд) 13 потерь = критерий (выходы, тест) 14
~ / miniconda3 / envs / mlbook / lib / python3.6 /site-packages / torch / nn / modules / module.py в call (self, * input, ** kwargs) 487 result = self._slow_forward (* input, ** kwargs) 488 else: -> 489 result = self.forward (* input, ** kwargs) 490 для хука в self._forward_hooks.values (): 491 hook_result = хук (self, input,результат)
вперёд (self, x) 5 6 def вперёд (self, x): ----> 7 out = self.layer (x) 8 return out
~ /miniconda3 / envs / mlbook / lib / python3.6 / site-packages / torch / nn / modules / module.py в вызов (self, * input, ** kwargs) 487 result = self._slow_forward (* input, ** kwargs) 488 else: -> 489 result = self.forward (* input, ** kwargs) 490 для ловли в self._forward_hooks.values (): 491 hook_result = hook (self, input, result)
~ / miniconda3 / envs / mlbook / lib / python3.6 / site-packages / torch / nn / modules / linear.py вперед (self, input) 65 @weak_script_method 66 def вперед (self, input): ---> 67 return F.linear (входные данные, self.weight, self.bias) 68 69 def extra_repr (self):
~ / miniconda3 / envs / mlbook / lib / python3.6 /Сайт-пакеты / torch / nn / functions.py в линейном (вход, вес, смещение) 1352 ret = torch.addmm (тorch.jit._unwrap_optional (bias), input, weight.t ())
1353 else: -> 1354 output = input.matmul (weight.t ()) 1355, если смещение отсутствует None: 1356 output + = torch.jit._unwrap_optional (bias)
RuntimeError: Ожидаемый объект скалярного типа Double, но получил скалярный тип Float для аргумента # 2 'mat2'
Чего мне не хватает?