private NeuralNetwork CreateNewNetwork() { //先创建一个神经网络 var network = new NeuralNetwork(); //创建一个全连接层,输出形状为(1, 10, 1),激活函数为Sigmoid //var d1 = new DenseLayer(new Shape(1, 10, 1), ActivationType.Sigmoid); //network.AddLayer(d1); //创建一个全连接层,输出形状为(1, 2, 1),注意这里是最后一层,输入形状要和你需要的输出对应,激活函数为Sigmoid var d2 = new DenseLayer(new Shape(1, 2, 1), ActivationType.Sigmoid); network.AddLayer(d2); //初始化参数 var initArgs = new NetworkInitializeArgs(); //输入形状 你的输入数据形状,这里是小车的demo,输入为射线的数量 initArgs.inputShape = new Shape(1, rayNum, 1); //权重的初始化范围 weight = Random.Range(-0.1f, 0.1f) initArgs.initWeightRange = (-0.1f, 0.1f); //偏执项的初始化范围 bias = Random.Range(-0.1f, 0.1f) initArgs.initBiasRange = (-0.1f, 0.1f); //初始化 network.Initialize(initArgs); return(network); }
// Start is called before the first frame update void Start() { var network = new NeuralNetwork(); var d1 = new DenseLayer(new Shape(1, 10, 1), ActivationType.Sigmoid); network.AddLayer(d1); var initArgs = new NetworkInitializeArgs(); initArgs.inputShape = new Shape(1, 28 * 28, 1); initArgs.initWeightRange = (-0.1f, 0.1f); initArgs.initBiasRange = (-0.1f, 0.1f); network.Initialize(initArgs); var trainArgs = new NeuralNetworkTrainArgs(); trainArgs.trainingData = ReadTrainingData(); //设置数据 trainArgs.trainingLabels = ReadTrainingLabels(); //设置标签 trainArgs.learningRate = 0.01f; //设置学习速率,越大学习的速度越快,但出现不收敛的可能性也越大 trainArgs.onOnceEpoch = (i) => { var accuracy = GetAccuracy(network, trainArgs.trainingData, trainArgs.trainingLabels); Debug.Log($"第{i}个训练回合, 准确率:{accuracy}"); }; trainArgs.trainEpoches = 100; //设置训练的回合数 network.Train(trainArgs); //开始训练 TestNetwork(network, trainArgs.trainingData, trainArgs.trainingLabels); }
public override void Initial(Shape inputShape, INeuralNetwork neuralNetwork, int layerIndex, NetworkInitializeArgs args) { this.inputShape = inputShape; this.neuralNetwork = neuralNetwork; this.layerIndex = layerIndex; _weights = new Tensor(1, outputShape.len1, inputShape.len1); _weights.FillWithRandomValue(args.initWeightRange.Item1, args.initWeightRange.Item2); _bias = new Tensor(1, outputShape.len1, 1); _bias.FillWithRandomValue(args.initBiasRange.Item1, args.initBiasRange.Item2); }