当前位置: 首页 > news >正文

【深度学习】发展过程和实际应用场景——图像分类 ?自然语音处理?语音识别?自动驾驶?医疗影像诊断?附代码

【深度学习】发展过程和实际应用场景——图像分类 ?自然语音处理?语音识别?自动驾驶?医疗影像诊断?附代码

【深度学习】发展过程和实际应用场景——图像分类 ?自然语音处理?语音识别?自动驾驶?医疗影像诊断?附代码


文章目录

  • 【深度学习】发展过程和实际应用场景——图像分类 ?自然语音处理?语音识别?自动驾驶?医疗影像诊断?附代码
  • 前言
  • 1.深度学习的历史与发展
    • 1.1 早期发展
    • 1.2 神经网络的停滞与复兴
    • 1.3 深度学习的蓬勃发展
  • 2.深度学习的核心原理
  • 3.常见的深度学习框架
  • 4.深度学习的应用场景
    • 4.1图像分类
    • 4.2自然语言处理(NLP)
    • 4.3语音识别
    • 4.4自动驾驶
    • 4.5医疗影像诊断
  • 总结


前言

深度学习(Deep Learning)是机器学习的一个子领域,它依赖于人工神经网络,特别是具有多层结构的深度神经网络(DNN)。它在图像处理、语音识别、自然语言处理、推荐系统等方面得到了广泛的应用。下面我们将深入探讨深度学习的发展历史、技术原理、框架以及具体的应用场景。

1.深度学习的历史与发展

1.1 早期发展

  • 20世纪40年代:神经网络的思想可以追溯到20世纪40年代,麦卡洛克(Warren McCulloch)和皮茨(Walter Pitts)提出了神经元模型这个模型简单地模拟了人类大脑中神经元的基本运作
  • 1958年:Frank Rosenblatt提出了感知器(Perceptron),这是最早的人工神经网络之一,能够实现简单的二分类任务

1.2 神经网络的停滞与复兴

  • 1970-1980年代:尽管感知器在简单问题上取得了一些成功,但由于感知器无法解决非线性问题(如异或问题),神经网络的研究陷入低谷
  • 1986年:Hinton等人提出了反向传播(Backpropagation)算法,使得多层神经网络(即“深度网络”)的训练成为可能。这是深度学习的一个关键突破。
  • 2006年:Hinton提出了深度信念网络(DBN),这是深度学习的正式崛起,标志着研究的复兴。

1.3 深度学习的蓬勃发展

  • 2010年以后:得益于数据量的激增和计算资源(特别是GPU)的提升,深度学习模型能够处理更复杂的任务。尤其在图像分类(如ImageNet比赛)和语音识别等领域,深度学习的表现远超传统的机器学习方法。

2.深度学习的核心原理

深度学习的核心是模拟生物神经元网络的人工神经网络。简单来说,神经网络由多个“层”组成,每一层由许多“节点”(或“神经元”)构成。每个节点接收输入并通过激活函数生成输出,传递给下一个节点。常见的激活函数包括ReLU、Sigmoid和Tanh等

  • 1.前向传播(Forward Propagation):输入数据通过层层神经元传递,生成输出结果。
  • 2.损失函数(Loss Function):用于衡量模型预测结果与实际结果的差距。常见的损失函数有均方误差(MSE)和交叉熵损失(Cross-Entropy Loss)。
  • 3.反向传播(Backpropagation):通过链式法则,计算损失对每个权重的梯度,从而更新网络的权重以最小化损失。
  • 4.优化算法(Optimization Algorithm):用于更新网络参数。常见的优化算法包括梯度下降(Gradient Descent)、Adam、RMSprop等。

3.常见的深度学习框架

  • 1.TensorFlow:由Google推出,支持灵活的计算图和分布式训练。
  • 2.PyTorch:由Facebook开发,易于使用,具有动态计算图,非常适合研究和快速原型开发。
  • 3.Keras:一个高级API,能够在TensorFlow或Theano之上构建和训练神经网络,简化了模型构建流程。
  • 4.MXNet:由亚马逊推出,专注于分布式训练和跨设备的高效计算。
  • 5.Caffe:由伯克利视觉和学习中心开发,擅长图像分类等任务。

4.深度学习的应用场景

4.1图像分类

场景:图像分类是深度学习最经典的应用之一,目标是为输入的图像分配一个类标签

  • 实现:使用卷积神经网络(CNN)处理图像,自动提取图像特征

