一个案例熟悉使用pytorch

news2024/12/28 19:28:39

文章目录

  • 1. 完整模型的训练套路
    • 1.2 导入必要的包
    • 1.3 准备数据集
      • 1.3.1 使用公开数据集:
      • 1.3.2 获取训练集、测试集长度:
      • 1.3.3 利用 DataLoader来加载数据集
    • 1.4 搭建神经网络
      • 1.4.1 测试搭建的模型
      • 1.4.2 创建用于训练的模型
    • 1.5 定义损失函数和优化器
    • 1.6 使用tensorboard(非必要)
    • 1.7 定义早停策略等参数
    • 1.8 训练模型
      • 1.8.1 通过训练得到best_model
    • 1.9 验证模型
      • 1.9.1标签数据:
      • 1.9.2 开始验证模型
        • 导入必要的包:
        • 读取图片(网上随便找的):
        • 转换图像维度:
        • 加载best_model
        • 开始用模型预测
    • 1.10 扩展知识
      • 1.10.1 使用GPU加速的方法
      • 1.10.2 使用早停策略
      • 1.10.3 两种保存模型的方法
        • 导包:
        • 两种保存模型方式:
        • 两种读取模型方式:
    • 完整代码获取方式:

1. 完整模型的训练套路

任务:给图片做分类,飞机、鸟、狗、猫。。等共十种标签

ps:针对不同任务,只是在数据处理和模型搭建上有所不同而已,模型的训练流程套路都是一样的。

1.2 导入必要的包

import torchvision
from torch import nn
import torch

1.3 准备数据集

1.3.1 使用公开数据集:

# 准备数据集
train_data = torchvision.datasets.CIFAR10(root="../data",train=True,transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root="../data",train=False,transform=torchvision.transforms.ToTensor(),download=True)

1.3.2 获取训练集、测试集长度:

# length长度
train_data_size = len(train_data)
test_data_size = len(test_data)

print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))

1.3.3 利用 DataLoader来加载数据集

# 利用 DataLoader来加载数据集
from torch.utils.data import DataLoader
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)

1.4 搭建神经网络

# 搭建神经网络
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel,self).__init__()
        
        self.model = nn.Sequential(
            nn.Conv2d(3,32,5,1,2),
            nn.MaxPool2d(2),
            
            nn.Conv2d(32,32,5,1,2),
            nn.MaxPool2d(2),
            
            nn.Conv2d(32,64,5,1,2),
            nn.MaxPool2d(2),
            
            nn.Flatten(),
            
            nn.Linear(64*4*4,64),
            nn.Linear(64,10)
        )
        
    def forward(self,x):
        x = self.model(x)
        return x

1.4.1 测试搭建的模型

# 测试搭建的模型
model1 = MyModel()
input = torch.ones((64,3,32,32))
output = model1(input)
print(output.shape) #torch.Size([64, 10])

1.4.2 创建用于训练的模型

# 定义是否使用gpu加速的设备
# 支持gpu加速的pytorch版本,device = cuda:0,否则为cpu
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 
print(device) # cuda:0

# 创建模型
model = MyModel()
# model.to(device) # 模型和损失函数不需要另外复制
model = model.to(device)

1.5 定义损失函数和优化器

# 损失函数
loss_fn = nn.CrossEntropyLoss() # 交叉熵,现在常用mse
loss_fn.to(device)

learning_rate = 1e-2
# learning_rate = 0.01
# 优化器
optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate) #SGD,现在常用Adam

1.6 使用tensorboard(非必要)

# 使用tensorboard
from torch.utils.tensorboard.writer import SummaryWriter
# 添加tensorbord
writer = SummaryWriter("../logs_train")

import time
import numpy as np

1.7 定义早停策略等参数

# 定义 Early Stopping 参数  
early_stopping_patience = 3  # 如果 3 个 epoch 后性能没有改善,就停止训练  
early_stopping_counter = 0  
best_loss = float('inf')  # 初始化为无穷大  

# 初始化最好模型的性能为无穷大  
best_valid_loss = float('inf')

# 初始化好的准确率
best_accuracy = 0.00

1.8 训练模型

# 设置训练网络的一些参数

# 记录测试的次数
total_test_step = 0

# 训练的次数
epoch = 100

