我正在尝试构建自己的神经网络反向传播算法实现。我为培训编写的代码到目前为止,
def train(x,labels,n):
lam = 0.5
w1 = np.random.uniform(0,0.01,(20,120)) #weights
w2 = np.random.uniform(0,0.01,20)
for i in xrange(n):
w1 = w1/np.linalg.norm(w1)
w2 = w2/np.linalg.norm(w2)
for j in xrange(x.shape[0]):
y1 = np.zeros((600)) #output
d1 = np.zeros((20))
p = np.mat(x[j,:])
a = np.dot(w1,p.T) #activation
z = 1/(1 + np.exp((-1)*a))
y1[j] = np.dot(w2,z)
for k in xrange(20):
d1[k] = z[k]*(1 - z[k])*(y1[j] - labels[j])*np.sum(w2) #delta update rule
w1[k,:] = w1[k,:] - lam*d1[k]*x[j,:] #weight update
w2[k] = w2[k] - lam*(y1[j]-labels[j])*z[k]
E = 1/2*pow((y1[j]-labels[j]),2) #mean squared error
print E
return 0
没有输入单元 - 120, 没有隐藏单位 - 20, 没有输出单元-1, 没有训练样本 - 600
x是600 * 120训练集,平均值和单位方差为零,最大值为3.28,最小值为-4.07。前200个样本属于1类,第2个200属于2类,最后200个属于3类。标签是分配给每个样本的类标签,n是收敛所需的迭代次数。每个样本有120个特征。
我已经将权重初始化为0到0.01之间,并且输入数据被缩放为具有单位方差和零均值,并且代码仍然会抛出溢出警告,从而导致' a'即激活值为NaN。我无法理解似乎是什么问题。
每个样本都有120个元素。 x行的示例行:
[ 0.80145231 1.29567936 0.91474224 1.37541992 1.16183938 1.43947296
1.32440357 1.43449479 1.32742415 1.40533852 1.28817561 1.37977183
1.2290933 1.34720161 1.15877069 1.29699635 1.05428735 1.21923531
0.92312685 1.1061345 0.66647463 1.00044203 0.34270708 1.05589558
0.28770958 1.21639524 0.31522575 1.32862243 0.42135899 1.3997094
0.5780146 1.44444501 0.75872771 1.47334256 0.95372771 1.48878048
1.13968139 1.49119962 1.33121905 1.47326017 1.47548571 1.4450047
1.58272343 1.39327328 1.62929132 1.31126604 1.62705274 1.21790335
1.59951034 1.12756958 1.56253815 1.04096709 1.52651382 0.95942134
1.48875633 0.87746762 1.45248623 0.78782313 1.40446404 0.68370011
答案 0 :(得分:18)
当信号强度增加时,逻辑sigmoid函数在NumPy中溢出。尝试附加以下代码行:
np.clip( signal, -500, 500 )
这会将NumPy matrises中的值限制在给定的时间间隔内。这将反过来防止sigmoid函数中的精度溢出。
>>> arr
array([[-900, -600, -300],
[ 0, 300, 600]])
>>> np.clip( arr, -500, 500)
array([[-500, -500, -300],
[ 0, 300, 500]])
这是我在项目中使用的片段:
def sigmoid_function( signal ):
# Prevent overflow.
signal = np.clip( signal, -500, 500 )
# Calculate activation signal
signal = 1.0/( 1 + np.exp( -signal ))
return signal
#end
随着培训的进展,网络提高了精度。当这种精确度接近完美时,S形信号将从下方接近1或从上接近0。例如:0.99999999999 ...或0.00000000000000001 ...
由于NumPy专注于执行高精度数值运算,因此它会尝试保持尽可能高的精度,从而导致溢出错误。注意:通过设置:
可以忽略此错误消息np.seterr( over='ignore' )