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

【PyTorch】PyTorch、Cuda 的安装和使用

原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。


文章目录

  • 前言
  • 一、Anaconda 中安装 PyTorch 和 CUDA
  • 二、检查PyTorch和CUDA版本
  • 三、PyTorch的基本使用
  • 四、PyTorch调用cuda
  • 五、Matplotlib绘制Pytorch损失函数和准确率
  • 六、tesorbrand显示图像
  • 七、用Pytorch写一个卷积神经网络
  • 八、用Pytorch写一个目标检测模型


前言

PyTorch是一个开源的Python深度学习框架,可以用于构建各种类型的神经网络模型。

一、Anaconda 中安装 PyTorch 和 CUDA

  1. 首先下载并安装适用于您系统的 Anaconda 版本。

  2. 打开 Anaconda Prompt 或命令行工具,并创建一个名为“pytorch”或任何其他您喜欢的环境,此处假设您使用的是 Anaconda 4.5 或更高版本:

conda create -n pytorch python=3.7 anaconda
  1. 激活新环境:
conda activate pytorch
  1. 安装 PyTorch:
conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia

此命令将安装适用于 CUDA 11.1 的 PyTorch 和 TorchVision,以及适用于 CUDA 11.1 的 CUDA 工具包。

  1. 验证 PyTorch 安装是否成功:
python -c "import torch; print(torch.__version__)"

如果成功安装,这将打印 PyTorch 的版本号。

二、检查PyTorch和CUDA版本

可以使用以下命令:

import torchprint(torch.__version__)
print(torch.version.cuda)

这将打印出您正在使用的PyTorch和CUDA版本。

三、PyTorch的基本使用

示例

PyTorch是一个开源的Python深度学习框架,可以用于构建各种类型的神经网络模型。要使用PyTorch,您需要首先安装它。可以使用以下命令在终端中安装PyTorch:

pip install torch

然后,您可以在Python脚本中导入PyTorch并开始使用它。例如,要构建一个简单的全连接神经网络,可以使用以下代码:

import torch
import torch.nn as nn# Define the neural network model
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(784, 256)self.fc2 = nn.Linear(256, 10)def forward(self, x):x = x.view(-1, 784)x = torch.relu(self.fc1(x))x = self.fc2(x)return x# Instantiate the model and define the loss function and optimizer
net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)# Load the data and train the model
for epoch in range(10):for i, (inputs, labels) in enumerate(train_loader, 0):optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# Evaluate the trained model on the test set
correct = 0
total = 0
with torch.no_grad():for inputs, labels in test_loader:outputs = net(inputs)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()
print('Accuracy: %d %%' % (100 * correct / total))

在这个例子中,我们定义了一个简单的全连接神经网络,使用MNIST数据集进行训练和测试。我们使用PyTorch内置的nn.Module类来定义神经网络模型,并在forward方法中定义正向传播的操作。我们使用交叉熵损失函数和随机梯度下降(SGD)优化器来训练模型。我们使用训练数据集中的数据来更新模型参数,并使用测试数据集来评估模型的准确性。

四、PyTorch调用cuda

在PyTorch中使用CUDA可以大大加速训练和推理过程。以下是使用CUDA的几个步骤:

  1. 检查CUDA是否可用:
import torchif torch.cuda.is_available():device = torch.device("cuda")          # 如果GPU可用,则使用CUDA
else:device = torch.device("cpu")           # 如果GPU不可用,则使用CPU
  1. 将模型和数据加载到CUDA设备:
model.to(device)
inputs, labels = inputs.to(device), labels.to(device)
  1. 将数据转换为CUDA张量:
inputs = inputs.cuda()
labels = labels.cuda()
  1. 在训练过程中,使用CUDA加速计算:
for inputs, labels in dataloader:inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()

请注意,在使用CUDA时,您需要确保您的计算机具有兼容的GPU和正确的CUDA和cuDNN版本。您可以在PyTorch的官方文档中找到更多详细信息。

五、Matplotlib绘制Pytorch损失函数和准确率

在Pytorch中,我们可以使用Matplotlib来绘制训练过程中的损失函数曲线、准确率曲线等。下面是一个简单的示例:

