Greetings,
I’m currently trying to train the following model:
class IrisModel(Module):
def __init__(self) -> None:
super(IrisModel, self).__init__()
self.inLayer = nn.Linear(in_features=4, out_features=5)
self.inLayerReLU = nn.ReLU()
self.midLayer = nn.Linear(in_features=5, out_features=24, bias=True)
self.midLayerReLU = nn.ReLU()
self.outLayer = nn.Linear(in_features=24, out_features=3, bias=True)
self.outLayerSoftMax = nn.Softmax()
def forward(self, x):
out = self.inLayer(x)
out = self.inLayerReLU(out)
out = self.midLayer(out)
out = self.midLayerReLU(out)
out = self.outLayer(out)
out = self.outLayerSoftMax(out)
return out
My training function is the following:
def train(model, train_in, train_out, loss_fn):
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
model.train()
iter = 1
for x_in, y_out in zip(train_in, train_out):
X = torch.LongTensor(x_in.tolist())
y = torch.LongTensor(y_out.tolist())
print(f"{X}, {X.type()}")
print(f"{y}, {y.type()}")
# compute prediction error
pred = model(X)
loss = loss_fn(pred, y)
# back propagation
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"Loss: {loss.item():>7f}")
iter += 1
The training data is loaded as follows:
def load_data():
iris_label_array = ["Iris-setosa","Iris-versicolor","Iris-virginica"]
#Load data
iris_data = np.loadtxt("./iris.csv", delimiter=",", dtype="str",skiprows=1)
#Pre-process data
for label in iris_label_array :
label_index = iris_label_array.index(label)
# associate a value to each type of iris
iris_data[np.where(iris_data[:,4] == label), 4] = label_index
iris_data = iris_data.astype("float32")
# convert data to int64 by multiplying by 10
iris_data[:, 0:3] = iris_data[:, 0:3]*10
iris_data = iris_data.astype("int64")
return iris_data
# Splitting Data for later evaluation
# 80% train and 20% Evaluation
data = load_data()
input_data = data[:,0:4]
output_data = data[:,4].reshape(-1, 1)
output_data = to_categorical(output_data) # from tensorflow.keras.utils import to_categorical
train_in, test_in, train_out, test_out = train_test_split(input_data, output_data, test_size=0.20)
Traceback (most recent call last):
File "IrisBrevitas.py", line 125, in <module>
train(iris_model, train_in, train_out, device, categorical_crossentropy)
File "IrisBrevitas.py", line 86, in train
pred = model(X)
File "/home/jacopo/.local/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1102, in _call_impl
return forward_call(*input, **kwargs)
File "IrisBrevitas.py", line 46, in forward
out = self.inLayer(x)
File "/home/jacopo/.local/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1102, in _call_impl
return forward_call(*input, **kwargs)
File "/home/jacopo/.local/lib/python3.8/site-packages/torch/nn/modules/linear.py", line 103, in forward
return F.linear(input, self.weight, self.bias)
File "/home/jacopo/.local/lib/python3.8/site-packages/torch/nn/functional.py", line 1848, in linear
return torch._C._nn.linear(input, weight, bias)
RuntimeError: expected scalar type Long but found Float
This is weird to me as when checking the type of X
and y
they both come out as torch.LongTensor
. I’m not exactly sure what I’m doing wrong here, any tip is appreciated.
EDIT: this is my setup:
OS: Ubuntu 20.04.4 LTS (running within WSL2 in Windows 10)
Python version: 3.8.10
PyTorch version: 1.10.1+cu102