0

Этот вопрос относится к C#'s Lunar Lander Example, полученному в репозитории Encog. Как видно из примера, я использую NeuralSimulatedAnnealing тренировать свою многослойную с прогнозированием сети (50 эпоха-х)Encog Lunar Lander Extended

BasicNetwork network = CreateNetwork(); 

IMLTrain train; 
train = new NeuralSimulatedAnnealing(network, new PilotScore(), 10, 2, 100); 

_

public static BasicNetwork CreateNetwork() { 
    var pattern = new FeedForwardPattern {InputNeurons = 3}; 
    pattern.AddHiddenLayer(50); 
    pattern.OutputNeurons = 1; 
    pattern.ActivationFunction = new ActivationTANH(); 
    var network = (BasicNetwork) pattern.Generate(); 
    network.Reset(); 
    return network; 
} 

пример работает отлично и нейронная пилот точно узнает, как посадить космический корабль в данных условиях, однако я хочу чего-то большего!

Для этого я создал класс глобал, такие как ниже, а также модифицированные строки в классе LanderSimulator

namespace Encog.Examples.Lunar 
{ 
    class globals 
    { 
     public static int fuelConsumption { get; set; } 
    } 
} 

_

public void Turn(bool thrust){ 
    Seconds++; 
    Velocity -= Gravity; 
    Altitude += Velocity; 

    if (thrust && Fuel > 0) 
    { 
     Fuel-= globals.fuelConsumption; //changed instead of Fuel--; 
     Velocity += Thrust; 
    } 

    Velocity = Math.Max(-TerminalVelocity, Velocity); 
    Velocity = Math.Min(TerminalVelocity, Velocity); 

    if (Altitude < 0) 
     Altitude = 0; 
} 

Так что теперь в зависимости от fuelConsumption переменного топлива является потребляемый при каждом нажатии. Тогда я попытался с тремя различными значениями fuelConsumption и следующие были соответствующие лучшие результаты для отдельных сетей:

//NETWORK 1 
globals.fuelConsumption = 1; 
bestScore: 7986 

//NETWORK 2 
globals.fuelConsumption = 5; 
bestScore: 7422 

//NETWORK 3 
globals.fuelConsumption = 10; 
bestScore: 6921 

Когда я тестировал эти сети друг от друга результаты были неутешительными:

  • сеть 1 показал счет от -39591 и -39661, когда FuelConsumed составлял 5 и 10 соответственно.
  • Сеть 2 показала оценку -8832 и -35671, когда FuelConsumed был 1 и 10 соответственно.
  • Сеть 3 показала оценку -24510 и -19697, когда FuelConsumed составлял 1 и 5 соответственно.

Так что я попытался обучить одну единую сеть для всех трех сценариев, как показано ниже:

int epoch; 

epoch = 1; 
globals.fuelConsumption = 1; 
for (int i = 0; i < 50; i++){ 
    train.Iteration(); 
    Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error); 
    epoch++; 
} 
Console.WriteLine("--------------------------------------"); 

epoch = 1; 
globals.fuelConsumption = 5; 
for (int i = 0; i < 50; i++){ 
    train.Iteration(); 
    Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error); 
    epoch++; 
} 
Console.WriteLine("--------------------------------------"); 
epoch = 1; 
globals.fuelConsumption = 10; 
for (int i = 0; i < 50; i++){ 
    train.Iteration(); 
    Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error); 
    epoch++; 
} 

Console.WriteLine(@"The score of experienced pilot is:"); 
network = (BasicNetwork) train.Method; 

var pilot = new NeuralPilot(network, false); 
globals.fuelConsumption = 1; 
Console.WriteLine("@1: " + pilot.ScorePilot()); 
globals.fuelConsumption = 5; 
Console.WriteLine("@5: " + pilot.ScorePilot()); 
globals.fuelConsumption = 10; 
Console.WriteLine("@10: " + pilot.ScorePilot()); 

Но результаты опять тот же

The score of experienced pilot is: 
@1: -27485 
@5: -27565 
@10: 7448 

Как создать нейронную пилот, который даст мне лучший результат во всех трех сценариях?

ответ

0

Для решения этой проблемы я переключился на NEAT-сети, а не на традиционные каналы прямой или прямой передачи. Вот некоторые интересные изменения в коде.

NEATPopulation network = CreateNetwork(); 
TrainEA train = default(TrainEA); 

_

