Springboot 整合 Java DL4J 搭建智能问答系统

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。

在这里插入图片描述


在这里插入图片描述

Springboot 整合 Java DL4J 搭建智能问答系统

引言

在当今数字化时代,智能问答系统变得越来越重要。无论是在客户服务、在线教育还是知识获取等领域,能够准确回答用户各种问题的系统都有着巨大的价值。

智能问答系统的核心在于利用知识图谱和语言模型来处理用户输入的自然语言,并提供准确的答案。知识图谱是一种语义网络,它以图的形式存储知识,节点表示实体,边表示实体之间的关系。通过查询知识图谱,可以获取与问题相关的知识。而语言模型则是对自然语言的概率分布建模,有助于理解问题的语义。

构建这样一个智能问答系统面临着诸多挑战。首先,自然语言处理本身就具有高度的复杂性,包括词汇歧义语法结构多变等问题。其次,要有效地整合知识图谱和语言模型,使它们协同工作,以提供最佳答案。

自然语言处理是一门涉及计算机科学、语言学和人工智能的交叉学科,旨在让计算机能够理解、生成和处理人类语言。智能问答系统是自然语言处理的一个重要应用领域,它可以通过对用户问题的理解和分析,从知识库中检索出最相关的答案并返回给用户。在构建智能问答系统时,需要用到多种自然语言处理技术,如词法分析句法分析语义理解知识图谱构建等。

Spring Boot 是一个基于 Spring 框架的快速开发框架,它简化了 Spring 应用的开发过程,提供了自动配置、快速启动和部署等功能。Java Deeplearning4j 是一个基于 Java 的深度学习库,它支持多种深度学习算法和模型,如卷积神经网络循环神经网络等。将 Spring BootJava Deeplearning4j 整合起来,可以快速构建一个高效可靠的智能问答系统。

本文将详细介绍如何使用 Spring Boot 整合 Java Deeplearning4j 来构建智能问答系统,包括系统的架构设计技术选型数据集准备模型训练系统实现测试等方面。通过本文的介绍,可以了解到智能问答系统的构建过程和关键技术,方便在自己的项目开发提供参考。

一、技术选型

(一)神经网络选择

在本智能问答系统中,我们选择使用循环神经网络Recurrent Neural NetworkRNN)来实现语言模型。RNN 是一种专门处理序列数据的神经网络,它可以对输入的序列数据进行建模,捕捉序列中的上下文信息。在自然语言处理中,文本数据通常是一种序列数据,因此 RNN 非常适合用于自然语言处理任务。

具体来说,我们选择使用长短期记忆网络Long Short-Term MemoryLSTM)作为 RNN 的一种变体。LSTM 可以有效地解决传统 RNN 存在的长期依赖问题,能够更好地捕捉文本中的长期依赖关系。此外,LSTM 还具有记忆单元门控机制,可以控制信息的流动和遗忘,提高模型的性能和稳定性。

(二)选择理由

  1. 处理序列数据的能力
    • RNN 及其变体 LSTM 专门设计用于处理序列数据,自然语言文本正是一种典型的序列数据,其中单词的顺序对于理解语义至关重要。
    • LSTM 能够记住长期的上下文信息,这对于理解复杂的句子结构和语义关系非常有帮助。例如,在回答问题时,系统需要考虑问题的整个上下文,而不仅仅是当前的单词或短语。
  2. 解决长期依赖问题
    • 传统的 RNN 在处理长序列数据时会遇到长期依赖问题,即难以捕捉远距离的依赖关系。LSTM 通过引入记忆单元和门控机制,有效地解决了这个问题。
    • 这使得智能问答系统能够更好地理解长句子和复杂的问题,提高回答的准确性。
  3. 性能和稳定性
    • LSTM 具有较高的性能稳定性,能够在大规模数据集上进行训练,并且不容易出现过拟合现象。
    • 这对于构建一个可靠的智能问答系统非常重要,因为系统需要处理大量的用户问题和知识库中的数据。
  4. 广泛的应用和研究基础
    • LSTM 在自然语言处理领域得到了广泛的应用和研究,有很多成熟的算法和技术可以借鉴。
    • 这使得我们在构建智能问答系统时可以更加高效地进行开发和优化。