import matplotlib.pyplot as plt# 定义损失函数和准确率列表
train_losses = [0.1, 0.08, 0.05, 0.03, 0.02]
train_accs = [90, 92, 95, 97, 98]# 绘制损失函数曲线
plt.plot(train_losses, label='Train Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()# 绘制准确率曲线
plt.plot(train_accs, label='Train Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

运行后会分别显示训练过程中的损失函数曲线和准确率曲线。我们可以根据自己的需要调整图表的样式和参数,例如修改线条颜色、线条宽度、坐标轴范围等。

六、tesorbrand显示图像

PyTorch下的Tensorboard 使用

七、用Pytorch写一个卷积神经网络

下面是一个简单的卷积神经网络(CNN)的实现,用PyTorch框架来训练MNIST手写数字识别数据集。

首先,您需要导入所需的库和模块,如下所示:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torchvision import datasets, transforms

接下来,您需要定义网络的架构。这个CNN有两个卷积层,一个最大池化层和两个全连接层。代码如下:

class Net(nn.Module):def __init__(self):super(Net, self).__init__()# 输入为28*28*1self.conv1 = nn.Conv2d(1, 10, kernel_size=5)# 输入为24*24*10self.conv2 = nn.Conv2d(10, 20, kernel_size=5)# 输入为20*20*20self.mp = nn.MaxPool2d(2)# 输入为10*10*20self.fc1 = nn.Linear(320, 50)self.fc2 = nn.Linear(50, 10)def forward(self, x):x = F.relu(self.mp(self.conv1(x)))x = F.relu(self.mp(self.conv2(x)))x = x.view(-1, 320)x = F.relu(self.fc1(x))x = self.fc2(x)return F.log_softmax(x, dim=1)

现在,您需要定义训练函数和测试函数。训练函数将会用来训练模型,而测试函数将会用来测试模型。代码如下:

def train(model, device, train_loader, optimizer, epoch):model.train()for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = F.nll_loss(output, target)loss.backward()optimizer.step()if batch_idx % 100 == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data), len(train_loader.dataset),100. * batch_idx / len(train_loader), loss.item()))def test(model, device, test_loader):model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += F.nll_loss(output, target, reduction='sum').item()pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(test_loss, correct, len(test_loader.dataset),100. * correct / len(test_loader.dataset)))

接下来,您需要加载数据集和定义训练和测试参数。代码如下:

batch_size = 64train_transforms = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])test_transforms = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])train_dataset = datasets.MNIST('./data', train=True, download=True, transform=train_transforms)
test_dataset = datasets.MNIST('./data', train=False, transform=test_transforms)train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)use_cuda = torch.cuda.is_available()
device = torch.device("cuda" if use_cuda else "cpu")model = Net().to(device)
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

最后,您需要在循环中训练和测试模型。代码如下:

epochs = 10for epoch in range(1, epochs + 1):train(model, device, train_loader, optimizer, epoch)test(model, device, test_loader)

这是一个简单的CNN的实现,用PyTorch训练MNIST数据集。您可以调整模型的超参数,例如学习率、动量等,来提高模型的准确性和性能。

八、用Pytorch写一个目标检测模型

下面是一个基于PyTorch的目标检测模型的实现,使用Faster R-CNN网络,并使用COCO数据集进行训练和测试。

首先,您需要导入所需的库和模块,如下所示:

import torch
import torchvision
import torchvision.transforms as transforms
import torch.utils.data
import numpy as np
import matplotlib.pyplot as plt
import time
import os
import json
import torch.utils.data as data
from torchvision.datasets import CocoDetection
import torchvision.transforms.functional as F
import torch.nn as nn
import torch.optim as optim
from torchvision.models.detection import FasterRCNN
from torchvision.models.detection.rpn import AnchorGenerator
from torchvision.models.detection.backbone_utils import resnet_fpn_backbone
from torchvision.ops import MultiScaleRoIAlign

接下来,您需要定义数据转换和数据集类,以加载和预处理COCO数据集。代码如下:

class Compose(object):def __init__(self, transforms):self.transforms = transformsdef __call__(self, img, target):for t in self.transforms:img, target = t(img, target)return img, targetclass RandomHorizontalFlip(object):def __init__(self, probability=0.5):self.probability = probabilitydef __call__(self, img, target):if np.random.rand() < self.probability:img = F.hflip(img)target["boxes"][:, [0, 2]] = img.width - target["boxes"][:, [2, 0]]return img, targetclass Resize(object):def __init__(self, max_size=900, min_size=600):self.max_size = max_sizeself.min_size = min_sizedef __call__(self, img, target):w, h = img.sizesize = self.min_sizeif w < h and max(h, w * size / w) <= self.max_size:size = int(w * size / w)elif max(h, w * size / h) <= self.max_size:size = int(h * size / h)img = F.resize(img, (size, size))target["boxes"][:, :4] *= size / self.min_sizereturn img, targetclass ToTensor(object):def __call__(self, img, target):img = F.to_tensor(img)return img, targetclass COCODataset(data.Dataset):def __init__(self, data_dir, set_name='train', transform=None):super().__init__()self.data_dir = data_dirself.images_dir = os.path.join(data_dir, set_name)self.set_name = set_nameself.transform = transformself.coco = CocoDetection(self.images_dir, os.path.join(data_dir, f'{set_name}.json'))def __getitem__(self, index):image, target = self.coco[index]image_id = self.coco.ids[index]if self.transform is not None:image, target = self.transform(image, target)return image, target, image_iddef __len__(self):return len(self.coco)

接下来,您需要定义模型的架构。这个Faster R-CNN网络使用ResNet-50 FPN作为骨干网络。代码如下:

class FasterRCNNResNetFPN(nn.Module):def __init__(self, num_classes):super(FasterRCNNResNetFPN, self).__init__()self.num_classes = num_classesbackbone = resnet_fpn_backbone('resnet50', pretrained=True)anchor_generator = AnchorGenerator(sizes=((32, 64, 128, 256, 512),),aspect_ratios=((0.5, 1.0, 2.0),))roi_pooler = MultiScaleRoIAlign(featmap_names=['0', '1', '2', '3'],output_size=7,sampling_ratio=2)self.model = FasterRCNN(backbone,num_classes=num_classes + 1,rpn_anchor_generator=anchor_generator,box_roi_pool=roi_pooler)def forward(self, x, targets=None):if self.training and targets is None:raise ValueError("In training mode, targets should be passed")elif not self.training and targets is not None:raise ValueError("In inference mode, targets should not be passed")else:return self.model(x, targets)

现在,您需要设置训练和测试的超参数并进行模型训练。代码如下:

batch_size = 2
num_workers = 2
num_epochs = 10data_dir = '/path/to/coco'train_transforms = Compose([Resize(min_size=600, max_size=900),RandomHorizontalFlip(),ToTensor()])
test_transforms = Compose([Resize(min_size=800, max_size=1333),ToTensor()])train_dataset = COCODataset(data_dir, set_name='train', transform=train_transforms)
test_dataset = COCODataset(data_dir, set_name='val', transform=test_transforms)train_loader = data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers, collate_fn=lambda x: tuple(zip(*x)))
test_loader = data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=num_workers, collate_fn=lambda x: tuple(zip(*x)))num_classes = 80device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = FasterRCNNResNetFPN(num_classes=num_classes).to(device)optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=0.0005)def train_one_epoch(model, optimizer, data_loader, device, epoch):model.train()train_loss = 0.0start_time = time.time()for step, (images, targets, image_ids) in enumerate(data_loader):images = [img.to(device) for img in images]targets = [{k: v.to(device) for k, v in t.items()} for t in targets]loss_dict = model(images, targets)losses = sum(loss_dict.values())train_loss += losses.item()optimizer.zero_grad()losses.backward()optimizer.step()if step % 10 == 0:print(f'Epoch: [{epoch}/{num_epochs}] Step: [{step}/{len(data_loader)}] Loss: {losses.item()}')train_loss /= len(data_loader)end_time = time.time()print(f'Training Loss: {train_loss} Time: {end_time - start_time}')def evaluate(model, data_loader, device):model.eval()results = []for images, targets, image_ids in data_loader:images = [img.to(device) for img in images]targets = [{k: v.to(device) for k, v in t.items()} for t in targets]with torch.no_grad():outputs = model(images)for i, (output, target) in enumerate(zip(outputs, targets)):result = {'image_id': image_ids[i],'boxes': output['boxes'].detach().cpu().numpy(),'scores': output['scores'].detach().cpu().numpy(),'labels': output['labels'].detach().cpu().numpy(),}target = {'image_id': image_ids[i],'boxes': target['boxes'].cpu().numpy(),'labels': target['labels'].cpu().numpy(),}results.append((result, target))return resultsfor epoch in range(num_epochs):train_one_epoch(model, optimizer, train_loader, device, epoch)results = evaluate(model, test_loader, device)

