I am working on clothing detection and instead of k-nearest neighbours I decided to learn how neural networks work. So I created very simple network and started to train it based on a tutorial: https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html
At first it looked very primising. The loss was decreasing in a satisfying rate, but it stopped as quickly as it started.
As I am at beginner in neural networks I don’t know what to do to imporve my neural network now.
Here is the code:
import torchvision import torchvision.transforms as transforms import torch from torch import nn import torch.optim as optim import pickle as pkl if __name__ == '__main__': device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") data = pkl.load(open('train.pkl', mode='rb')) traindata = data labels = data tensor_data = torch.stack([torch.Tensor(i) for i in traindata]) tensor_labels = torch.from_numpy(labels) dataset = torch.utils.data.TensorDataset(tensor_data, tensor_labels) trainloader = torch.utils.data.DataLoader(dataset, batch_size=16, shuffle=True, num_workers=2) testloader = torch.utils.data.DataLoader(dataset, batch_size=16, shuffle=False, num_workers=2) torch.multiprocessing.freeze_support() class SimpleNetwork(nn.Module): def __init__(self): super(SimpleNetwork, self).__init__() self.fc1 = nn.Linear(1296, 10) self.sig = nn.Sigmoid() self.params = list(self.fc1.parameters()) def forward(self, x): x = self.fc1(x) x = self.sig(x) return x def get_params(self): w = self.params return w net = SimpleNetwork() #net.to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9) print('testing started') for epoch in range(20): net.load_state_dict(torch.load('parameters.pkl')) net.eval() running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data #inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() #print(torch.sum(net.fc1.weight.data)) running_loss += loss.item() if i % 2000 == 1999: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 data = net.fc1.weight.data.numpy(), net.fc1.bias.data.numpy() with open('weights.pkl', 'wb') as f: pkl.dump(data, f) torch.save(net.state_dict(), 'parameters.pkl') print('finished testing')
My data (train.pkl) is a file containing a numpy array of images (represented as 1296 floats) and a array of labels (from 0 to 9)
I need to extract weights from this model, hence last few lines of code
What can I do make this neural network learn?