二、数据集准备

(一)数据集格式

我们的智能问答系统需要一个大规模的数据集来进行训练和测试。数据集的格式通常包括问题和答案对,每个问题和答案都用自然语言文本表示。以下是一个数据集的示例格式:

问题答案
什么是人工智能?人工智能是指计算机系统能够执行通常需要人类智能才能完成的任务,如学习、推理、解决问题等。
深度学习有哪些应用?深度学习在图像识别、语音识别、自然语言处理等领域有广泛的应用。
如何学习编程?学习编程可以通过在线课程、书籍、实践项目等方式进行。
自然语言处理的应用有哪些?自然语言处理的应用包括机器翻译、文本分类、情感分析、问答系统等。

在实际应用中,数据集的格式可能会根据具体的需求和数据源而有所不同。例如,如果我们使用知识图谱作为数据源,数据集的格式可能会包括实体、关系和属性等信息。

(二)样例目录格式

为了方便管理和使用数据集,我们可以将数据集按照一定的目录结构进行组织。以下是一个样例目录格式:

dataset/
├── train/
│   ├── questions.txt
│   └── answers.txt
├── test/
│   ├── questions.txt
│   └── answers.txt
└── validation/
    ├── questions.txt
    └── answers.txt

在这个目录结构中,dataset 是数据集的根目录,包含三个子目录:traintestvalidation。分别用于存储训练集测试集验证集。每个子目录下都有两个文件:questions.txtanswers.txt,分别存储问题和答案。

(三)数据预处理

在使用数据集进行训练之前,我们需要对数据进行预处理,以提高模型的性能和泛化能力。数据预处理的步骤通常包括以下几个方面:

  1. 文本清洗
    • 去除文本中的噪声和无用信息,如标点符号特殊字符HTML 标签等。
    • 进行文本规范化处理,如大小写转换词干提取词性标注等。
  2. 分词
    • 将文本分割成单词或词组,以便模型进行处理。
    • 可以使用现有的分词工具,如 JiebaHanLP 等。
  3. 建立词汇表
    • 统计数据集中出现的所有单词,并建立一个词汇表。
    • 词汇表可以用于将单词转换为数字表示,以便模型进行处理。
  4. 数据编码
    • 将问题和答案转换为数字序列,以便模型进行处理。
    • 可以使用词汇表将单词转换为数字表示,或者使用其他编码方式,如 One-Hot 编码、Word2Vec 等。

三、技术介绍

(一)Spring Boot 简介

Spring Boot 是一个基于 Spring 框架的快速开发框架,它简化了 Spring 应用的开发过程,提供了自动配置、快速启动和部署等功能。Spring Boot 具有以下特点:

  1. 简化配置
    • Spring Boot 采用约定大于配置的原则,自动配置了很多常用的组件和功能,减少了开发人员的配置工作量。
    • 开发人员只需要关注业务逻辑的实现,而不需要花费大量时间在配置文件上。
  2. 快速启动
    • Spring Boot 内置了 TomcatJetty 等 Web 容器,可以直接运行 Spring 应用,无需额外的服务器部署。
    • 启动速度非常快,可以大大提高开发效率。
  3. 微服务支持
    • Spring Boot 可以轻松地构建微服务架构,支持服务注册与发现、负载均衡、断路器等功能。
    • 可以方便地进行分布式系统的开发和部署。
  4. 易于集成
    • Spring Boot 可以与其他流行的框架和技术进行集成,如 MyBatisRedisRabbitMQ 等。
    • 可以根据项目的需求选择合适的组件和技术,提高开发效率和系统性能。

(二)Java Deeplearning4j 简介

