【Deeplearning4j】小小的了解下深度学习

文章目录

      • 1. 起因
      • 2. Deeplearning4j是什么
      • 3. 相关基本概念
      • 4. Maven依赖
      • 5. 跑起来了,小例子!
      • 6. 鸢尾花分类
        • 代码
      • 7. 波士顿房价 回归预测
        • 代码
      • 8. 参考资料

1. 起因

其实一直对这些什么深度学习,神经网络很感兴趣,之前也尝试过可能因为Java做这个不成熟或者其他什么原因但是没开始。这次,从Jone到TensorFlow到Deeplearning4j(DL4j)试了好几种,最终选了DL4j。

2. Deeplearning4j是什么

深度学习是一个极具吸引力的新领域,尤其是在 计算机视觉Q、自然语言处理等领域。目前,业界热议的有基手TensorFlow、Caffe、Theano枸建的开源深度学习框架,还有基于Spark构建的分布式、高性能的神经网络平台。而近年来,基于多种深度学习框架的开源工具如Keras、Torch、MxNet等越来越火爆。但是,这些框架各不兼容,很难构建复杂的深度学习模型。为解决这个问题,业界提出了另一种思路——用统一的JavaAP!构建统一的深度学习框架,使得不同深度学习框架可以方便地互联互通。从此,Deeplearning4j诞生了!
Deeplearning4j(简称DL4J)是Apache顶级项目,面向机器学习和深度学习开发者提供一个开源、商业级、健壮的平台。已是基于JVM (Java Virtual Machine) 的框架,支持Java、Scala及其他语言编写的代码。它的主要功能包括:

  1. 交叉语言接口:支持多种编程语言,包括Java、Scala、Python、C++、尺等;
    2.向量化计算:支持高度优化的矢量化计算,同时也兼顾易用性;
    3.自动微分:支持自动求导,并针对各类机器学习任务进行优化;
    4.深度学习模型库:包括卷积网络、循环网络、递归网络等;
    5.可扩展性:提供了便利的组件模型,并且允许用户自定义组件;
    6.分布式计算:通过Spark、Hadoop等计算框架可实现海量数据的分布式运算;
    7.模型训练工具:提供了命令行工具和图形界面工具,让用户快速上手;
    8.文档和示例代码:提供详尽的文档和丰富的示例代码,帮助用户快速入门。

3. 相关基本概念

列举了后面代码可能遇到的
3.1.神经网络(Neural Network)
神经网络(neural network)是由大量感知器组织起来的集成系统,每个感知器具有多个输入和输出连接,根据一定规则对其输入信号做加权处理,然后送给输出单元,产生一个输出信号。一个简单的神经元可以看作是—个具有单个阅值的线性分类器,它接受多个输入信号并决定是否激活,将信号传播至输出层。神经网络中的感知器可以互相连接,构成一个多层结构。深度学习中的神经网络通常具有多层结构,其中隐藏层的数量和各层节点的数量是手动设定的。
3.2.反向传播算法(Backpropagation algorithm)
反向传播算法是指用来更新神经网络参数的最常用的方法之一。每一次选代中,从最后一层往回迭代,首先计算当前层的误差值,然后依据误差和权重更新前一层的参数,直到更新完整个网络。反向传播算法相当于一个链式法则,将权重与误差传播给每一层,并根据这一链式法则更新权重,最终达到合理的训练结果。
3.3.梯度下降算法(Gradient Descent Algorithm)
梯度下降算法是反向传播算法的基础,它是利用误差最小化的方法来确定参数的最优解。具体来说,梯度下降算法以损失函数对参数的偏导数作为搜索方向,沿着该方向递减参数,直到找到全局最优解。梯度下降算法在每次迭代中计算出代价函数在当前参数处的梯度,根据梯度更新参数,直到得到局部最优解。
3.4.激活函数(Activation function)
激活函数 (activation function)是神经网络的关键组件之一。它作用在每一个非线性变换之后,用来修正线性组合的输出,使其成为非线性的。常用的激活函数有sigmoid函数、tanh函数、ReLU函数和softmax函数。
3.5.损失函数(Loss Function)
损失函数 (loss function)是描述神经网络性能的指标。神经网络的目标是最小化损失函数的值,以达到良好的性能。常用的损失函数有均方误差函数(mean squared error)、交叉熵函数 (cross entropy)