public static NEATPopulation CreateNetwork(){ 
    int inputNeurons = 3; 
    int outputNeurons = 1; 
    NEATPopulation network = new NEATPopulation(inputNeurons, outputNeurons, 100); 
    network.Reset(); 
    return network; 
} 

А затем после настройки некоторых параметров в NeuralPilot класса,

private readonly NEATNetwork _network; 

public NeuralPilot(NEATNetwork network, bool track) 

я должен был внести изменения в ScorePilot функции поскольку NEATNetoworks использовать SteepenedSigmoidActivation по умолчанию а не традиционные ActivationLinear или ActivatonTanH на выходе s

bool thrust; 

if (value > 0.5){  //changed from, if (value > 0){ 
    thrust = true; 
    if (_track) 
     Console.WriteLine(@"THRUST"); 
} 
else 
    thrust = false; 

Так что теперь обучение одной сети выглядит следующим образом:

OriginalNEATSpeciation speciation = default(OriginalNEATSpeciation); 
speciation = new OriginalNEATSpeciation(); 

int epoch; 
double best_1, best_5, best_10; 
best_1 = best_5 = best_10 = 0; 

train = NEATUtil.ConstructNEATTrainer(network, new PilotScore()); 
train.Speciation = speciation; 

epoch = 1; 
globals.fuelConsumption = 1; 
for (int i = 0; i < 50; i++){ 
    train.Iteration(); 
    Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error); 
    best_1 = train.Error; 
    epoch++; 
} 
Console.WriteLine("--------------------------------------"); 

train = NEATUtil.ConstructNEATTrainer(network, new PilotScore()); 
train.Speciation = speciation; 

epoch = 1; 
globals.fuelConsumption = 5; 
for (int i = 0; i < 50; i++){ 
    train.Iteration(); 
    Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error); 
    best_5 = train.Error; 
    epoch++; 
} 
Console.WriteLine("--------------------------------------"); 

train = NEATUtil.ConstructNEATTrainer(network, new PilotScore()); 
train.Speciation = speciation; 

epoch = 1; 
globals.fuelConsumption = 10; 
for (int i = 0; i < 50; i++){ 
    train.Iteration(); 
    Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error); 
    best_10 = train.Error; 
    epoch++; 
} 

Console.WriteLine(@"The score of experienced pilot is:"); 

NEATNetwork trainedNetwork = default(NEATNetwork); 
trainedNetwork = (NEATNetwork)train.CODEC.Decode(network.BestGenome); 

var pilot = new NeuralPilot(trainedNetwork, false); 
globals.fuelConsumption = 1; 
Console.WriteLine("@bestScore of " + best_1.ToString() +" @1: liveScore is " + pilot.ScorePilot()); 
globals.fuelConsumption = 5; 
Console.WriteLine("@bestScore of " + best_5.ToString() + " @5: liveScore is " + pilot.ScorePilot()); 
globals.fuelConsumption = 10; 
Console.WriteLine("@bestScore of " + best_10.ToString() + " @10: liveScore is " + pilot.ScorePilot()); 

Результаты идут рискованными! Ниже приведены некоторые результаты по случайных испытаний:

The score of experienced pilot is: 
@bestScore of 5540 @1: liveScore is -4954 
@bestScore of 1160 @5: liveScore is 3823 
@bestScore of 3196 @10: liveScore is 3196 

The score of experienced pilot is: 
@bestScore of 7455 @1: liveScore is 8227 
@bestScore of 6324 @5: liveScore is 7427 
@bestScore of 6427 @10: liveScore is 6427 

The score of experienced pilot is: 
@bestScore of 5322 @1: liveScore is -4617 
@bestScore of 1898 @5: liveScore is 9531 
@bestScore of 2086 @10: liveScore is 2086 

The score of experienced pilot is: 
@bestScore of 7493 @1: liveScore is -3848 
@bestScore of 4907 @5: liveScore is -13840 
@bestScore of 4954 @10: liveScore is 4954 

The score of experienced pilot is: 
@bestScore of 6560 @1: liveScore is 4046 
@bestScore of 5775 @5: liveScore is 3366 
@bestScore of 2516 @10: liveScore is 2516 

Как вы можете видеть мы не удалось получить положительный счет весь путь во втором сценарии, но там, кажется, не будет никакого отношения между окончательной сети производительность и начальные наилучшие оценки. Следовательно, проблема может быть решена, но не удовлетворительно.

+0

примечание это такой же ** сеть ** и ** speciation ** используются последовательно но over новый ** тренер ** каждый раз. Это логично правильно? – dexterslab

Смежные вопросы