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

使用Pytorch+Numpy+Matplotlib实现手写字体分类和图像显示

文章目录

  • 1.引用
  • 2.内置图片数据集加载
  • 3.处理为batch类型
  • 4.设置运行设备
  • 5.查看数据
  • 6.绘图查看数据图片
    • (1)不显示图片标签
    • (2)打印图片标签
    • (3)图片显示标签
  • 7.定义卷积函数
  • 8.卷积实例化、损失函数、优化器
  • 9.训练和测试损失、正确率
    • (1)训练
    • (2)测试
    • (3)循环
    • (4)损失和正确率曲线
    • (5)输出数据到表格
  • 10.额外添加
    • (1)添加dropout减少过拟合
      • ①未添加dropout层
      • ②添加dropout层
    • (2)循环同时输出时间
    • (3)每个类别分类正确率输出
      • ①输出到控制台
      • ②输出到表格
    • (4)模型保存/加载
    • (5)保存后的网络模型可视化
    • (6)训练过程可视化
    • (7)显示彩色图片
      • ①灰色图片
      • ②彩色图片
    • (8)每次卷积后特征图显示
    • (9)运行过程中忽视警告

1.引用

   torchvision提供了一些常用的数据集、模型、转换函数等

import torchvision
from torchvision import transforms
import numpy as np
import matplotlib.pyplot as plt

2.内置图片数据集加载

  torch的内置图片数据集均在datasets模块下,包含Catletch、CelebA、CIFAR、Cityscapes、COCO、Fashion-MNIST、ImageNet、MNIST等。
  MNIST数据集是0-9手写数字数据集。

  train=True表示是训练数据
  torchvision.transforms包含了转换函数
  这里用到了ToTensor类,该类的主要作用有以下3点:
  ①将输入转换成张量
  ②读取图片的格式规范为(channel,heigth,width)
  ③将图片像素的取值范围归一化0-1

train_ds=torchvision.datasets.MNIST('data/',train=True,transform=transforms.ToTensor(),download=True)
test_ds=torchvision.datasets.MNIST('data/',train=False,transform=transforms.ToTensor(),download=True)

3.处理为batch类型

  DataLoader有以下4个目的:
  ①使用shuffle参数对数据集做乱序的操作(随机打乱)
  ②将数据采样为小批次,可用batch_size参数指定批次大小(小批次)
  ③可以充分利用多个子进程加速数据预处理(多线程)
  ④可通过collate_fn参数传递批次数据中的处理函数,实现对批次数据进行转换处理(转换处理)

train_dl=torch.utils.data.DataLoader(train_ds,batch_size=64,shuffle=True)
test_dl=torch.utils.data.DataLoader(test_ds,batch_size=64)

  上述两行代码创建了DataLoader类型的train_dl和test_dl
  DataLoader是可迭代对象,next方法返回一个批次的图像imgs和对应一个批次的标签labels

4.设置运行设备

  机器学习或者深度学习需要选择程序运行的设备是CPU还是GPU,GPU就是通常所说的需要有显卡。

device='cuda' if torch.cuda.is_available() else 'cpu'
print('use {} device'.format(device))

5.查看数据

imgs,labels=next(iter(train_dl))
print(imgs.shape)
print(labels.shape)
结果:
torch.Size([64, 1, 28, 28])
torch.Size([64])

6.绘图查看数据图片

  imgs[:10]查看前10条数据
  np.squeeze从数组的形状中删除维度为 1 的维度。
  np.unsqueeze从数组的形状中添加维度为 1 的维度。
  注:只有数组长度在该维度上为 1,那么该维度才可以被删除。如果不是1,那么删除的话会报错
  报错信息:cannot select an axis to squeeze out which has size not equal to one

(1)不显示图片标签

plt.figure(figsize=(10,1))
for i,img in enumerate(imgs[:10]):npimg=img.numpy()npimg=np.squeeze(npimg)#形状由(1,28,28)转换为(28,28)plt.subplot(1,10,i+1)plt.imshow(npimg)      #在子图中绘制单张图片plt.axis('off')        #关闭显示子图坐标    
print(labels[:10])
plt.show()

(2)打印图片标签

