从零开始学习Java神经网络、自然语言处理和语音识别,附详解和简易版GPT,语音识别完整代码示例解析

news/2024/5/4 6:20:23/文章来源:https://blog.csdn.net/weixin_46780832/article/details/129566214

在这里插入图片描述

🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

目录

    • 一、神经网络简介
    • 二、实现简单神经网络
    • 三、Java自然语言处理示例代码(简易版GPT)
    • 四、Java简易版语音识别示例代码
    • 五、结论

神经网络是一种模仿人脑神经系统运行方式的计算模型。在计算机科学领域,神经网络被广泛应用于图像处理、自然语言处理、语音识别、智能推荐等领域。本文将介绍如何用Java编写一个简易版的神经网络模型。

一、神经网络简介

神经网络由神经元(neuron)和连接(synapse)构成。每个神经元接收一些输入,经过加权和运算后产生输出。神经元之间的连接有不同的权值,表示不同神经元之间的强度。神经网络的训练过程就是通过调整权值,使网络能够学习输入输出的映射关系。

神经网络通常包含输入层、隐藏层和输出层。输入层接收输入信号,隐藏层进行处理,输出层产生最终结果。每个层都由多个神经元组成,它们之间通过连接进行通信。神经网络的结构和参数(权值)都需要进行设计和调整,以适应不同的任务。

二、实现简单神经网络

我们将实现一个简单的神经网络,包含一个输入层、一个隐藏层和一个输出层。输入层有3个神经元,隐藏层有4个神经元,输出层有1个神经元。我们将使用反向传播算法来训练神经网络。

首先,我们需要定义神经网络的结构。我们可以创建一个类来表示神经元,另一个类来表示神经网络层。以下是神经元类的定义:

public class Neuron {private double output; //神经元的输出值private double error; //神经元的误差//计算神经元的输出值public double calculateOutput(double[] inputs, double[] weights) {double sum = 0;for (int i = 0; i < inputs.length; i++) {sum += inputs[i] * weights[i];}output = sigmoid(sum);return output;}//计算sigmoid函数private double sigmoid(double x) {return 1 / (1 + Math.exp(-x));}//设置神经元的误差public void setError(double error) {this.error = error;}//获取神经元的误差public double getError() {return error;}//获取神经元的输出值public double getOutput() {return output;}
}

上述代码中,我们定义了一个神经元类,它包含神经元的输出值、误差以及计算输出值的方法。计算输出值的方法使用了sigmoid函数,它将神经元的加权和转换为0到1之间的输出值。

接下来,我们定义神经网络层的类。以下是神经网络层类的定义:

public class NetworkLayer {private int numberOfNeurons; //神经网络层的神经元数量private Neuron[] neurons; //神经网络层的神经元数组//初始化神经网络层public NetworkLayer(int numberOfNeurons, int numberOfInputsPerNeuron) {this.numberOfNeurons = numberOfNeurons;neurons = new Neuron[numberOfNeurons];for (int i = 0; i < numberOfNeurons; i++) {neurons[i] = new Neuron();}}//计算神经网络层的输出值public double[] calculateLayerOutput(double[] inputs) {double[] outputs = new double[numberOfNeurons];for (int i = 0; i < numberOfNeurons; i++) {outputs[i] = neurons[i].calculateOutput(inputs, weights[i]);}return outputs;}//计算隐藏层的误差public void calculateHiddenLayerError(NetworkLayer outputLayer, double[] outputError) {double[] error = new double[numberOfNeurons];for (int i = 0; i < numberOfNeurons; i++) {double sum = 0;for (int j = 0; j < outputLayer.getNumberOfNeurons(); j++) {sum += outputError[j] * outputLayer.getNeurons()[j].getWeights()[i];}error[i] = neurons[i].getOutput() * (1 - neurons[i].getOutput()) * sum;}for (int i = 0; i < numberOfNeurons; i++) {neurons[i].setError(error[i]);}//更新神经元的权重值
public void updateWeights(double[] inputs, double learningRate) {for (int i = 0; i < numberOfNeurons; i++) {double[] weights = neurons[i].getWeights();for (int j = 0; j < inputs.length; j++) {weights[j] += learningRate * neurons[i].getError() * inputs[j];}}
}//获取神经元的数量public int getNumberOfNeurons() {return numberOfNeurons;}//获取神经元数组public Neuron[] getNeurons() {return neurons;
}}

