2013-11-12 7 views
0

Я работаю над доказательством основных результатов нейронной сети и до сих пор не смог. Я делаю проблему с отправкой вперед xor в encog и экспортирую конечные веса и вычисляемый вывод.Proofing encog xor results in excel

Для доказательства у меня просто есть лист Excel, в который вводятся веса, тогда I1 * W1 + I2 * W2 | I1 * W3 + I2 * W4 к скрытому слою, затем сигмоидная активация для каждого, затем H1 * W5 + H2 * W6, затем сигмоид снова для выхода.

Так что никакого смещения, просто базового 2x2x1, но выходные значения, которые я получаю после того, как я подключу весы, не имеют близких к ожидаемым выходным значениям, которые я получаю с помощью encog.

У меня есть 8 выходных наборов из encog для тестирования, но до сих пор я не соглашаюсь с теми же выводами. Любая помощь будет оценена по достоинству.

Ниже приведен пример вывода, если это было бы полезно. Спасибо, Израиль

Выходные Веса

61.11812639080170, -70.09419692460420, 2.58264325902522, 2.59015713019213, 1.16050691499417, +1,16295830927117

выходные значения

+0,01111771776254, 0.96929877340644, 0.96926035361899, +0,04443376315742

В excel, вот что я использую для сигмовидной функции: = 1/(1 + EXP (-1 * (C3))), не знаю, поможет ли больше, поскольку это просто добавление и умножение вне сигмовидной.

Вот Form1.cs:

using Encog.Engine.Network.Activation; 
using Encog.ML.Data.Basic; 
using Encog.Neural.Networks; 
using Encog.Neural.Networks.Layers; 
using Encog.Neural.Networks.Training.Propagation.Resilient; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Encog_Visual 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      double[][] XOR_Input = 
      { 
       new[] {0.0,0.0}, 
       new[] {1.0,0.0}, 
       new[] {0.0,1.0}, 
       new[] {1.0,1.0} 
      }; 

      double[][] XOR_Ideal = 
      { 
       new[] {0.0}, 
       new[] {1.0}, 
       new[] {1.0}, 
       new[] {0.0} 
      }; 

      var trainingSet = new BasicMLDataSet(XOR_Input, XOR_Ideal); 

      BasicNetwork network = CreateNetwork(); 

      var train = new ResilientPropagation(network, trainingSet); 

      int epoch = 0; 
      do 
      {   
       train.Iteration(); 
       epoch++; 
       string result0 = String.Format("Iteration No :{0}, Error: {1}", epoch, train.Error); 
       textBox1.AppendText(result0 + Environment.NewLine); 
      } while (train.Error > 0.001); 


      foreach (var item in trainingSet) 
      { 
       var output = network.Compute(item.Input); 
       string result1 = String.Format("Input : {0}, {1} Ideal : {2} Actual : {3}", item.Input[0], item.Input[1], item.Ideal[0], output[0]); 
       textBox1.AppendText(result1 + Environment.NewLine + network.DumpWeights() + Environment.NewLine); 
      }   


     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private static BasicNetwork CreateNetwork() 
     { 
      var network = new BasicNetwork(); 
      network.AddLayer(new BasicLayer(null, false, 2)); 
      network.AddLayer(new BasicLayer(new ActivationSigmoid(), false, 2)); 
      network.AddLayer(new BasicLayer(new ActivationSigmoid(), false, 1)); 
      network.Structure.FinalizeStructure(); 
      network.Reset(); 
      return network; 
     } 

     private void textBox2_TextChanged(object sender, EventArgs e) 
     { 

     } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 

     } 


    } 


} 
+0

Какой у вас код на данный момент? Трудно понять, что может быть проблемой, не видя, что вы делаете. –

+0

Добавил my form1.cs в исходное сообщение, и то, что я использую для сигмоида в excel, дайте мне знать, если больше информации будет полезно, спасибо! – Israel

+0

Вот еще один пример, о ближайшей вещи, которую я нашел в качестве доказательства: http://www.generation5.org/content/2001/xornet.asp Эта сеть немного отличается, поскольку она имеет 1 смещение на нейрон, но в excel Я переделал свои расчеты, включив в них предвзятость. До точки первого выхода (до обучения) у меня такой же выход: 0,367610, но как только я подключу его последние весы, я не получаю нигде близко к его выходу. Почти такая же стена, с которой я сталкиваюсь с моей первоначальной проблемой. – Israel

