v1.1.8

easyAI是用来简易快速开发人工智能应用的JAVA引擎,也同时可以深度开发定制需求。本文档详细讲述本框架的所有即时更新版本内容, 详细列举部分主要内置API,内置参数,各种模式及应用,对于深度学习easyAI开发人员提供帮助。同时可以让企业低成本部署,快速应用落地,并降低人才门槛及费用。 点击可查看easyAi视频教程easyAi-1.1.8Maven包下载地址

快速开始

图像识别:
YoloConfig yoloConfig = new YoloConfig();//配置文件类;

配置文件类,这是一个用来保存学习过程中需要的各种参数,各种分类器参数及各种需要初始化的内部类。

private int windowWidth = 90;//检测框宽度
private int windowHeight = 140//检测框高度
private int typeNub = 10;//训练的类别种类数
private int enhance = 800//训练增强,训练样本数越少该值设置越大,训练样本数越多该值设置量越小,最小为1
private double iouTh = 0.05;//NMS合并框交并比阈值
private double containIouTh = 0.15;//判断是否包含样本交并比阈值
private double pth = 0.4;//可信概率阈值,超过该概率才认为检测区域内部有需要检测的内容

图片解析与图片训练

 Picture picture = new Picture();//图片解析类,用于将图片解析为三通道像素矩阵
 FastYolo yolo = new FastYolo(yoloConfig);//创建识别类

读取训练图片,进行图像训练

					///////////////训练部分
					YoloConfig yoloConfig = new YoloConfig();//创建配置参数类
					//配置类内的配置参数,根据实际情况修改
					private int windowWidth = 90;//检测窗口宽
					private int windowHeight = 140;//检测窗口高
					private int typeNub = 10;//需要识别的种类数
					private int hiddenNerveNub = 16;//线性层隐层神经元数量
					private double lineStudy = 0.01;//线性层学习率
					private int kernelSize = 3;//卷积核尺寸
					private boolean showLog = false;//是否打印学习过程中的log
					private double convStudy = 0.01;//卷积层学习率
					private int enhance = 800;//训练样本过少时增强效果,如果有足够训练数据量,请将其设置为1
					private double iouTh = 0.05;//NMS合并框交并比阈值
					private double containIouTh = 0.15;//训练时是否包含样本判断交并比阈值
					
					FastYolo yolo = new FastYolo(yoloConfig); //初始化图像识别类
					List<YoloSample> data//目标标注类集合
					YoloSample data;//标注类
					//标注类属性
					private String locationURL;//标注图片的本地url
					private List<YoloBody> yoloBodies;//该图片的内部标注
					YoloBody yoloBody;//内部标注类
					//内部标注类属性
					private int x;//目标左上角x的值
					private int y;//目标左上角得y的值
					private int width;//目标的宽度
					private int height;//目标的高度
					private int typeID;//标注类别id
					//开始训练
					yolo.toStudy(data);//训练耗时较长
                

学习完成提取模型,并将模型myModel序列化为JSON字符串形式保存

					YoloModel yoloModel = yolo.getModel();
					writeModel(JSON.toJSONString(yoloModel), "D:\\lesson/yoloModel.json");

服务启动初始化静态配置,并注入学习模型

					FastYolo yolo = new FastYolo(yoloConfig); //初始化图像识别类
					YoloModel yoloModel = readModelParameter();//从训练的模型中JSON反序列化读取模型
					yolo.insertModel(yoloModel);//识别类注入模型
                

识别过程

					//////////////////////识别部分
					long eventId;需要生成一个线程唯一id 保证识别时的线程安全,可直接用雪花算法id
					Picture picture = new Picture();//初始化图像解析类
					ThreeChannelMatrix th = picture.getThreeMatrix("D:\\lesson/number.png");//将图像解析为矩阵
					List<OutBox> list = yolo.look(th,eventId);//对该图像矩阵进行识别,并返回识别结果
                   