4. Maven依赖

不多废话,直接给能跑的代码
本人使用环境 MacOS 13.1 JDK 1.8

首先,在Windows/Linux/Mac 系统上,操作系统需要 64 位的(早期的版本支持 32 位,但由于训练深度神经网络需要大量内存,而 32 位系统访问内存有限,因此后期的版本只支持 64 位系统)。
其次,由于 Deeplearning4j 是基于 JVM 的框架,因此JDK 必须安装,JDK 版本推荐 1.7以上。由于篇幅关系,这里不再赘述JDK 的相关安装,请读者自行阅读Oracle 相关文档进行安装和相关环境变量的设置。
再者,DeepLearnina 依赖以及间接依赖的库很多,比如 JavaCPP、JavaCV、Guava、Spark 等。所以我们需要用类似 Maven 的jar 包管理工具进行依赖的引入。

在DL4j版本上进行过多次选择 一开始直接1.0.0-beta7 → 0.8.0 →0.9.0→0.9.1→1.0.0-beta4

因为有很多周边配置或者依赖或者机器(Apple M1 Pro)arm原因,目前是beta4(2023.12.02)

注意:但是以下两个例子需要0.8.0的版本,所以使用0.8.0,后面MNIST手写数据识别,会修改为1.0.0-beta4

为了怕遗漏,我就把我的相关依赖全放上去了(要下挺久)

 <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <dl4j.version>0.8.0</dl4j.version>
        <nd4j.version>0.8.0</nd4j.version>
        <spark.version>2</spark.version>
        <datavec.version>0.8.0</datavec.version>
        <scala.binary.version>2.11</scala.binary.version>
    </properties>

        <!--deeplearning4j-->
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-core</artifactId>
            <version>${dl4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-nn</artifactId>
            <version>${dl4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-zoo</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.nd4j</groupId>
            <artifactId>nd4j-native-platform</artifactId>
            <version>${nd4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-ui_${scala.binary.version}</artifactId>
            <version>${dl4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.datavec</groupId>
            <artifactId>datavec-api</artifactId>
            <version>${datavec.version}</version>
        </dependency>
        <dependency>
            <groupId>org.datavec</groupId>
            <artifactId>datavec-data-image</artifactId>
            <version>${datavec.version}</version>
        </dependency>
        <dependency>
            <groupId>org.datavec</groupId>
            <artifactId>datavec-spark_${scala.binary.version}</artifactId>
            <version>${dl4j.version}_spark_2</version>
        </dependency>
        <dependency>
            <groupId>org.nd4j</groupId>
            <artifactId>nd4j-native</artifactId>
            <version>${dl4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-scaleout-parallelwrapper-parameter-server</artifactId>
            <version>${dl4j.version}</version>
        </dependency>

如果下不了,可以在pom.xml project标签下新增(存在就看着替换)仓库

 <repositories>
        <repository>
            <id>tensorflow-maven-repo</id>
            <url>https://repo.maven.apache.org/maven2/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>tensorflow-snapshots</id>
       <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

5. 跑起来了,小例子!

直接跑 ,超简单的小例子(加法)


import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

import java.io.IOException;

public class ND4j_create {
        public static void main(String[] args) throws IOException{
            System.out.println(Nd4j.getBackend());
            INDArray tensor1 = Nd4j.create(new double[]{1,2,3});
            INDArray tensor2 = Nd4j.create(new double[]{10.0,20.0,30.0});
            System.out.println(tensor1.add(tensor2));
        }
}

6. 鸢尾花分类

以下俩例子,仅模型训练来自参考资料2的付费课程(提醒下文章中在线图片都过期了,有会员的可以看看)

两个例子所需文件在文章顶部,无需积分

也可以直接去参考资料3,下载官网demo

鸢尾花是广泛分布于温带的一种植物,在中国国内也种植有大量的鸢尾花,据百度百科—一鸢尾花词条中记录的信息表明,鸢尾花的种类有 13种之多。
鸢尾花数据集是由 R.A.Fisher 收集的关于 3种鸢尾花 (lris Setosa、Iris Versicolour 和 Iris Virginica) 且每一个种类有 50 条记录的开源数据集。

数据集中的每条记录共包含 4 个维度(萼片长度、萼片宽度、花瓣长度和花瓣宽度),部分数据集的截图如下:
在这里插入图片描述

需要注意的是,最后一列表示鸢尾花类别的例子是文本的,因此为了方便之后训练数据集的构建,我们将最后一列统一替换成数字(用数字 0、1、2分别标识三种类别的鸢尾花)。

代码

以下代码中说的单核多核,在现在的版本好像没什么区别了,默认好像就是多线程的

import org.deeplearning4j.api.storage.StatsStorage;
import org.deeplearning4j.datasets.iterator.impl.ListDataSetIterator;
import org.deeplearning4j.eval.Evaluation;
import org.deeplearning4j.nn.api.OptimizationAlgorithm;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.Updater;
import org.deeplearning4j.nn.conf.layers.DenseLayer;
import org.deeplearning4j.nn.conf.layers.OutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.weights.WeightInit;
import org.deeplearning4j.optimize.listeners.ScoreIterationListener;
import org.deeplearning4j.ui.api.UIServer;
import org.deeplearning4j.ui.stats.StatsListener;
import org.deeplearning4j.ui.storage.InMemoryStatsStorage;
import org.deeplearning4j.util.ModelSerializer;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.dataset.SplitTestAndTrain;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.lossfunctions.LossFunctions;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * 鸢尾花: http://archive.ics.uci.edu/dataset/53/iris
 *
 * 本Demo需要在 0.8.0版本才能跑,1.0.0-beta4 一堆问题
 */
public class MLPClassifyLris {
        private final static int numClasses= 3;
        private final static String TRAIN_DATA_PATCH = "src/main/resources/training/iris.csv";
        // 模型保存路径(注意模型无后缀 lris_model就是我起的模型名称,这和后面版本不一样,后面是zip后缀)
        private final static String MODEL_PATCH = "your path/lris_model";



        public static void training() throws IOException {
            /*--------------超参数常量声明------------------*/
            final int batchSize = 3;
            final long SEED = 1234L;
            final int trainSize = 120;
            /*--------------数据集构建------------------*/
            List<DataSet> irisList = loadIrisSeq(new File(TRAIN_DATA_PATCH));
//            merge(irisList,batchSize);
            DataSet allData = DataSet.merge(irisList);
            allData.shuffle(SEED);
            SplitTestAndTrain split = allData.splitTestAndTrain(trainSize);
            DataSet dsTrain = split.getTrain();
            DataSet dsTest = split.getTest();
            DataSetIterator trainIter = new ListDataSetIterator(dsTrain.asList() , batchSize);
            DataSetIterator testIter = new ListDataSetIterator(dsTest.asList() , batchSize);

            // 设置UI页面
            UIServer uiServer = UIServer.getInstance();
            StatsStorage statsStorage = new InMemoryStatsStorage();
            uiServer.attach(statsStorage);

            // 加载模型
            MultiLayerNetwork mlp = model();
            mlp.setListeners(new StatsListener(statsStorage));

            mlp.setListeners(new ScoreIterationListener(1));    //loss score监听器
            // 单(核)CPU
            for( int i = 0; i < 20; ++i ){
                mlp.fit(trainIter);    //训练模型
                trainIter.reset();
                Evaluation eval = mlp.evaluate(testIter);    //在验证集上进行准确性测试
                System.out.println(eval.stats());
                testIter.reset();
            }
            ModelSerializer.writeModel(mlp, new File(MODEL_PATCH), true);    //save model
        }
    public static List<DataSet> loadIrisSeq(File file) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line = null;
        List<DataSet> trainDataSetList = new LinkedList<DataSet>();
        while( (line = br.readLine()) != null ){
            String[] token = line.split(",");
            double[] featureArray = new double[token.length - 1];
            double[] labelArray = new double[numClasses];
            for( int i = 0; i < token.length - 1; ++i ){
                featureArray[i] = Double.parseDouble(token[i]);
            }
            labelArray[Integer.parseInt(token[token.length - 1])] = 1.0;
            //
            INDArray featureNDArray = Nd4j.create(featureArray);
            INDArray labelNDArray = Nd4j.create(labelArray);
            trainDataSetList.add(new DataSet(featureNDArray, labelNDArray));
        }
        br.close();
        return trainDataSetList;
    }

    public static List<DataSet> merge(List<DataSet> seq, int batchSize){
        int count = 0;
        List<DataSet> miniBatchSeq = new LinkedList<DataSet>();
        List<DataSet> tempSeq = new LinkedList<DataSet>();
        for( DataSet ds : seq ){
            if( count == batchSize ){
                miniBatchSeq.add(DataSet.merge(tempSeq));
                tempSeq.clear();
                count = 0;
            }
            tempSeq.add(ds);
            ++count;
        }
        if( !tempSeq.isEmpty() ){
            miniBatchSeq.add(DataSet.merge(tempSeq));
        }
        return miniBatchSeq;
    }

    public static MultiLayerNetwork model(){
        MultiLayerConfiguration.Builder builder = new NeuralNetConfiguration.Builder()
                .seed(12345)
//                .iterations(1) // Training iterations as above 0.9.1 ok | 1.0.0 X
//                .learningRate(0.01)
                .weightInit(WeightInit.XAVIER)
                .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
                .updater(Updater.ADAM)
                .list()
                .layer(0, new DenseLayer.Builder().activation(Activation.LEAKYRELU)
                        .nIn(4).nOut(2).build())
                .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
                        .activation(Activation.SOFTMAX)
                        .nIn(2).nOut(3).build());
        MultiLayerConfiguration conf = builder.build();
        MultiLayerNetwork model = new MultiLayerNetwork(conf);
        model.init();
        return model;
    }
    public static void main(String[] args) throws IOException, InterruptedException {
        training();
    }

}

如无意外,结果为:
鸢尾花模型训练完成
准确率(Accuracy)为 0.9333,表示模型正确预测的样本比例约为 93.33%。
精确率(Precision)为 0.9583,表示模型在预测为正类的样本中,正确预测为正类的比例约为 95.83%。
召回率(Recall)为 0.9259,表示模型在所有正类样本中,正确预测为正类的比例约为 92.59%。
F1 分数(F1 Score)为 0.9419,综合考虑了精确率和召回率的综合指标,越接近 1 表示模型的性能越好。

然后你设定的路径上会多一个模型文件
在这里插入图片描述
这里两个例子为就不使用模型了,我是在后面的MNIST才开始使用的

7. 波士顿房价 回归预测

前面说分类,好理解,那什么是回归

回归分析是一种统计分析方法,用于研究变量之间的关系和预测一个变量(称为因变量)的值,基于其他变量(称为自变量)的值。它旨在寻找自变量与因变量之间的关联,并使用这种关联来预测因变量的值。

回归分析的目标是建立一个数学模型,该模型可以描述自变量与因变量之间的函数关系。常见的回归分析方法包括线性回归、多项式回归、逻辑回归等。

在回归分析中,通常假设自变量与因变量之间存在某种线性或非线性关系。通过分析数据样本,回归分析可以估计出模型的参数,从而预测因变量的值。

回归分析在许多领域中都有广泛的应用,包括经济学、金融学、社会科学、医学、工程等。它可以帮助研究人员了解变量之间的关系、预测未来的趋势和行为,并支持决策和策略制定。

总而言之,回归分析是一种用于研究变量关系和预测因变量的统计分析方法,它是统计学和数据分析中常用的工具之一。

(所需数据在文章顶部,有资源链接,无需积分)
在这里插入图片描述

代码
package cn.genmer.test.security.machinelearning.deeplearning4j.begin;

import org.deeplearning4j.api.storage.StatsStorage;
import org.deeplearning4j.datasets.iterator.impl.ListDataSetIterator;
import org.deeplearning4j.eval.RegressionEvaluation;
import org.deeplearning4j.nn.api.OptimizationAlgorithm;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.DenseLayer;
import org.deeplearning4j.nn.conf.layers.OutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.weights.WeightInit;
import org.deeplearning4j.optimize.listeners.ScoreIterationListener;
import org.deeplearning4j.ui.api.UIServer;
import org.deeplearning4j.ui.storage.InMemoryStatsStorage;
import org.deeplearning4j.util.ModelSerializer;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.dataset.SplitTestAndTrain;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
import org.nd4j.linalg.dataset.api.preprocessor.NormalizerMinMaxScaler;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.lossfunctions.LossFunctions;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * 波士顿房价: http://www.cs.toronto.edu/~delve/data/boston/bostonDetail.html
 * 本Demo需要在 0.8.0版本才能跑,1.0.0-beta4 一堆问题
 */
public class MLPRetuenTheBostonHousingDataset {
        private final static String TRAIN_DATA_PATCH = "src/main/resources/training/boston-house-price.csv";
        private final static String MODEL_PATCH = "your path/bostonHousing_model";



        public static void training() throws IOException {
            final int batchSize = 4;
            final long SEED = 1234L;
            final int trainSize = 400;
            List<DataSet> housePriceList = loadHousePrice(new File(TRAIN_DATA_PATCH));
            //获取全部数据并且打乱顺序
            DataSet allData = DataSet.merge(housePriceList);
            allData.shuffle(SEED);
            //划分训练集和验证集
            SplitTestAndTrain split = allData.splitTestAndTrain(trainSize);
            DataSet dsTrain = split.getTrain();
            DataSet dsTest = split.getTest();
            DataSetIterator trainIter = new ListDataSetIterator(dsTrain.asList() , batchSize);
            DataSetIterator testIter = new ListDataSetIterator(dsTest.asList() , batchSize);
            //归一化处理
            DataNormalization scaler = new NormalizerMinMaxScaler(0,1);
            scaler.fit(trainIter);
            scaler.fit(testIter);
            trainIter.setPreProcessor(scaler);
            testIter.setPreProcessor(scaler);
            //声明多层感知机
            MultiLayerNetwork mlp = model();
            mlp.setListeners(new ScoreIterationListener(1));
            // 设置UI页面
            UIServer uiServer = UIServer.getInstance();
            StatsStorage statsStorage = new InMemoryStatsStorage();
            uiServer.attach(statsStorage);
            //训练200个epoch
            for( int i = 0; i < 200; ++i ){
                mlp.fit(trainIter);
                trainIter.reset();
            }
            //利用 Deeplearning4j 内置的回归模型分析器进行模型评估
            RegressionEvaluation eval = mlp.evaluateRegression(testIter);
            System.out.println(eval.stats());
            testIter.reset();
            //输出验证集的真实值和预测值
            System.out.println("真实值:");
            System.out.println(testIter.next(testIter.totalExamples()).getLabels());
            System.out.println();
            testIter.reset();
            System.out.println("预测值:");
            System.out.println(mlp.output(testIter));
            testIter.reset();

            ModelSerializer.writeModel(mlp, new File(MODEL_PATCH), true);    //save model
        }
    public static List<DataSet> loadHousePrice(File file) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line = null;
        List<DataSet> totalDataSetList = new LinkedList<DataSet>();
        while( (line = br.readLine()) != null ){
            String[] token = line.split(",");
            double[] featureArray = new double[token.length - 1];
            double[] labelArray = new double[1];
            for( int i = 0; i < token.length - 1; ++i ){
                featureArray[i] = Double.parseDouble(token[i]);
            }
            labelArray[0] = Double.parseDouble(token[token.length - 1]);
            //
            INDArray featureNDArray = Nd4j.create(featureArray);
            INDArray labelNDArray = Nd4j.create(labelArray);
            totalDataSetList.add(new DataSet(featureNDArray, labelNDArray));
        }
        br.close();
        return totalDataSetList;
    }

    public static List<DataSet> merge(List<DataSet> seq, int batchSize){
        int count = 0;
        List<DataSet> miniBatchSeq = new LinkedList<DataSet>();
        List<DataSet> tempSeq = new LinkedList<DataSet>();
        for( DataSet ds : seq ){
            if( count == batchSize ){
                miniBatchSeq.add(DataSet.merge(tempSeq));
                tempSeq.clear();
                count = 0;
            }
            tempSeq.add(ds);
            ++count;
        }
        if( !tempSeq.isEmpty() ){
            miniBatchSeq.add(DataSet.merge(tempSeq));
        }
        return miniBatchSeq;
    }

    public static MultiLayerNetwork model(){
        MultiLayerConfiguration.Builder builder = new NeuralNetConfiguration.Builder()
                .seed(12345L)
//                .iterations(1)
//                .updater(Updater.ADAM)
                .weightInit(WeightInit.XAVIER)
                .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
                .list()
                .layer(0, new DenseLayer.Builder().activation(Activation.LEAKYRELU)
                        .nIn(13).nOut(10).build())
                .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.MEAN_SQUARED_LOGARITHMIC_ERROR)
                        .activation(Activation.IDENTITY)
                        .nIn(10).nOut(1).build());
//                .backprop(true).pretrain(false);
        MultiLayerConfiguration conf = builder.build();
        MultiLayerNetwork model = new MultiLayerNetwork(conf);
        model.init();
        return model;
    }
    public static void loadModelAndPredict(INDArray feature) throws IOException{
        MultiLayerNetwork reloadModel = ModelSerializer.restoreMultiLayerNetwork(new File(MODEL_PATCH));
        reloadModel.predict(feature);
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        training();
    }

}

