模型部分pytorch代码如下:model_lr = 1e-5 BATCH_SIZE = 16 EPOCHS = 50 DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') use_amp = True use_dp = True classes = 8 resume = None CLIP_GRAD = 5.0 Best_ACC = 0 use_ema=True model_ema_decay=0.9998 start_epoch=1 seed=1 seed_everything(seed) 这是一个8分类的表情数据集,帮我用pytorch实现混淆矩阵可视化

时间: 2024-01-15 22:03:47 浏览: 195
好的,以下是实现混淆矩阵可视化的代码,其中使用了sklearn库的confusion_matrix和matplotlib库的imshow和colorbar函数: ```python import torch import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix # 定义函数来预测图像的类别 def predict(model, dataloader): model.eval() preds = [] targets = [] with torch.no_grad(): for data, target in dataloader: data = data.to(DEVICE) target = target.to(DEVICE) output = model(data) pred = output.argmax(dim=1, keepdim=True) preds += pred.cpu().numpy().tolist() targets += target.cpu().numpy().tolist() return np.array(preds).flatten(), np.array(targets).flatten() # 加载数据集和模型 test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=True) model = MyModel() model.load_state_dict(torch.load('model.pth')) model.to(DEVICE) # 预测测试集 y_pred, y_true = predict(model, test_loader) # 计算混淆矩阵 cm = confusion_matrix(y_true, y_pred, labels=range(classes)) # 可视化混淆矩阵 plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues) plt.colorbar() tick_marks = np.arange(classes) plt.xticks(tick_marks, range(classes)) plt.yticks(tick_marks, range(classes)) plt.xlabel('Predicted') plt.ylabel('True') plt.show() ``` 其中,test_dataset是测试集的数据集对象,MyModel是你训练好的模型。你需要将这些代码中的变量名改为你自己的。
阅读全文

相关推荐

LDAM损失函数pytorch代码如下:class LDAMLoss(nn.Module): def __init__(self, cls_num_list, max_m=0.5, weight=None, s=30): super(LDAMLoss, self).__init__() m_list = 1.0 / np.sqrt(np.sqrt(cls_num_list)) m_list = m_list * (max_m / np.max(m_list)) m_list = torch.cuda.FloatTensor(m_list) self.m_list = m_list assert s > 0 self.s = s if weight is not None: weight = torch.FloatTensor(weight).cuda() self.weight = weight self.cls_num_list = cls_num_list def forward(self, x, target): index = torch.zeros_like(x, dtype=torch.uint8) index_float = index.type(torch.cuda.FloatTensor) batch_m = torch.matmul(self.m_list[None, :], index_float.transpose(1,0)) # 0,1 batch_m = batch_m.view((16, 1)) # size=(batch_size, 1) (-1,1) x_m = x - batch_m output = torch.where(index, x_m, x) if self.weight is not None: output = output * self.weight[None, :] target = torch.flatten(target) # 将 target 转换成 1D Tensor logit = output * self.s return F.cross_entropy(logit, target, weight=self.weight) 模型部分参数如下:# 设置全局参数 model_lr = 1e-5 BATCH_SIZE = 16 EPOCHS = 50 DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') use_amp = True use_dp = True classes = 7 resume = None CLIP_GRAD = 5.0 Best_ACC = 0 #记录最高得分 use_ema=True model_ema_decay=0.9998 start_epoch=1 seed=1 seed_everything(seed) # 数据增强 mixup mixup_fn = Mixup( mixup_alpha=0.8, cutmix_alpha=1.0, cutmix_minmax=None, prob=0.1, switch_prob=0.5, mode='batch', label_smoothing=0.1, num_classes=classes) 帮我用pytorch实现模型在模型训练中使用LDAM损失函数