代码示例:

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms# 定义简单的CNN
class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3)self.conv2 = nn.Conv2d(32, 64, kernel_size=3)self.fc1 = nn.Linear(64*12*12, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = torch.relu(self.conv1(x))x = torch.relu(self.conv2(x))x = x.view(-1, 64*12*12)  # 展开为一维x = torch.relu(self.fc1(x))x = self.fc2(x)return torch.log_softmax(x, dim=1)# 数据处理
transform = transforms.Compose([transforms.ToTensor()])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)# 定义模型、损失函数和优化器
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
for epoch in range(1, 11):for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()if batch_idx % 100 == 0:print(f'Epoch {epoch}, Batch {batch_idx}, Loss: {loss.item()}')

代码解释:

  • 1.SimpleCNN 定义了一个简单的卷积神经网络,包含两个卷积层和两个全连接层。
  • 2.forward 函数描述了前向传播的过程,通过ReLU激活函数进行非线性变换。
  • 3.使用 MNIST 数据集,定义了数据加载器和模型。
  • 4.使用交叉熵损失函数计算预测和真实标签的差距,并通过Adam优化器更新权重。

4.2自然语言处理(NLP)

场景:文本分类,例如情感分析。

  • 实现:可以使用循环神经网络(RNN)或基于Transformer的模型(如BERT)处理文本

代码示例:

import torch
from transformers import BertTokenizer, BertForSequenceClassification# 加载预训练的BERT模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')# 示例句子
sentences = ["I love this product!", "This is a bad experience."]# 将句子编码成BERT输入格式
inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")# 模型推理
outputs = model(**inputs)# 输出分类结果
logits = outputs.logits
print(logits)

代码解释:

  • 加载BERT模型和对应的分词器,能够将文本转化为模型所需的格式。
  • inputs 是BERT所需的张量形式输入,logits 是模型的输出,表示分类结果。

4.3语音识别

场景:将语音信号转化为文本。语音识别的目标是将语音信号转化为文字,这通常使用深度神经网络(如RNN、CNN 或 Transformer)来处理音频序列。

  • 实现:以预训练的Wav2Vec 2.0模型为例,这是基于Transformer的自动语音识别(ASR)模型

代码示例:

import torch
from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC
import torchaudio# 加载预训练的Wav2Vec 2.0模型和处理器
processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h")
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h")# 加载音频文件并进行预处理
waveform, sample_rate = torchaudio.load("path_to_audio_file.wav")
input_values = processor(waveform, sampling_rate=sample_rate, return_tensors="pt").input_values# 使用模型进行推理
with torch.no_grad():logits = model(input_values).logits# 解码预测结果
predicted_ids = torch.argmax(logits, dim=-1)
transcription = processor.batch_decode(predicted_ids)print("识别结果: ", transcription)

代码解释:

1.加载模型和处理器:

  • Wav2Vec2Processor 用于将音频转换为模型所需的输入形式。
  • Wav2Vec2ForCTC 是基于Wav2Vec2的语音识别模型。

2.加载和预处理音频:

  • 使用 torchaudio.load 函数加载音频文件,并将其采样率与模型要求的采样率保持一致。
  • processor 将音频转换为模型可以接受的张量格式。

3.推理过程:

  • 通过 model(input_values) 进行前向传播,得到预测的 logits(模型输出的概率分布)。

4.解码输出:

  • 使用 torch.argmax 获得每个时间步的预测ID,然后通过 processor.batch_decode 将ID转为文本,即最终的识别结果。

4.4自动驾驶

场景:通过摄像头和传感器的输入,识别周围的环境,并对车辆进行控制。自动驾驶通常涉及多种传感器数据的处理,如摄像头捕捉的图像数据。深度学习在自动驾驶中的核心应用包括物体检测和路径规划。

  • 实现:使用卷积神经网络进行图像处理,结合强化学习进行策略优化。下面以YOLOv5为例,展示如何实现基于摄像头的物体检测。

代码示例:

import torch
from PIL import Image
from torchvision import transforms# 加载预训练的YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')# 加载并预处理图像
img = Image.open('path_to_image.jpg')
transform = transforms.Compose([transforms.ToTensor()])
img_tensor = transform(img).unsqueeze(0)# 推理检测
results = model(img_tensor)# 显示结果
results.show()

代码解释:

1. 加载YOLOv5模型:

  • 使用 torch.hub.load 从YOLOv5库加载预训练模型,yolov5s 是轻量级模型。

2.图像预处理:

  • Image.open 用于加载图像文件,transforms.ToTensor() 将图像转换为PyTorch的张量格式,并且 unsqueeze(0) 将其扩展为批量维度。

3.推理:

  • model(img_tensor) 使用模型进行前向传播,返回检测结果。

4.结果显示:

  • results.show() 直接展示检测出的物体及其边界框。

在自动驾驶中,这种物体检测可以用于识别道路上的行人、车辆、交通标志等,帮助系统实时做出决策。

4.5医疗影像诊断

场景:通过X光、CT等医疗影像,自动检测病变区域。医疗影像诊断中,深度学习常用于病灶的检测与分割,典型的模型是UNet。

  • 实现:卷积神经网络和基于UNet的分割模型。以下是UNet模型用于医学图像分割的核心代码。