执行结果
在这里插入图片描述
在这里插入图片描述

8. 参考资料

  1. 介绍来自 Deeplearning4j: 用 Java 实现深度学习框架
  2. 鸢尾花 & 波士顿房价预测 多层感知机在结构化数据中的应用实现
  3. Deeplearning4j官网项目地址 有demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/232896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python实现GUI图片浏览程序

Python实现GUI图片浏览程序 下面程序需要pillow库。pillow是 Python 的第三方图像处理库&#xff0c;需要安装才能实用。pillow是PIL&#xff08; Python Imaging Library&#xff09;基础上发展起来的&#xff0c;需要注意的是pillow库安装用pip install pillow&#xff0c;导…

javaEE -14(10000字 JavaScript入门 - 1)

一&#xff1a;初始 JavaScript JavaScript (简称 JS)是世界上最流行的编程语言之一&#xff0c;它是一个脚本语言, 通过解释器运&#xff0c;主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行. JavaScript 和 HTML 和 CSS 之间的关系&#xff1a; HTML…

Rellax.js,一款超酷的 JavaScript 滚动效果库

嗨&#xff0c;大家好&#xff0c;欢迎来到猿镇&#xff0c;我是镇长&#xff0c;lee。 又到了和大家见面的时间&#xff0c;今天和大家分享一款轻松实现视差滚动效果的 JavaScript 库——Rellax.js。无需大量的配置&#xff0c;即可为你的网站增色不少。 什么是Rellax.js&am…