classes = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
class_label_str=''img_label_list=list(zip(imgs,labels))
for i,(img,label) in enumerate(img_label_list):nimg=np.array(img)nimg=np.squeeze(nimg)plt.subplot(8,8,i+1)plt.title(str(label.item()))plt.imshow(nimg)plt.axis('off')'''按照图片显示格式打印所有标签:i!=0实现按行打印的同时第一行前面无空行,按每行8列打印'''if i!=0 and i%8==0:class_label_str +='\n'class_label_str += classes[label.item()]+'\t'
print(class_label_str)
plt.show()

(3)图片显示标签

  我这里以'airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'这些类别示例,作用于手写字体图像分类时,要更改成0-9

classes = ('airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')img_label_list=list(zip(imgs,labels))
for i,(img,label) in enumerate(img_label_list):nimg=img.transpose(0, 2)nimg=nimg.numpy()plt.subplot(5,5,i+1)plt.title(classes[label.item()])plt.imshow(nimg)plt.axis('off')
plt.show()

7.定义卷积函数

  定义卷积函数才是算法模型的真正开始,卷积层一般是必不可少的,是机器学习和深度学习的灵魂与基石所在。

class net(nn.Module):def __init__(self):super().__init__()self.conv1=nn.Conv2d(1,6,5)self.conv2=nn.Conv2d(6,16,5)self.linear1 = nn.Linear(16*4*4,20)self.linear2 = nn.Linear(20,10)def forward(self,input):x=torch.max_pool2d(torch.relu(self.conv1(input)),2)x=torch.max_pool2d(torch.relu(self.conv2(x)),2)x=x.view(x.size(0),-1)x=torch.relu(self.linear1(x))x=self.linear2(x)return x

  算法模型流程示意:

8.卷积实例化、损失函数、优化器

model=net().to(device)
loss_f=nn.CrossEntropyLoss()
opti=optim.Adam(model.parameters(), lr=0.005)

9.训练和测试损失、正确率

(1)训练

def train(dataloader,model,loss_f,opt):model.train()                  #模型为训练模式num_batches=len(dataloader)    #总批次数size=len(dataloader.dataset)   #样本总数(所有的批次里所有的数据点)loss_zhi=0                     #所有批次的损失之和correct=0                      #预测正确的样本总数for x,y in dataloader:x,y=x.to(device),y.to(device)pred=model(x)loss=loss_f(pred,y)        '''梯度清零、反向传播、梯度更新是专属'''opt.zero_grad()loss.backward()opt.step()with torch.no_grad():loss_zhi+=loss.item()correct+=(pred.argmax(1)==y).type(torch.float).sum().item()loss_zhi/=num_batches  #loss_zhi是所有批次的损失之和,所以计算全部样本的平均损失需要除以总批次数correct/=size          #correct是预测正确的样本总数,若计算每个批次总体正确率,需除以样本总数量return loss_zhi,correct

  注:当前代码里的pred.argmax(1)会返会类似Tensor([4,6,...,0])Tensor,而y也是类似形状的tensor,因此二者可以用==比较

(2)测试

def test(dataloader, model):model.eval()                   #模型为测试模式num_batches=len(dataloader)    #总批次数size=len(dataloader.dataset)   #样本总数(所有的批次里所有的数据点)loss_zhi=0                     #所有批次的损失之和correct=0                      #预测正确的样本总数for x, y in dataloader:x,y=x.to(device),y.to(device)pred = model(x)loss = loss_f(pred, y)with torch.no_grad():loss_zhi += loss.item()correct += (pred.argmax(1) == y).type(torch.float).sum().item()loss_zhi /= num_batchescorrect /= sizereturn loss_zhi, correct

(3)循环

epochs = 200
train_loss = []
train_acc = []
test_loss = []
test_acc = []
for epoch in range(epochs):epoch_train_loss,epoch_train_acc=train(train_dl,model,loss_f,opt)epoch_test_loss,epoch_test_acc=test(test_dl,model)train_loss.append(epoch_train_loss)train_acc.append(epoch_train_acc)test_loss.append(epoch_test_loss)test_acc.append(epoch_test_acc)tishi='epoch:{},train_loss:{:.4f},train_acc:{:.2f}%,test_loss:{:.4f},test_acc:{:.2f}%'print(tishi.format(epoch,train_loss[-1],train_acc[-1]*100,test_loss[-1],test_acc[-1]*100))
print('batch over!')

