Python中神经网络的光学字符识别

时间:2017-05-31 02:27:04

标签: python machine-learning neural-network

此代码用于使用ANN的OCR,它包含一个隐藏层,输入是一个大小为28x28的图像。代码运行时没有任何错误,但即使给出5000+图像进行训练,输出仍然不准确.I我使用的是mpg数据集,它是jpg图像的形式。请告诉我我的逻辑有什么问题。

            import numpy as np
            from PIL import Image
            import random
            from random import randint
            y = [[0,0,0,0,0,0,0,0,0,0]]
            W1 =  [[ random.uniform(-1, 1) for q in range(40)] for p in range(784)]
            W2 = [[ random.uniform(-1, 1) for q in range(10)] for p in range(40)]
            def sigmoid(x):
                global b
                return (1.0 / (1.0 + np.exp(-x)))

            #run the neural net forward

            def run(X, W):
                return sigmoid(np.matmul(X,W)) #1x2 * 2x2 = 1x1 matrix

            #cost function

            def cost(X, y, W):  
                nn_output = run(X, W)
                return ((nn_output - y))

            def gradient_Descent(X,y,W1,W2):
                alpha = 0.12    #learning rate
                epochs =  15000 #num iterations
                for i in range(epochs):
                    Z2=sigmoid(np.matmul(run(X,W1),W2))  #final activation function(1X10))
                    Z1=run(X,W1)   #first activation function(1X40)
                    phi1=Z1*(1-Z1)  #differentiation of Z1
                    phi2=Z2*(1-Z2)  #differentiation of Z2
                    delta2 = phi2*cost(Z1,y,W2)  #delta for outer layer(1X10)
                    delta1 = np.transpose(np.transpose(phi1)*np.matmul(W2,np.transpose(delta2)))
                    deltaW2 = alpha*(np.matmul(np.transpose(Z1),delta2))
                    deltaW1 = alpha*(np.matmul(np.transpose(X),delta1))
                    W1=W1+deltaW1
                    W2=W2+deltaW2

            def Training():

                for j in range(8):
                    y[0][j]=1
                    k=1
                    while k<=15: #5421
                        print(k)
                        q=0
                        img = Image.open('mnist_jpgfiles/train/mnist_'+str(j)+'_'+str(k)+'.jpg')
                        iar = np.array(img)     #image array
                        ar=np.reshape(iar,(1,np.product(iar.shape)))
                        ar=np.array(ar,dtype=float)
                        X = ar
                        '''
                        for p in range(784):

                            if X[0][p]>0:

                                X[0][p]=1

                            else:

                                X[0][p]=0
                        '''         
                        k+=1
                        gradient_Descent(X,y,W1,W2)
                        print(np.argmin(cost(run(X,W1),y,W2)))
                        #print(W1)

                    y[0][j]=0
            Training()

            def test():
                global W1,W2
                for j in range(3):
                    k=1
                    while k<=5: #890
                        img = Image.open('mnist_jpgfiles/test/mnist_'+str(j)+'_'+str(k)+'.jpg')
                        iar = np.array(img)     #image array
                        ar=np.reshape(iar,(1,np.product(iar.shape)))
                        ar=np.array(ar,dtype=float)
                        X = ar/256
                        '''
                        for p in range(784):

                            if X[0][p]>0:

                                X[0][p]=1

                            else:

                                X[0][p]=0
                        '''     
                        k+=1
                        print("Should be "+str(j))
                        print((run(run(X,W1),W2)))
                        print((np.argmax(run(run(X,W1),W2))))
            print("Testing.....")
            test()  

3 个答案:

答案 0 :(得分:1)

您的成本函数存在问题,因为您只是计算假设输出与实际输出之间的差异。它使您的成本函数呈线性,因此它严格增加(或严格减少),这可以& #39;优化。  您需要制作交叉熵成本函数(因为您使用sigmoid作为激活函数)。  此外,梯度下降只是可以优化ANN成本函数,您应该使用梯度下降的反向传播来优化它。

答案 1 :(得分:0)

我没有使用ANN但是当使用梯度下降算法来处理回归问题时,例如在课程中的Andrew Nag机器学习课程中,我发现学习率alpha小于0.05且迭代次数不超过100000是有帮助的。 尝试调整您的学习率,然后创建一个混淆矩阵,帮助您了解系统的准确性。

答案 2 :(得分:0)

根据我的经验,人工神经网络可能会出现很多问题。我列出了一些可能的错误供您考虑。

假设训练后分类准确度根本没有增加。

  • 培训或测试集有些问题。
  • 太高了 学习速率有时会导致算法不收敛 所有。尝试将其设置为非常小,如0.01或0.001。如果仍然没有收敛。问题可能与梯度下降之外的其他事情有关。

假设培训确实增加但准确性比预期差。

  • 规范化过程未正确实施。对于图像,建议使用零均值单位方差。
  • 学习率太低或太高