ответ

0

В случае, если кто натыкается на это в будущем.

Выходного веса от Encog является layerN Нейрон: 0,1, п, смещение, вплоть до layer0 нейрона: 0,1, п, смещение

выяснения надлежащего вывода, чтобы кормить обратно в функцию, я был способен проверить его должным образом в соответствии с данным выходом.

2

я наткнуться на это, и получил здесь, и я думаю, что есть ответ осталось быть детализирована:

Да, на самом деле, это занимает много времени, чтобы выяснить, к какому слою принадлежит каждый вес, учитывая, что слои, кажется, быть пронумерованы с различными критериями в пределах Encog Framework.

Например, если вы пишете какой-то код, например: networkName - это все, что вы хотите назвать своим (например, «XOR_one»). Тогда вы можете вызвать эту функцию из вашего main public Form1(), после цикла обучения сети, добавив одну строку: saveNetwork("XOR_one");, а затем ...

public DirectoryInfo dataDirRoot; 
public FileInfo dataFileRoot; 
public StreamWriter fileWriteSW; 

public bool saveNetwork(string networkName) 
{ 
    try 
    { 
     // File data initialized 
     if (dataDirRoot == null) dataDirRoot = new DirectoryInfo(Application.StartupPath + "\\Data"); 
     if (!dataDirRoot.Exists) dataDirRoot.Create(); 

     dataFileRoot = new FileInfo(dataDirRoot + "\\" + networkName + ".weights.txt"); 
     fileWriteSW = new StreamWriter(dataFileRoot.FullName, false, Encoding.Default); 

     // (A) Write down weights from left to right layers, meaning input first and output last. 
     // ...within each layer, weights are ordered up-down, always, in all three methods. 
     for (int j = 0; j < network.LayerCount-1; j++) 
     { 
      for (int l = 0; l < network.GetLayerNeuronCount(j + 1); l++) 
      { 
       for (int k = 0; k < network.GetLayerTotalNeuronCount(j); k++) 
       { 
        fileWriteSW.Write(network.GetWeight(j, k, l).ToString("r") + ", "); 
       } 
       fileWriteSW.Write("\r\n"); 
      } 
     } 
     fileWriteSW.Write("\r\n\r\n"); 

     // (B) Write down weights from left to right layers, output first, input last 
     double[] auxDouble = new double[network.EncodedArrayLength()]; 
     network.EncodeToArray(auxDouble); 

     for (int j = 0; j < network.EncodedArrayLength(); j++) 
     { 
      fileWriteSW.Write(auxDouble[j] + "\r\n"); 
     } 
     fileWriteSW.Flush(); 
     fileWriteSW.Close(); 

     // (C) Write down network structure 
     // ...you will find that "weights" in the same order as with "DumpWeights()" 
     dataFileRoot = new FileInfo(dataDirRoot + networkName + ".encog.txt"); 
     Encog.Persist.EncogDirectoryPersistence.SaveObject(dataFileRoot, network); 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show("Error: " + e.Message); 
     return false; 
    } 
    return true; 
} 

Важно: Это действительно трудно обучить сеть XOR без смещения скрытый слой, поэтому результаты, которые я показываю, имеют еще два веса, чем ваш пример.Это может быть достигнуто путем изменения одной строки в коде:

... network.AddLayer(new BasicLayer(null, false, 2));

в network.AddLayer(new BasicLayer(null, true, 2));

... для того, чтобы дать ввод веса в скрытом слое. Нейроны в скрытом слое будут иметь по три веса каждый. Один поступает из входов нейрона 1, другой из входов нейрона 2 и третьего - из нейронного смещения (который указан как «третий нейрон» во входном слое, имеющий значение, установленное в 1.0).

Итак: сложная вещь здесь, какой слой следует называть «слой 0».

В случае (A) слой 0 является слоем ввода, первым слева, а весы сбрасываются с первого скрытого слоя (поскольку вход не имеет веса), нейрон от 0 до 1, а затем выходной уровень , neuron 0.

Но в случае (B) и (C) и «DumpWeights()» уровень 0 является первым справа, что означает выходной слой, а весы сбрасываются влево и влево, вниз в каждом слое.

Всегда, внутри каждого слоя, весы сбрасываются по порядку, от Neuron от 0 до n и внутри каждого нейрона - вес, исходящий от верхнего нейрона на слое слева от последнего нейрона или смещения, если он существует на левый слой.