start_time = time.time()
for i in range(epoch):
    print("----------------第{}轮训练开始----------------".format(i+1))
    
    # 训练步骤开始
    model.train() #训练模式,对DropOut等有用
    
    train_loss = []
    # 记录训练的次数
    iter_count = 0
    for data in train_dataloader:
        imgs,targets = data
        imgs = imgs.to(device)
        targets = targets.to(device)
        
        outputs = model(imgs) # 调用模型计算输出值
        
        loss = loss_fn(outputs,targets) # 计算损失值
        
        train_loss.append(loss.item())
        
        # 优化器优化模型
        optimizer.zero_grad() # 梯度清零
        loss.backward() # 反向传播
        optimizer.step() # 优化参数
        
        iter_count = iter_count + 1 # 迭代次数
        
        if (iter_count %100 == 0):
            end_time = time.time()
#             print("cost_time:",end_time-start_time)
            print("训练次数:{0},Loss:{1:.7f}".format(iter_count,loss.item()))
            writer.add_scalar("train_loss:",loss.item(),iter_count)
            
    train_loss = np.average(train_loss)
    print("第{0}轮训练结束".format(i+1))
    print("Epoch:{0} | Train_Loss:{1:.7f}\n".format(i+1,train_loss))
    
    # 测试步骤开始
    model.eval()# 测试模式
    print("第{0}轮测试开始:".format(i+1))
    test_loss = []
    
    test_accuracy = 0
    with torch.no_grad(): # 不计算梯度
        for data in test_dataloader:
            imgs,targets = data
            
            imgs = imgs.to(device)
            targets = targets.to(device)
            
            outputs = model(imgs)
            loss = loss_fn(outputs,targets)
            
            test_loss.append(loss.item())
            
            accuracy = (outputs.argmax(1) == targets).sum()
            test_accuracy = test_accuracy+accuracy
            
    test_loss = np.average(test_loss)
    print("Epoch:{0} | Test_Loss:{1:.7f}".format(i+1,test_loss))
    test_accuracy = test_accuracy/test_data_size
    print("Test_Accuracy:{0:.7f}".format(test_accuracy))
    
    writer.add_scalar("test_loss:",test_loss,total_test_step )
    writer.add_scalar("test_accuracy:",test_accuracy,total_test_step )
        
    total_test_step = total_test_step + 1
    
    
    
    # 每一轮保存模型
    # torch.save(model,"model_{}.pth".format(i+1))
    # torch.save(model.state_dict(),"model_{}.pth".format(i)) # 官方推荐的保存模型方法
    
    
    # # 如果当前模型在验证集上的性能更好,保存该模型  (以Loss为标准)
    # if test_loss < best_valid_loss:  
    #     best_valid_loss = test_loss  
    #     torch.save(model.state_dict(), './model/best_model.pth')
    #     print("当前第{}轮模型为best_model,已保存!".format(i+1))
    
    # 以正确率为标准
    if best_accuracy < test_accuracy:  
        best_accuracy = test_accuracy  
        torch.save(model.state_dict(), './model/'+'ac_{0:.4f}_best_model.pth'.format(best_accuracy))
        print("当前第{}轮模型为best_model,已保存!".format(i+1))
        
        early_stopping_counter = 0 #只要模型有更新,早停patience就初始化为0
    else:  #早停策略
        early_stopping_counter += 1  
        if early_stopping_counter >= early_stopping_patience:  
            print("Early stopping at epoch {}".format(i+1))  
            break
    print("\n")
    
writer.close()

训练过程展示(只给出两轮的信息):

image-20230915214915625

​ …

image-20230915215059806

1.8.1 通过训练得到best_model

我自得到的best_model :ac_0.6553_best_model.pth

准确率:0.65,还行,练手的项目,就不一一调参多次训练了

1.9 验证模型

1.9.1标签数据:

在这里插入图片描述

1.9.2 开始验证模型

导入必要的包:
from PIL import Image
import torchvision
import torch
读取图片(网上随便找的):

图1-dog1:image-20230915220139203

图2-dog2:

image-20230915215959119

image_path = "./data/dog2.png"
image = Image.open(image_path)
image = image.convert('RGB')
转换图像维度:
transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),
                                torchvision.transforms.ToTensor()])
image = transform(image)
print(image.shape) #torch.Size([3, 32, 32])                                
加载best_model

神经网络类:


from torch import nn
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel,self).__init__()
        
        self.model = nn.Sequential(
            nn.Conv2d(3,32,5,1,2),
            nn.MaxPool2d(2),
            
            nn.Conv2d(32,32,5,1,2),
            nn.MaxPool2d(2),
            
            nn.Conv2d(32,64,5,1,2),
            nn.MaxPool2d(2),
            
            nn.Flatten(),
            
            nn.Linear(64*4*4,64),
            nn.Linear(64,10)
        )
        
    def forward(self,x):
        x = self.model(x)
        return x

