I am trying to solve a problem that I found in deep learning with pytorch course on Udacity: “Predict whether a student will get selected or rejected by the university”.
But i am getting the training loss ~0.2000 every time. The loss is not falling below this value. Could you please go through the code to give me feedback?
import pandas as pd
import numpy as np
data = pd.read_csv('student_data.csv')
import matplotlib.pyplot as plt
def plot_points(data):
X = np.array(data[['gre', 'gpa']])
Y = np.array(data['admit'])
admitted = X[np.argwhere(Y==1)]
rejected = X[np.argwhere(Y==0)]
plt.scatter([s[0][0] for s in rejected], [s[0][1] for s in rejected], color='red')
plt.scatter([s[0][0] for s in admitted], [s[0][1] for s in admitted], color='cyan')
plt.xlabel('Test (GRE)')
plt.ylabel('Grades (GPA)')
plot_points(data)
data = data.drop('rank', axis=1)
# Normalizing the values
data['gre'] /= max(data['gre'])
data['gpa'] /= max(data['gpa'])
# splitting in train and test set
sample = np.random.choice(data.index, size=int(len(data)*0.9), replace=False)
train_data, test_data = data.iloc[sample], data.drop(sample)
train_features = train_data.drop('admit', axis=1)
train_labels = train_data['admit']
import torch
from torch import nn, optim
import torch.nn.functional as F
# converting dataFrames into tensors
input_tensor = torch.from_numpy(train_features.values).type(torch.FloatTensor)
label_tensor = torch.from_numpy(train_labels.values).type(torch.FloatTensor)
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(2, 4)
self.fc2 = nn.Linear(4, 1)
def forward(self, x):
x = F.relu(self.fc1(x))
x = (self.fc2(x))
return x
model = Net()
criteron = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
losses=[]
EPOCHS = 501
for e in range(EPOCHS):
train_loss = 0
output = model(input_tensor)
loss = criteron(output, label_tensor.view(360, 1))
train_loss += loss.item()
losses.append(train_loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if e%100==0:
print('epoch {}: Training loss: {:.4f}'.format(e+1, train_loss))
plt.plot(losses)
here is how the data looks like.