如何扩大神经网络的图像识别范围?



我正在用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)

提前感谢您的帮助!

首先我要推荐的是写一个干净的Pytorch代码

例如。
如果我看到你的神经网络类,它应该有forward方法(小写f),这样你就不会用prediction = neuralNet.Forward(dataSet)来称呼它了。原因是如果你使用prediction = neuralNet.Forward(dataSet),你的神经网络钩子不会被调度。更多详细信息请参考此链接

第二件事是:既然你的数据集不平衡.....尝试使用欠采样/过采样方法,这将对您的情况非常有帮助。

最新更新