因为我保存模型用了state_dict(),(这样的模型小,省空间),所以加载模型需要以下这样加载,下文会给出保存模型的两种方法:

best_model = MyModel()
best_model.load_state_dict(torch.load("./best_model/ac_0.6553_best_model.pth")) 
print(best_model)

输出:

MyModel(
  (model): Sequential(
    (0): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (4): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (6): Flatten(start_dim=1, end_dim=-1)
    (7): Linear(in_features=1024, out_features=64, bias=True)
    (8): Linear(in_features=64, out_features=10, bias=True)
  )
)
开始用模型预测

再转换一下图片维度:

image = torch.reshape(image,(1,3,32,32))
best_model.eval()
with torch.no_grad():
    output = best_model(image)
print(output)
print(output.argmax(1)) # 取出预测最大概率的值

输出结果:由结果可知,预测的十个标签中,从0开始,第5个结果的值最大,查看标签数据知,序号5为dog,预测成功了

ps:我得到的这个模型,把图片dog1,预测成了猫

tensor([[ -3.7735,  -9.3045,   6.1250,   2.3422,   4.8322,  11.0666,  -2.2375,
           7.5186, -11.7261,  -8.5249]])
tensor([5])

1.10 扩展知识

1.10.1 使用GPU加速的方法

GPU训练:

  1. 网络模型
  2. 数据(输入、标注)
  3. 损失函数
  4. .cuda
# 使用GPU训练
import torch  
  
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")  
  
# 将模型移动到 GPU  
model = model.to(device) 

# 将损失函数移动到 GPU
loss_fn = loss_fn.to(device)
  
# 将输入数据移动到 GPU  
inputs = inputs.to(device)  
  
# 将标签移动到 GPU  
labels = labels.to(device)

# 命令行的方式查看显卡配置(在jupyter上)
!nvidia-smi

1.10.2 使用早停策略

# 使用早停策略
import torch  
import torch.nn as nn  
from torch.optim import Adam  
from torch.utils.data import DataLoader, TensorDataset  
  
# 定义一个简单的模型  
class SimpleModel(nn.Module):  
    def __init__(self, input_dim, output_dim):  
        super(SimpleModel, self).__init__()  
        self.linear = nn.Linear(input_dim, output_dim)  
  
    def forward(self, x):  
        return self.linear(x)  
  
# 创建数据  
input_dim = 10  
output_dim = 1  
x_train = torch.randn(100, input_dim)  
y_train = torch.randn(100, output_dim)  
dataset = TensorDataset(x_train, y_train)  
dataloader = DataLoader(dataset, batch_size=10)  
  
# 初始化模型、损失函数和优化器  
model = SimpleModel(input_dim, output_dim)  
criterion = nn.MSELoss()  
optimizer = Adam(model.parameters(), lr=0.01)  
  
# 定义 Early Stopping 参数  
early_stopping_patience = 5  # 如果 5 个 epoch 后性能没有改善,就停止训练  
early_stopping_counter = 0  
best_loss = float('inf')  # 初始化为无穷大  
  
# 训练循环  
for epoch in range(100):  # 例如我们训练 100 个 epoch  
    for inputs, targets in dataloader:  
        optimizer.zero_grad()  
        outputs = model(inputs)  
        loss = criterion(outputs, targets)  
        loss.backward()  
        optimizer.step()  
  
    # 计算当前 epoch 的损失  
    current_loss = 0  
    with torch.no_grad():  
        for inputs, targets in dataloader:  
            outputs = model(inputs)  
            current_loss += criterion(outputs, targets).item() / len(dataloader)  
    current_loss /= len(dataloader)  
  
    # 检查是否应提前停止训练  
    if current_loss < best_loss:  
        best_loss = current_loss  
        early_stopping_counter = 0  
    else:  
        early_stopping_counter += 1  
        if early_stopping_counter >= early_stopping_patience:  
            print("Early stopping at epoch {}".format(epoch))  
            break

1.10.3 两种保存模型的方法

导包:
import torch
import torchvision

两种保存模型方式:
vgg16 = torchvision.models.vgg16(weights=None)

# 保存方式1,模型结构+参数结构
torch.save(vgg16,"vgg16_method1.pth")