'''Next, define the trainer and the parameters used for training.''' class Trainer: def __init__(self,model,train_loader,val_loader=None,loss_function=l2loss,device=torch.device('cpu'), optimizer='Adam_amsgrad',lr=5e-4,weight_decay=0): self.opt_type=optimizer self.device=device self.model=model self.train_data=train_loader self.val_data=val_loader self.device=device self.opts={'AdamW':torch.optim.AdamW(self.model.parameters(),lr=lr,amsgrad=False,weight_decay=weight_decay), 'AdamW_amsgrad':torch.optim.AdamW(self.model.parameters(),lr=lr,amsgrad=True,weight_decay=weight_decay), 'Adam':torch.optim.Adam(self.model.parameters(),lr=lr,amsgrad=False,weight_decay=weight_decay), 'Adam_amsgrad':torch.optim.Adam(self.model.parameters(),lr=lr,amsgrad=True,weight_decay=weight_decay), 'Adadelta':torch.optim.Adadelta(self.model.parameters(),lr=lr,weight_decay=weight_decay), 'RMSprop':torch.optim.RMSprop(self.model.parameters(),lr=lr,weight_decay=weight_decay), 'SGD':torch.optim.SGD(self.model.parameters(),lr=lr,weight_decay=weight_decay) } self.optimizer=self.opts[self.opt_type] self.loss_function=loss_function self.step=-1 def train(self,num_train,targ,stop_loss=1e-8, val_per_train=50, print_per_epoch=10): self.model.train() len_train=len(self.train_data) for i in range(num_train): val_datas=iter(self.val_data) for j,batch in enumerate(self.train_data): self.step=self.step+1 torch.cuda.empty_cache() self.optimizer.zero_grad() out = self.model(pos=batch.pos.to(self.device), z=batch.z.to(self.device), batch=batch.batch.to(self.device)) target = batch[targ].to(self.device) 这个是源代码的一部分,请帮我修改完整后发给我

class Config: # 训练参数 batch_size = 16 learning_rate = 0.001 epochs = 10 # 音频参数 sample_rate = 16000 n_mels = 64 # 路径设置 model_save_path = "voice_detector.pth" config = Config() from model.voice_detector import VoiceDialogDetector from utils.audio_processing import create_dummy_data import torch from torch.utils.data import Dataset, DataLoader import config # 简单数据集类 class AudioDataset(Dataset): def __init__(self, dummy=True): self.dummy = dummy def __len__(self): return 100 # 虚拟数据量 def __getitem__(self, idx): if self.dummy: wave, label = create_dummy_data(batch_size=1) return wave.squeeze(0), label.squeeze(0) def train(): # 初始化 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = VoiceDialogDetector().to(device) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=config.learning_rate) # 数据加载(先用虚拟数据测试) dataset = AudioDataset(dummy=True) loader = DataLoader(dataset, batch_size=config.batch_size, shuffle=True) # 训练循环 for epoch in range(config.epochs): total_loss = 0.0 for waves, labels in loader: waves = waves.to(device) labels = labels.to(device) # 前向传播 outputs = model(waves) loss = criterion(outputs.permute(0, 2, 1), labels) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() total_loss += loss.item() print(f"Epoch [{epoch + 1}/{config.epochs}] Loss: {total_loss / len(loader):.4f}") # 保存模型 torch.save(model.state_dict(), config.model_save_path) print(f"模型已保存至 {config.model_save_path}") if __name__ == "__main__": train()这是train.py文件,还是报错Traceback (most recent call last): File "train.py", line 59, in <module> train() File "train.py" def learning_rate(): return None这是config.py文件

import torch import torchvision from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter from model import *# 准备数据集 train_data = torchvision.datasets.CIFAR10( root="./data_taolu", train=True, transform=torchvision.transforms.ToTensor(), download=True ) test_data = torchvision.datasets.CIFAR10( root="./data_taolu", train=False, transform=torchvision.transforms.ToTensor(), download=True ) # 数据统计 train_data_size = len(train_data) test_data_size = len(test_data) print(f"训练数据集长度:{train_data_size}") print(f"测试数据集长度:{test_data_size}") # 数据加载器 train_dataloader = DataLoader(train_data, batch_size=64, shuffle=True) test_dataloader = DataLoader(test_data, batch_size=64) device = torch.device('cuda') # 模型初始化 model = Jzh().to(device) # 确保模型类已修改(见下方model.py)# 损失函数与优化器 loss_fn = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=1e-2) # 训练参数 total_train_step = 0 total_test_step = 0 epochs = 10 writer = SummaryWriter("./logs_train") # 训练循环 for epoch in range(epochs): print(f"------第 {epoch + 1} 轮训练开始------") # 训练模式 model.train() for batch, (imgs, targets) in enumerate(train_dataloader): outputs = model(imgs) loss = loss_fn(outputs, targets) optimizer.zero_grad() loss.backward() optimizer.step() total_train_step += 1 if total_train_step % 100 == 0: print(f"训练次数: {total_train_step}, Loss: {loss.item():.4f}") writer.add_scalar("train_loss", loss.item(), total_train_step) # 评估模式 model.eval() total_test_loss = 0 total_accuracy = 0 with torch.no_grad(): for imgs, targets in test_dataloader: outputs = model(imgs) loss = loss_fn(outputs, targets) total_test_loss += loss.item() accuracy = (outputs.argmax(1) == targets).sum().item() total_accuracy += accuracy avg_test_loss = total_test_loss / len(test_dataloader) test_accuracy = total_accuracy / test_data_size print(f"测试集平均Loss: {avg_test_loss:.4f}") print(f"测试集准确率: {test_accuracy:.4f}") writer.add_scalar("test_loss", avg_test_loss, epoch) writer.add_scalar("test_accuracy", test_accuracy, epoch) # 保存模型 torch.save(model.state_dict(), f"jzh_{epoch}.pth") print(f"模型已保存: jzh_{epoch}.pth") writer.close()告诉我应该在何处添加哪些代码?