(4)损失和正确率曲线

plt.figure(figsize=(10,4))
plt.subplot(121)
#打印损失
plt.plot(range(1,epochs+1),train_loss,label='train_loss')
plt.plot(range(1,epochs+1),test_loss,label='test_loss')
plt.title('train+test:loss')
plt.xlabel('epoch')
plt.legend(loc='upper right')
plt.subplot(122)
#打印正确率
plt.plot(range(1,epochs+1),train_acc,label='train_acc')
plt.plot(range(1,epochs+1),test_acc,label='test_acc')
plt.title('train+test:acc')
plt.xlabel('epoch')
plt.legend(loc='lower right')
plt.show()
plt.savefig('D:/loss+acc.png')

(5)输出数据到表格

table={'train_loss':train_loss,'train_acc':train_acc,'test_loss':test_loss,'test_acc':test_acc}
data_shuju=pd.DataFrame(table,index=list(range(1,epochs+1)))
data_shuju.to_excel('D:/loss+acc.xlsx')

10.额外添加

(1)添加dropout减少过拟合

  卷积后添加Dropout层较少使用,效果也不是很明显,这是因为相邻元素之间有相关性,随机地丢弃卷积输出特征像素点,抑制过拟合的效果有限。
  Dropout的第一个参数是输入的tensor,第二个参数p代表的是丢弃的神经元的比例,默认为0.5

①未添加dropout层

class net(nn.Module):def __init__(self):super().__init__()self.conv1=nn.Conv2d(1,6,5)self.conv2=nn.Conv2d(6,16,5)self.linear1 = nn.Linear(16*4*4,20)self.linear2 = nn.Linear(20,10)def forward(self,input):x=torch.max_pool2d(torch.relu(self.conv1(input)),2)x=torch.max_pool2d(torch.relu(self.conv2(x)),2)x=x.view(x.size(0),-1)x=torch.relu(self.linear1(x))x=self.linear2(x)return x

  dropoutloss+acc图像:

②添加dropout层

class net(nn.Module):def __init__(self):super().__init__()self.conv1=nn.Conv2d(1,6,5)self.conv2=nn.Conv2d(6,16,5)self.linear1 = nn.Linear(16*4*4,20)self.linear2 = nn.Linear(20,10)def forward(self,input):x=torch.max_pool2d(torch.relu(self.conv1(input)),2)x=torch.max_pool2d(torch.relu(self.conv2(x)),2)x=x.view(x.size(0),-1)x=torch.dropout(x, p=0.5, train=self.training)x=torch.relu(self.linear1(x))x=torch.dropout(x, p=0.5, train=self.training)x=self.linear2(x)return x

  dropoutloss+acc图像:
在这里插入图片描述

(2)循环同时输出时间

import timeepochs=1
train_loss=[]
train_acc=[]
test_loss=[]
test_acc=[]
epoch_time=[]
start=time.time()
for epoch in range(epochs):epoch_train_loss,epoch_train_acc=train(train_dl,model,loss_f,opt)epoch_test_loss, epoch_test_acc = test(test_dl, model)train_loss.append(epoch_train_loss)train_acc.append(epoch_train_acc)test_loss.append(epoch_test_loss)test_acc.append(epoch_test_acc)epoch_time.append(time.time()-start)tishi='epoch:{},train_loss:{:.4f},train_acc:{:.2f}%,test_loss:{:.4f},test_acc:{:.2f}%,time:{:.2f}'print(tishi.format(epoch,train_loss[-1],train_acc[-1]*100,test_loss[-1],test_acc[-1]*100,epoch_time[-1]))
print('epoch over!')table={'train_loss':train_loss,'train_acc':train_acc,'test_loss':test_loss,'test_acc':test_acc,'epoch_time':epoch_time}
data_shuju=pd.DataFrame(table,index=list(range(1,epochs+1)))
data_shuju.to_excel('loss+acc.xlsx')
print('save over!')

(3)每个类别分类正确率输出

①输出到控制台

  注:需要在网络循环loss+acc之后使用,若是提前使用正确率只有个位数