Java Deeplearning4j 是一个基于 Java 的深度学习库,它支持多种深度学习算法和模型,如神经网络、卷积神经网络、循环神经网络等。Java Deeplearning4j 具有以下特点:

  1. 基于 Java 语言
    • Java Deeplearning4j 是一个完全用 Java 语言实现的深度学习库,无需依赖其他语言的运行环境。
    • 这使得它可以在 Java 应用中方便地进行集成和使用。
  2. 支持多种深度学习算法和模型
    • Java Deeplearning4j 支持多种深度学习算法和模型,如神经网络、卷积神经网络、循环神经网络等。
    • 可以根据不同的任务和需求选择合适的算法和模型。
  3. 易于使用
    • Java Deeplearning4j 提供了简单易用的 API,使得开发人员可以轻松地构建和训练深度学习模型。
    • 同时,它还提供了丰富的文档和示例代码,方便开发人员学习和使用。
  4. 高性能
    • Java Deeplearning4j 采用了分布式计算并行处理技术,可以在大规模数据集上进行高效的训练和推理。
    • 同时,它还支持 GPU 加速,可以进一步提高模型的训练速度。

(三)知识图谱简介

知识图谱是一种结构化的语义知识库,它以图形的方式表示实体之间的关系。知识图谱可以用于自然语言处理、智能问答、推荐系统等领域,为这些应用提供丰富的语义信息和知识支持。知识图谱具有以下特点:

  1. 结构化表示
    • 知识图谱以图形的方式表示实体之间的关系,具有结构化的特点。
    • 这使得知识图谱可以方便地进行存储、查询和推理。
  2. 语义丰富
    • 知识图谱中的实体和关系都具有明确的语义含义,可以为自然语言处理等应用提供丰富的语义信息。
    • 例如,在智能问答系统中,知识图谱可以帮助系统理解问题的语义,从而提供更准确的答案。
  3. 可扩展性
    • 知识图谱可以不断地扩展和更新,随着新的知识和数据的加入,知识图谱可以不断地完善和优化。
    • 这使得知识图谱可以适应不同的应用场景和需求。

四、Maven 依赖添加

我们需要在项目的 pom.xml 文件中添加以下 Maven 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>deeplearning4j-core</artifactId>
    <version>1.0.0-beta7</version>
</dependency>
<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>deeplearning4j-nlp</artifactId>
    <version>1.0.0-beta7</version>
</dependency>
<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>deeplearning4j-ui</artifactId>
    <version>1.0.0-beta7</version>
</dependency>

以上 Maven 依赖分别引入了 Spring Boot 的 Web 模块、Java Deeplearning4j 的核心库、自然语言处理库和用户界面库。这些依赖将为我们构建智能问答系统提供必要的功能和支持。

五、代码实现

(一)数据加载和预处理

首先,我们需要加载数据集,并对数据进行清洗和预处理。以下是一个数据加载和预处理的示例代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DataLoader {
    public static List<String[]> loadData(String filePath) {
        List<String[]> data = new ArrayList<>();
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine())!= null) {
                String[] parts = line.split("\\|");
                if (parts.length == 2) {
                    data.add(parts);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }
}

在上面的代码中,我们定义了一个DataLoader类,其中包含一个静态方法loadData,用于加载数据集。该方法接受一个文件路径作为参数,读取文件中的每一行,并将问题和答案对分割成数组,添加到列表中。如果文件读取过程中出现错误,将打印错误信息。

(二)构建语言模型

接下来,我们需要构建语言模型,对用户的问题进行理解和回答。以下是一个使用 Deeplearning4j 构建语言模型的示例代码:

import org.deeplearning4j.nn.api.OptimizationAlgorithm;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.LSTM;
import org.deeplearning4j.nn.conf.layers.RnnOutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.weights.WeightInit;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.lossfunctions.LossFunctions;

public class LanguageModel {
    private MultiLayerNetwork model;
    private int vocabSize;
    private int embeddingSize;
    private int hiddenSize;
    private int numLayers;

    public LanguageModel(int vocabSize, int embeddingSize, int hiddenSize, int numLayers) {
        this.vocabSize = vocabSize;
        this.embeddingSize = embeddingSize;
        this.hiddenSize = hiddenSize;
        this.numLayers = numLayers;
        buildModel();
    }

