I found a model that looked appealing to me at:
https://towardsdatascience.com/how-to-train-an-image-classifier-in-pytorch-and-use-it-to-perform-basic-inference-on-single-images-99465a1e9bf5
As a start I copied nearly everything from this website.
Firstly I want to explain my train and test datasets.
My Train Dataset contains some chinese signs as bitmaps with unknown “meaning” ( I am looking for unicode escapes)
My Test Dataset contains the range of simplified chinese characters as bitmaps (escape sequences are known).
I thought it would be better to do it this way as there are more than 22000 signs in simplified chinese. For training I would have needed more than one image per sign resulting in like 130000 pictures for training.
I only have 225 unknown bitmaps. By doing so I only have 225*6 pictures for training which I thought would be way better for performance.
Here is where I changed the code from the website:
def load_train_test():
normalize = transforms.Normalize(mean=[0.5,],
std=[0.5,])
img_transforms = transforms.Compose([transforms.Resize(224),
transforms.CenterCrop(224),
transforms.ToTensor(),
normalize])
train_data = datasets.ImageFolder(TRAIN_DS,
transform = img_transforms)
test_data = datasets.ImageFolder(TEST_DS,
transform = img_transforms)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=64)
return train_loader, test_loader
In the example he created labels from SubsetRandomSampler().
Now I receive following error message:
Exception has occurred: IndexError
Target 10 is out of bounds.
The error occurs when I try to calculate loss at
loss = criterion(logps, labels)
Here is the code snippet (line 7)
for epoch in range(epochs):
for inputs, labels in train_loader:
steps += 1
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
logps = model.forward(inputs)
loss = criterion(logps, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if steps % print_every == 0:
test_loss = 0
accuracy = 0
model.eval()
with torch.no_grad():
for inputs, labels in test_loader:
inputs, labels = inputs.to(device), labels.to(device)
logps = model.forward(inputs)
batch_loss = criterion(logps, labels)
test_loss += batch_loss.item()
ps = torch.exp(logps)
top_p, top_class = ps.topk(1, dim=1)
equals = top_class == lavels.view(*top_class.shape)
accuracy = torch.mean(equals.type(torch.FloatTensor)).item()
train_losses.append(running_loss/len(train_loader))
test_losses.append(test_loss/len(test_loader))
print(f"Epoch {epoch+1}/{epochs}.."
f"Train loss: {running_loss/print_every:.3f}.."
f"Test loss: {test_loss/len(test_loader):.3f}.."
f"Test accuracy: {accuracy/len(test_loader):.3f}")
running_loss = 0
model.train()
torch.save(model, 'chinese.pth')
In debug mode I can see that there are some labels generated. I really don’t know why this error occurs.
Maybe someone of you knows what I am doing wrong.
Thanks for your time!