Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Python的MNIST三层神经网络_Python_Neural Network - Fatal编程技术网

基于Python的MNIST三层神经网络

基于Python的MNIST三层神经网络,python,neural-network,Python,Neural Network,我目前正在编写自己的代码来实现一个单隐层神经网络,并在MNIST数据集上测试该模型。但我得到了有线结果(NLL高得令人无法接受),尽管我检查了我的代码超过2天,没有发现哪里出了问题 以下是全局参数: layers = np.array([784, 300, 10]) learningRate = 0.01 momentum = 0.01 batch_size = 10000 num_of_batch = len(train_label)/batch_size nepoch = 30 Softm

我目前正在编写自己的代码来实现一个单隐层神经网络,并在MNIST数据集上测试该模型。但我得到了有线结果(NLL高得令人无法接受),尽管我检查了我的代码超过2天,没有发现哪里出了问题

以下是全局参数:

layers = np.array([784, 300, 10])
learningRate = 0.01
momentum = 0.01
batch_size = 10000
num_of_batch = len(train_label)/batch_size
nepoch = 30
Softmax函数定义:

def softmax(x):
    x = np.exp(x)
    x_sum = np.sum(x,axis=1) #shape = (nsamples,)
    for row_idx in range(len(x)):
        x[row_idx,:] /= x_sum[row_idx]
    return x
def f(x):
    return 1.0/(1+np.exp(-x))
S形函数定义:

def softmax(x):
    x = np.exp(x)
    x_sum = np.sum(x,axis=1) #shape = (nsamples,)
    for row_idx in range(len(x)):
        x[row_idx,:] /= x_sum[row_idx]
    return x
def f(x):
    return 1.0/(1+np.exp(-x))
初始化w和b

k = np.vectorize(math.sqrt)(layers[0:-2]*layers[1:])
w1 = np.random.uniform(-0.5, 0.5, layers[0:2][::-1])
b1 = np.random.uniform(-0.5, 0.5, (1,layers[1]))
w2 = np.random.uniform(-0.5, 0.5, layers[1:3][::-1])
b2 = np.random.uniform(-0.5, 0.5, (1,layers[2]))
以下是每个小批量的核心部分:

for idx in range(num_of_batch):

    # forward_vectorized
    x = train_set[idx*batch_size:(idx+1)*batch_size,:]
    y = Y[idx*batch_size:(idx+1)*batch_size,:]

    a1 = x
    a2 = f(np.dot(np.insert(a1,0,1,axis=1),np.insert(w1,0,b1,axis=1).T))
    a3  = softmax(np.dot(np.insert(a2,0,1,axis=1),np.insert(w2,0,b2,axis=1).T))

    # compute delta
    d3 = a3-y
    d2 = np.dot(d3,w2)*a2*(1.0-a2)

    # compute grad
    D2 = np.dot(d3.T,a2)
    D1 = np.dot(d2.T,a1)

    # update_parameters
    w1 = w1 - learningRate*(D1/batch_size + momentum*w1)
    b1 = b1 - learningRate*(np.sum(d2,axis=0)/batch_size)
    w2 = w2 - learningRate*(D2/batch_size+ momentum*w2)
    b2 = b2 - learningRate*(np.sum(d3,axis=0)/batch_size)

    e = -np.sum(y*np.log(a3))/batch_size
    err.append(e)
在一个历元(50000个样本)之后,我得到了以下e序列,它似乎太大了:

Out[1]:
    10000/50000     4.033538
    20000/50000     3.924567
    30000/50000     3.761105
    40000/50000     3.632708
    50000/50000     3.549212

我认为back_prop代码应该是正确的,我找不到哪里出了问题。它折磨了我两天多

我建议您使用pdb和一个简单的测试用例来测试您的代码,例如delta、gradient、updaterule是否在每个步骤中都正常工作。现在是凌晨4点,所以我没有读你的代码。也许明天(当然,tmr可能永远不会出现)你为什么认为一个时代后的情况不好?它似乎正在以一个不错的速度下降。尝试至少100个时代,看看你能从中得到什么。人们通常在MNIST上运行数千个历元。@IVlad我运行了一个历元,并在测试集上测试了模型,得到了85%的错误准确率,我认为这在任何意义上都已经够糟糕的了(@IVlad你可能是对的,我重新运行了100个历元的代码,并将错误率降低到37%,我将继续测试我的代码,并找出是否还有任何进一步的问题。非常感谢,伙计。是的,不要用大数据集开始测试。从XOR和基本函数开始,看看组件是否工作正常(记录梯度和激活也很有帮助)。尽可能以孤立的方式测试网络中的每一个机制。如果仍然无法训练特定的参数集,则需要调整参数集大小,以便在训练真实对象之前,调整设置大小以缩短训练时间,从而找到“正确”的参数。