    private void buildModel() {
        MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
               .seed(12345)
               .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
               .updater(0.01)
               .list()
               .layer(0, new LSTM.Builder()
                       .nIn(embeddingSize)
                       .nOut(hiddenSize)
                       .activation(Activation.TANH)
                       .weightInit(WeightInit.XAVIER)
                       .build())
               .layer(1, new LSTM.Builder()
                       .nIn(hiddenSize)
                       .nOut(hiddenSize)
                       .activation(Activation.TANH)
                       .weightInit(WeightInit.XAVIER)
                       .build())
               .layer(2, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
                       .activation(Activation.SOFTMAX)
                       .nIn(hiddenSize)
                       .nOut(vocabSize)
                       .weightInit(WeightInit.XAVIER)
                       .build())
               .pretrain(false).backprop(true)
               .build();
        model = new MultiLayerNetwork(conf);
        model.init();
    }

    public void train(DataSet dataSet) {
        model.fit(dataSet);
    }

    public INDArray predict(INDArray input) {
        return model.output(input);
    }
}

在上面的代码中,我们定义了一个LanguageModel类,用于构建语言模型。该类包含一个MultiLayerNetwork对象,表示语言模型的神经网络,以及一些参数,如词汇表大小、嵌入维度、隐藏层大小和层数。在构造函数中,我们调用buildModel方法构建语言模型的神经网络。在buildModel方法中,我们使用NeuralNetConfiguration.Builder构建神经网络的配置,包括随机种子、优化算法、学习率等。然后,我们使用MultiLayerNetwork的构造函数创建神经网络对象,并调用init方法初始化神经网络。在train方法中,我们使用fit方法训练语言模型,接受一个DataSet对象作为参数,表示训练数据。在predict方法中,我们使用output方法预测下一个单词的概率分布,接受一个INDArray对象作为参数,表示输入序列。

(三)智能问答系统服务

最后,我们需要构建智能问答系统的服务,处理用户的请求,并返回答案。以下是一个使用 Spring Boot 构建智能问答系统服务的示例代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@SpringBootApplication
@RestController
public class QuestionAnsweringSystemApplication {
    private LanguageModel languageModel;
    private List<String[]> data;

    public QuestionAnsweringSystemApplication(LanguageModel languageModel, List<String[]> data) {
        this.languageModel = languageModel;
        this.data = data;
    }

    @PostMapping("/answer")
    public String answerQuestion(@RequestBody Map<String, String> question) {
        String inputQuestion = question.get("question");
        for (String[] pair : data) {
            if (pair[0].equals(inputQuestion)) {
                return pair[1];
            }
        }
        return "Sorry, I don't know the answer.";
    }

    public static void main(String[] args) {
        SpringApplication.run(QuestionAnsweringSystemApplication.class, args);
    }
}

在上面的代码中,我们定义了一个QuestionAnsweringSystemApplication类,作为智能问答系统的服务。该类使用@SpringBootApplication注解标记为 Spring Boot 应用程序的入口点,并使用@RestController注解标记为 RESTful API 的控制器。在构造函数中,我们接受一个LanguageModel对象和一个数据集作为参数,并将它们存储在成员变量中。在answerQuestion方法中,我们接受一个包含问题的 JSON 对象作为请求体,并返回答案。如果问题在数据集中存在,我们直接返回对应的答案;否则,我们返回一个默认的回答。最后,在main方法中,我们启动 Spring Boot 应用程序。

六、单元测试

为了确保智能问答系统的正确性和稳定性,我们需要进行单元测试。以下是一个单元测试的示例代码:

import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class LanguageModelTest {
    private LanguageModel languageModel;

    @BeforeEach
    public void setUp() {
        int vocabSize = 10;
        int embeddingSize = 5;
        int hiddenSize = 10;
        int numLayers = 2;
        languageModel = new LanguageModel(vocabSize, embeddingSize, hiddenSize, numLayers);
    }

    @Test
    public void testPredict() {
        INDArray input = Nd4j.create(new int[]{1, 2, 3}, new int[]{1, 3});
        INDArray output = languageModel.predict(input);
        assertEquals(output.shape()[0], 1);
        assertEquals(output.shape()[1], vocabSize);
    }
}

