Python 神经网络处理中的错误MNIST不下降

Python 神经网络处理中的错误MNIST不下降,python,neural-network,deep-learning,mnist,Python,Neural Network,Deep Learning,Mnist,我编写了一个python程序,其中我试图实现一个3层神经网络来处理MNIST图形识别问题,但我从每个历元得到的误差并没有下降。有人能帮我找出是我的代码问题还是我的模型问题吗? -------更新--- 我打印了输出f3的数组,在一个循环后,所有值都在减小。我真的被这弄糊涂了 这是密码 import struct import numpy as np import os import matplotlib.pyplot as plt np.random.s

我编写了一个python程序,其中我试图实现一个3层神经网络来处理MNIST图形识别问题,但我从每个历元得到的误差并没有下降。有人能帮我找出是我的代码问题还是我的模型问题吗? -------更新--- 我打印了输出f3的数组,在一个循环后,所有值都在减小。我真的被这弄糊涂了

这是密码

    import struct
    import numpy as np
    import os
    import matplotlib.pyplot as plt

    np.random.seed(0)
    ## compute sigmoid nonlinearity
    def sigmoid(x):
        output = 1/(1+np.exp(-x))
        return output
    # convert output of sigmoid function to its derivative
    def sigm_deri(output):
        return output*(1-output)

    def softmax(x):
        e_x = np.exp(x - np.max(x))
        return e_x / e_x.sum()
        #exp_scores=np.exp(x)
        #probs=exp_scores/np.sum(exp_scores, axis=1,keepdims=True)
        #return probs

    def softmax_deri(signal):
        J = - signal[..., None] * signal[:, None, :] # off-diagonal Jacobian
        iy, ix = np.diag_indices_from(J[0])
        J[:, iy, ix] = signal * (1. - signal) # diagonal
        return J.sum(axis=1) # sum across-rows for each sample

    def relu(x):
        return np.maximum(x, 0)

    def relu_deri(output):
        return 1.*(output>0)

    alpha = 0.03
    lamda = 0.1#alpha*alpha
    input_dim = 28*28
    hidden_dim1 = 500
    hidden_dim2 = 100
    output_dim = 10
    # initialize neural network weights
    synapse_0 = (2*np.random.random((input_dim,hidden_dim1))-1)
    synapse_1 = (2*np.random.random((hidden_dim1,hidden_dim2))-1)
    synapse_2 = (2*np.random.random((hidden_dim2,output_dim)) -1)
    bias_0=np.zeros((1, hidden_dim1))
    bias_1=np.zeros((1, hidden_dim2))
    bias_2=np.zeros((1, output_dim))
    imagef = open('/home/rdeng/code/mine/nn/data/train-images-idx3-ubyte', 'rb')
    labelf = open('/home/rdeng/code/mine/nn/data/train-labels-idx1-ubyte', 'rb')

    magic, imgNum=struct.unpack(">II", imagef.read(8))
    imgRow, imgCol =struct.unpack(">II", imagef.read(8))
    print magic, imgNum, imgRow, imgCol
    lblMagic, lblNum=struct.unpack(">II", labelf.read(8))
    print lblMagic, lblNum
    overallError = 0
    loop=100
    errordot=np.zeros((loop,1))
    X=np.fromfile(imagef, np.uint8, imgRow*imgCol)
y=np.fromfile(labelf, np.uint8, 1)
for j in range(loop):
    #read a 28x28 image and a byte label
    #X=np.fromfile(imagef, np.uint8, imgRow*imgCol)
    #y=np.fromfile(labelf, np.uint8, 1)
    X=X.reshape(1, imgRow*imgCol)
    #Forward propagation
    z1=np.dot(X, synapse_0)
    f1=sigmoid(z1+bias_0)
    z2=np.dot(f1, synapse_1)
    f2=sigmoid(z2+bias_1)

    z3=np.dot(f2, synapse_2)
    f3=sigmoid(z3+bias_2)
    sumf3=np.sum(np.abs(f3))
    f4=softmax(f3)
    pred=np.argmax(f4)
    yy=np.zeros((1, output_dim))
    yy[0, y]=sumf3

    #backward propagation
    #ignore softmax layer
    error=pow(f3-yy,2)/2
    errordot[j]=np.sum(error)
    if j%(loop/10)==0:
        print 'f3=',f3
        print 'pred=',pred,'y=',y,'error=',error

    gprime=sigm_deri(f3)
    delta3=error#*gprime
    #print 'delta3=',delta3.shape,'synapse_2.T=',synapse_2.T.shape
    delta2=np.dot(delta3, synapse_2.T)*sigm_deri(f2)
    #print 'delta2=',delta2.shape,'synapse_1.T=',synapse_1.T.shape
    delta1=np.dot(delta2, synapse_1.T)*sigm_deri(f1)
    d2=np.dot(delta3.T, f2)
    dbias_2=delta3
    d1=np.dot(delta2.T, f1)
    dbias_1=delta2
    d0=np.dot(delta1.T, X)
    dbias_0=delta1
    synapse_0-=alpha*(d0.T+lamda*synapse_0)/hidden_dim1
    synapse_1-=alpha*(d1.T+lamda*synapse_1)/hidden_dim2
    synapse_2-=alpha*(d2.T+lamda*synapse_2)/output_dim
    bias_0-=alpha*dbias_0/hidden_dim1
    bias_1-=alpha*dbias_1/hidden_dim2
    bias_2-=alpha*dbias_2/output_dim

    print 'overallerror=',overallError
    plt.plot(range(loop), errordot, "o")
    plt.show()
我更新了代码,在一个图像上进行循环训练,但是错误似乎不正确,因为它正在增加。 此外,
f3
的每个数据都越来越小,但正确的数据也越来越小,从而导致错误降低。

您是否将数据集定义为有100张标签正确的图像?因此,在你的例子中,循环100个图像对应一个历元?我已经做了10/100循环来训练1个具有正确标签的图像,但似乎所有f3分数都将越来越小,包括“正确”的分数。我想知道问题是否出在反向传播的实现中。