'''Training script. ''' import os from tqdm import tqdm import torch import torch.nn as nn from torch.utils.data import DataLoader from torch.optim import Adam, lr_scheduler from torchsummary import summary from torchvision import transforms import torch.distributed as dist import torch.multiprocessing as mp from models.resnet50 import ResNet50 from runtime_args import args from load_dataset import LoadDataset from plot import plot_loss_acc from helpers import calculate_accuracy device = torch.device("cuda:0" if torch.cuda.is_available() and args.device == 'gpu' else 'cpu') if not os.path.exists(args.graphs_folder) : os.mkdir(args.graphs_folder) model_save_folder = 'resnet_cbam/' if args.use_cbam else 'resnet/' if not os.path.exists(model_save_folder) : os.mkdir(model_save_folder) def train(gpu, args): '''Init models and dataloaders and train/validate model. ''' rank = args.rank * args.gpus + gpu world_size = args.gpus * args.nodes dist.init_process_group(backend='nccl', init_method='env://', world_size=world_size, rank=rank) model = ResNet50(image_depth=args.img_depth, num_classes=args.num_classes, use_cbam=args.use_cbam) torch.cuda.set_device(gpu) model.cuda(gpu) optimizer = Adam(model.parameters(), lr=args.learning_rate) lr_decay = lr_scheduler.ExponentialLR(optimizer, gamma=args.decay_rate) criterion = torch.nn.CrossEntropyLoss().cuda(gpu) summary(model, (3, 224, 224)) model = nn.parallel.DistributedDataParallel(model, device_ids=[gpu]) train_dataset = LoadDataset(dataset_folder_path=args.data_folder, image_size=args.img_size, image_depth=args.img_depth, train=True, transform=transforms.ToTensor()) test_dataset = LoadDataset(dataset_folder_path=args.data_folder, image_size=args.img_size, image_depth=args.img_depth, train=False, transform=transforms.ToTensor()) train_sampler = torch.utils.data.distributed.DistributedSample

import argparse import logging import os import random import sys import torch import torch.nn as nn import torch.nn.functional as F import torchvision.transforms as transforms import torchvision.transforms.functional as TF from pathlib import Path from torch import optim from torch.utils.data import DataLoader, random_split from tqdm import tqdm # 删除 wandb 导入 from evaluate import evaluate from unet import UNet from utils.data_loading import BasicDataset, CarvanaDataset from utils.dice_score import dice_loss dir_img = Path('./data/imgs/') dir_mask = Path('./data/masks/') dir_checkpoint = Path('./checkpoints/') def train_model( model, device, epochs: int = 5, batch_size: int = 1, learning_rate: float = 1e-5, val_percent: float = 0.1, save_checkpoint: bool = True, img_scale: float = 0.5, amp: bool = False, weight_decay: float = 1e-8, momentum: float = 0.999, gradient_clipping: float = 1.0, ): # 1. Create dataset try: dataset = CarvanaDataset(dir_img, dir_mask, img_scale) except (AssertionError, RuntimeError, IndexError): dataset = BasicDataset(dir_img, dir_mask, img_scale) # 2. Split into train/validation n_val = int(len(dataset) * val_percent) n_train = len(dataset) - n_val train_set, val_set = random_split(dataset, [n_train, n_val], generator=torch.Generator().manual_seed(0)) # 3. Create data loaders loader_args = dict(batch_size=batch_size, num_workers=os.cpu_count(), pin_memory=True) train_loader = DataLoader(train_set, shuffle=True, **loader_args) val_loader = DataLoader(val_set, shuffle=False, drop_last=True, **loader_args) # 删除 wandb 初始化,改为直接打印配置 logging.info(f'''Starting training: Epochs: {epochs} Batch size: {batch_size} Learning rate: {learning_rate} Training size: {n_train} Validation size: {n_val} Checkpoints: {save_chec

