当前位置: 首页 > 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…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...