说明:
1. 本软件在构建一个网络时, 使用了层, 变量, 任务的概念
2. 变量: 可以理解为一个一维向量或者二维数组, 主要的作用是存储优化的值
3. 层  : 层上具有节点(一个向量), 层上附加指定的函数动作, 其中层的输入可以是其它层, 也可以是变量, 或者层与变量之间的组合
4. 任务: 一个由多个层组成的全连接网络, 它包含一个输入与输出层, 其中网络可以由输入层传递到输出层
5. 求解器: 一个对梯度更新算法的黑箱
6. 优化器: 一个对网络进行优化的黑箱
7. 由于本软件以层来代替输入输出, 加之层上的数值只能为向量, 因此本软件仅支持一个向量输入以及一个向量输出的模型
8. 如果实际模型由多个向量输入组成, 可以将输入变为一个向量, 然后使用NetCreateLayer创建"GetPart"层将输入向量拆分处理即可.
9. 如果实际模型涉及到二维矩阵的操作, 比如卷积层的操作, 本软件可以使用NetCreateLayer创建"Convolution"层, 然后进行相应操作, 也可以达到对应效果.
10. 如果构建的模型为n分类问题, 则模型的最终输出必须是n个节点, 且节点值最大索引对应的输出为对应分类. 比如如果输出为[0.25, 0.98, 0.12], 那么表示预测的分类为0.98对应的索引类. 这点需要注意.


例子:

//1. 下面假如事先有测试数据集x与y, 其中x当中有2个变量, y只有一个变量, 现在使用一个网络来逼近y
x1 = {Rand<矩阵运算\rand>}(1.2, 100, 1);
x2 = {Rand<矩阵运算\rand>}(1.2, 100, 1);
y1 = {Abs<矩阵运算\abs>}({Sin<矩阵运算\sin>}({Sin<矩阵运算\sin>}(x1) * {Cos<矩阵运算\Cos>}(x2) * x1 * 1.6 + (x2 - x1)^2 * 1.5));
y2 = ({Cos<矩阵运算\Cos>}({Sin<矩阵运算\sin>}(x1) * {Cos<矩阵运算\Cos>}(x2) * x2 * 2.6 + (x2 - x1)^2 * 0.5)); 
x  = [x1, x2];
y  = [y1, y2];

//2. 创建多个连接层
inputlayer  = {NetCreateLayer<矩阵运算\NetCreateLayer>}("", 2); //输入层节点有2个,因此设置节点数为2
outputlayer = {NetCreateConnectLayer<矩阵运算\NetCreateConnectLayer>}(inputlayer, "GElU", 6, "SQNL", 4, "Mish", 2); //这里设置第2层为6节点的GElU函数, 第3层为4节点的SQNL函数, 最后一层为2个节点的Mish函数, 因为y有2个变量因此,这里最后一层节点数为2

/*
这里也可以按下面的方式进行创建,

//. 创建需要操作的函数层
inputlayer = NetCreateLayer("", 2);
layer1 = NetCreateLayer("W * x", 10);
layer2 = NetCreateLayer("x + a", 10);
layer3 = NetCreateLayer("Sigmod", 10);
layer4 = NetCreateLayer("W * x", 1);
layer5 = NetCreateLayer("x + a", 1);
outputlayer = NetCreateLayer("Sigmod", 1);

//. 创建连接各层需要优化的变量
w1 = NetCreateVar(10, 2);
b1 = NetCreateVar(10);
w2 = NetCreateVar(1, 10);
b2 = NetCreateVar(1);

//. 对各层进行网络连接
//. layer1 = w1 * inputlayer
NetLayerSetVar(layer1, w1);
NetLayerSetInput1(layer1, inputlayer);

//. layer2 = layer1 + b1
NetLayerSetVar(layer2, b1);
NetLayerSetInput1(layer2, layer1);

//. layer3 = Sigmod(layer2)
NetLayerSetInput1(layer3, layer2);

//. layer4 = w2 * layer3
NetLayerSetVar(layer4, w2);
NetLayerSetInput1(layer4, layer3);

//. layer5 = layer4 + b2
NetLayerSetVar(layer5, b2);
NetLayerSetInput1(layer5, layer4);

//. layer6 = Sigmod(layer5)
NetLayerSetInput1(layer6, layer5);
*/

//4. 创建一个网络任务并初始化网络
net = {NetCreateWork<矩阵运算\NetCreateWork>}();
{NetWorkInit<矩阵运算\NetWorkInit>}(net, inputlayer, outputlayer);

//5. 创建RAdma求解器, 其中学习速率为1
solver = {NetCreateSolver<矩阵运算\NetCreateSolver>}("RAdma", 1);

//6. 创建优化器并设置参数
opt = {NetCreateOptimier<矩阵运算\NetCreateOptimier>}();

//6.1 设置批处理数为32
{NetOptSetBatchNum<矩阵运算\NetOptSetBatchNum>}(opt, 32);

//6.2 设置最大迭代次数为1024000
{NetOptSetIterCount<矩阵运算\NetOptSetIterCount>}(opt, 1024000);

//6.3 使用误差平方和作为评估标准,其中终止误差设置为1e-12
{NetOptSetEvalBySquaredError<矩阵运算\NetOptSetEvalBySquaredError>}(opt, 1e-12);

//6.4 设置每迭代16次进行一次效果评估
{NetOptSetEvalCount<矩阵运算\NetOptSetEvalCount>}(opt, 16);

//6.5 训练数据不需要预处理
{NetOptSetPreprocess<矩阵运算\NetOptSetPreprocess>}(opt, 255);

//6.6 设置求解器
{NetOptSetSolver<矩阵运算\NetOptSetSolver>}(opt, solver);

//6.7 设置网络任务
{NetOptSetWork<矩阵运算\NetOptSetWork>}(opt, net);

//6.8 设置训练数据
{NetOptSetTrainData<矩阵运算\NetOptSetTrainData>}(opt, x, y);

//6.9 设置评估数据集, 这里因为只是演示, 因此直接使用训练集作为评估集
{NetOptSetEvalData<矩阵运算\NetOptSetEvalData>}(opt, x, y);

//7. 开始优化求解, 以1000ms的频次打印结果
{NetOptSolve<矩阵运算\NetOptSolve>}(opt, 1000);

//8. 优化结束后, 可以使用如下方式计算网络输出, 可以对比一下y与y1的数值
y1 = {NetWorkPredict<矩阵运算\NetWorkPredict>}(net, x);