【问题标题】:Neural network for bidding in a card game using Encog使用 Encog 在纸牌游戏中出价的神经网络
【发布时间】:2016-08-13 21:54:22
【问题描述】:

我想使用 Encog 在此 link 的数据上训练神经网络。有 17 个输入特征(2 个数字特征,15 个分类特征)和 2 个输出特征(都是分类特征)。

我想创建一个基本的前馈网络来解决这个问题,但到目前为止我的努力未能收敛。我的网络设计是:

  • 输入层:57 个节点
    • A-B 列得分的 2 个节点
    • 3 个节点用于 C-E 列中的先前出价(使用 -1 表示无,0 表示通过,2 表示二,3 表示三)
    • G-Q 列中 6 个卡的 52 个节点(在“六热”向量中)
  • 隐藏层:104 个节点(只是基于 2 * 57 的猜测)
  • 输出层:13 个节点(3 个未通过投标 * 4 花色 + 1 个通过投标)

我使用 tanh 作为激活函数并启用了偏置节点。创建此网络的调用(在 C# 中)是:

Encog.Util.Simple.EncogUtility.SimpleFeedForward(nInputs, nHidden, 0, nOutputs, true)

我是神经网络的新手,所以我真的不知道如何处理这个问题。到目前为止,我一直在使用试错法,但我希望有更好的方法。谢谢。

【问题讨论】:

    标签: c# neural-network encog


    【解决方案1】:

    我在下面的代码中输入了您的数据。我遇到了培训错误,我会看看能否解决问题。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.OleDb;
    using System.IO;
    
    
    using Encog.Neural.Networks;
    using Encog.Neural.Networks.Layers;
    using Encog.Engine.Network.Activation;
    using Encog.ML.Data;
    using Encog.Neural.Networks.Training.Propagation.Resilient;
    using Encog.ML.Train;
    using Encog.ML.Data.Basic;
    using Encog;
    using System.Data;
    using System.Data.OleDb;
    using System.IO;
    
    
    namespace encog_sample_csharp
    {
        internal class Program
        {
            /// <summary>
            /// Input for the XOR function.
            /// </summary>
            const string FILENAME = @"c:\temp\BidTraining.csv";
    
            static DataTable dt = null;
            private static void Main(string[] args)
            {
    
                CSVReader reader = new CSVReader();
                DataSet ds = reader.ReadCSVFile(FILENAME, true);
                dt = ds.Tables["Table1"];
    
    
                // create a neural network, without using a factory
                var network = new BasicNetwork();
                network.AddLayer(new BasicLayer(null, true, 17));
                network.AddLayer(new BasicLayer(new ActivationSigmoid(), false, 2));
                network.Structure.FinalizeStructure();
                network.Reset();
                Dictionarys dict = new Dictionarys();
    
                // create training dat
                IMLDataSet dataSet = dict.GetDataSet(dt);
    
                // train the neural network
                IMLTrain train = new ResilientPropagation(network, dataSet);
    
                int epoch = 1;
    
                do
                {
                    train.Iteration();
                    Console.WriteLine(@"Epoch #" + epoch + @" Error:" + train.Error);
                    epoch++;
                } while (train.Error > 0.01);
    
                train.FinishTraining();
    
                // test the neural network
                Console.WriteLine(@"Neural Network Results:");
                foreach (IMLDataPair pair in dataSet)
                {
                    IMLData output = network.Compute(pair.Input);
                    Console.WriteLine(pair.Input[0] + @"," + pair.Input[1]
                                      + @", actual=" + output[0] + @",ideal=" + pair.Ideal[0]);
                }
    
                EncogFramework.Instance.Shutdown();
            }
        }
        public class Dictionarys
        {
            public double[][] inputNeurons;
            public double[][] outputNeurons;
            public static Dictionary<string, double> bid = new Dictionary<string, double>(){
                 {"None", -1.0},
                 {"Pass", 0.0},
                 {"One", 1.0},
                 {"Two", 2.0},
                 {"Three", 3.0},
                 {"Four", 4.0},
                 {"Five", 5.0},
                 {"Six", 6.0}
            };
            public static Dictionary<string, double> rank = new Dictionary<string, double>() {
                {"Ace", 1.0},
                {"Two", 2.0},
                {"Three", 3.0},
                {"Four", 4.0},
                {"Five", 5.0},
                {"Six", 6.0},
                {"Seven", 7.0},
                {"Eight", 8.0},
                {"Nine", 9.0},
                {"Ten", 10.0},
                {"Jack", 11.0},
                {"Queen", 12.0},
                {"King", 13.0}
            };
            public static Dictionary<string, double> suit = new Dictionary<string, double>() {
                {"None",-1.0},
                {"SuitA",1.0},
                {"SuitB",2.0},
                {"SuitC",3.0},
                {"SuitD",4.0}
            };
    
            public IMLDataSet GetDataSet(DataTable dt)
            {
                inputNeurons = dt.AsEnumerable().Select(x => new[] {
                    (double)x.Field<int>(0),
                    (double)x.Field<int>(1),
                    bid[x.Field<string>(2)],
                    bid[x.Field<string>(3)],
                    bid[x.Field<string>(4)],
                    rank[x.Field<string>(5)],
                    suit[x.Field<string>(6)],
                    rank[x.Field<string>(7)],
                    suit[x.Field<string>(8)],
                    rank[x.Field<string>(9)],
                    suit[x.Field<string>(10)],
                    rank[x.Field<string>(11)],
                    suit[x.Field<string>(12)],
                    rank[x.Field<string>(13)],
                    suit[x.Field<string>(14)],
                    rank[x.Field<string>(15)],
                    suit[x.Field<string>(16)]
                }).ToArray();
    
                outputNeurons = dt.AsEnumerable().Select(x => new[] {
                    bid[x.Field<string>(17)],
                    suit[x.Field<string>(18)]
                }).ToArray();
    
                IMLDataSet trainingSet = new BasicMLDataSet(inputNeurons, outputNeurons);    
                return trainingSet;
            }
    
    
        }
        public class CSVReader
        {
    
            public DataSet ReadCSVFile(string fullPath, bool headerRow)
            {
    
                string path = fullPath.Substring(0, fullPath.LastIndexOf("\\") + 1);
                string filename = fullPath.Substring(fullPath.LastIndexOf("\\") + 1);
                DataSet ds = new DataSet();
    
                try
                {
                    if (File.Exists(fullPath))
                    {
                        string ConStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" + ";Extended Properties=\"Text;HDR={1};FMT=Delimited\\\"", path, headerRow ? "Yes" : "No");
                        string SQL = string.Format("SELECT * FROM {0}", filename);
                        OleDbDataAdapter adapter = new OleDbDataAdapter(SQL, ConStr);
                        adapter.Fill(ds, "TextFile");
                        ds.Tables[0].TableName = "Table1";
                    }
                    foreach (DataColumn col in ds.Tables["Table1"].Columns)
                    {
                        col.ColumnName = col.ColumnName.Replace(" ", "_");
                    }
                }
    
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                return ds;
            }
        }
    }
    

    【讨论】:

    • 代码有效,但训练永远循环。我没有使用 SimpleFeedForward(),它可能比 Encog 网页上的示例代码训练得更好。我认为我遇到了与您相同的收敛错误。
    • 我的代码正在收敛~2。如果您更改 while 循环条件(train.Error > 2.1 而不是 0.01),您可能会得到结果。我基于代码的示例是执行 100% 定义的异或。您的输入不是 100% 定义的,因此收敛数更高。随着越来越多的出价被添加到输入中,训练误差应该会下降..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2017-06-07
    • 2013-11-19
    • 2012-10-18
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多