在上面的代码中,我们定义了一个LanguageModelTest类,用于测试LanguageModel类。在setUp方法中,我们创建一个LanguageModel对象,并设置一些参数。在testPredict方法中,我们创建一个输入序列,并调用predict方法预测下一个单词的概率分布。然后,我们检查输出的形状是否正确。

七、预期输出

当我们运行智能问答系统时,我们可以通过发送 POST 请求到/answer接口来获取答案。以下是一个预期的输出示例:

{
    "question": "什么是人工智能?",
    "answer": "人工智能是指计算机系统能够执行通常需要人类智能才能完成的任务,如学习、推理、解决问题等。"
}

如果问题在数据集中不存在,我们将得到以下输出:

{
    "question": "什么是深度学习?",
    "answer": "Sorry, I don't know the answer."
}

八、参考资料文献

  1. Spring Boot 官方文档
  2. Deeplearning4j 官方文档
  3. 知识图谱介绍
  4. 循环神经网络介绍

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

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

相关文章

相较于发达国家约70%的普及率,中国【台式洗碗机】渗透率仅在2%-3%之间,潜在市场增量可观

内容摘要 据 HengCe 最新调研&#xff0c;2023年中国台式洗碗机市场销售收入达到了 万元&#xff0c;预计2030年可以达到 万元&#xff0c;2024-2030期间年复合增长率(CAGR)为 %。本研究项目旨在梳理台式洗碗机领域产品系列&#xff0c;洞悉行业特点、市场存量空间及增量空间&…

自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于python的机器学习(四)—— 聚类(一)

目录 一、聚类的原理与实现 1.1 聚类的概念和类型 1.2 如何度量距离 1.2.1 数据的类型 1.2.2 连续型数据的距离度量方法 1.2.3 离散型数据的距离度量方法 1.3 聚类的基本步骤 二、层次聚类算法 2.1 算法原理和实例 2.2 算法的Sklearn实现 2.2.1 层次聚类法的可视化实…

算法知识-12-指针

概念 指针是一个变量&#xff0c;它存储的是另一个变量的内存地址。 基础使用指针 //声明 int* ptr; // 声明一个指向 int 类型的指针 //初始化 int num 5; int* ptr2 &num; // 使 ptr2 指向 num 的地址 //访问值 cout << *ptr2; // 输出 ptr2 所指向的 num …

图像上显示中文文本 - python 实现

该示例是在图像上显示中文文本&#xff0c;并用opencv的显示方式显示。 注意&#xff1a;SimHei.ttf&#xff08;黑体字体&#xff09;为字体文件&#xff0c;Windows 默认字体路径&#xff1a;C:/Windows/Fonts/SimHei.ttf 具体实现代码如下&#xff1a; # -*-coding:utf-8…

uniapp rpx兼容平板

问题: 使用uniapp开发平板端时, rpx/upx 内容过小, 没有适应屏幕 原因: uniapp 默认支持最大设备宽度为960px 而平板宽度超出了960 uniapp官方文档https://uniapp.dcloud.io/collocation/pages?idglobalstyle 解决: // pages.json 文件&#xff1a; {//..."globalSt…

【隐私计算大模型】联邦深度学习之拆分学习Split learning原理及安全风险、应对措施以及在大模型联合训练中的应用案例

Tips&#xff1a;在两方场景下&#xff0c;设计的安全算法&#xff0c;如果存在信息不对等性&#xff0c;那么信息获得更多的一方可以有概率对另一方实施安全性攻击。 1. 拆分学习原理 本文介绍了一种适用于隐私计算场景的深度学习实现方案——拆分学习&#xff0c;又称分割…

Java函数式编程基础之【Optional类】详解

一、概述 Optional 是 Java 8 引入的新特性&#xff0c;它是一种特殊的包装类&#xff0c;里面只存储一个元素&#xff08;这一点与基本数据类型的包装类有点相似&#xff09;。有的文档称其为容器类&#xff0c;但它不同于 Conllection框架中的集合类&#xff0c;它一个容器只…

stm32与ht7038的项目