代码示例:

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import transforms
from torch.utils.data import DataLoader, Dataset
from PIL import Image# 定义UNet模型
class UNet(nn.Module):def __init__(self):super(UNet, self).__init__()# 定义编码器部分self.enc1 = nn.Sequential(nn.Conv2d(1, 64, 3, padding=1), nn.ReLU(), nn.Conv2d(64, 64, 3, padding=1), nn.ReLU())self.pool = nn.MaxPool2d(2)# 解码器部分self.dec1 = nn.Sequential(nn.Conv2d(64, 64, 3, padding=1), nn.ReLU(), nn.Conv2d(64, 1, 3, padding=1), nn.Sigmoid())def forward(self, x):enc1 = self.enc1(x)    # 编码器部分x = self.pool(enc1)    # 下采样x = self.dec1(x)       # 解码器部分return x# 加载数据(假设已准备好的医学图像和对应的掩码)
class MedicalDataset(Dataset):def __init__(self, image_paths, mask_paths, transform=None):self.image_paths = image_pathsself.mask_paths = mask_pathsself.transform = transformdef __len__(self):return len(self.image_paths)def __getitem__(self, idx):image = Image.open(self.image_paths[idx])mask = Image.open(self.mask_paths[idx])if self.transform:image = self.transform(image)mask = self.transform(mask)return image, masktransform = transforms.Compose([transforms.ToTensor()])
dataset = MedicalDataset(["image_path_1.png"], ["mask_path_1.png"], transform=transform)
dataloader = DataLoader(dataset, batch_size=1)# 初始化模型、损失函数和优化器
model = UNet()
criterion = nn.BCELoss()  # 二分类交叉熵损失,用于图像分割
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
for epoch in range(1, 6):  # 假设训练5个epochfor images, masks in dataloader:optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, masks)loss.backward()optimizer.step()print(f'Epoch {epoch}, Loss: {loss.item()}')

代码解释:

1.定义UNet模型:

  • UNet模型由编码器和解码器两部分组成,用于提取特征并对图像进行像素级别的预测。

2.数据加载:

  • MedicalDataset 是自定义的数据集类,加载医学图像和其对应的掩码(标签)。

3.模型训练:

  • 使用二分类交叉熵损失 BCELoss,用于判断每个像素是否属于某一病灶。
  • 通过反向传播和Adam优化器来更新模型参数。

4.推理和损失计算:

  • 对每个图像进行前向传播,计算损失,并更新模型参数。

医疗影像诊断中的深度学习模型(如UNet)能够自动检测X光、CT、MRI等图像中的病变区域,帮助医生提高诊断的效率和准确性。

总结

深度学习的发展历程从感知器到深度神经网络,经过了漫长的研究和探索。如今,深度学习技术已经渗透到多个领域,推动了人工智能的进步。通过TensorFlow、PyTorch等框架,我们能够快速构建和训练神经网络,并将其应用于图像处理、自然语言处理、语音识别等实际场景。


http://www.mrgr.cn/news/31553.html

相关文章:

  • Pod控制器
  • Go语言开发基于SQLite数据库实现用户表查询详情接口(三)
  • 论文3—《基于YOLOv5s的农田垃圾轻量化检测方法》文献阅读分析报告
  • 力扣.15 三数之和 three-sum
  • 第二节 OSI-物理层
  • Qt 获取当前系统中连接的所有USB设备的信息 lsusb版
  • PyTorch使用------自动微分模块
  • 【面试宝典】面试基础指导
  • 自动化运维:Ansible、Puppet、Chef工具对比与实战
  • 股价预测,非线性注意力更佳?
  • 掌握这些技巧让C语言学习更加轻松!
  • 【C++】list容器的基本使用
  • Java数据结构专栏介绍
  • MySQL数据库概述与基础
  • 2024年中国研究生数学建模竞赛F题思路代码模型文章——X射线脉冲星光子到达时间建模
  • How can I stream a response from LangChain‘s OpenAI using Flask API?
  • 生活小助手系统小程序的设计
  • 语言的复合语句
  • PCDN技术如何实现动态调度与负载均衡(壹)?
  • 【渐冻勇士的营养秘籍!这些营养素让爱更坚强】
  • 若依shiro非前后端分离项目集群化改造
  • 技术大神把Linux装进Intel 4004?4 位运算能力,640字节内存地址!怎么做到的?
  • windows环境下配置MySQL主从启动失败 查看data文件夹中.err发现报错unknown variable ‘log‐bin=mysql‐bin‘
  • 音视频入门基础:AAC专题(3)——AAC的ADTS格式简介
  • python 多边形越界
  • Python | Leetcode Python题解之第420题强密码检验器