simulinkveristandlabview联合仿真环境搭建

目录 开篇废话 软件版本 明确需求 软件安装 matlab2020a veristand2020 R4 VS2017 VS2010 软件安装验证 软件资源分享 开篇废话 推免之后接到的第一个让人难绷的活&#xff0c;网上开源的软件资料和成功的案例很少&#xff0c;查来查去就那么几篇&#xff0c;而且版本…

以pycharm为例,生成Python项目所需要的依赖库/包文档:requirements.txt

平时我们在编写或者使用别人的Python项目时&#xff0c;往往会看到一个文档requirements.txt&#xff0c;该文档是描述一个Python项目中的第三方库的名称以及版本。本文介绍导出python当前项目依赖包requirements.txt的操作步骤。 方法一&#xff1a;如果每个项目有对应的虚拟…

Java零基础——Elasticsearch篇

1.Elasticsearch简介 Elasticsearch是一个基于Lucene的一个开源的分布式、RESTful 风格的搜索和数据分析引擎。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。Elasticsearch用于云计算中&#xf…

13. MySQL 日志

目录 错误日志 binlog日志 概述 日志格式 查询日志 慢查询日志 错误日志 错误日志是MySQL中最重要的日志之一&#xff0c;它记录了当mysqld启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#…

用Rust刷LeetCode之26 删除有序数组中的重复项