class_correct = list(0 for i in range(10))  #每个类别预测正确的数量
class_total   = list(0 for i in range(10))  #每个类别的总数量
with torch.no_grad():# 从测试数据中取出数据for x, y in test_dl: x, y= x.to(device), y.to(device)outputs = model(x)_, predicted = torch.max(outputs, 1)# 预测正确的返回True,预测错误的返回False;squeeze将数据转换为一维数据c = (predicted == y).squeeze()for i in range(10):label = y[i]  # 提取标签class_correct[label] += c[i].item()  # 预测正确个数class_total[label] += 1  # 总数
for i in range(10):print('{}的准确率:{:.2f}%'.format(classes[i], 100 * class_correct[i] / class_total[i]))
结果:
0的准确率:98.03%
1的准确率:100.00%
2的准确率:100.00%
3的准确率:98.08%
4的准确率:97.74%
5的准确率:97.62%
6的准确率:98.44%
7的准确率:99.39%
8的准确率:98.60%
9的准确率:97.60%

②输出到表格

class_test_dic={}
for i in range(10):print('{:.10s}的准确率:{:.2f}%'.format(classes[i], 100 * class_correct[i] / class_total[i]))class_test_dic['{:.12s}'.format(classes[i])]=[100 * class_correct[i] / class_total[i],'{:.2f}%'.format(100 * class_correct[i] / class_total[i])]
class_dic = pd.DataFrame(class_test_dic,index=list(range(2)))
class_dic.to_excel('model5s_class_test_dic.xlsx')
print('save over!')

(4)模型保存/加载

torch.save(model,"K:\\classifier3.pt")    #保存完整模型
load_model = torch.load("K:\\classifier3.pt")

  测试图片:

path='./MNIST_data.pth'
test_model = net()
test_model.load_state_dict(torch.load(path))test_image = Image.open(file)  # 加载要测试的图片test_transform = torchvision.transforms.Compose([torchvision.transforms.Resize((28, 28)),torchvision.transforms.Grayscale(),  # 训练的是灰色图片需要加上,不然通道数不对torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0.1307,), (0.3081,))
])test_image = test_transform(test_image)
test_image = test_image.unsqueeze(0)  # 添加批次维度output = test_model(test_image)  # 输入图片到模型中进行推理
_, predicted = torch.max(output, 1)  # 获取预测结果
self.label_result.setText(str(predicted.item()))

(5)保存后的网络模型可视化

  浏览器输入链接:netron

  点击按钮,打开保存的.pt文件,就可以显示网络机构
  例:

(6)训练过程可视化

def visualize(train_loss,val_loss,val_acc):train_loss = np.array(train_loss)val_loss = np.array(val_loss)val_acc = np.array(val_acc)plt.grid(True)plt.xlabel("epoch")plt.ylabel("value")plt.title("train_loss and valid_acc")plt.plot(np.arange(len(val_acc)),val_acc, label=r"valid_acc",c="g")plt.plot(np.arange(len(train_loss)),train_loss,label=r"train_loss",c="r")plt.legend()plt.savefig("K:\\a.png")visualize(train_loss_list,valid_loss_list,valid_accuracy_list)

(7)显示彩色图片

  问题1:TypeError: Invalid shape (3, 224, 224) for image data

①灰色图片

img_label_list=list(zip(img,label))
for i,(img,label) in enumerate(img_label_list):nimg=np.array(img)nimg=np.squeeze(nimg)plt.subplot(8,8,i+1)plt.title(str(label.item()))plt.imshow(nimg)plt.axis('off')
plt.show()

②彩色图片

img_label_list=list(zip(img,label))
for i,(img,label) in enumerate(img_label_list):nimg=img.transpose(0, 2)  彩色图像是3*n*n需要先将3移到最后!nimg=nimg.numpy()plt.subplot(5,5,i+1)plt.title(str(label.item()))plt.imshow(nimg)plt.axis('off')
plt.show()

  问题2:Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
  matplotlib.pyplot.imshow()函数在处理灰度图像时,自动将其值做归一化处理而在处理彩色图像时则不会,而是将浮点值变换至[0,1],整数值变换到[0, 255]范围

(8)每次卷积后特征图显示

  需要先修改transform

