github资源地址:[Release-x86/x64]
上一篇:轻量级C++神经网络应用库CreativeLus:1、库介绍。案例:简单sin函数逼近。
下一篇:轻量级C++神经网络应用库CreativeLus:3、复杂函数逼近。案例:多输入混合逼近。
案例2:平面点2分类问题
本章将介绍以下几个新的使用方法:
1、对样本数据的保存及读取,对训练好的模型的保存及读取;
2、启动多线程支持,加速你的训练模型;
3、动态的实时输出训练时的图形结果;(按每一训练周期做一次输出更新的方式)
4、将图形和曲线结果保存到外部Bitmap图形文件中;
5、将模型的计算内核和训练扩展脱开,释放训练扩展占用的内存,仅保留预测部分。
问题介绍:
我们在三位空间中 x y z方向中取x,y在0,1之间,z取0,取一定数量的随机三维点,保证全部落在0,1的xy平面内。在该[0,1]xy平面范围内构造两个多段线封闭区域R1和R2(该区域是任意定义的,他们之间可能存在交集),若点ptx属于R1则对应的分类标记记作1,反之为0,则对每一个点ptx={x,y,z},他存在一个唯一的2分类标记集T={t1,t2}。以此构建数据映射样本集和测试集。
R1={ {0.1,0.1,0},{0.32,0.1,0},{0.56,0.55,0},{0.25,0.25,0},{0.29,0.88,0},{0.1,0.76,0} };
R2={ {0.38,0.13,0},{0.66,0.13,0},{0.66,0.90,0},{0.15,0.90,0}, {0.15,0.65,0},{0.65,0.38,0} };
分类区域如下:(由图像可知,这仍然是一个非线性问题)
测试代码:
#include <stdio.h>
#include <string>
#include <vector>
#include <map>
#include "CreativeLus.h"
#include "CreativeLusExTools.h"
using namespace cl;
int main() {
printf("\n案例2:平面区域分类 \n\n");
string pathTag = ("D:\\Documents\\Desktop\\example_01_classify\\"); //输出目录
//第一步:构造数据样本集------------------------
//空间点坐标定义域范围在 [ 0 , 1 ] 内
const Float r1 = 0, r2 = 1;
//构造平面分类区域。(CLSpace::Polygon定义在 CreativeLusExTools.h 中)
CLSpace::Polygon R1 = {
{
0.1,0.1,0},{
0.32,0.1,0},{
0.56,0.55,0},{
0.25,0.25,0},{
0.29,0.88,0},{
0.1,0.76,0} };
CLSpace::Polygon R2= {
{
0.38,0.13,0},{
0.66,0.13,0},{
0.66,0.90,0},{
0.15,0.90,0}, {
0.15,0.65,0},{
0.65,0.38,0} };
//构造逻辑:采用3输入,2输出样本对,表示空间3维点是否属于两个平面区域poly或poly2,若属于,则对应的分类为1,否则为0,将所有点的z置0,转化为平面点
Float x = 0, y = 0, z = 0, t1 = 0, t2 = 0;
BpnnSamSets sams, tags;
size_t si = 10000;//训练样本数
for (size_t i = 0; i < si; i++)
{
// CLSpace::pointIsInPolygon()方法判断某个点是否在一个多段线封闭范围内
#define INPUT_DATA_CLASSIFY \
x = rand_f_a_b(r1, r2), y = rand_f_a_b(r1, r2), z = 0;\
t1 = CLSpace::pointIsInPolygon({ x,y,z }, R1) ? (1.0) : (0.0);\
t2 = CLSpace::pointIsInPolygon({ x,y,z }, R2) ? (1.0) : (0.0);
INPUT_DATA_CLASSIFY;
sams.