26. 删除排序数组中的重复项[1] 难度: 简单 老的描述: 新的描述: 注意是 排序数组,非严格递增排列,即已经是排好序的,只不过有重复元素 func removeDuplicates(nums []int) int { if len(nums) 0 { return 0 } i : 0 for j : 1; j < len(nums); j { …

Kubernetes架构及核心部件

文章目录 1、Kubernetes集群概述1.1、概述1.2、通过声明式API即可 2、Kubernetes 集群架构2.1、Master 组件2.1.1、API Server2.1.2、集群状态存储2.1.3、控制器管理器2.1.4、调度器 2.2、Worker Node 组件2.2.1、kubelet2.2.2、容器运行时环境2.2.3、kube-proxy 2.3、图解架构…

AI隆重软件,AI原创文章隆重软件

随着信息量的急剧增加&#xff0c;许多写作者、网站管理员和内容创作者们纷纷感受到了文章降重的压力。原始文本的降重&#xff0c;需要保留关键信息的同时避免重复&#xff0c;这是一项既繁琐又耗时的任务。 改写软件的批量降重功能 147SEO改写软件在降重领域的卓越表现主要体…

PHP基础 - 注释变量

一. 语言开始标识 在PHP中,文件的开头需要使用语言开始标识来指定该文件是PHP代码。标识通常为"<?php",也可以是"<?",但建议使用"<?php"以确保代码的兼容性和可读性。 <?php // PHP代码从这里开始写 二. PHP注释 注释是用…

svn使用步骤

服务器端主要用来创建仓库&#xff0c;然后供客户端去访问与下载。 客户端&#xff1a; 图形化界面的使用&#xff1a;这里使用的是tortoise工具 1.创建一个文件夹作为自己的本地仓库目录 2.鼠标右键文件夹&#xff0c;在菜单中点击SVN checkout 3.找个图 这一步骤相当于git中…

nodejs+vue+微信小程序+python+PHP的基于大数据的家电销售分析系统设计与实现-计算机毕业设计推荐django

系统按照用户的实际需求开发而来&#xff0c;贴近生活。从管理员通过正确的账号的密码进入系统&#xff0c;可以使用相关的系统应用。管理员总体负责整体系统的运行维护&#xff0c;统筹协调。 系统整体模块设计&#xff1a;系统分为管理员和用户两大角色&#xff0c;系统管理员…

Linux 系统上配置 SSH 密钥

1. 生成 SSH 密钥 打开终端&#xff0c;运行以下命令来生成 SSH 密钥&#xff1a; ssh-keygen -t rsa -b 4096 -C "wqzbxhexample.com" 替换 "wqzbxhexample.com" 为你在 GitHub 注册时使用的邮箱地址。 2. 添加 SSH 密钥到 SSH 代理 运行以下命令来启…

贪心算法和动态规划

目录 一、简介 二、贪心算法案例&#xff1a;活动选择问题 1.原理介绍 三、动态规划案例&#xff1a;背包问题 1.原理介绍 四、贪心算法与动态规划的区别 五、总结 作者其他文章链接 正则表达式-CSDN博客 深入理解HashMap&#xff1a;Java中的键值对存储利器-CSDN博客…

知名的Mac系统清理软件CleanMyMac发布了最新的CleanMyMac X 4.14.5 破解版下载

最新版CleanMyMac X 让您的Mac焕然一新&#xff0c;时刻保持安全 CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#x…

Arduino驱动MPX5700AP气压传感器(压力传感器)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 4.1、采集数据 4.2、校准传感器 MPX5700AP测量范围15~700kPa&#xff0c;支持I2C数字输出&#xff0c;可以根据已知气压值进行标定&#xff0c;可以快速、准确的测量管路或其他环境中的气压值。…

【数据结构】——二叉树功能

前言&#xff1a;我们前面已经了解了二叉树的一些概念&#xff0c;那么我们今天就来了解下二叉树的遍历实现和一些性质。 二叉树的遍历方式有三种&#xff1a;前序&#xff0c;中序&#xff0c;后序。 前序&#xff1a;先根节点&#xff0c;再左子树&#xff0c;最后右子树。 中…

如何用Qt配置git项目并上传Gitee

1.进入到Qt项目文件夹内&#xff0c;打开 “Git Bash Here” 2.初始化&#xff0c;在“Git Bash Here”中输入 git init 3.加入所有文件&#xff0c;在“Git Bash Here”中输入 git add . (需要注意&#xff0c;git add 后面还有一个点) 4.添加备注&#xff0c;git com…

蓝桥杯航班时间

蓝桥杯其他真题点这里&#x1f448; //飞行时间 - 时差 已过去的时间1 //飞行时间 时差 已过去的时间2 //两个式子相加会发现 飞行时间 两段时间差的和 >> 1import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public cl…
最新文章