【发布时间】:2014-06-01 10:40:53
【问题描述】:
我正在尝试构建自己的神经网络反向传播算法实现。到目前为止,我为训练编写的代码是这样的,
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 类,后 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
【问题讨论】:
-
你能给出示例输入吗(
x,labels,n)? -
您似乎在使用
np.dot将一个 numpy 数组和一个 numpy 矩阵相乘 - 可能不是好的做法(请参阅 this)。p可以改为数组吗?我不知道这是否是您的问题的原因。 -
我这样做是为了调试。我之前用 p 作为数组来实现它。还是不行。
-
你能说出
x、labels和n是什么吗? -
谢谢,
x数组的大小/形状是多少?问题中的示例输入会很好:-)
标签: python numpy neural-network