1

PyBrain を使用して単純なニューラル ネットワークを作成しました。

from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

    L_Z = [
    0b111111,
    0b000010,
    0b000100,
    0b001000,
    0b010000,
    0b111111
    ]

C_Z = [
    0b111111,
    0b100001,
    0b000110,
    0b000001,
    0b100001,
    0b111111
    ]

net = buildNetwork(6, 3, 1)


ds = SupervisedDataSet(6, 1)

ds.addSample(tuple(L_Z), (1,))
ds.addSample(tuple(C_Z), (0,))

trainer = BackpropTrainer(net, ds)
trainer.trainUntilConvergence()


print net.activate(L_Z)
print net.activate(C_Z)

しかし、プログラムを実行するたびに異なる結果が表示されます。私のネットワークは、英語の「Z」文字とキリル文字の「З」文字を見つけることを学習する必要があります。なにが問題ですか?

4

2 に答える 2

2

あなたのアプローチは根本的に間違っています。6 つの入力を持つネットワークは、各入力が 0 から 1 までの浮動小数点数であることを意味します。たとえば、0b111111 は実際には 63 です。各検出セルに入力が必要な場合は、36 入力のネットワークを使用する必要があります。

L_Z = [
    1,1,1,1,1,1,
    0,0,0,0,1,0,
    0,0,0,1,0,0,
    0,0,1,0,0,0,
    0,1,0,0,0,0,
    1,1,1,1,1,1
    ]

 C_Z = [
    1,1,1,1,1,1,
    1,0,0,0,0,1,
    0,0,0,1,1,0,
    0,0,0,0,0,1,
    1,0,0,0,0,1,
    1,1,1,1,1,1
    ]

 net = buildNetwork(36, 3, 1)


 ds = SupervisedDataSet(36, 1)

 ds.addSample(L_Z, [1])
 ds.addSample(C_Z, [0])

 trainer = BackpropTrainer(net, ds)

 for x in range(1000):
  trainer.train()

 print net.activate(L_Z)
 print net.activate(C_Z)

.trainUntilConvergeance() が機能していることに驚いています。通常、検証用にデータの 1/4 を確保します。例を 2 つだけ挙げると、通常はクラッシュします。いずれにせよ、このコードは目的の結果を得るために機能しますが、コンピューター ビジョンを実行しようとしている場合は、一般的にさまざまなアプローチを組み合わせて検出します。

于 2014-01-29T20:29:50.143 に答える