# 保存方式2,模型参数(官方推荐)模型较小
torch.save(vgg16.state_dict(),"vgg16_method2.pth")
两种读取模型方式:
# 方式1
model1 = torch.load("vgg16_method1.pth")
# model1
# 方式2
model2 = torch.load("vgg16_method2.pth")
# model2 # 参数结构
# 将方式2 恢复成模型结构
vgg16 = torchvision.models.vgg16(weights=None)
vgg16.load_state_dict(torch.load("vgg16_method2.pth"))

print(vgg16)

输出结果:

VGG(
  (features): Sequential(
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU(inplace=True)
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (6): ReLU(inplace=True)
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (8): ReLU(inplace=True)
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (11): ReLU(inplace=True)
    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (13): ReLU(inplace=True)
    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (15): ReLU(inplace=True)
    (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (18): ReLU(inplace=True)
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (20): ReLU(inplace=True)
    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (22): ReLU(inplace=True)
    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (25): ReLU(inplace=True)
    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (27): ReLU(inplace=True)
    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (29): ReLU(inplace=True)
    (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (avgpool): AdaptiveAvgPool2d(output_size=(7, 7))
  (classifier): Sequential(
    (0): Linear(in_features=25088, out_features=4096, bias=True)
    (1): ReLU(inplace=True)
    (2): Dropout(p=0.5, inplace=False)
    (3): Linear(in_features=4096, out_features=4096, bias=True)
    (4): ReLU(inplace=True)
    (5): Dropout(p=0.5, inplace=False)
    (6): Linear(in_features=4096, out_features=1000, bias=True)
  )
)

完整代码获取方式:

点赞、收藏、加关注
加我vx:ls888726

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open3D点云处理简明教程

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 这是“激光雷达入门”文章的延续。 在这篇文章中&#xff0c;我们将查看用于处理点云的 python 库和 Open3D 数据结构&#xff0c;执行可视化并操作点云数据&#xff0c;以便进行后续的分析处理。 如果你需要快速预览3D点…

速卖通,获取标题,价格,品牌字段,免测

aliexpress.item_get&#xff08;获得aliexpress商品详情&#xff09; 为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个速卖通应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09…

宏基因组元素循环:碳氮循环的动态耦合分析

微生物在环境中生长并不是靠单一元素周转而存活的&#xff0c;生物地球化学元素循环&#xff0c;例如碳、氮、磷、硫等&#xff0c;存在复杂的耦合关系。 研究表明&#xff0c;陆地生态系统的碳氮耦合过程中&#xff0c;氮的输入在促进植物初级生产力和土壤碳固存的同时也增加…

【计算机网络笔记八】应用层(五)HTTPS

什么是 HTTPS HTTPS 解决了 HTTP 不安全的问题 HTTP 整个传输过程数据都是明文的&#xff0c;任何人都能够在链路中截获、修改或者伪造请求&#xff0f;响应报文&#xff0c;数据不具有可信性。 ① HTTPS 使用加密算法对报文进行加密&#xff0c;黑客截获了也看不懂 ② HTTP…

python安全工具开发笔记(五)——python数据库编程

一、Python DB API 在没有Python DB API之前&#xff1a; 有Python DB API之后&#xff1a; Python DB API包含内容 Python DB API访问数据库流程 二、Python Mysql开发环境 三、Python 数据库编程实例 数据库连接对象connection 连接对象&#xff1a;建立Python客户端…

post为什么会发送两次请求?

1 同源策略 在浏览器中&#xff0c;内容是很开放的&#xff0c;任何资源都可以接入其中&#xff0c;如 JavaScript 文件、图片、音频、视频等资源&#xff0c;甚至可以下载其他站点的可执行文件。但也不是说浏览器就是完全自由的&#xff0c;如果不加以控制&#xff0c;就会出现…

elementui引入弹出框报错:this.$alert is not defined 解决方案

1.按需引入文件element.js 注意&#xff1a;引入Message&#xff0c;MessageBox两个组件就行&#xff0c;alert包括在MessageBox里面了。 之前我引入了Alert组件&#xff0c;发现不行 2.在vue的prototype里注册伪名字 3.组件里直接调用就行了 4.实现效果 我发现elementui调用…

【实验记录】AGW | Visible-Infrared Re-ID

【RT】Visible Thermal Re-IDDeep Learning for Person Re-identification: A Survey and Outlook中提出了一个针对单/跨模态行人重识别的baseline&#xff1a;AGW 做过两次&#xff0c;在测试阶段有问题&#xff0c;现在再重做一次&#x1f914;Code RTX3090 修改数据集路…

数据中台实战(00)-大数据的尽头是数据中台吗?

除了支撑集团的大数据建设&#xff0c;团队还提供To B服务&#xff0c;因此我也有机会接触到一些正在做数字化转型的传统企业。从2018年末开始&#xff0c;原先市场上各种关于大数据平台的招标突然不见了&#xff0c;取而代之的是数据中台项目&#xff0c;建设数据中台俨然成为…

docker安装高斯数据库openGauss数据库

1.创建容器 #创建数据没有挂在的容器 docker run --name opengauss --privilegedtrue -d -e GS_PASSWORDEnmo123 -p 8090:5432 enmotech/opengauss:latest 2. 进入容器&#xff0c;并切换omm用户&#xff0c;使用gsql连接高斯数据库 [rootansible ~]# docker ps -a CONTAIN…

【Proteus仿真】【STM32单片机】多功能智能台灯

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1604液晶、按键、蜂鸣器、语音识别模块、PCF8591 ADC模块、DHT11温湿度传感器、光线传感器、台灯、人体红外传感器等。 主要功能&#xff1a…

华为Mate 60系列搭配出境易,轻松玩转出境游高能体验~

今年中秋国庆假期“合体”&#xff0c;长达8天的超级黄金周即将到来。不少朋友期待来一场说走就走的出境旅行&#xff0c;趁此机会远游异国他乡&#xff0c;领略不一样的风土人情。众所周知&#xff0c;海外的应用生态和网络环境和国内并不相同。想要获得“一机在手&#xff0c…

python二级

python二级Turtle 太阳花四瓣花正六边形和圆内切六边形质数&#xff08;素数&#xff09;鲁棒输入异常处理python math模块 解密函数的返回结果是元组类型类 太阳花 题目&#xff1a;用turtle库的turtle.fd()函数和turtle.left()函数绘制一个边长为200的太阳花。绘制效果如图&…

感性负载箱与电容负载箱有什么区别?

感性负载箱和电容负载箱在电力系统中的应用场景有所不同&#xff0c;感性负载箱通常用于测试和评估电力系统中的感性负载设备&#xff0c;如电动机和变压器。这些设备在运行过程中会产生感性负载&#xff0c;即对电流的相位差有一定要求。感性负载箱可以通过调节串联的电感元件…

小米科技笔记 | ElasticSearch与Redis底层原理解析

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的小伙伴&#xff01;今天&#xff0c;我们来探讨一下两个非常重要的数据存储和检索工具&#xff1a;ElasticSearch和Redis。虽然它们都是高度优化的工具&#xff0c;但在底层原理上有着明显的区别。接下来&#xff0…

多维时序 | MATLAB实现GA-BP多变量时间序列预测(遗传算法优化BP神经网络)

多维时序 | MATLAB实现GA-BP多变量时间序列预测(遗传算法优化BP神经网络) 目录 多维时序 | MATLAB实现GA-BP多变量时间序列预测(遗传算法优化BP神经网络)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.MATLAB实现GA-BP多变量时间序列预测(遗传算法优化BP神经网络)&…

Linux IP地址、主机名

查看ip地址指令 ifconfig 如无法使用ifconfig命令&#xff0c;可以安装 yum -y install net-tools ip address show--显示协议地址

AEM TESTPRO K50 ROADSHOW华南区路演

AEM的测试和测量解决方案是由一个具有四十多年经验的团队为企业和汽车客户的解决方案而设计开发的。AEM的解决方案也是专为用户在整个产品生命周期阶段&#xff0c;包括布线和连接器&#xff0c;无论是制造和实验室环境&#xff0c;在安装或日常网络故障排除方面&#xff0c;其…

Zabbix5.0_介绍_组成架构_以及和prometheus的对比_大数据环境下的监控_网络_软件_设备监控_Zabbix工作笔记001

z 这里Zabbix可以实现采集 存储 展示 报警 但是 zabbix自带的,展示 和报警 没那么好看,我们可以用 grafana进行展示,然后我们用一个叫睿象云的来做告警展示, 会更丰富一点. 可以看到 看一下zabbix的介绍. 对zabbix的介绍,这个zabbix比较适合对服务器进行监控 这个是zabbix的…

Win11系统安装WSA 的简单方式

Win11 WSA 的简单安装方式&#xff0c;无需开启Hyper-V&#xff0c;无需下载安装包。 ​ Win11系统安装WSA 1. 开启虚拟机 注&#xff1a;我只开启了虚拟机平台和Bios的虚拟化&#xff0c;其他没有操作&#xff0c;其他人出现问题可以用通过Hyper-v解决&#xff0c;但我并不…