识别结果

				   List<OutBox> list;//识别结果集合
				   ////识别结果类
				   OutBox outBox;
				   private int x;//检测到物体在该图片中的横坐标
				   private int y;//检测到物体在该图片中的纵坐标
				   private int width;//检测到物体在该图片中的宽度
				   private int height;//检测到物体在该图片中的高度
				   private int typeID;//检测到物体在该图片中的类别id
              

图片摘要

FastPictureExcerpt fastPictureExcerpt = new FastPictureExcerpt();
String id = fastPictureExcerpt.creatImageName(threeChannelMatrix, 5, 10);
语义理解:

对语言训练模板中的语句进行词向量嵌入训练

 SentenceConfig sentenceConfig = new SentenceConfig();//语句训练配置类
 WordEmbedding wordEmbedding = new WordEmbedding();//word2Vec训练及生成器
 wordEmbedding.setConfig(sentenceConfig);//词向量装载配置参数类
 SentenceModel sentenceModel = new SentenceModel();//装载训练样本类
            for (Sentence sentence : sentences) {//读取模板语句
                sentenceModel.setSentence(sentence.getWord());
            }
wordEmbedding.init(sentenceModel, wordVectorDimension);//wordVectorDimension 设置词向量维度
WordTwoVectorModel wordTwoVectorModel = wordEmbedding.start();//word2Vec词向量嵌入训练器开始训练
String model = JSON.toJSONString(wordTwoVectorModel);//训练完毕 保存模型

语句模型训练

  //语句训练类,参数分别是上文的语句配置类,和训练完毕或者注入模型后的词向量嵌入生成器。	 	    
  RRNerveManager randomNerveManager =new RRNerveManager(getSentenceConfig(), getWordEmbedding(), true);
  Map<Integer, List<String>> model = new HashMap<>();//训练语句模板,主键是类别id,值是该类别id下所有模板语句
 RandomModel mySentenceModel = randomNerveManager.studyType(model);//开始学习
String sentenceModel = JSON.toJSONString(mySentenceModel);//学习完成保存模型

中文语句词嵌入及语义识别注入模型

SentenceConfig sentenceConfig = new SentenceConfig();//语句训练配置类
WordEmbedding wordEmbedding = new WordEmbedding();//word2Vec训练及生成器
wordEmbedding.insertModel(readWord2VecModel(),wordVectorDimension);//注入词嵌入模型,wordVectorDimension词向量维度与训练的词向量该参数保持一致
RRNerveManager randomNerveManager = new RRNerveManager(sentenceConfig, wordEmbedding,false);//中文语义分类器
randomNerveManager.insertModel(readSentenceModel());//注入中文语义分类模型
     

中文语句语义识别

String word ="识别语句";
RRNerveManager randomNerveManager = beanMangerOnly.getRRNerveManager();//单例化获取的注入过模型的中文语义识别器
Trust trust = randomNerveManager.getType(word, SnowflakeIdWorker.get().nextId());//获取结果 后者参数是一个用户线程,一个唯一id来保证线程安全
int type = trust.getKeys();//获取结果id type为类别id
     

中文语句语义配置参数说明

private SentenceModel sentenceModel;//语句训练模板
private int typeNub = 11;//语义分类种类数
private int wordVectorDimension = 21;//词向量嵌入维度
private int maxWordLength = 15;//最大识别单句长度
private double weStudyPoint = 0.01;//学习率
private double weLParam = 0.001;//正则系数
private int randomNumber = 11;//网络集群数量
private int nerveDeep = 6;//集群网络中每个rnn网络的深度
private boolean showLog = true;//是否打印学习过程
private int dateAug = 12000;//数据增广量
private int TopNumber = 1;//获取最有可能的语义结果数量
     

纯切词模式

wordTemple.setSplitWord(true);
List<List<String>> lists = talk.getSplitWord("空调坏了,帮我修一修");
for (List<String> list : lists) {
System.out.println(list);
}

捕捉用户输入语句的关键词