上述代码中,我们定义了一个神经网络层类,它包含神经元数量、神经元数组以及计算输出值、计算误差和更新权重值的方法。

现在,我们可以将上述两个类组合起来创建一个完整的神经网络。以下是完整的神经网络类的定义:

public class NeuralNetwork {private NetworkLayer inputLayer;private NetworkLayer hiddenLayer;private NetworkLayer outputLayer;//初始化神经网络public NeuralNetwork() {inputLayer = new NetworkLayer(3, 4);hiddenLayer = new NetworkLayer(4, 3);outputLayer = new NetworkLayer(1, 4);}//计算神经网络的输出值public double calculateOutput(double[] inputs) {double[] hiddenLayerOutput = hiddenLayer.calculateLayerOutput(inputs);return outputLayer.calculateLayerOutput(hiddenLayerOutput)[0];}//训练神经网络public void train(double[][] inputs, double[] outputs, double learningRate, int epochs) {for (int epoch = 0; epoch < epochs; epoch++) {double error = 0;for (int i = 0; i < inputs.length; i++) {double[] hiddenLayerOutput = hiddenLayer.calculateLayerOutput(inputs[i]);double[] outputLayerOutput = outputLayer.calculateLayerOutput(hiddenLayerOutput);double outputError = outputs[i] - outputLayerOutput[0];outputLayer.getNeurons()[0].setError(outputError);hiddenLayer.calculateHiddenLayerError(outputLayer, outputLayer.getNeurons()[0].getWeights());hiddenLayer.updateWeights(inputs[i], learningRate);outputLayer.updateWeights(hiddenLayerOutput, learningRate);error += Math.pow(outputError, 2);}error /= inputs.length;System.out.println("Epoch " + epoch + " Error: " + error);}}
}

上述代码中,我们定义了一个神经网络类,它包含输入层、隐藏层和输出层。计算输出值的方法调用了隐藏层和输出层的计算输出值方法。训练方法使用了反向传播算法来更新神经网络的权重值,并计算误差。训练方法中的输出显示了每个时代的误差。

三、Java自然语言处理示例代码(简易版GPT)