大家在看

recommend-type

HCIE DC数据中心认证培训教材

HCIE DC数据中心认证培训教材 2000页 
recommend-type

签约中投科信接口设计 商户绑卡签约

签约中投科信接口设计 商户绑卡签约(换绑卡)流程--子商户签约--子商户开通支付----调用支付(自动分账)----查询交易--退款等11个接口,集成了微信支付、支付宝支付,对接了中投科信交易的完整周期
recommend-type

svm.cpp.rar_SVM SVR_SVR

This is a weighted svr in matlab
recommend-type

压缩光谱成像空间编码的调制效应

空间光调制过程是空间编码压缩光谱成像方法中影响光谱成像数据保真度的重要环节。为拓展现有压缩光谱成像空间光调制的编码种类,揭示其与成像数据保真度的关联规律,针对压缩光谱成像中的编码调制效应展开研究。基于成像系统物理模型,拓展现有二值化编码振幅调制方法,开展非二值化连续型编码振幅调制研究,进而验证相位型调制方法的施用方法,以全波段图像均方根差作为评价成像数据保真度的参数,量化各类编码调制方法与成像数据保真度的关联。构建具有特定空间特征和谱线特征的仿真场景,实施压缩光谱成像仿真实验,比对六类空间编码调制效应下的成像效果,验证非二值化振幅编码调制的施用可行性及相位型空间光调制对提高此类成像方法数据保真度的有效性。
recommend-type

kaggle疟疾细胞深度学习方法进行图像分类

这个资源是一个完整的机器学习项目工具包,专为疟疾诊断中的细胞图像分类任务设计。它使用了深度学习框架PyTorch来构建、训练和评估一个逻辑回归模型,适用于医学研究人员和数据科学家在图像识别领域的应用。 主要功能包括: 数据预处理与加载: 数据集自动分割为训练集和测试集。 图像数据通过PyTorch转换操作标准化和调整大小。 模型构建: 提供了一个基于逻辑回归的简单神经网络模型,适用于二分类问题。 模型结构清晰,易于理解和修改。 训练与优化: 使用Adam优化器和学习率调度,有效提升模型收敛速度。 实施早停机制,防止过拟合并优化训练时间。 性能评估: 提供准确率、分类报告和混淆矩阵,全面评估模型性能。 使用热图直观显示模型的分类效果。 这里面提供了一个完整的训练流程,但是模型用的相对简单,仅供参考。 可以帮助新手入门医学研究人员在实验室测试中快速识别疟疾细胞,还可以作为教育工具,帮助学生和新研究者理解和实践机器学习在实际医学应用中的运用。

最新推荐

recommend-type

python人脸识别医院考勤系统(编号:70359507).zip

python人脸识别医院考勤系统(编号:70359507)
recommend-type

认识VisualFoxPro专题培训.pptx

认识VisualFoxPro专题培训.pptx
recommend-type

2021办公自动化实习工作总结报告范文.docx

2021办公自动化实习工作总结报告范文.docx
recommend-type

VB数组新版.pptx

VB数组新版.pptx
recommend-type

数据挖掘综述.pptx

数据挖掘综述.pptx
recommend-type

小巧实用的多语言代码行统计工具