CatchKeyWord catchKeyWord = new CatchKeyWord();
List<KeyWordForSentence> keyWordForSentenceList = new ArrayList<>();
            for (Sentence sentence : sentences) {
                String word = sentence.getWord();//模板中的用户语句
                String keyWord = sentence.getNoun();//该用户语句中的关键词
                if (keyWord != null && keyWord.length() > 0) {//关键词必须存在
                    KeyWordForSentence keyWordForSentence = new KeyWordForSentence();
                    keyWordForSentence.setSentence(word);//输入语句
                    keyWordForSentence.setKeyWord(keyWord);//输入关键词
                    keyWordForSentenceList.add(keyWordForSentence);
                }
            }
catchKeyWord.study(keyWordForSentenceList);//进行关键词训练
KeyWordModel keyWordModel = catchKeyWord.getModel();//训练完毕获取模型并将其序列化以JSON字符串形式保存

对获取关键词类进行服务启动初始化

                    CatchKeyWord catchKeyWord = new CatchKeyWord();
                    catchKeyWord.insertModel(keyWordModel);//注入训练时的模型(通过JSON反序列化)

对用户输入语句的关键词进行捕捉

List<String> keyWords=catchKeyWord.getKeyWord(sen);//返回关键词集合

理解用户输入的语句并根据语义直接回复用户

没有模型文件,选择初始化后进行样本学习,学习完成序列化实体类保存模型文件。

List<TalkBody> sentences = new ArrayList();//语句回复训练样本
CustomManager customManager = beanMangerOnly.getCustomManager();//语句生成管理器
customManager.init();//管理器初始化
CreatorModel creatorModel = customManager.study(sentences, 1);//进行训练并返回模型
String model = JSON.toJSONString(creatorModel);//序列化模型文件并保存该文件

训练样本实体

public class TalkBody {//语句回复训练样本
		private String question;//问题
		private String answer;//回答问题
	}

有模型文件,则选择初始化后直接注入

CustomManager customManager = beanMangerOnly.getCustomManager();//语句生成管理器
customManager.init();//管理器初始化
customManager.insertModel(CreatorModel model);//若已有模型文件,则初始化管理器后,直接反序列化模型文件后注入管理器

完成初始化管理器,并注入模型后,用户输入语句进行回复

String word="广告可以退款么"//用户输入语句
long id=SnowflakeIdWorker.get().nextId();//用户线程唯一ID,用来负责线程安全,推荐雪花算法生成的id;
String answer = customManager.getAnswer(word, id);//返回回复语句

对用户输入的语句进行延伸

List<String> sentenceList = new ArrayList<>();//模板中所有语句集合
                    static{
                      将模板中所有语句集合注入到sentenceList当中
                    }
SentenceCreator creator =new SentenceCreator();//词句延伸类 需要服务启动时单例化
WordTemple wordTemple = new WordTemple();//同上文模板类需要服务启动时单例化
creator.initFirst(sentenceList, wordTemple);
creator.study();//进行训练
String myModel = JSONObject.toJSONString(creator.getModel());//训练完成将模型反序列化为JSON字符串保存
            

对语句延伸类进行初始化

CreatorSentenceModel model = JSONObject.parseObject(readPaper(file), CreatorSentenceModel.class);
creator.initModel(wordTemple, model);//注入语句延伸模型

若用户语句拆词数量过少,则对用户语句进行延伸生成新的语句

 List<String> words = talk.getSplitWord(sen).get(0);//对该词进行拆词
                if (words.size() < 3) {//拆词数量小于3,则对语句进行补全
                    String fillName = beanMangerOnly.sentenceCreator().fill(sen, talk);//补全语句
                    type = talk.talk(fillName).get(0);//对补全后的语句进行识别
                } else {
                    type = talk.talk(sen).get(0);//对原句进行识别
                }
             

分类工具