用于从文本中提取名词短语

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.util.CoreMap;import java.util.ArrayList;
import java.util.List;
import java.util.Properties;import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.util.CoreMap;public class NLPExample {public static void main(String[] args) {// 要处理的文本String text = "我有一只名叫小陈的猫。她喜欢在csdn发博客。";// 提取名词短语List<String> nounPhrases = extractNounPhrases(text);// 输出结果System.out.println(nounPhrases);}public static List<String> extractNounPhrases(String text) {List<String> nounPhrases = new ArrayList<String>();// 创建Stanford CoreNLP对象Properties props = new Properties();props.setProperty("annotators", "tokenize, ssplit, pos");StanfordCoreNLP pipeline = new StanfordCoreNLP(props);// 对文本进行注释Annotation document = new Annotation(text);pipeline.annotate(document);// 获取句子列表List<CoreMap> sentences = document.get(CoreAnnotations.SentencesAnnotation.class);// 遍历每个句子,提取名词短语for (CoreMap sentence : sentences) {String sentenceText = sentence.get(CoreAnnotations.TextAnnotation.class);List<CoreLabel> tokens = sentence.get(CoreAnnotations.TokensAnnotation.class);for (int i = 0; i < tokens.size(); i++) {CoreLabel token = tokens.get(i);String pos = token.get(CoreAnnotations.PartOfSpeechAnnotation.class);// 如果当前标记是一个名词,则收集它的名词短语if (pos.startsWith("NN")) {String nounPhrase = token.get(CoreAnnotations.TextAnnotation.class);int j = i + 1;while (j < tokens.size()) {CoreLabel nextToken = tokens.get(j);String nextPos = nextToken.get(CoreAnnotations.PartOfSpeechAnnotation.class);if (nextPos.startsWith("NN")) {nounPhrase += " " + nextToken.get(CoreAnnotations.TextAnnotation.class);j++;} else {break;}}nounPhrases.add(nounPhrase);}}}return nounPhrases;}
}

代码说明:
这个示例代码使用了Stanford CoreNLP库,它是一个流行的自然语言处理工具包,可以用于分词、句子分割、词性标注、命名实体识别等任务。在这个示例代码中,我们首先使用Stanford CoreNLP对输入文本进行处理,然后遍历每个词语,如果它的词性标注以"NN"开头,则将它作为名词短语的一部分。最后,我们将所有提取到的名词短语存储在一个列表中,并返回该列表。

四、Java简易版语音识别示例代码

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import edu.cmu.sphinx.api.Configuration;
import edu.cmu.sphinx.api.LiveSpeechRecognizer;public class SpeechRecognition {public static void main(String[] args) throws Exception {// 配置语音识别引擎Configuration configuration = new Configuration();// 设置语音识别引擎使用的语言模型文件和字典文件configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us");configuration.setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict");// 创建语音识别器LiveSpeechRecognizer recognizer = new LiveSpeechRecognizer(configuration);// 开始语音识别recognizer.startRecognition(true);// 获取识别结果while (true) {String result = recognizer.getResult().getHypothesis();System.out.println("识别结果:" + result);}// 停止语音识别recognizer.stopRecognition();}// 读取音频文件public static AudioInputStream getAudioInputStream(String filename) throws IOException {File file = new File(filename);InputStream inputStream = new FileInputStream(file);return AudioSystem.getAudioInputStream(inputStream);}// 保存音频文件public static void saveAudioFile(AudioInputStream audioInputStream, String filename, AudioFileFormat.Type fileType) throws IOException {File file = new File(filename);AudioSystem.write(audioInputStream, fileType, file);}
}

代码说明:
这个示例代码使用了CMUSphinx语音识别引擎,实现了一个简单的语音识别功能。代码中,Configuration类用于配置语音识别引擎,LiveSpeechRecognizer类用于创建语音识别器,getAudioInputStream方法用于读取音频文件,saveAudioFile方法用于保存音频文件。

在代码中,通过configuration.setAcousticModelPath方法和configuration.setDictionaryPath方法设置了语音识别引擎使用的语言模型文件和字典文件。然后创建了一个LiveSpeechRecognizer对象,并调用其startRecognition方法开始语音识别,再通过getResult方法获取识别结果,最后调用stopRecognition方法停止语音识别。

五、结论

本文介绍了如何使用Java编写一个简单的神经网络模型,包含输入层、隐藏层和输出层。我们使用了反向传播算法来训练神经网络,反向传播算法是一种广泛使用的神经网络训练算法,它使用了梯度下降法来最小化神经网络的误差。在本文中,我们使用反向传播算法来更新神经网络的权重值,以使神经网络的输出尽可能接近预期的输出。我们还介绍了神经网络的基本概念,包括神经元、神经网络层和神经网络。

虽然本文中实现的神经网络非常简单,但是我们可以通过增加神经元、增加隐藏层或增加更多的训练数据来增强神经网络的性能。此外,还有许多其他的神经网络架构和训练算法可供选择,可以根据具体应用场景选择合适的架构和算法。

总之,神经网络是一种非常强大的工具,可以用于许多不同的应用,如图像识别、自然语言处理和预测等。希望本文可以为读者提供基本的神经网络实现思路,以便进一步研究和应用。

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

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

相关文章

【Linux系统】理解Linux中进程间通信

Linux进程间通信1 进程间通信的介绍1.1为什么要有进程间通信1.2 为什么能进程间通信2 进程间通信的框架2.1 进程间通信机制的结构2.2 进程间通信机制的类型2.2.1 共享内存式2.2.2 消息传递式2.3 进程间通信的接口设计3 进程间通信机制简介4 详细讲解进程间通信部分机制&#xf…

DFIG控制10: 双馈发电机的动态模型

DFIG控制10&#xff1a; 双馈发电机的动态模型。主要介绍DFIG在三相坐标系、定子αβ坐标系、dq同步坐标系下的模型。 本文主要是整理了DFIG的动态模型的公式和坐标变换的过程。某些描述是为了便于自己理解&#xff0c;不一定准确。 大部分内容参考&#xff1a; G. Abad, J. …

树莓派连接串口时无法开机

树莓派连接串口时无法开机我的情况我的思考我的解决过程重点参考我的情况 因为项目需要&#xff0c;因此需要使用树莓派控制电机&#xff0c;而电机是一上电就会给树莓派发送数据&#xff0c;而这时树莓派还正处于开机时&#xff0c;结果就是开机失败。当将串口断开时就又可以…

8.Java面向对象---类、属性和方法

Java面向对象—类、属性和方法 在生活中&#xff0c;说到类&#xff0c;可以联想到类别&#xff0c;同类&#xff0c;会想到一类人&#xff0c;一类事物等等。而这一类人或事物都是具有相同特征或特点和行为的&#xff0c;我们根据不同的特征或特点和行为将他们归类或分类。同…

形式语言和自动机总结DFA、NFA正则语言

第一章DFA 形式定义和状态转移函数: DFA是一种特殊的NFA&#xff0c; A{Q,,,,F} Q:输入状态集&#xff0c;∑:字母表&#xff0c;δ:状态转移函数Q∑→Q q0∈Q初始状态 F终结集 设计举例 1.设计接受偶数个0和偶数个1串的DFA 2.设计 DFA 接受 {0,1} 上的字符串 w, 且 w 是 …

【数据结构】-计数排序

&#x1f387;作者&#xff1a;小树苗渴望变成参天大树 &#x1f389; 作者宣言&#xff1a;认真写好每一篇博客 &#x1f38a;作者gitee:link 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录前言一、计数排序二、排序算法复杂度…

《花雕学AI》18:AI绘画尝鲜Prompt Hunt,使用人工智能模型来创造、探索和分享艺术作品

引言&#xff1a; 人工智能是当今科技领域的热门话题&#xff0c;它不仅可以帮助人类解决各种实际问题&#xff0c;也可以激发人类的创造力和艺术感。Prompt Hunt就是一个利用人工智能模型来创造、探索和分享艺术作品的AI绘画网站。它提供了三种不同的模型&#xff0c;分别是S…

Java垃圾收集原理

程序计数器、虚拟机栈、本地方法栈这三个区域随线程而灭&#xff0c;栈中栈帧的内存大小也是在确定的。这几个区域的内存分配和回收都具有确定性&#xff0c;因此不需要过多考虑如何回收。 Java堆和方法区这两个区域有着很显著的不确定性 一个接口的实现类需要的内存可能不一…

用Flutter开发一款音乐App(从0到1开发一款音乐App)

Flutter Music_Listener(flutter音乐播放器) Flutter version 3.9 项目介绍 1、项目整体基于getxretrofitdiojsonserialize开发 2、封装通用控制器BaseController&#xff0c;类似jetpack mvvm框架中的BaseViemodel 3、封装基础无状态基类BaseStatelessWidget&#xff0c;结合…

十三、市场活动:全部导出

功能需求&#xff1a;批量导出市场活动 用户在市场活动主页面,点击"批量导出"按钮,把所有市场活动生成一个excel文件,弹出文件下载的对话框; 用户选择要保存的目录,完成导出市场活动的功能. *导出成功之后,页面不刷新 功能分析&#xff1a;导出市场活动 1.给批量…

Vue组件化编程【Vue】

2.Vue 组件化编程 2.1 模块与组件、模块化与组件化 2.1.1 模块 理解&#xff1a;向外提供特定功能的js程序&#xff0c;一般就是一个js文件为什么&#xff1a;js文件很多很复杂作用&#xff1a;复用js、简化js的编写、提高js运行效率。 2.1.2 组件 理解&#xff1a;用来实…

接口自动化【一】(抓取后台登录接口+postman请求通过+requests请求通过+json字典区别)

文章目录 前言一、requests库的使用二、json和字典的区别三、后端登录接口-请求数据生成四、接口自动化-对应电商项目中的功能五、来自postman的代码-后端登录总结前言 记录&#xff1a;json和字典的区别&#xff0c;json和字段的相互转化&#xff1b;postman发送请求与Python…

source insight4.0使用技巧总结

一、技巧1&#xff1a;查看函数调用关系 步骤 1&#xff1a;在主菜单中点击下图中的按钮 图 1 打开relation界面 步骤 2&#xff1a;在弹出的relation界面点击“设置”按钮&#xff0c; 图2 点击“设置”按钮 步骤3&#xff1a; 在“设置”界面中&#xff0c;“Levels”选择…

AC7811-FOC无感控制代码详解

目录 矢量控制原理 矢量控制框图 电流采样方式 电流在整个控制过程中的传递 采样关键点 三电阻 双电阻 单电阻 三者对比 坐标变换 dq轴电流的PI控制 启动方式 启动波形 脉冲注入 高频注入 Startup 预定位到指定角度 PulseInject_api hfi_api Speed loop s…

前端学习:HTML块、类、Id

目录 快 一、块元素、内联元素 二、HTML 元素 三、HTML元素 类 一、分类块级元素 二、分类行内元素 Id 一、使用 id 属性 二、 class与ID的差异 三、总结 快 一、块元素、内联元素 大多数HTML元素被定义为块级元素或内联元素。 块级元素在浏览器显示时&#xff0c;通常会…

FTP-----局域网内部传输文件(1)

在日常工作中&#xff0c;如果需要跨设备的传输文件&#xff0c;您需要借助USB数据线或者借助应用实现无线互联&#xff0c;将所需文件传输到对应设备&#xff0c;这一来一去&#xff0c;花费的时间与精力变多了&#xff0c;那么&#xff0c;怎么实现不使用第三方软件来实现跨设…

3-5年以上的功能测试如何进阶自动化?【附学习路线】

做为功能测试人员来讲&#xff0c;从发展方向上可分两个方面&#xff1a; 1、业务流程方向 2、专业技能方向。 当确定好方向后&#xff0c;接下来就是如何达到了。(文末自动化测试学习资料分享) 一、业务流程方向 1、熟悉底层的业务 作为功能测试工程师来讲&#xff0c;了解…

【C++高级】手写线程池项目-经典死锁问题分析-简历项目输出指导

作为五大池之一&#xff0c; 线程池的应用非常广 泛&#xff0c;不管是客户端程序&#xff0c;还是后台服务程序&#xff0c;掌握线程池&#xff0c;是提高业务处理能力的必备模块 本课程将带你从零开始&#xff0c;设计一个支持fixed和cached模式的线程池&#xff0c;玩转C11、…

IGA_PLSM3D的理解1

文章目录前言一、IgaTop3D_FAST.m给的参数二、Material properties 材料特性对Geom_Mod3D的理解对Pre_IGA3D的理解 输出1-----CtrPts&#xff1a; 输出2-----Ele&#xff1a; 输出3-----GauPts&#xff1a;前言 只是为方便学习&#xff0c;不做其他用途 一、IgaTop3D_FAST.m给的…

Python爬虫-某跨境电商(AM)搜索热词

前言 本文是该专栏的第42篇,后面会持续分享python爬虫干货知识,记得关注。 关于某跨境电商(AM),本专栏前面有单独详细介绍过,获取配送地的cookie信息以及商品库存数据,感兴趣的同学可往前翻阅。 1. python爬虫|爬取某跨境电商AM的商品库存数据(Selenium实战) 2. Seleni…