Как увеличить объем изображений, которые может распознавать нейронная сеть?

#python #neural-network #pytorch #conv-neural-network

#python #нейронная сеть #pytorch #conv-neural-network

Вопрос:

Я работаю над нейронной сетью распознавания изображений с помощью Pytorch. Моя цель — сделать снимки рукописных математических уравнений, обработать их и использовать нейронную сеть для распознавания каждого элемента. Я достиг точки, когда я могу отделить каждую переменную, число или символ от уравнения, и все готово для отправки через нейронную сеть. Я обучил свою сеть распознавать числа довольно хорошо (эта часть была довольно простой), но теперь я хочу расширить возможности нейронной сети для распознавания букв, а также цифр. Я загрузил рукописные буквы вместе с числами в тензоры, перетасовал элементы и распределил их по пакетам. Независимо от того, как я меняю скорость обучения, мою архитектуру (скрытые слои и количество нейронов на слой) или размер пакета, я не могу заставить нейронную сеть распознавать буквы.

Вот моя сетевая архитектура и функция прямой связи (вы можете видеть, что я экспериментировал с количеством скрытых слоев):

 class NeuralNetwork(nn.Module):

def __init__(self):

    super().__init__()
    inputNeurons, hiddenNeurons, outputNeurons = 784, 700, 36

    # Create tensors for the weights
    self.layerOne = nn.Linear(inputNeurons, hiddenNeurons)
    self.layerTwo = nn.Linear(hiddenNeurons, hiddenNeurons)
    self.layerThree = nn.Linear(hiddenNeurons, outputNeurons)
    #self.layerFour = nn.Linear(hiddenNeurons, outputNeurons)
    #self.layerFive = nn.Linear(hiddenNeurons, outputNeurons)

# Create function for Forward propagation
def Forward(self, input):

    # Begin Forward propagation
    input = torch.sigmoid(self.layerOne(torch.sigmoid(input)))
    input = torch.sigmoid(self.layerTwo(input))
    input = torch.sigmoid(self.layerThree(input))
    #input = torch.sigmoid(self.layerFour(input))
    #input = torch.sigmoid(self.layerFive(input))

    return input
 

И это блок обучающего кода (данные перетасовываются в загрузчике данных, основные истины перетасовываются в том же порядке, размер пакета равен 10, общее количество буквенных и числовых точек данных равно 244800):

 neuralNet = NeuralNetwork()
params = list(neuralNet.parameters())
criterion = nn.MSELoss()
print(neuralNet)

dataSet = next(iter(imageDataLoader))
groundTruth = next(iter(groundTruthsDataLoader))

for i in range(15):

    for k in range(24480):

        neuralNet.zero_grad()

        prediction = neuralNet.Forward(dataSet)
        loss = criterion(prediction, groundTruth)
        loss.backward()

        for layer in range(len(params)):

            # Updating the weights of the neural network
            params[layer].data.sub_(params[layer].grad.data * learningRate)
 

Заранее спасибо за помощь!

Комментарии:

1. Скорее всего, это не из-за плохого кода, поэтому он не относится к SO. Но вам, вероятно, следует использовать более современную нейронную сеть, со слоями свертки, batchnorm и всем прочим. Найдите наилучший результат MNIST и попробуйте воспроизвести его в своем наборе данных. Кроме того, насколько сбалансирован ваш набор данных? Если некоторые классы будут значительно доминировать, это негативно скажется на ваших результатах

2. Хорошо, спасибо за информацию. У меня около 60 000 написанных от руки числовых точек данных и около 184 800 букв, включая заглавные и строчные. Я точно проверю, сколько у меня каждой буквы, и определю, является ли это проблемой с моим набором данных. Еще раз спасибо

Ответ №1:

Первое, что я бы порекомендовал, это написать чистый Pytorch-код

Например.
если я вижу ваш класс NeuralNetwork, у него должен быть forward метод (f в нижнем регистре), чтобы вы не вызывали его с помощью prediction = neuralNet.Forward(dataSet) . Причина в том, что ваши хуки из нейронной сети не отправляются, если вы используете prediction = neuralNet.Forward(dataSet) . Для получения более подробной информации обратитесь к этой ссылке

Второе: поскольку ваш набор данных не сбалансирован ….. попробуйте использовать методы недостаточной / избыточной выборки, которые будут очень полезны в вашем случае.