深度神经网络:
      //创建一个DNN神经网络管理器 包路径:org.wlld.nerveCenter
       /**
       * 初始化神经元参数,该参数设置都为线性层参数
       *
       * @param sensoryNerveNub 输入神经元个数
       * @param hiddenNerveNub  隐层神经元个数
       * @param outNerveNub     输出神经元个数
       * @param hiddenDepth     隐层深度
       * @param activeFunction  激活函数
       * @param studyPoint      线性分类器学习率
       * @param rzType          正则函数
       * @param lParam          正则系数
       * @throws Exception 如果参数错误则抛异常
	   */
	 public NerveManager(int sensoryNerveNub, int hiddenNerveNub, int outNerveNub, int hiddenDepth, ActiveFunction activeFunction,
	  double studyPoint, int rzType, double lParam)
	  /**
	  * 线性层初始化
	  *
	  * @param initPower 是否是第一次注入
	  * @param isShowLog 是否打印学习参数
	  * @param isSoftMax 最后一层是否用softMax激活
	  */
     public void init(boolean initPower, boolean isShowLog, boolean isSoftMax)//深度神经网络初始化
	 /**
     * 初始化卷积层神经网络
     *
     * @param step 卷积步长 建议为2
     * @param kernLen 卷积核大小 建议为3
     * @param xSize 检测窗口行高
     * @param ySize 检测窗口行宽
     * @param convStudyPoint 卷积层学习率
     * @param convFunction 卷积层激活函数
     * @param isShowLog 是否打印学习参数
     * @param isSoftMax 最后一层是否用softMax激活
     */
     public void initImageNet(int step, int kernLen, int xSize, int ySize, boolean isSoftMax, boolean isShowLog,
	  double convStudyPoint, ActiveFunction convFunction)
     public void initRnn(boolean initPower, boolean isShowLog)//初始化神经网络为rnn网络 包路径 org.wlld.rnnNerveCenter
     public ModelParameter getModelParameter()//返回Rnn训练结果模型
     public void insertModelParameter(ModelParameter modelParameter)//注入RNN训练结果模型
     nerveManager.getSensoryNerves()获取感知神经元集合
	 //获取输入层神经元
	 public List<SensoryNerve> getSensoryNerves()
     /**
     * @param eventId   唯一的事件id
     * @param parameter 输入点的数据
     * @param isStudy   是否是学习 (学习状态没有输出)
     * @param E         标注
     * @param outBack   回调结果
     * @throws Exception
     */
     //神经网络输入层发送参数
     SensoryNerve.postMessage(long eventId, double parameter, boolean isStudy, Map<Integer, Double> E, OutBack outBack)
     //每一次输出结果都会返回给回调类,通过回调类拿取输出结果,并通过eventId来对应事件
     //卷积神经网络输入层发送参数
	 /**
     * @param eventId       唯一的事件id
     * @param parameter     特征矩阵
     * @param isKernelStudy 是否是学习 (学习状态没有输出)
     * @param E             标注
     * @param outBack       回调结果
     * @throws Exception
     */
     SensoryNerve.postMatrixMessage(long eventId, Matrix parameter, boolean isKernelStudy, Map<Integer, Double> E, OutBack outBack)
     public ModelParameter getDnnModel()//返回神经网络训练结果模型
     public ModelParameter getConvModel()//返回卷积神经网络训练结果模型
     public void insertDnnModel(ModelParameter modelParameter)//注入神经网络训练结果模型
     public void insertConvModel(ModelParameter modelParameter)//注入卷积神经网络训练结果模型
                