最近做了一个stm32与ht7038的数据采集项目 硬件包含太阳能充电电路 ht7038采集芯片电路 buck电路 stm32最小系统电路和lora模块电路 硬件PCB如下图所示 ht7038的程序如下所示ht7038.c #include "ht7038.h" #include "stm32l0xx_hal_spi.h"typedef uint8…

AbsPlus框架介绍2

ABSPlus框架以其集成的多功能性在市场上脱颖而出。它不仅提供美观且符合主流风格的页面设计&#xff0c;还支持灵活的流程配置&#xff0c;包括算法处理流程和页面审批流程。在众多业务系统中&#xff0c;流程管理往往是核心且复杂的挑战&#xff0c;涉及数据库设计、页面开发以…

springboot基于微信小程序的食堂预约点餐系统

摘 要 基于微信小程序的食堂预约点餐系统是一种服务于学校和企事业单位食堂的智能化解决方案&#xff0c;旨在提高食堂就餐的效率、缓解排队压力&#xff0c;并优化用户的就餐体验。系统作为一种现代化的解决方案&#xff0c;为食堂管理和用户就餐提供了便捷高效的途径。它不仅…

免费的视频混剪综合处理工具介绍与下载

免费的视频混剪综合处理工具 软件截图 功能 支持&#xff1a; 这个软件主要用于视频的批量处理&#xff0c;包括添加水印、裁剪、画中画、去水印、去头尾、变速、文本和背景音乐等功能。以下是界面中一些主要功能的介绍&#xff1a; 视频队列&#xff1a;显示当前待处理的视…

2024年亚太数学建模竞赛问题C宠物产业及相关产业发展分析与对策

随着人们消费理念的发展&#xff0c;随着经济的快速发展和人均收入的提高&#xff0c;宠物产业作为一个新兴产业在全球范围内逐渐积聚势头。1992年&#xff0c;中国小动物保护协会成立&#xff0c;随后1993年&#xff0c;皇家狗狗、玛氏等国际宠物品牌进入中国市场。随着“宠物…

如何默认VS2019用管理员方式打开

1.通过快捷方式找到“Visual Studio 2019”所在文件夹。 2.继续在"Visual Studio 2019"右键菜单&#xff0c;打开“devenv.exe”所在文件夹。 3.在“devenv.exe”右键菜单&#xff0c;选择“兼容性疑难解答”。 4.选择“疑难解答程序”。 5.选择勾选“该程序需要附加…

鸿蒙UI开发与部分布局

UI开发 1. 布局概述 1.1 开发流程 1.先确定开发流程 -> 2.分析页面元素构成 ->3.选用合适的布局容器组件 1.3 布局元素组成&#xff1a;盒模型 2.1 布局分类 2.1 线性布局 线性布局是开发中最常用、最基础的布局&#xff0c;通过线性容器Row和Column构建 2.1.1 线性布…

Python中Tushare(金融数据库)入门详解

文章目录 Python中Tushare&#xff08;金融数据库&#xff09;入门详解一、引言二、安装与注册1、安装Tushare2、注册与获取Token 三、Tushare基本使用1、设置Token2、获取数据2.1、获取股票基础信息2.2、获取交易日历2.3、获取A股日线行情2.4、获取沪股通和深股通成份股2.5、获…

性能优化(二):ANR

介绍 ANR全称Application Not Responding&#xff0c;意思就是程序未响应。如果一个应用无法响应用户的输入&#xff0c;系统就会弹出一个ANR对话框&#xff0c;用户可以自行选择继续等待亦或者是停止当前程序。 Android系统会监控程序的响应状况&#xff0c;一旦出现下面情况…

神经网络问题之:梯度不稳定

梯度不稳定是深度学习中&#xff0c;特别是在训练深度神经网络时常见的一个问题&#xff0c;其本质涉及多个方面。 一、根本原因 梯度不稳定问题的根本原因在于深度神经网络的结构和训练过程中的一些固有特性。随着网络层数的增加&#xff0c;梯度在反向传播过程中会逐层累积变…

弹幕发送功能‘简单’实现

导入依赖 <!-- websocket弹幕依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>后端代码 package com.by.danmaku;import org.springfra…

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…