transform=transforms.Compose([transforms.ToTensor(),   #转换成张量transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])])
#保存数据集一张图像
imgs,labels=next(iter(train_dl))
img_label_list=list(zip(imgs,labels))
for i,(img,label) in enumerate(img_label_list):nimg=img.transpose(0, 2)nimg=nimg.numpy()plt.imshow(nimg)plt.axis('off')plt.savefig('1.png')if i==0:break# 传入图片
from PIL import Imageimage=Image.open(str(r'1.png')).convert('RGB')
image=transform(image)
print('\n输入图尺寸:{}'.format(image.shape))image=image.unsqueeze(0)
image=image.to(device)# 计算卷积个数
model_weights=[] #卷积层参数
conv_layers=[]   #卷积层本身
model_children=list(model.children())
counter=0        #卷积层个数
for i in range(len(model_children)):if type(model_children[i])==nn.Conv2d:counter+=1model_weights.append(model_children[i].weight)conv_layers.append(model_children[i])elif type(model_children[i])==nn.Sequential:for j in range(len(model_children[i])):for child in model_children[i][j].children():if type(child)==nn.Conv2d:counter+=1model_weights.append(child.weight)conv_layer.append(child)outputs=[]
names=[]
for layer in conv_layers[0:]:image=layer(image)outputs.append(image)names.append(str(layer))
print('特征图尺寸:{}'.format(outputs[1].shape))#具体绘制特征图
processed=[]
for feature_map in outputs:feature_map=feature_map.squeeze(0)gray_scale=torch.sum(feature_map,0)gray_scale=gray_scale/feature_map.shape[0]processed.append(gray_scale.data.cpu().numpy())
fig=plt.figure()for i in range(len(processed)):a=fig.add_subplot(5,4,i+1)imgplot=plt.imshow(processed[i])a.axis('off')a.set_title(names[i].split('(')[0],fontsize=10)
plt.savefig('feature_map.png',bbox_inches='tight')
print('over!')

(9)运行过程中忽视警告

import warnings
warnings.filterwarnings("ignore")

相关文章:

使用Pytorch+Numpy+Matplotlib实现手写字体分类和图像显示

文章目录 1.引用2.内置图片数据集加载3.处理为batch类型4.设置运行设备5.查看数据6.绘图查看数据图片(1)不显示图片标签(2)打印图片标签(3)图片显示标签 7.定义卷积函数8.卷积实例化、损失函数、优化器9.训练和测试损失、正确率(1)训练(2)测试(3)循环(4)损失和正确率曲线(5)输出…...

kimi帮我解决ubuntu下软链接文件夹权限不够的问题

我的操作如下 ubuntuubuntu-QiTianM420-N000:~$ ln -s /media/ubuntu/4701aea3-f883-40a9-b12f-61e832117414 code ubuntuubuntu-QiTianM420-N000:~$ ls -l 总用量 636 drwxrwxr-x 2 ubuntu ubuntu 4096 5月 7 17:16 bin drwxrwxrwx 2 ubuntu ubuntu 4096 5月 8 13…...

如何去除背景音乐保留人声?保留人声,消除杂音

在日常生活和工作中,我们经常遇到需要处理音频的情况,尤其是当我们想要去除背景音乐,仅保留人声时。这种需求在处理电影片段、制作音乐MV、或者提取演讲内容等场景中尤为常见。本文将为您详细介绍如何去除背景音乐并保留人声,帮助…...

2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数

2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数 2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数 文章目录 2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数KfRaiseIrql 函数 KfRaiseIrql 函数 /*********************************************************************** NAME …...

【新书】使用 OpenAI API 构建 AI 应用:利用 ChatGPT等构建 10 个 AI 项目(第二版),404页pdf

通过构建 ChatGPT 克隆、代码错误修复器、测验生成器、翻译应用、自动回复邮件生成器、PowerPoint 生成器等项目,提升您的应用开发技能。 关键特性 通过掌握 ChatGPT 概念(包括微调和集成),转变为 AI 开发专家 通过涵盖广泛 AI …...

修改PostgreSQL表中的字段排列顺序

二、通过修改系统表(pg_attribute)达到字段重新排序的目的有关系统表的概述及用途可以查看官网:http://www.pgsqldb.org/pgsqldoc-cvs/catalogs.html 表名字表用途pg_class表,索引,序列,视图(”关系”)pg_…...

canvas实现手写功能

1.从接口获取手写内容&#xff0c;处理成由单个字组成的数组&#xff08;包括符号&#xff09; 2.合成所有图的时候&#xff0c;会闪现outputCanvas合成的图&#xff0c;注意隐藏 3.可以进行多个手写内容切换 4.基于uniapp的 <template><view class"content&quo…...

Python知识点:基于Python技术,如何使用TensorFlow进行目标检测

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 使用TensorFlow进行目标检测的完整指南 目标检测是计算机视觉领域中的一项重要任…...

初始爬虫13(js逆向)

为了解决网页端的动态加载&#xff0c;加密设置等&#xff0c;所以需要js逆向操作。 JavaScript逆向可以分为三大部分&#xff1a;寻找入口&#xff0c;调试分析和模拟执行。 1.chrome在爬虫中的作用 1.1preserve log的使用 默认情况下&#xff0c;页面发生跳转之后&#xf…...

前端发送了请求头的参数,经debug发现后端请求对象请求头中没有该参数

debug测试&#xff0c;发现前端发来请求头中确实没有找到添加的请求头参数&#xff0c;但是 Network 中却显示请求头中有该参数信息。 原因是RequestHeaders中设置的请求参数含有下划线&#xff0c;NGINX将静默地丢弃带有下划线的HTTP标头&#xff0c;这样做是为了防止在将头映…...

雷池社区版如何使用静态资源的方式建立站点

介绍&#xff1a; SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、X…...

车载电源OBC+DC/DC

文章目录 1. 车载DC/DC应用场景2. PFC2.1 简介2.2 专业名词2.3 常见拓扑结构2.3.1 传统桥式PFC2.3.2 普通无桥型PFC2.3.3 双Boost无桥PFC2.3.4 图腾柱PFC2.3.5 参考资料 2.4 功率因数2.4.1 简介2.4.2 计算 3. DC/DC3.1 Boost升压电路3.1.1 简介3.1.2 电路框图3.1.3 工作原理3.1…...

【朝花夕拾】免费个人网页搭建:免费托管、CDN加速、个人域名、现代化网页模板一网打尽

现代化网页设计的免费宝藏&#xff1a;GitHub PagesCodePenCloudflareUS.KG 前言 在当今数字化时代&#xff0c;个人和企业越来越重视在线形象的建立。GitHub Pages 提供了一个免费且便捷的平台&#xff0c;允许用户托管静态网站。然而&#xff0c;GitHub Pages 默认的域名可…...

Spring Boot知识管理系统:用户体验设计

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…...

《数字信号处理》学习08-围线积分法(留数法)计算z 逆变换

目录 一&#xff0c;z逆变换相关概念 二&#xff0c;留数定理相关概念 三&#xff0c;习题 一&#xff0c;z逆变换相关概念 接下来开始学习z变换的反变换-z逆变换&#xff08;z反变化&#xff09;。 由象函数 求它的原序列 的过程就称为 逆变换。即 。 求z逆变换…...

vue3中的computed属性

模板界面&#xff1a; <template><div class"person"><h2>姓&#xff1a; <input type"text" v-model"person.firstName" /></h2><h2>名&#xff1a; <input type"text" v-model"person…...

C++学习笔记之vector容器

天上月&#xff0c;人间月&#xff0c;负笈求学肩上月&#xff0c;登高凭栏眼中月&#xff0c;竹篮打水碎又圆。 山间风&#xff0c;水边风&#xff0c;御剑远游脚下风&#xff0c;圣贤书斋翻书风&#xff0c;风吹浮萍又相逢。 STL(Standard Template Library,标准模板库 ) 从…...

LeNet-5(论文复现)

LeNet-5&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 LeNet-5&#xff08;论文复现&#xff09;概述LeNet-5网络架构介绍训练过程测试过程使用方式说明 概述 LeNet是最早的卷积神经网络之一。1998年&#xff0c;Yann LeCun第一次将LeN…...

基于SpringBoot+Vue+Uniapp汽车保养系统小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而…...

【问题实战】Jmeter中jtl格式转换图片后如何分开展示各个性能指标?

【问题实战】Jmeter中jtl格式转换图片后如何分开展示各个性能指标&#xff1f; 遇到的问题解决方法查看修改效果 遇到的问题 JMeter测试计划中只设置了一个性能监控器jpgc - PerfMon Metrics Collector&#xff1b;在这个监控器中设置几个性能监控指标&#xff0c;比如CPU、Di…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

FFmpeg 低延迟同屏方案

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

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...