这是一个使用PyTorch实现的目标检测模型的示例,使用Faster R-CNN网络和COCO数据集进行训练和测试。您可以根据需要调整模型的超参数,以提高模型的准确性和性能。

相关文章:

【PyTorch】PyTorch、Cuda 的安装和使用

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、Anaconda 中安装 PyTorch 和 CUDA二、检查PyTorch和CUDA版本三、PyTorch的基本使用四、PyTorch调用cuda五、Matplotlib绘制Pytorch损…...

1.初识typescript

在很多地方的示例代码中使用的都是ts而不是js&#xff0c;为了使用那些示例&#xff0c;学习ts还是有必要的 JS有的TS都有&#xff0c;JS与TS的关系很像css与less ts在运行前需要先编译为js&#xff0c;浏览器不能直接运行ts 目录 1 编译TS的工具包 1.1 安装 1.2 基本…...

iPhone 6透明屏是什么?原理、特点、优势

iPhone 6透明屏是一种特殊的屏幕技术&#xff0c;它能够使手机屏幕变得透明&#xff0c;让用户能够透过屏幕看到手机背后的物体。 这种技术在科幻电影中经常出现&#xff0c;给人一种未来科技的感觉。下面将介绍iPhone 6透明屏的原理、特点以及可能的应用。 iPhone 6透明屏的原…...

prometheus+grafana进行服务器资源监控

在性能测试中&#xff0c;服务器资源是值得关注一项内容&#xff0c;目前&#xff0c;市面上已经有很多的服务器资 源监控方法和各种不同的监控工具&#xff0c;方便在各个项目中使用。 但是&#xff0c;在性能测试中&#xff0c;究竟哪些指标值得被关注呢&#xff1f; 监控有…...

EventBus 开源库学习(三)

源码细节阅读 上一节根据EventBus的使用流程把实现源码大体梳理了一遍&#xff0c;因为精力有限&#xff0c;所以看源码都是根据实现过程把基本流程看下&#xff0c;中间实现细节先忽略&#xff0c;否则越看越深不容易把握大体思路&#xff0c;这节把一些细节的部分再看看。 …...

zjzcyList.stream().map(Pb_zjzcy::getZjid).collect(Collectors.toList()); 解释一下

zjzcyList.stream().map(Pb_zjzcy::getZjid).collect(Collectors.toList()); 解释一下 这段代码是使用Java 8的流式处理&#xff08;Stream&#xff09;对一个存储了对象的列表&#xff08;zjzcyList&#xff09;进行操作&#xff0c;并最终返回一个包含了列表中每个对象的Zji…...

车载总线系列——J1939 二

车载总线系列——J1939 二 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 没有人关注你。也无需有人关注你。你必须承认自己的价值&#xff0c;你不能站…...

【C#学习笔记】引用类型(2)

文章目录 ObjectEqualsGetTypeToStringGetHashCode string逐字文本复合格式字符串字符串内插 StringBuilderStringBuilder 的工作原理StringBuilder提供的方法访问字符迭代字符查询字符 dynamic Object 支持 .NET 类层次结构中的所有类&#xff0c;并为派生类提供低级别服务。…...

【Rust 基础篇】Rust类函数宏:代码生成的魔法

导言 Rust是一门现代的、安全的系统级编程语言&#xff0c;它提供了丰富的元编程特性&#xff0c;其中类函数宏&#xff08;Function-Like Macros&#xff09;是其中之一。类函数宏允许开发者创建类似函数调用的宏&#xff0c;并在编译期间对代码进行生成和转换。在本篇博客中…...

