基于Python的MNIST三层神经网络
我目前正在编写自己的代码来实现一个单隐层神经网络,并在MNIST数据集上测试该模型。但我得到了有线结果(NLL高得令人无法接受),尽管我检查了我的代码超过2天,没有发现哪里出了问题 以下是全局参数:基于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
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和基本函数开始,看看组件是否工作正常(记录梯度和激活也很有帮助)。尽可能以孤立的方式测试网络中的每一个机制。如果仍然无法训练特定的参数集,则需要调整参数集大小,以便在训练真实对象之前,调整设置大小以缩短训练时间,从而找到“正确”的参数。