X = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=torch.float32)
y = torch.tensor([0, 1, 1, 0], dtype=torch.float32)
dataset = torch.utils.data.TensorDataset(X, y)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=4, shuffle=True)
model = torch.nn.Sequential(
torch.nn.Linear(in_features=2, out_features=2), # hidden layer with 2 neurons
torch.nn.ReLU(), # ReLU activation
torch.nn.Linear(in_features=2, out_features=1), # output layer with 1 neuron
torch.nn.Sigmoid() # sigmoid activation for binary classification
)
criterion = torch.nn.BCELoss() # binary cross-entropy loss (NLL for binary classification)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
num_epochs = 1000
for epoch in range(num_epochs):
for X_batch, y_batch in dataloader:
optimizer.zero_grad()
y_pred = model(X_batch).squeeze()
loss = criterion(y_pred, y_batch)
loss.backward()
optimizer.step()
model(X).squeeze() # squeeze() is similar to drop=TRUE in R to remove extra dimensions