Encog ライブラリを使用してニューラル ネットワークをトレーニングしようとしています。
(トレーニング (60%)、クロス検証 (20%)、テスト (20%) に) 分割する前のデータセット (〜 7000 例) は、次のように線形に正規化されます。
Min=-1.000000; Max=1.000000; Average=-0.077008
ターゲット (理想) データセット (これも線形正規化) は次のようになります。
Min=0.201540; Max=0.791528; Average=0.477080
私はこのようにネットワークを初期化します:
mNetwork = new BasicNetwork();
mNetwork.addLayer(new BasicLayer(null, false, trainingDataSet.getInputSize()));
mNetwork.addLayer(new BasicLayer(new ActivationSigmoid(), true, numberOfNeurons));
mNetwork.addLayer(new BasicLayer(new ActivationSigmoid(), false, trainingDataSet.getIdealSize()));
mNetwork.getStructure().finalizeStructure();
mNetwork.reset();
私はResilientPropagation
トレーナーを使用しています(同様に試しBackpropagation
ました):
ResilientPropagation training = new ResilientPropagation(mNetwork, mTrainingDataSet);
for (int i = 0; i < mNumberOfIterations; ++i) {
training.iteration();
result.trainingErrors[i] = mNetwork.calculateError(mTrainingDataSet);
result.validationErrors[i] = mNetwork.calculateError(mValidationDataSet);
System.out.println(String.format("Iteration #%d: error=%.8f", i, training.getError()));
}
training.finishTraining();
トレーニングの過程で、トレーナーによって報告されるエラーは一般的に減少しています。トレーニングが終了したら、ウェイトをダンプします。
0.04274211002929323,-0.5481902707068103,0.28978635361541294,-0.203635994176051,22965.18656660482,22964.992410871928,22966.23882308963,22966.355722230965,22965.036733143017,22964.894030965166,22966.002332259202,22965.177650526788,22966.009842504238,22965.971560546248,22966.257180159628,22966.234150681423,-21348.311232865744,-21640.843082085466,-21057.13217475862,-21347.52051343582,-21347.988714647887,-21641.161098510198,-21057.27275747668,-21348.784123049118,-21347.719149090022,-21639.773689115867,-21057.095487328377,-21348.269878600076,22800.304816865206,23090.894751729396,22799.39388588725,22799.72408290791,22800.249806096508,22799.19823789763,22799.85510732227,22799.99965531053,22799.574773588192,22799.57945236908,22799.12542315293,22799.523065957797
それらは通常、非常に大きいか、または非常に小さいです。シグモイドを使用すると、予測がいくつかの数値に収束することになります。たとえば、上記の重み (500 回の反復後に取得) は次のようになります。
Min=0.532179; Max=0.532179; Average=0.532179
ネットワークまたはトレーニングの構成に問題があるようです。私のネットワークが低分散に苦しんでいる場合、少なくとも目標範囲内の結果が生成されます。分散が大きい場合は、ターゲットに一致します。そして今、それはターゲットを完全に逃しています。
予測がかなり外れているにもかかわらず、エラーが減少し、かなり低くなるのはなぜですか? 上記の私の例で明らかな間違いを見た人はいますか? 私はまだニューラルネットワークの経験があまりありません。