残差Rnn神经网络(跳层):
					/**
					* 初始化神经元参数
					*
					* @param sensoryNerveNub 输入神经元个数
					* @param hiddenNerveNub  隐层神经元个数
					* @param outNerveNub     输出神经元个数
					* @param hiddenDepth     隐层深度
					* @param activeFunction  激活函数
					* @param isDynamic       是否是动态神经元
					* @param studyPoint   学习率
					* @param rzType          正则函数
					* @param lParam          正则系数
					* @throws Exception 如果参数错误则抛异常
					*/
				   public NerveJumpManager(int sensoryNerveNub, int hiddenNerveNub, int outNerveNub
						   , int hiddenDepth, ActiveFunction activeFunction, boolean isDynamic,
										   double studyPoint, int rzType, double lParam);
					/**
					* 初始化残差Rnn神经元(跳层)参数
					* @param initPower 是否是首次进行训练
					* @param isShowLog  是否打印续写过程中的参数
					* @param toSoftMax   是否增加softMax输出层
					* @throws Exception 如果参数错误则抛异常
					*/
					public void initRnn(boolean initPower, boolean isShowLog, boolean toSoftMax) throws Exception
					//获取输入层神经元
					public List<SensoryNerve> getSensoryNerves()
					                    //输入层发送参数
				                        /**
                                        * @param eventId     唯一的事件id(每个用户线程一个id用来处理线程安全)
                                        * @param parameter   该输入层的输入参数
                                        * @param isStudy     是否是学习 (学习状态没有输出)
                                        * @param E           标注
                                        * @param outBack     回调结果
                                        * @param isEmbedding 是否获取word2Vec返回结果(单独为词向量嵌入兼容,若无需则传false)
                                        * @param rnnMatrix   rnn参数全层数特征矩阵,矩阵中每一行是每一层的特征向量
                                        * @param storeys    自定义跳层路径的数组,即在rnn中经过的隐层层数(隐层层数从1开始),若不在此路径集合内则跳跃
                                        */
	                           SensoryNerve.postMessage(long eventId, double parameter, boolean isStudy, Map<Integer, Double> E
                            , OutBack outBack, boolean isEmbedding, Matrix rnnMatrix, int[] storeys)
                            public ModelParameter getModelParameter();//返回跳层RNN训练结果模型
                            public void insertModelParameter(ModelParameter modelParameter);//注入跳层RNN训练结果模型
				
随机森林:
                    //创建一个内存中的数据表
                    DataTable dataTable = new DataTable(column);
                    //构造参数是列名集合
                    public DataTable(Set<String> key)
                    //指定主列名集合中该表的主键
                    dataTable.setKey("point");
                    //创建一片随机森林
                    RandomForest randomForest = new RandomForest(7);
                    //构造参数为森林里的树木数量
                    public RandomForest(int treeNub);
                    //唤醒随机森林里的树木
                    randomForest.init(dataTable);
                    //将加入数据的实体类一条条插入森林中
                    randomForest.insert(Object object);
                    //森林进行学习
                    randomForest.study();
                    //插入特征数据,森林对该数据的最终分类结果进行判断
                    int type = randomForest.forest(Object objcet);
                
KNN:
                    public Knn(int nub);//构造参数,有几个人参与投票
                    public void insertMatrix(Matrix vector, int tag);//参数分别是特征向量和类别,注入进KNN当中
                    public int getType(Matrix vector);//输入特征向量,返回类别
                    public void removeType(int type);//移除一个分类
                

聚类工具

LVQ学习向量量化:
                    public LVQ(int typeNub, int lvqNub, double studyPoint);//类别数量,循环次数,学习率,注意lvq的递增类别id必须从0开始
                    public void insertMatrixBody(MatrixBody matrixBody);//注入特征向量
                    public void start();//执行学习
                
原型聚类:
                    public MeanClustering(int speciesQuantity, int maxTimes);//聚多少个类,迭代次数上限
                    public void setFeature(double[] feature);//输入特征数组
                    public void start();//开始聚类
                    public List<RGBNorm> getMatrices();//聚类结束时,获取聚类实体 其中 RGBNorm.getRgb() 为该实体的聚类结果
		    public double[] getResultByNorm();//将聚类结果依照各特征范数的自然排序后,返回所有聚类特征集合
                
混合高斯聚类:
                    public GMClustering(int speciesQuantity, int maxTimes);//聚多少个类,迭代次数上限
                    public void insertParameter(Matrix matrix)//输入特征数组必须是行向量
                    public void start();//开始聚类
		    public double getProbabilityDensity(double[] feature);//获取该特征的概率密度
                