Spring-1-透彻理解Spring XML的Bean创建--IOC

学习目标 上一篇文章我们介绍了什么是Spring,以及Spring的一些核心概念&#xff0c;并且快速快发一个Spring项目&#xff0c;实现IOC和DI&#xff0c;今天具体来讲解IOC 能够说出IOC的基础配置和Bean作用域 了解Bean的生命周期 能够说出Bean的实例化方式 一、Bean的基础配置 …...

【JAVA】类和对象

作者主页&#xff1a;paper jie的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…...

jenkins准备

回到目录 jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&#xff0c;也可独立运行。通常与版本管理工具(SCM)、构…...

【Rust】Rust学习

文档&#xff1a;Rust 程序设计语言 - Rust 程序设计语言 简体中文版 (bootcss.com) 墙裂推荐这个文档 第一章入门 入门指南 - Rust 程序设计语言 简体中文版 第二章猜猜看游戏 猜猜看游戏教程 - Rust 程序设计语言 简体中文版 (bootcss.com) // 导入库 use std::io; use s…...

Linux 常用命令之配置环境变量 PATH

PATH是系统环境变量中的一种&#xff0c;同时将一些二进制文件的绝对路径追加进去&#xff0c;则在系统终端中可以发现这些路径下的文件。 一. 环境变量设置 export PATH<二进制文件的绝对路径>:$PATH 以下为结合实际例子的操作 1、临时设置 打开一个终端执行如下命令 e…...

flask-----蓝图

1.引入蓝图 flask都写在一个文件中&#xff0c;项目这样肯定不行&#xff0c;会导致循环导入的问题&#xff0c;分目录&#xff0c;分包&#xff0c;使用蓝图划分目录。 2.使用蓝图 步骤如下&#xff1a; -1 实例化得到一个蓝图对象-order_blueBlueprint(order,__name__,tem…...

学习左耳听风栏目90天——第一天 1-90(学习左耳朵耗子的工匠精神,对技术的热爱)【洞悉技术的本质,享受科技的乐趣】

洞悉技术的本质&#xff0c;享受科技的乐趣 第一篇&#xff0c;我的感受就是 耗叔是一个热爱技术&#xff0c;可以通过代码找到快乐的技术人。 作为it从业者&#xff0c;我们如何可以通过代码找到快乐呢&#xff1f;这是一个问题&#xff1f; 至少目前&#xff0c;我还没有这种…...

后端登录安全的一种思路

PS:作者是小白能接触到的就只会这样写。勿喷。 前提 思路: 结合io流将登录token存储到配置文件中,不将token存储到浏览器端&#xff0c;从而避免盗取。 下面jwt的学习可以参考下这个: JWT --- 入门学习_本郡主是喵的博客-CSDN博客 JWT工具类 Component public class JWTtU…...

【深度学习_TensorFlow】激活函数

写在前面 上篇文章我们了解到感知机使用的阶跃函数和符号函数&#xff0c;它们都是非连续&#xff0c;导数为0的函数&#xff1a; 建议回顾上篇文章&#xff0c;本篇文章将介绍神经网络中的常见激活函数&#xff0c;这些函数都是平滑可导的&#xff0c;适合于梯度下降算法。 写…...

机器学习笔记之优化算法(七)线搜索方法(步长角度;非精确搜索;Wolfe Condition)

机器学习笔记之优化算法——线搜索方法[步长角度&#xff0c;非精确搜索&#xff0c;Wolfe Condition] 引言回顾&#xff1a; Armijo \text{Armijo} Armijo准则及其弊端 Glodstein \text{Glodstein} Glodstein准则及其弊端 Wolfe Condition \text{Wolfe Condition} Wolfe Condi…...

十四.redis哨兵模式

redis哨兵模式 1.概述2.测试3.哨兵模式优缺点 redis哨兵模式基础是主从复制 1.概述 主从切换的技术方法&#xff1a;当主节点服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这就需要人工干预&#xff0c;费时费力&#xff0c;还会造成一段时间内服…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...