2

これは PyBrain Google グループからの再投稿です: https://groups.google.com/forum/#!topic/pybrain/J9qv0nHuxVY

私は OpenNN と FANN をいじくり回してきましたが、必要なことを行う ANN ライブラリをまだ見つけていません。

これを短期目標と中期目標に分けて説明しますが、最初に少し背景を...

バックグラウンド

ANN を使用して、時間の経過とともに変化する 1000 ~ 2000 項目のベクトルの時系列予測を行いたいと考えています。各要素は、特定の時点でのコンピューター ビジョン システム内のビジュアル プロパティのクラスターの存在を表すブール値です。

アイデアは、ネットワークに時間 t-1 のベクトルを、時間 t のベクトルをターゲット値として供給することです。

ネットワークの出力は、ベクトルの前の状態 (t-1) に基づいて、現在の時間 (t) に何が起こると予想されるかの予測になります。

短期

これらのベクトルを時間の経過とともに予測することを学習できるように、ANN をトレーニングしたいと思います。つまり、任意のベクトルをフィードしたいのですが、次に期待するように訓練されたベクトルを返します。今のところ、有限のデータセットを使用しても問題ありません。通常のエポック学習から始めることを期待しています。入力とターゲットが 1 単位時間オフセットされている通常の教師ありデータ セットから始めます。https://groups.google.com/forumで説明されているように、これまでのところ、MSE リターンに関して FANN で得ることができたほど良い結果を示していません (最初のエポック後にエラーの大幅な減少はありません) 。 /#!topic/pybrain/QSfVHsFRXz0 .

FANN では、1026 個の入力、103 個の非表示、および 1026 個の出力を持つ単純な MLP を使用していました。ブール入力は -1 から 1 にスケーリングされ、重みは -1 から 1 の間のランダムな値に初期化されました (これは、0 から 1 よりも負の値の方が明らかに学習が速いためです)。ネットワークは入力パターンを非常によく再現しており、最終的に小さな MSE になりました。

PyBrain では、これはコードの現在のバージョンです。

#!/usr/bin/python
# First try and using pyBrain for building an ANN. We'll start with an MLP for obvious reasons.

from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.validation import ModuleValidator
import pickle, time

# Load the dataset (parse data)
print "Loading and parsing dataset..."
inputFile = open("../MLP/data/113584_backgroundState-filter-1.fann", 'r')
rawData = inputFile.readlines()
inputFile.close()
processedData = list()
for inputLine in rawData[1:]: # all but last element.
    data = inputLine.split() # Slicing to strip off the final newline
    scaleData = list()
    for item in data:
        scaleData.append(int(item))
    processedData.append(scaleData)

# Create dataset from parsed data
inputData = SupervisedDataSet(1027, 1027)
for index in xrange(0,len(processedData)-1,2): # every second line.
    inputData.addSample(processedData[index], processedData[index+1])

del processedData # no longer needed

# Build the same network as in FANN
net = buildNetwork(1027, 103, 1027, bias=True)

# Train the network
print "Training network..."
trainer = BackpropTrainer(net, inputData, verbose = True)
for i in xrange(5):
    startTime = time.time()
    error = trainer.train()
    print "ERROR " + str(i) + " " + str(error) # test network (calculate error)
    print "ProcessingTime " + str(i) + " " + str(time.time() - startTime)

# save results.
print "Saving network..."
fileObject = open('network.pybrain', 'w')
pickle.dump(net, fileObject)

# For each input pattern, what is the output?
# Compatible with FANN output
print "Testing network and generating results..."
i = 0;
for inputPattern in inputData['input']:
    outputPattern = net.activate(inputPattern)
    for j in xrange(len(inputPattern)):
        print "RESULT " + str(i) + " " + str(j) + " " + str(inputPattern[j]) + " " + str(outputPattern[j])
    i += 1

print "Done."

これを学習用に最適に設定する方法に関する推奨事項はありますか? (再帰が必要になると思いますが、PyBrain を単純な MLP を使用した以前の FANN の結果と比較したかったのです。)

私は実際に recurrent=True でこのネットワークを構築しようとしましたが、すべてのテストで python は使用可能なすべての RAM を使用してクラッシュしました (このマシンには 8GB の RAM があります)。メモリフットプリントを大幅に増加させずに再実行を有効にする方法がわかりません。

中期

最終的には、システムはオンラインで実行され、入力がオンザフライで供給され、常に変化する必要があります。これは、エポック トレーニングが不可能であることを意味するため、学習アルゴリズムの反復を 1 回実行できる必要があります。ANN が学習するのは難しいと思いますが、幸いなことに、データ ポイント (少なくとも 100,000 秒) が不足することはありません。データの固定セットがないため、収束の必要はありません。新しいパターンや安定したパターンが提示されると、誤差が増減することが予想されます。

コメントや提案をありがとう。

4

0 に答える 0