m_a*_*ber 10 python numpy neural-network
我试图构建我自己的神经网络反向传播算法的实现.我为培训编写的代码到目前为止,
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
Run Code Online (Sandbox Code Playgroud)
输入单元的数量 - 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
Run Code Online (Sandbox Code Playgroud)
jor*_*nkg 22
当信号强度增加时,逻辑sigmoid函数在NumPy中溢出.尝试附加以下代码段:
np.clip( signal, -500, 500 )
Run Code Online (Sandbox Code Playgroud)
这将限制NumPy矩阵中的变量在给定的间隔内.这将防止Sigmoid函数中的精度溢出.
>>> arr
array([[-900, -600, -300],
[ 0, 300, 600]])
>>> np.clip( arr, -500, 500)
array([[-500, -500, -300],
[ 0, 300, 500]])
Run Code Online (Sandbox Code Playgroud)
这是我在我的项目中使用的片段:
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
Run Code Online (Sandbox Code Playgroud)
随着培训的进行,网络实现了越来越高的精度.当这种精确度接近完美时,S形信号将从下方接近1或从上接近0.例如:0.99999999999 ...或0.00000000000000001 ...
由于NumPy专注于执行高度精确的数值运算,因此它将尝试保持尽可能高的精度,从而导致溢出错误.注意:此错误消息可能会被忽略,并可能被设置隐藏:
np.seterr( over='ignore' )
Run Code Online (Sandbox Code Playgroud)