我想用点位置训练,询问和检查我的神经网络。
我有一个带有INI文件结构的文件,其中包含按类排序的点列表。 例如:
[points]
c_0 = (0, 0)#(1, 1)#(0,1)
c_1 = (5, 5)#(6, 6)#(10, 10)
我解析了文件,然后我尝试学习来自PyBrain库的神经网络。所以我做了这样的代码
net = buildNetwork(2, 3, 1, bias=True)
new_params = np.array([1.0]*13)
net._setParameters(new_params)
ds = SupervisedDataSet(2, 1)
for (class) ... # loop for every class
for (point) ... # loop for every point in class
ds.addSample(point, class)
trainer = BackpropTrainer(net, ds)
print(trainer.train())
所以它是一个线性函数,我可以识别将分配哪个类以后的点。
但是当我使用文件中的偶数点0,1或2时,我仍然得到相同的结果。
例如:
>>> net.activate([0, 0])
4.
>>> net.activate([4, 4])
4.
我认为我做错了。也许有更好的图书馆?我不需要比我写的更多的东西。
答案 0 :(得分:0)
问题在于:
<强> trainer.train()强>
此调用训练网络一个完整的纪元,并返回与错误成比例的双倍。如果我们想要训练网络直到收敛,还有另一种方法:
<强> trainer.trainUntilConvergence()强>
import numpy as np
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets.supervised import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
c_0 = [(0, 0), (1, 1), (0,1)]
c_1 = [(5, 5), (6, 6), (10, 10)]
c_2 = [(20, 20), (23, 23), (25, 25)]
net = buildNetwork(2, 3, 1, bias=True)
new_params = np.array([1.0]*13)
net._setParameters(new_params)
ds = SupervisedDataSet(2, 1)
for point in c_0:
ds.addSample(point, 0)
for point in c_1:
ds.addSample(point, 1)
for point in c_2:
ds.addSample(point, 2)
trainer = BackpropTrainer(net, ds)
trainer.trainUntilConvergence()
print(net.activate([-1, -1])) # [-0.09622381] ~0 - classify for cluster 0
print(net.activate([7, 7])) # [ 0.95804033] ~1 - classify for cluster 1
print(net.activate([26, 26])) # [ 2.04101203] ~2 - classify for cluster 2