我正在尝试创建我的第一个神经网络。我正在尝试创建一个“虚拟生物”系统,其中每个生物头顶都有两个传感器。 网络获得的输入是从两个传感器到最近食物源的距离。通过输出我应该决定该生物是假设向左还是向右,以及在什么角度。问题是,我总是得到相同的结果(它总是向右或向左)。我的计算如下:
def forward(self, X):
self.z1 = np.dot(np.insert(X, len(X), 1), self.W1)
self.a1 = self.sigmoid(self.z1)
self.z2 = np.dot(np.insert(self.a1, len(self.a1), 1), self.W2)
results = self.sigmoid(self.z2)
return results
我通过以下方式计算角度:
left_d = distance(sensors[0], food_pos)
right_d = distance(sensors[1], food_pos)
max_dis = sqrt(WIDTH**2 + HEIGHT ** 2)
output = self.NN.forward(np.array([float(left_d) / max_dis, float(right_d) / max_dis]))
if output[0] > output[1]:
self.angle += (output[0] - 0.5) * np.pi
else:
self.angle -= (output[1] - 0.5) * np.pi
我也尝试过随机输入的网络,我发现对于给定的NN,输出总是(X,Y),使得X> Y或那个X< Y,从未在同一个NN中两者之间随机化。
以下是来自运行的一些数据:
X - [ 0.78958477 0.69948212]
Z1 - [ 1.61766664 1.56767388 1.82580234]
A1 - [ 0.99890179 0.99999513 0.96766178]
Z2 - [ 1.45907443 0.92895941]
R - [ 0.9937656 0.80099741]
X - [ 0.14044444 0.60987121]
Z1 - [ 0.97104647 1.00091401 1.23983745]
A1 - [ 0.82547683 0.84196448 0.94573119]
Z2 - [ 1.28368194 0.85941254]
R - [ 0.95906503 0.75745915]
正如你所看到的,R对于这个和大约百万个测量是一致的。 这是我的体重初始化:
self.W1 = np.random.rand(self.inputLayerSize + 1, self.hiddenLayerSize)
self.W2 = np.random.rand(self.hiddenLayerSize + 1, self.outputLayerSize)
注意:我使用遗传算法而不是反向传播。 以下是GA部分:
def merge_guppies(screen, g1, g2):
W11, W12 = g1.NN.get_W()
W21, W22 = g2.NN.get_W()
W1 = [[0] * len(W11[0])] * len(W11)
W2 = [[0] * len(W12[0])] * len(W12)
for k in xrange(len(W11)):
for j in xrange(len(W11[k])):
if uniform(0, 1) > 0.9:
W1[k][j] = uniform(0, 1)
elif uniform(0, 1) > 0.45:
W1[k][j] = W11[k][j]
else:
W1[k][j] = W21[k][j]
for k in xrange(len(W12)):
for j in xrange(len(W12[k])):
if uniform(0, 1) > 0.9:
W2[k][j] = uniform(0, 1)
elif uniform(0, 1) > 0.45:
W2[k][j] = W12[k][j]
else:
W2[k][j] = W22[k][j]
W1 = np.array(W1)
W2 = np.array(W2)
g = Guppy(screen)
g.NN.set_W(W1, W2)
return g
我怀疑这个问题是否在这里,考虑到我用我的NN进行的其他测试(只是给它随机输入),但谁知道......我一直在寻找几天的答案现在,我很迷茫。
任何帮助将不胜感激。知道我哪里弄错了吗?