启发式工具

粒子群

适应函数类需要实现适应函数接口,并实现生成返回值

 public interface PsoFunction {//粒子群回调函数
    //根据参数返回函数值
    double getResult(double[] parameter,int id) throws Exception;
}

构造例子群类

              /**
     * 初始化
     *
     * @param dimensionNub 维度
     * @param minBorder  最小边界
     * @param maxBorder 最大边界
     * @param times 迭代次数
     * @param particleNub 粒子数量
     * @param psoFunction 适应函数
     * @param inertialFactor 惯性因子
     * @param selfStudyFactor 个体学习因子
     * @param socialStudyFactor 社会学习因子
     * @param isMax 最大值是否为最优
     * @param maxSpeed 最大速度
     * @param initSpeed 初始速度
     * @throws Exception
     */
    public PSO(int dimensionNub, int[] minBorder, int[] maxBorder,
               int times, int particleNub, PsoFunction psoFunction,
               double inertialFactor, double selfStudyFactor, double socialStudyFactor
            , boolean isMax, double maxSpeed, double initSpeed)
     public void start()//粒子群开始进行迭代
     public double[] getAllBest()//迭代结束获取全局最优解
                

强化学习工具

动态规划

动态规划类:DynamicProgramming, 动作函数要继承动作抽象类Action,并重写以下方法

public abstract class Action {//动作
    private int actionId;//动作id

    public int getActionId() {//返回该动作id
        return actionId;
    }

    public void setActionId(int actionId) {//设置该动作id
        this.actionId = actionId;
    }

    public int[] action(int[] stateId) {//stateId状态进行该动作后生成新的状态
        return new int[0];
    }

    public int[] actionTest(int[] stateId) {//stateId状态进行该动作后生成新的测试状态
        return new int[0];
    }

    protected int getProfit(int[] stateId) {//stateId的状态进行该动作后所获得的收益
        return 0;
    }
}
   Map<Integer, Action> actionMap = dynamicProgramming.getActionMap();//从dynamicProgramming获取内部动作集合
}

状态类:DynamicState

public class DynamicState {
    private int[] stateId;//状态id
    private boolean isFinish = false;//是否是终结态
    public void setFinish(boolean finish) {
        isFinish = finish;
    }
    public DynamicState(int[] stateId) {//设置状态id
        this.stateId = stateId;
    }
    List<DynamicState> dynamicStateList = dynamicProgramming.getDynamicStateList();//从dynamicProgramming获取内部状态集合
}

启动开始动态规划的策略迭代,并生成价值函数,api调用如下:

    dynamicProgramming.setMaxTimes(int maxTimes)//策略改进最大迭代次数
    dynamicProgramming.setValueTh(double valueTh);//设置策略改进价值阈值
    dynamicProgramming.setGaMa(double gaMa);//设置贴现因子
    dynamicProgramming.gameStart();//开始策略迭代生成价值函数
    dynamicProgramming.getValueFunction();//返回价值函数
    dynamicProgramming.getBestAction(int[] stateId);//获取当前最优动作集合
                

矩阵运算

矩阵类:Matrix

                 1,Matrix matrix = new Matrix(int x, int y);//初始化构造一个行为x,列为y的矩阵类
                 2,Matrix matrix= new Matrix(int x, int y, String matr);//初始化构造一个行为x,列为y,内部数据为 matr 的矩阵
                 3,int getX();//获取行数
                 4,int getY();//获取列数
                 5,void setState(int x, int y);//设置矩阵属性,根据x,y的数值大小,属性分别是0矩阵,行矩阵,列矩阵
                 6,double getAVG();//获取当前矩阵中所有数值的平均值
                 7,boolean isRowVector();//该矩阵是否是一个行矩阵
                 8,boolean isVector();该矩阵是否为一个向量
                 9,boolean isZero();该矩阵是否为一个0矩阵
                 10,void clear();//清除矩阵数据
                 11, double getDet();//求该矩阵的行列式
                 12,Matrix getSonOfMatrix(int x, int y, int xSize, int ySize);//求该矩阵的分块矩阵
                 13,Matrix getRow(int x);//求该矩阵指定一行的行向量
                 14,Matrix getColumn(int y);//求该矩阵指定一列的列向量
                 15,String getString();//返回字符串形式的该矩阵
                 16,String getPositionString();//返回带坐标的该矩阵字符串
                 17,void setNub(int x, int y, double number);//向该矩阵指定xy的位置输入一个数值
                 18,double getNumber(int x, int y);//向该矩阵指定xy的位置获取一个数值
		 19,double getSigmaByVector(boolean isRow, int index);计算矩阵中某一行或者某一列所有元素的和,isRow是否是行,index下标
                

