#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)
. Для получения более подробной информации обратитесь к этой ссылке
Второе: поскольку ваш набор данных не сбалансирован ….. попробуйте использовать методы недостаточной / избыточной выборки, которые будут очень полезны в вашем случае.