### 代码行统计工具知识点总结 代码行统计工具是软件开发过程中用于计算源代码文件中代码行数的实用软件工具。代码行(Line of Code, LOC)是衡量软件大小和复杂度的一种基本指标。这种统计可以手动进行,但效率低下且容易出错。因此,开发出了多种自动化工具来完成这项任务,以便更加高效、准确地计算代码量。 #### 标题知识点 - **各种语言的支持:** 这说明工具能够支持多种编程语言,不仅限于某一特定语言。这可能意味着该工具能够识别不同语言的语法结构,包括关键字、注释规则和代码块的开始和结束符号。 - **工具的轻巧性:** “工具很小”通常指的是该工具具有较低的系统要求和较小的安装包体积。这意味着它易于安装和运行,不会占用太多的磁盘空间和内存资源。 - **简单实用:** 指的是该工具拥有简洁的用户界面和直观的操作流程。用户无需复杂的学习或配置就能上手使用。 - **容易操作:** 暗示着工具提供的交互简单明了,可能包括命令行操作、图形界面操作或拖放功能等。用户可以通过简单的步骤完成代码行的统计任务。 #### 描述知识点 - **自动化统计:** 描述强调了自动化的能力,自动统计可以大大提高效率,减少人为错误,并能快速提供统计结果。 - **易于使用:** 描述再次强调工具的易用性,强调即便是对计算机不太熟悉的用户也能够轻松使用该工具。 #### 标签知识点 - **代码行统计:** 通过标签“代码行统计”我们可以明确知道工具的主要功能是统计代码行数。在软件工程中,代码行统计常用于项目估算、生产率分析、成本计算和质量保证等。 #### 压缩包子文件的文件名称列表知识点 - **CountLines.exe:** 这是代码行统计工具的可执行文件名。"exe"文件扩展名表示这是一个在Windows操作系统上运行的可执行程序。 ### 代码行统计工具的应用场景 #### 1. 项目管理与规划 - **项目估算:** 开发者和项目经理可以根据代码行数来估计开发时间和成本。例如,某些公司可能会有自己的生产率标准,即每个开发人员每天平均能写多少行有效代码。 - **生产率分析:** 长期跟踪代码行数可以帮助分析团队和个人的生产率。 #### 2. 质量保证 - **代码审查:** 在代码审查的过程中,代码行统计可以作为评估代码质量的辅助手段。过于复杂的代码可能需要重构,而代码行统计可以提供参考数据。 - **测试覆盖率:** 统计代码行数也可以帮助测试人员了解测试覆盖的范围,以保证测试的充分性。 #### 3. 版本控制与维护 - **变更影响分析:** 当需要对代码库进行修改时,代码行统计有助于评估这些修改可能影响的代码量。 - **维护成本:** 统计代码行数有助于估算未来维护代码所需的资源和成本。 #### 4. 代码重构 - **识别冗余代码:** 过多的代码行可能意味着存在重复代码或不必要的复杂性。通过统计分析可以找到需要重构的代码段。 ### 工具的使用注意事项 - **注释代码的处理:** 工具应能识别注释代码行,并在统计时给予适当的处理,通常注释行不应计入代码行数。 - **空白行的处理:** 空白行在统计时通常也会被排除,因为它们不包含任何执行代码。 - **跨语言项目的统计:** 对于涉及多种编程语言的项目,工具需要能够区分不同语言的代码,并分别进行统计。 - **准确性:** 工具在统计时需要考虑代码的结构,避免将不属于代码的文本计入行数统计。 ### 结语 代码行统计工具是软件开发和管理中不可或缺的辅助工具。通过这些工具,开发者可以更高效地进行代码管理、项目规划、质量和维护任务。但需要强调的是,代码行数只是衡量代码质量和项目规模的指标之一,应当结合其他度量标准如功能点分析、代码复杂度分析等综合评估。
recommend-type

【性能测试基准】:为RK3588选择合适的NVMe性能测试工具指南

# 1. NVMe性能测试基础 ## 1.1 NVMe协议简介 NVMe,全称为Non-Volatile Memory Express,是专为固态驱动器设计的逻辑设备接口规范。与传统的SATA接口相比,NVMe通过使用PCI Express(PCIe)总线,大大提高了存储设备的数据吞吐量和IOPS(每秒输入输出操作次数),特别适合于高速的固态存储设备。
recommend-type

transformers能在vue中用么

### 使用Transformers库在Vue.js项目中的集成 为了在Vue.js项目中使用Transformers库,需先安装必要的依赖项。通过npm或yarn来完成此操作: ```bash npm install @vue/cli-service transformers --save ``` 或者对于使用Yarn的开发者而言, ```bash yarn add @vue/cli-service transformers ``` 创建一个新的组件用于加载和初始化Transformers模型。下面是一个简单的例子展示如何在一个名为`TransformerModel.vue`的文件
recommend-type

JQuery三季深入学习笔记合集

