Python 如何增加神经网络可以识别的图像范围?
我正在用Pytork开发一个图像识别神经网络。我的目标是拍摄手写数学方程式的照片,对其进行处理,并使用神经网络识别每个元素。我已经到了可以从方程中分离出每个变量、数字或符号的地步,一切都可以通过神经网络发送。我已经训练了我的网络来很好地识别数字(这部分很简单),但是现在我想把神经网络的范围扩大到识别字母和数字。我把手写的字母和数字一起装入张量,将元素混洗,然后分批放入。无论我如何改变我的学习速度,我的架构(隐藏层和每层神经元的数量),或者我的批量大小,我都无法让神经网络识别字母 这是我的网络架构和前馈功能(你可以看到我尝试了隐藏层的数量): 这是训练代码块(数据在数据加载器中洗牌,基本事实按相同顺序洗牌,批量大小为10,总数字字母和数字数据点为244800):Python 如何增加神经网络可以识别的图像范围?,python,neural-network,pytorch,conv-neural-network,Python,Neural Network,Pytorch,Conv Neural Network,我正在用Pytork开发一个图像识别神经网络。我的目标是拍摄手写数学方程式的照片,对其进行处理,并使用神经网络识别每个元素。我已经到了可以从方程中分离出每个变量、数字或符号的地步,一切都可以通过神经网络发送。我已经训练了我的网络来很好地识别数字(这部分很简单),但是现在我想把神经网络的范围扩大到识别字母和数字。我把手写的字母和数字一起装入张量,将元素混洗,然后分批放入。无论我如何改变我的学习速度,我的架构(隐藏层和每层神经元的数量),或者我的批量大小,我都无法让神经网络识别字母 这是我的网络架构
提前谢谢你的帮助 我建议的第一件事是编写一个干净的Pytorch代码 例如,
如果我看到你的神经网络类,它应该有
forward
方法(小写为f),
这样您就不会使用prediction=neuralNet.Forward(dataSet)
调用它。如果您使用prediction=neuralNet.Forward(dataSet)
,则无法调度来自神经网络的钩子。
有关更多详细信息,请参阅
第二件事是:由于您的数据集不平衡……请尝试使用欠采样/过采样方法,这对您的情况非常有帮助。这很可能不是因为代码不正确,所以它不属于so。但您可能应该使用更先进的神经网络,具有卷积层和batchnorm等等。寻找最佳MNIST结果,并尝试在数据集上复制它。此外,您的数据集平衡程度如何?如果某些类明显占主导地位,这将对您的结果产生负面影响OK,谢谢您提供的信息。我有大约60000个手写数字数据点和大约184800个字母,包括大写和小写字母。我将准确地检查每个字母中有多少字母,并根据这些字母确定我的数据集是否存在问题。再次感谢
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
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)