此代码用于使用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()
答案 0 :(得分:1)
您的成本函数存在问题,因为您只是计算假设输出与实际输出之间的差异。它使您的成本函数呈线性,因此它严格增加(或严格减少),这可以& #39;优化。 您需要制作交叉熵成本函数(因为您使用sigmoid作为激活函数)。 此外,梯度下降只是可以优化ANN成本函数,您应该使用梯度下降的反向传播来优化它。
答案 1 :(得分:0)
我没有使用ANN但是当使用梯度下降算法来处理回归问题时,例如在课程中的Andrew Nag机器学习课程中,我发现学习率alpha小于0.05且迭代次数不超过100000是有帮助的。 尝试调整您的学习率,然后创建一个混淆矩阵,帮助您了解系统的准确性。
答案 2 :(得分:0)
根据我的经验,人工神经网络可能会出现很多问题。我列出了一些可能的错误供您考虑。
假设训练后分类准确度根本没有增加。
假设培训确实增加但准确性比预期差。