### JQuery学习笔记合集知识点概述 JQuery是目前前端开发中最流行的JavaScript库之一,它极大地简化了JavaScript编程,特别是在HTML文档遍历和操作、事件处理、动画以及Ajax交互方面。以下是关于“JQuery学习笔记合集”中所涉及知识点的详细说明。 #### 标题知识点解析 - **JQuery学习笔记合集** 该标题表明我们即将讨论的内容是对JQuery学习的总结和记录,涵盖了JQuery的核心概念、常用方法和最佳实践。由于提到了“合集”,这暗示了本学习笔记可能是对JQuery多方面内容的综合整理,不仅包含基础的语法和使用方法,还可能包括高级技巧和实际开发中的问题解决。 #### 描述知识点解析 - **总共三季,深入浅出的介绍JQuery的应用。** 描述中的“总共三季”意味着整个学习笔记被分为三个部分或章节,每一季都可能涵盖不同级别的内容,从基础到进阶逐步深入。"深入浅出的介绍JQuery的应用"则暗示着在编写这些笔记时,作者采取了易理解的方式,使得即使是初学者也能够通过这些笔记掌握JQuery的使用。"深入浅出"是教育和培训中一个重要的原则,尤其是对于复杂的技术内容,需要逐步引导学习者从基础概念理解到能够解决实际问题。 #### 标签知识点解析 - **JQuery, Javascript, 学习笔记** 标签中列出了三个关键词:JQuery、Javascript和学习笔记。这些标签揭示了笔记的焦点主题和内容范围。 - **JQuery**:作为标题的主要内容,这表明学习笔记会集中在JQuery的使用上,包括其API的介绍、选择器、事件处理、动画效果、AJAX操作等。 - **Javascript**:作为JQuery的基础,Javascript是前端开发的灵魂,JQuery本质上是Javascript库。因此,笔记中可能也会涵盖一些Javascript的基础知识,以及如何与JQuery结合使用。 - **学习笔记**:表示这些文档是个人学习过程中的记录,它可能包含了代码示例、练习题、常见问题解答、个人心得等。通过这些笔记,学习者可以快速了解JQuery的使用,并可作为复习和参考材料。 #### 压缩包子文件的文件名称列表解析 - **jQ学习第三季.rar、jQ学习第二季(1).rar、jQ学习第一季.rar、jQ学习第二季(3).rar、jQ学习第二季(2).rar** 这部分提供的文件名称列表揭示了JQuery学习笔记合集的组织结构。文件按照季节进行划分,暗示了内容的分批安排,可能是按照学习进度或者JQuery的难易程度来划分。每个季节又可能细分为不同的主题或小节,比如“第二季(1)”、“第二季(2)”和“第二季(3)”,这表明了在第二季中包含了三个不同方面的内容。文件的扩展名为“.rar”,意味着这些文档被打包并压缩,可能是为了方便存储和传输。 通过这些文件名,我们可以推测: - 第一季可能涵盖了JQuery的入门知识,包括选择器、基本操作、事件绑定、基本效果等。 - 第二季可能深入讨论了JQuery的高级功能,如动画、高级选择器、DOM操作、数据存储等。 - 第三季则可能专注于JQuery的整合与优化,以及与其他前端技术(如HTML5、CSS3)的协同工作,或者探讨JQuery插件开发等更高级的主题。 综上所述,"JQuery学习笔记合集"不仅是对JQuery技能的一个系统性学习总结,也为我们提供了一个从基础到高级的应用路线图,非常适合希望通过JQuery来增强JavaScript编程能力的前端开发者使用。通过这些精心整理的学习笔记,我们可以更加高效地掌握JQuery,从而在实际开发中更加游刃有余。
recommend-type

【固态硬盘寿命延长】:RK3588平台NVMe维护技巧大公开

# 1. 固态硬盘寿命延长的基础知识 ## 1.1 固态硬盘的基本概念 固态硬盘(SSD)是现代计算设备中不可或缺的存储设备之一。与传统的机械硬盘(HDD)相比,SSD拥有更快的读写速度、更小的体积和更低的功耗。但是,SSD也有其生命周期限制,主要受限于NAND闪存的写入次数。 ## 1.2 SSD的写入次数和寿命 每块SSD中的NAND闪存单元都有有限的写入次数。这意味着,随着时间的推移,SSD的