выходных весов результатов является чем-то вроде этого:

Case (A) 
-3.61545321823196, -2.7522256580709645, 3.509680820551957, 
-7.2744584719809806, -6.05682131778526, 7.6850785784618676, 
-35.025902985103983, 31.763309640942925, 

Case (B) 
-35.025902985104 
31.7633096409429 
-3.61545321823196 
-2.75222565807096 
3.50968082055196 
-7.27445847198098 
-6.05682131778526 
7.68507857846187 

Позволяет видеть то:

**Output Layer** (being it called 0 or N... you decide, I prefer N) 
**Neuron 0** (the only one there) 
weight 2,0,0 = -35.025902985104 (where 2 is layer, 0 is first neuron in hidden layer and 0 is output neuron) 
weight 2,1,0 = 31.7633096409429 

**Hidden Layer** (I choose 1) 
**Neuron 0** (first one) 
weight 1,0,0 = -3.61545321823196 (where 1 is layer, 0 is first neuron in input layer and 0 is this neuron) 
weight 1,1,0 = -2.75222565807096 
weight 1,2,0 = 3.50968082055196 
**Neuron 1** (last one) 
weight 1,0,1 = -7.27445847198098 
weight 1,1,1 = -6.05682131778526 
weight 1,2,1 = 7.68507857846187 (where 1 is layer, 2 is bias in input layer and 1 is this neuron) 

Обратите внимание, что: ваш пример в этом вопросе был результат DumpWeights(): 61.11812639080170, -70.09419692460420, 2.58264325902522, 2.59015713019213, 1.16050691499417, 1.16295830927117

Он соответствует корпусу (B), разделен только запятой. Первые два числа относятся к выходному нейрону, а последние относятся к третьему и четвертому относятся к 1-му нейрону, скрытому слою и пятому и шестому относятся к 2-му нейрону, скрытому слою.

Я в том числе здесь CSV для примера Excel, используя свои данные:

,,=+A2,2.58264325902522,,,,,,, 
0,,=+A4,2.59015713019213,=C1*D1+C2*D2,=1/(1+EXP(-1*(E2))),,,,, 
,,=+A2,1.16050691499417,,,,=+F2,61.1181263908017,, 
0,,=+A4,1.16295830927117,=C3*D3+C4*D4,=1/(1+EXP(-1*(E4))),,=+F4,-70.0941969246042,=H3*I3+H4*I4,=1/(1+EXP(-1*(J4))) 
,,,,,,,,,, 
,,=+A7,2.58264325902522,,,,,,, 
1,,=+A9,2.59015713019213,=C6*D6+C7*D7,=1/(1+EXP(-1*(E7))),,,,, 
,,=+A7,1.16050691499417,,,,=+F7,61.1181263908017,, 
0,,=+A9,1.16295830927117,=C8*D8+C9*D9,=1/(1+EXP(-1*(E9))),,=+F9,-70.0941969246042,=H8*I8+H9*I9,=1/(1+EXP(-1*(J9))) 
,,,,,,,,,, 
,,=+A12,2.58264325902522,,,,,,, 
0,,=+A14,2.59015713019213,=C11*D11+C12*D12,=1/(1+EXP(-1*(E12))),,,,, 
,,=+A12,1.16050691499417,,,,=+F12,61.1181263908017,, 
1,,=+A14,1.16295830927117,=C13*D13+C14*D14,=1/(1+EXP(-1*(E14))),,=+F14,-70.0941969246042,=H13*I13+H14*I14,=1/(1+EXP(-1*(J14))) 
,,,,,,,,,, 
,,=+A17,2.58264325902522,,,,,,, 
1,,=+A19,2.59015713019213,=C16*D16+C17*D17,=1/(1+EXP(-1*(E17))),,,,, 
,,=+A17,1.16050691499417,,,,=+F17,61.1181263908017,, 
1,,=+A19,1.16295830927117,=C18*D18+C19*D19,=1/(1+EXP(-1*(E19))),,=+F19,-70.0941969246042,=H18*I18+H19*I19,=1/(1+EXP(-1*(J19))) 
,,,,,,,,,, 
DumpWeights() = ,,,,,,,,,, 
"61.11812639080170, -70.09419692460420, 2.58264325902522, 2.59015713019213, 1.16050691499417, 1.16295830927117",,,,,,,,,, 

Это должно сделать это :)

(для записи, я использовал Encog v3.2.0)