我在使用numpy在python中实现神经网络时检查梯度的计算遇到问题。我正在使用mnist
数据集尝试并尝试使用小批量梯度下降。
我已经检查了数学并且在纸面上看起来不错,所以也许您可以给我一些这里发生的事情的提示:
编辑:一个答案让我意识到,成本函数的计算确实是错误的。但是,这不能解释渐变问题,因为它是使用back_prop计算的。使用minibatch gradient
带有rmsprop
30个历元和100个批次的下降的隐藏层中的300个单位,我得到%7的错误率。(learning_rate
= 0.001,由于rmsprop而较小)。
每个输入具有768个功能,因此对于100个样本,我有一个矩阵。Mnist
有10个班级。
X = NoSamplesxFeatures = 100x768
Y = NoSamplesxClasses = 100x10
完全训练后,我正在使用一个隐藏层神经网络,其中隐藏层大小为300。我还有一个问题是我是否应该使用softmax输出函数来计算错误...我认为不是。但是,对于所有这些我都是新手,显然,这对我来说似乎很奇怪。
return np.true_divide(1,1 + np.exp(-z) )
#not calculated really - this the fake version to make it faster.
def sigmoid_prime(a):
return (a)*(1 - a)
def _back_prop(self,W,X,labels,f=sigmoid,fprime=sigmoid_prime,lam=0.001):
"""
Calculate the partial derivates of the cost function using backpropagation.
"""
#Weight for first layer and hidden layer
Wl1,bl1,Wl2,bl2 = self._extract_weights(W)
# get the forward prop value
layers_outputs = self._forward_prop(W,X,f)
#from a number make a binary vector, for mnist 1x10 with all 0 but the number.
y = self.make_1_of_c_encoding(labels)
num_samples = X.shape[0] # layers_outputs[-1].shape[0]
# Dot product return Numsamples (N) x Outputs (No CLasses)
# Y is NxNo Clases
# Layers output to
big_delta = np.zeros(Wl2.size + bl2.size + Wl1.size + bl1.size)
big_delta_wl1, big_delta_bl1, big_delta_wl2, big_delta_bl2 = self._extract_weights(big_delta)
# calculate the gradient for each training sample in the batch and accumulate it
for i,x in enumerate(X):
# Error with respect the output
dE_dy = layers_outputs[-1][i,:] - y[i,:]
# bias hidden layer
big_delta_bl2 += dE_dy
# get the error for the hiddlen layer
dE_dz_out = dE_dy * fprime(layers_outputs[-1][i,:])
#and for the input layer
dE_dhl = dE_dy.dot(Wl2.T)
互换的青春
相关分类