矩阵运算类:MatrixOperation

                    static Matrix add(Matrix matrix1, Matrix matrix2);//矩阵相加
                    static Matrix sub(Matrix matrix1, Matrix matrix2);//矩阵相减
                    static Matrix getLinearRegression(Matrix parameter, Matrix out);//多元线性回归
                    static double getEDistByMatrix(Matrix matrix1, Matrix matrix2);//矩阵相似度(欧氏距离)
                    static double getEDist(Matrix matrix1, Matrix matrix2);//两个向量之间欧式距离的平方
                    static Matrix pushVector(Matrix myMatrix, Matrix matrix, boolean addRow);//向一个矩阵里合并一个行向量或者列向量到矩阵行或者列的末尾
                    static Matrix push(Matrix matrix, double nub, boolean isRow);//向一个向量里PUSH一个值
                    static Matrix matrixToVector(Matrix matrix, boolean isRow);//将一个矩阵转成行向量
                    static double innerProduct(Matrix matrix1, Matrix matrix2);//求两个向量的内积
                    static double getNorm(Matrix matrix);//求向量范数
                    static double getNormCos(Matrix matrix1, Matrix matrix2);//求两个向量之间的余弦
                    static Matrix transPosition(Matrix matrix);//矩阵转置
                    static int inverseNumber(double[] myInverse);//逆序数奇偶性判定
                    static Matrix getInverseMatrixs(Matrix matrix);//矩阵求逆
                    static Matrix adjointMatrix(Matrix matrix);//求伴随矩阵
                    static double algebraicCofactor(Matrix matrix, int row, int column);//求矩阵代数余子式
                    static Matrix mulMatrix(Matrix matrix1, Matrix matrix2);//矩阵相乘
                    static void mathMul(Matrix matrix, double nub);//矩阵数乘
                    static void mathSub(Matrix matrix, double nub);//矩阵数减
                    static void mathDiv(Matrix matrix, double nub);//矩阵数除
                    static List<Double> matrixToList(Matrix matrix);//矩阵转list集合
                    static Matrix listToRowVector(List<Double> list);//list集合转行向量
                    static Matrix im2col(Matrix matrix, int kernLen, int step);//卷积im2col
                    static Matrix reverseIm2col(Matrix matrix, int kernLen, int step, int xSize, int ySize);//逆向im2col
		    //对两个相乘的矩阵中的一个求偏导,errorMatrix 为loss矩阵,isFirstPd=true 对相乘的前矩阵first求偏导,反之依然。
		    static Matrix matrixMulPd(Matrix errorMatrix, Matrix first, Matrix second, boolean isFirstPd);
                

图像工具

图像解析类:Picture

                Picture picture = new Picture();//实例化一个图像解析类
                ThreeChannelMatrix getThreeMatrix(String fileURL);//根据本地图片url返回一个RGB三通道矩阵类
                ThreeChannelMatrix getThreeMatrix(InputStream file);//根据一个输入流返回一个RGB三通道矩阵类

RGB三通道矩阵:ThreeChannelMatrix

    Matrix getMatrixR();//返回R矩阵
    Matrix getMatrixG();//返回G矩阵
    Matrix getMatrixB();//返回B矩阵
    Matrix getH();//返回灰度矩阵