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

从代码学习深度学习 - 实战 Kaggle 比赛:图像分类 (CIFAR-10 PyTorch版)

文章目录

  • 前言
  • 1. 读取并整理数据集
    • 1.1 读取标签文件
    • 1.2 划分训练集和验证集
    • 1.3 整理测试集
    • 1.4 执行数据整理
  • 2. 图像增广
    • 2.1 训练集图像变换
    • 2.2 测试集(和验证集)图像变换
  • 3. 读取数据集
    • 3.1 创建 Dataset 对象
    • 3.2 创建 DataLoader 对象
  • 4. 定义模型
    • 4.1 获取 ResNet-18 模型
    • 4.2 损失函数
  • 5. 定义训练函数
  • 6. 训练和验证模型
  • 7. 在完整训练集上训练并预测测试集
  • 8. 辅助工具代码 (`utils_for_train.py` 和 `utils_for_huitu.py`)
    • 8.1 `utils_for_train.py`
    • 8.2 `utils_for_huitu.py`
  • 总结

前言

欢迎来到我们的深度学习实战系列!在本文中,我们将深入探讨一个经典的图像分类问题——CIFAR-10挑战,并通过一个实际的 Kaggle 比赛流程来学习。我们将从原始图像文件开始,一步步进行数据整理、图像增广、模型构建、训练、评估,并最终生成提交结果。本教程将全程使用 PyTorch 框架,并详细解释每一段代码的功能和背后的原理。

在以往的教程中,我们可能更多地依赖深度学习框架的高级API直接获取处理好的张量格式数据集。但在真实的比赛和项目中,我们往往需要从更原始的数据形态(如.jpg, .png 文件和标签列表)入手。本篇博客旨在弥补这一差距,带你体验一个相对完整的小型 Kaggle 比赛pipeline。

我们将使用一个名为 kaggle_cifar10_tiny 的数据集,它是 CIFAR-10 的一个小型子集,方便我们快速迭代和学习。让我们开始吧!

完整代码:下载链接

1. 读取并整理数据集

在任何机器学习项目中,数据准备都是至关重要的一步。对于图像分类任务,这通常意味着读取图像文件,将其与对应的标签关联起来,并组织成适合模型训练的结构。

1.1 读取标签文件

我们的原始数据包含一个 trainLabels.csv 文件,其中记录了训练集中每张图像的文件名及其类别标签。下面的代码定义了一个函数 read_csv_labels 来读取这个 CSV 文件,并将其内容转换为一个字典,方便后续查找。

import os# 定义数据目录路径
data_dir = 'kaggle_cifar10_tiny'def read_csv_labels(fname):"""读取CSV文件并返回文件名到标签的映射字典参数:fname (str): CSV文件路径返回:dict: 包含文件名到标签的映射字典- 键 (str): 图像文件名 (不含扩展名)- 值 (str): 对应的类别标签"""with open(fname, 'r') as f:# 跳过CSV文件的第一行(列名)lines = f.readlines()[1:]# 将每行按逗号分割成tokens# tokens是一个列表,每个元素是[文件名, 标签]形式的列表# 维度: tokens - list[list[str, str]], 长度为样本数量tokens = [l.rstrip().split(',') for l in lines]# 构建字典,将文件名映射到对应的标签# 维度: 返回的字典 - dict{str: str}, 键为文件名,值为标签return dict(((name, label) for name, label in tokens))# 读取训练标签文件
# 维度: labels - dict{str: str}, 键为文件名,值为标签
labels = read_csv_labels(os.path.join(data_dir, 'trainLabels.csv'))# 打印训练样本数量(即字典中键值对的数量)
# len(labels) - int, 表示训练样本的数量
print('# 训练样本:', len(labels))# 打印类别数量(即标签种类的数量)
# len(set(labels.values())) - int, 表示不同类别的数量
print('# 类别:', len(set(labels.values())))

运行上述代码,我们会得到训练样本的总数和类别的总数。例如:

# 训练样本: 1000
# 类别: 10

这表明我们的微型数据集中有1000个训练样本,分布在10个类别中。

1.2 划分训练集和验证集

为了评估模型的泛化能力并进行超参数调整,我们需要从原始训练数据中划分出一部分作为验证集。下面的 reorg_train_valid 函数实现了这个功能。它会根据指定的验证集比例 valid_ratio,从每个类别中抽取一定数量的样本放入验证集,其余的放入新的训练集。同时,它会将所有原始训练图像(未划分前)也复制到一个单独的目录,以便后续在完整训练数据上训练模型。

copyfile 是一个辅助函数,用于将单个文件复制到目标目录,并在目标目录不存在时创建它。

import shutil
import collections
import mathdef copyfile(filename, target_dir):"""将文件复制到目标目录参数:filename (str): 源文件路径target_dir (str): 目标目录路径"""# 创建目标目录(如果不存在)# target_dir - str, 目标目录路径os.makedirs(target_dir, exist_ok=True)# 复制文件到目标目录# filename - str, 源文件路径# target_dir - str, 目标目录路径shutil.copy(filename, target_dir)def reorg_train_valid(data_dir, labels, valid_ratio):"""将验证集从原始的训练集中拆分出来参数:data_dir (str): 数据集目录路径labels (dict): 文件名到标签的映射字典valid_ratio (float): 验证集比例,取值范围[0, 1]返回:int: 每个类别中分配给验证集的样本数量"""# 获取样本数最少的类别中的样本数# collections.Counter(labels.values()) - Counter{str: int}, 统计每个标签出现的次数# most_common() - list[(str, int)], 按出现次数降序排列的(标签, 出现次数)列表# most_common()[-1] - tuple(str, int), 出现次数最少的(标签, 出现次数)对# most_common()[-1][1] - int, 出现次数最少的标签的出现次数# n - int, 样本数最少的类别中的样本数n = collections.Counter(labels.values()).most_common()[-1][1]# 计算验证集中每个类别应有的样本数# math.floor(n * valid_ratio) - int, 向下取整的验证集样本数# max(1, math.floor(n * valid_ratio)) - int, 确保每个类别至少有1个样本# n_valid_per_label - int, 每个类别分配给验证集的样本数n_valid_per_label = max(1, math.floor(n * valid_ratio))# 用于跟踪每个类别已分配到验证集的样本数# label_count - dict{str: int}, 键为标签,值为该标签在验证集中的样本数label_count = {}# 遍历训练目录中的所有文件# train_file - str, 训练集中的文件名for train_file in os.listdir(os.path.join(data_dir, 'train')):# 获取文件对应的标签# train_file.split('.')[0] - str, 去除文件扩展名的文件名# label - str, 文件对应的类别标签label = labels[train_file.split('.')[0]]# 构建完整的源文件路径# fname - str, 训练文件的完整路径fname = os.path.join(data_dir, 'train', train_file)# 将所有文件复制到train_valid目录下对应类别目录中# os.path.join(data_dir, 'train_valid_test', 'train_valid', label) - str, 目标目录路径copyfile(fname, os.path.join(data_dir, 'train_valid_test','train_valid', label))# 如果该类别在验证集中的样本数未达到目标数量,则将文件添加到验证集if label not in label_count or label_count[label] < n_valid_per_label:# 复制文件到验证集目录对应类别文件夹下# os.path.join(data_dir, 'train_valid_test', 'valid', label) - str, 验证集目标目录路径copyfile(fname, os.path.join(data_dir, 'train_valid_test','valid', label))# 更新该类别在验证集中的样本计数# label_count.get(label, 0) - int, 当前类别已有的验证集样本数,如果不存在则为0# label_count[label] - int, 更新后该类别在验证集中的样本数label_count[label] = label_count.get(label, 0) + 1else:# 如果该类别在验证集中的样本数已达到目标数量,则将文件添加到训练集# os.path.join(data_dir, 'train_valid_test', 'train', label) - str, 训练集目标目录路径copyfile(fname, os.path.join(data_dir, 'train_valid_test','train', label))# 返回每个类别中分配给验证集的样本数量# n_valid_per_label - intreturn n_valid_per_label

1.3 整理测试集

测试集图像最初也存放在一个扁平的目录 test 中。为了方便后续使用 PyTorch 的 ImageFolder 类进行读取,我们需要将它们也组织到一个特定的目录结构下。reorg_test 函数将所有测试图像复制到 train_valid_test/test/unknown 目录下。这里将它们归类为 “unknown” 是因为在预测阶段,我们并不知道它们的真实标签。

import os
import shutildef reorg_test(data_dir):"""在预测期间整理测试集,以方便读取该函数将测试集图像文件复制到组织化的目录结构中,所有测试图像都归为"unknown"类别参数:data_dir (str): 数据集根目录路径"""# 遍历测试目录中的所有文件# data_dir - str, 数据集根目录路径# os.path.join(data_dir, 'test') - str, 测试集目录的完整路径# os.listdir(...) - list[str], 测试集目录中的所有文件名列表# test_file - str, 当前处理的测试文件名for test_file in os.listdir(os.path.join(data_dir, 'test')):# 构建源文件路径# os.path.join(data_dir, 'test', test_file) - str, 测试文件的完整源路径# 构建目标目录路径,所有测试文件都放在'unknown'类别文件夹下# os.path.join(data_dir, 'train_valid_test', 'test', 'unknown') - str, 目标目录的完整路径# 将测试文件复制到组织化的目录结构中# 源文件: 原始测试集目录下的测试文件# 目标位置: train_valid_test/test/unknown/文件名copyfile(os.path.join(data_dir, 'test', test_file),os.path.join(data_dir, 'train_valid_test', 'test','unknown'))

1.4 执行数据整理

现在,我们将上述函数整合到 reorg_cifar10_data 中,并执行它来完成整个数据集的重新组织。

import os
import shutil
import collections
import mathdef reorg_cifar10_data(data_dir, valid_ratio):"""重新组织CIFAR-10数据集,划分为训练集、验证集和测试集该函数完成CIFAR-10数据集的整体重组,包含三个主要步骤:1. 读取训练标签文件获取图像标签2. 重组训练集和验证集(从原始训练集中划分出验证集)3. 重组测试集(将所有测试图像归类为"unknown"类别)参数:data_dir (str): CIFAR-10数据集根目录路径valid_ratio (float): 验证集比例,取值范围[0, 1],表示从训练集中划分多少比例作为验证集"""# 步骤1: 读取训练标签文件,获取文件名到标签的映射# data_dir - str, 数据集根目录路径# os.path.join(data_dir, 'trainLabels.csv') - str, 训练标签文件的完整路径# read_csv_labels(...) - 函数调用,读取CSV文件并返回字典# labels - dict{str: str}, 键为图像文件名,值为对应的类别标签labels = read_csv_labels(os.path.join(data_dir, 'trainLabels.csv'))# 步骤2: 重组训练集和验证集# 将原始训练集按照指定比例分为训练集和验证集,并保存到对应目录# data_dir - str, 数据集根目录路径# labels - dict{str: str}, 文件名到标签的映射字典# valid_ratio - float, 验证集比例# reorg_train_valid(...) - 函数调用,重组训练集和验证集reorg_train_valid(data_dir, labels, valid_ratio)# 步骤3: 重组测试集# 将测试集图像整理到组织化的目录结构中,便于后续处理# data_dir - str, 数据集根目录路径# reorg_test(...) - 函数调用,重组测试集reorg_test(data_dir)

我们设定批量大小 batch_size 为32,验证集比例 valid_ratio 为0.1(即10%的训练数据用作验证)。

import os
import shutil
import collections
import math# batch_size - int, 训练和评估时的批量大小
batch_size = 32 # 设置验证集比例
# valid_ratio - float, 验证集在原始训练集中的比例,取值范围[0, 1]
# 值为0.1表示将10%的原始训练数据划分为验证集
valid_ratio = 0.1# 重组CIFAR-10数据集
# data_dir - str, CIFAR-10数据集的根目录路径
# valid_ratio - float, 验证集比例
# reorg_cifar10_data(...) - 函数调用,执行数据集重组操作
# 该函数会将原始CIFAR-10数据集重组为训练集、验证集和测试集三部分
# 重组后的数据结构为:
# - train_valid_test/train/: 训练集,按类别组织
# - train_valid_test/valid/: 验证集,按类别组织
# - train_valid_test/test/unknown/: 测试集,所有测试图像
# - train_valid_test/train_valid/: 原始训练集(包含验证部分),按类别组织
reorg_cifar10_data(data_dir, valid_ratio)

执行完毕后,data_dir 目录下会生成一个新的 train_valid_test 文件夹,其结构如下:

kaggle_cifar10_tiny/
├── trainLabels.csv
├── train/ (原始训练图像)
├── test/ (原始测试图像)
└── train_valid_test/├── train/│   ├── airplane/│   ├── automobile/│   └── ... (其他8个类别)├── valid/│   ├── airplane/│   ├── automobile/│   └── ... (其他8个类别)├── train_valid/ (原始训练图像,按类别组织)│   ├── airplane/│   ├── automobile/│   └── ... (其他8个类别)└── test/└── unknown/ (所有测试图像)

2. 图像增广

图像增广(Data Augmentation)是一种通过对训练图像进行一系列随机变换来生成新样本的技术。它可以有效增加训练数据的多样性,减少模型过拟合,提高模型的泛化能力。

2.1 训练集图像变换

对于训练集,我们应用以下变换:

  1. Resize (40x40): 将图像调整到 40x40 像素。
  2. RandomResizedCrop (32x32, scale=(0.64, 1.0), ratio=(1.0, 1.0)): 随机裁剪一个面积为原图 64% 到 100% 的正方形区域,并将其缩放到 32x32 像素。这有助于模型学习到图像的不同部分。
  3. RandomHorizontalFlip: 以 50% 的概率水平翻转图像。
  4. ToTensor: 将 PIL 图像转换为 PyTorch 张量,并将像素值从 [0, 255] 归一化到 [0.0, 1.0]。
  5. Normalize: 使用 CIFAR-10 数据集的均值和标准差对图像进行标准化。这有助于加速模型收敛。
import torch
import torchvision
import torchvision.transforms as transforms# 定义训练数据的图像变换流水线
# transform_train - torchvision.transforms.Compose对象, 包含多个按顺序应用的图像变换操作
transform_train = torchvision.transforms.Compose([# 步骤1: 调整图像大小# 将输入图像(任意大小)调整为40×40像素的正方形# 输入: 任意大小的PIL图像# 输出: 40×40像素的PIL图像torchvision.transforms.Resize(40),# 步骤2: 随机裁剪并调整大小# 随机裁剪一个面积为原始图像面积0.64~1倍(约为原图的80%~100%)的正方形区域,# 然后将该区域调整为32×32像素的图像# scale参数: (0.64, 1.0) - tuple(float, float), 表示裁剪区域面积占原图面积的比例范围# ratio参数: (1.0, 1.0) - tuple(float, float), 表示裁剪区域的宽高比范围,此处固定为1.0表示裁剪正方形# 输入: 40×40像素的PIL图像# 输出: 32×32像素的PIL图像torchvision.transforms.RandomResizedCrop(32, scale=(0.64, 1.0),ratio=(1.0, 1.0)),# 步骤3: 随机水平翻转# 以0.5的概率水平翻转图像,增加数据多样性# 输入: 32×32像素的PIL图像# 输出: 32×32像素的PIL图像,可能已水平翻转torchvision.transforms.RandomHorizontalFlip(),# 步骤4: 转换为张量# 将PIL图像转换为形状为[C, H, W]的张量,并将像素值范围从[0, 255]缩放到[0.0, 1.0]# 输入: 32×32像素的PIL图像# 输出: torch.Tensor, 形状为[3, 32, 32],值范围为[0.0, 1.0]torchvision.transforms.ToTensor(),# 步骤5: 标准化# 对每个通道应用标准化处理:(x - mean) / std

相关文章:

从代码学习深度学习 - 实战 Kaggle 比赛:图像分类 (CIFAR-10 PyTorch版)

文章目录 前言1. 读取并整理数据集1.1 读取标签文件1.2 划分训练集和验证集1.3 整理测试集1.4 执行数据整理2. 图像增广2.1 训练集图像变换2.2 测试集(和验证集)图像变换3. 读取数据集3.1 创建 Dataset 对象3.2 创建 DataLoader 对象4. 定义模型4.1 获取 ResNet-18 模型4.2 损…...

什么是路由器环回接口?

路由器环回接口&#xff08;LoopbackInterface&#xff09;是网络设备中的一种逻辑虚拟接口&#xff0c;不依赖物理硬件&#xff0c;但在网络配置和管理中具有重要作用。以下是其核心要点&#xff1a; 一、基本特性 1.虚拟性与稳定性 环回接口是纯软件实现的逻辑接口&#x…...

【高频面试题】LRU缓存

文章目录 1 相关前置知识&#xff08;OS&#xff09;2 面试题 16.25. LRU 缓存2.1 题面2.2 示例2.3 解法1 &#xff08;双端队列哈希表&#xff09;思路 2.4 解法2思路 3 参考 1 相关前置知识&#xff08;OS&#xff09; 为什么需要页面置换算法&#xff1a;当进程运行时&…...

Golang

本文来源 &#xff1a;腾讯元宝 Go语言&#xff08;又称Golang&#xff09;是由Google开发的一种现代编程语言&#xff0c;自2009年发布以来&#xff0c;因其简洁性、高性能和内置并发支持而广受欢迎。以下是关于Go语言的核心特点和优势的总结&#xff1a; 1. ​​核心特点​​…...

20250515配置联想笔记本电脑IdeaPad总是使用独立显卡的步骤

20250515配置联想笔记本电脑IdeaPad总是使用独立显卡的步骤 2025/5/15 19:55 百度&#xff1a;intel 集成显卡 NVIDIA 配置成为 总是用独立显卡 百度为您找到以下结果 ?要将Intel集成显卡和NVIDIA独立显卡配置为总是使用独立显卡&#xff0c;可以通过以下步骤实现?&#xff…...

『已解决』Python virtualenv_ error_ unrecognized arguments_--wheel-bundle

&#x1f4e3;读完这篇文章里你能收获到 &#x1f40d; 了解 virtualenv 参数错误的原因及解决方案&#x1f4e6; 学习如何正确配置 Python 虚拟环境 文章目录 前言一、问题描述1.1 错误现象1.2 影响范围 二、问题分析2.1 根本原因 三、解决方案3.1 兼容处理3.2 完整解决方案 …...

使用 Apache POI 生成 Word 文档

创建一个包含标题、段落和表格的简单文档。 步骤 1:添加依赖 确保你的项目中已经添加了 Apache POI 的依赖。如果你使用的是 Maven,可以在 pom.xml 中添加以下内容: <dependency><groupId>org.apache.poi</groupId>...

表记录的检索

1.select语句的语法格式 select 字段列表 from 表名 where 条件表达式 group by 分组字段 [having 条件表达式] order by 排序字段 [asc|desc];说明&#xff1a; from 子句用于指定检索的数据源 where子句用于指定记录的过滤条件 group by 子句用于对检索的数据进行分组 ha…...

【PX4飞控】在 Matlab Simulink 中使用 Mavlink 协议与 PX4 飞行器进行交互

这里列举一些从官网收集的比较有趣或者实用的功能。 编写 m 脚本与飞行器建立 UDP 连接&#xff0c;并实时可视化 Mavlink 消息内容&#xff0c;或者读取脚本离线分析数据。不光能显示 GPS 位置或者姿态等信息的时间曲线&#xff0c;可以利用 Matlab Plot 功能快速定制化显示一…...

文章复现|(1)整合scRNA-seq 和空间转录组学揭示了子宫内膜癌中 MDK-NCL 依赖性免疫抑制环境

https://www.frontiersin.org/journals/immunology/articles/10.3389/fimmu.2023.1145300/full 目标&#xff1a;肿瘤微环境(TME)在子宫内膜癌(EC)的进展中起着重要作用。我们旨在评估EC的TME中的细胞群体。 方法&#xff1a;我们从GEO下载了EC的单细胞RNA测序(scRNA-seq)和空…...

自用Vscode 配置c++ debug环境

前言 使用vscode配置c debug环境的好处 1、可以借助vscode方便轻量的扩展和功能 2、避免了传统使用gdb 复杂按键以及不够直观的可视化 3、方便一次运行&#xff0c;断点处查看变量&#xff0c;降低找bug难度 4、某大公司项目采用类似配置&#xff0c;经过实践检验 配置c运行环…...

STM32单片机内存分配详细讲解

单片机的内存无非就两种&#xff0c;内部FLASH和SRAM&#xff0c;最多再加上一个外部的FLASH拓展。在这里我以STM32F103C8T6为例子讲解FLASH和SRAM。 STM32F103C8T6具有64KB的闪存和20KB的SRAM。 一. Flash 1.1 定义 非易失性存储器&#xff0c;即使在断电后&#xff0c;其所…...

从算力困境到创新突破:GPUGEEK如何重塑我的AI开发之旅

目录 从算力困境到创新突破&#xff1a;GPUGEEK如何重塑我的AI开发之旅开发者的算力挣扎&#xff1a;一个不得不面对的现实AI算力市场的尴尬现状&#xff1a;为什么我们需要另辟蹊径1. 资源分配失衡与价格壁垒2. 技术门槛与环境复杂性 GPUGEEK深度剖析&#xff1a;不只是又一个…...

基于OpenCV的人脸微笑检测实现

文章目录 引言一、技术原理二、代码实现2.1 关键代码解析2.1.1 模型加载2.1.2 图像翻转2.1.3 人脸检测 微笑检测 2.2 显示效果 三、参数调优建议四、总结 引言 在计算机视觉领域&#xff0c;人脸检测和表情识别一直是热门的研究方向。今天我将分享一个使用Python和OpenCV实现…...

2025认证杯数学建模第二阶段A题小行星轨迹预测思路+模型+代码

2025认证杯数学建模第二阶段思路模型代码&#xff0c;详细内容见文末名片 一、问题重述 1.1 问题背景 在浩瀚无垠的宇宙中&#xff0c;近地小行星&#xff08;NEAs&#xff09;宛如一颗颗神秘的“太空子弹”&#xff0c;其轨道相对接近地球&#xff0c;给我们的蓝色星球带来…...

Uniapp 安卓实现讯飞语音听写(复制即用)

在移动应用开发中&#xff0c;语音交互功能能够极大提升用户体验&#xff0c;让操作更加便捷自然。讯飞语音听写技术凭借其高准确率和稳定性&#xff0c;成为众多开发者的选择。本文将详细介绍如何在 Uniapp 项目中&#xff0c;实现安卓端的讯飞语音听写功能&#xff0c;帮助你…...

【FileZilla】 从事件类型到消息类型的函数形参类型转化

本篇其实是前篇【Filezilla】 dispatch函数重载的例子-CSDN博客的一个补充&#xff0c;其中涉及到【FileZilla】事件调用机制代码解析-CSDN博客中的事件分发机制时钩子函数的参数传递怎么实现的。跟【FileZilla】sftp协议的数据传输上传和下载-CSDN博客同样&#xff0c;用事件是…...

python打卡day26

函数、参数、变量 知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 def function_name(parameter…...

RPC框架源码分析学习(二)

RPC框架源码分析与原理解读 前言 在分布式系统开发中&#xff0c;远程过程调用(RPC)是一项基础且关键的技术。通过对KVstorageBaseRaft-cpp项目RPC模块的源码分析&#xff0c;我深入理解了RPC框架的工作原理和实现细节。本文将从程序员视角分享我的学习心得。 框架概述 本项…...

算法分析:蛮力法

一、实验目的 1 掌握蛮力法的设计思想(利用计算机去穷举所有的可能解,再从中依次找出可行解) 2 掌握蛮力法的具体实现和时间复杂度分析 3 理解蛮力法的常见特性 实验要求&#xff1a;先用伪代码描述利用蛮力法解决的算法解决方案&#xff0c;再用程序实现&#xff0c;计算时间…...

构建RAG混合开发---PythonAI+JavaEE+Vue.js前端的实践

写在前文&#xff1a;之所以设计这一套流程&#xff0c;是因为 Python在前沿的科技前沿的生态要比Java好&#xff0c;而Java在企业级应用层开发比较活跃&#xff1b; 毕竟许多企业的后端服务、应用程序均采用Java开发&#xff0c;涵盖权限管理、后台应用、缓存机制、中间件集成…...

游戏引擎学习第280天:精简化的流式实体sim

回顾并为今天的内容做铺垫 今天的任务是让之前关于实体存储方式的改动真正运行起来。我们现在希望让实体系统变得更加真实和实用&#xff0c;能够支撑我们游戏实际所需的功能。这就要求我们对它进行更合理的实现和调试。 昨天我们基本让代码编译通过了&#xff0c;但实际上还…...

小程序映射逻辑处理

onLoad: function (options) { // 如果直接从options获取数据 this.setData({ jielunpin:发羽音, birthStr: 1944-01-01 }); // 处理诊断结论 this.processJielunpin(); // 添加一个处理诊断结论的函数 processJielunpin: function() { // 获取jielunpin和birthSt…...

亚马逊,temu测评采购低成本养号策略:如何用一台设备安全批量管理买家账号

只要能够巧妙规避平台的检测和风控措施&#xff0c;测评便可安全进行。 自养号测评&#xff0c;它更便于卖家掌控&#xff0c;且能降低风险。现在很多卖家都是自己养号&#xff0c;自己养号都是精养&#xff0c;不是自动的机刷&#xff0c;买家账号掌握在自己手里&#xff0c;更…...

TCP实现安全传输的核心机制 + TCP的报文讲解(全程图文讲解)

目录 一、TCP的协议和数据报格式 二、TCP常见的核心机制 1. 确认应答 2. 超时重传 3. 连接管理 三次握手&#xff08;建立连接&#xff09; 四次挥手&#xff08;断开连接&#xff09; 常见的状态和整体的传输流程 4. 滑动窗口 5. 流量控制 6. 拥塞控制 7. 延迟应…...

【测试工具】selenium和playwright如何选择去构建自动化平台

构建UI自动化平台服务&#xff0c;在底层选择自动化框架&#xff0c;selenium和playwright这两个如何选择 在构建UI自动化平台服务时&#xff0c;选择底层自动化框架&#xff08;如 Selenium 和 Playwright&#xff09;是一个非常关键的决策&#xff0c;直接影响平台的性能、可…...

ES常识8:ES8.X如何实现热词统计

文章目录 一、数据采集与存储设计1. 确定需记录的字段2. 设计搜索日志索引 二、数据写入与采集三、热门搜索词统计&#xff08;核心逻辑&#xff09;1. 基础版&#xff1a;近 7 天热门搜索词&#xff08;按出现次数排序&#xff09;2. 进阶版&#xff1a;加权热门词&#xff08…...

可解释性AI 综述《Explainable AI for Industrial Fault Diagnosis: A Systematic Review》

一、研究背景与动因&#xff08;Background & Motivation&#xff09; 随着工业4.0与工业5.0的发展&#xff0c;工业生产越来越依赖自动化与智能化手段&#xff0c;以实现高效、预测性维护与运行优化。在这一背景下&#xff0c;人工智能&#xff08;AI&#xff09;与机器学…...

数据可视化-----子图的绘制及坐标轴的共享

目录 绘制固定区域的子图 &#xff08;一&#xff09;、绘制单子图 subplot()函数 Jupyter Notebook的绘图模式 &#xff08;二&#xff09;、多子图 subplots()--可以在规划好的所有区域中一次绘制多个子图 &#xff08;三&#xff09;、跨行跨列 subplot2grid()---将整…...

nginx 配置

proxy_pass 结尾斜杠规则 不带斜杠‌&#xff1a;保留原始请求路径。 location /api {proxy_pass http://backend; # 转发到 http://backend/api }带斜杠‌&#xff1a;剥离 location 匹配的路径前缀。 location /api/ {proxy_pass http://backend/; # 转发到 http://back…...

《从零开始入门递归算法:搜索与回溯的核心思想 + 剑指Offer+leetcode高频面试题实战(含可视化图解)》​

一.递归 1.汉诺塔 题目链接&#xff1a;面试题 08.06. 汉诺塔问题 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a;将A柱子上的盘子借助B柱子全部移动到C柱子上。 算法原理&#xff1a;递归 当A柱子上的盘子只有1个时&#xff0c;我们可以直接将A上的盘子直…...

船舶制造业数字化转型:驶向智能海洋新航道

在全球海洋经济蓬勃发展的当下&#xff0c;船舶制造业作为海洋产业的重要支柱&#xff0c;正面临着前所未有的机遇与挑战。船舶制造周期长、技术复杂&#xff0c;从设计图纸到最终交付&#xff0c;涉及成千上万的零部件和复杂的工艺流程&#xff0c;传统制造模式已难以满足市场…...

SpringBoot 自动装配流程

Spring Boot 的自动装配&#xff08;Auto Configuration&#xff09;是其最核心的特性之一&#xff0c;它让你能“开箱即用”&#xff0c;极大简化了配置。下面是 Spring Boot 自动装配的整体流程&#xff08;从启动到生效&#xff09; 的详细解析&#xff1a; ✅ 一、整体流程…...

Vue 3 实现后端 Excel 文件流导出功能(Blob 下载详解)

&#x1f4a1; 本文以告警信息导出为例&#xff0c;介绍 Vue 3 中如何通过 Axios 调用后端接口并处理文件流&#xff0c;实现 Excel 自动下载功能。 &#x1f4d1; 目录 一、前言 二、后端接口说明 三、前端实现思路 四、导出功能完整代码 五、常见问题处理 六、效果展示 …...

基于IBM BAW的Case Management进行项目管理示例

说明&#xff1a;使用IBM BAW的难点是如何充分利用其现有功能根据实际业务需要进行设计&#xff0c;本文是示例教程&#xff0c;因CASE Manager使用非常简单&#xff0c;这里重点是说明如何基于CASE Manager进行项目管理&#xff0c;重点在方案设计思路上&#xff0c;其中涉及的…...

《Python星球日记》 第78天:CV 基础与图像处理

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、计算机视觉(CV)简介1. 什么是计算机视觉?2. 计算机视觉的应用场景3. 图像的基本属性a》像素(Pixel)b》通道(Channel)c》分辨率(Res…...

Google DeepMind 推出AlphaEvolve

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Flink 1.13.2 日志配置优化:保留最近 7 天日志文件

Flink 1.13.2 日志配置优化:保留最近 7 天日志文件 在使用 Apache Flink 1.13.2 进行流处理任务时,合理的日志配置对于作业的监控、调试和故障排查至关重要。本文将介绍如何通过修改log4j.properties文件,将 Flink 的默认日志配置升级为保留最近 7 天的日志文件配置,并解决…...

【优化算法】协方差矩阵自适应进化策略(Covariance Matrix Adaptation Evolution Strategy,CMA-ES)

CMA-ES&#xff08;Covariance Matrix Adaptation Evolution Strategy&#xff09;算法是一种无导数、基于多元正态分布的迭代优化方法&#xff0c;通过自适应地调整搜索分布的均值、协方差矩阵和步长&#xff0c;能够高效地解决非线性、非凸的连续优化问题。 算法以最大似然和…...

基于Leaflet和天地图的免费运动场所WebGIS可视化-以长沙市为例

目录 前言 一、免费运动场所数据整理 1、本地宝数据简介 2、Java后台数据解析 二、Leaflet前端地图展示 1、基础数据准备 2、具体位置及属性标记 三、成果展示 1、空间位置分布 2、东风路立交桥运动公园 3、芙蓉区花侯路浏阳河大桥下方 4、梅岭国际小区 5、湖南大学…...

399. 除法求值

https://leetcode.cn/problems/evaluate-division/description/?envTypestudy-plan-v2&envIdtop-interview-150思路&#xff1a;读完题后我们可以发现这题的考察已经很明确了就是考我们矩阵&#xff0c;我们将矩阵构建出来后&#xff0c;这题就变成可达性分析题了。 所以解…...

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示 📢 前言: 作为一名键盘爱好者,近期研究了QMK固件的OLED显示屏配置,发现网上的教程要么太过复杂,要么过于简单无法实际操作。因此决定写下这篇教程,从零基础出发,带大家一步步实现键盘OLED屏幕的配置与个性化显示…...

深度解析 Meta 开源 MR 项目《North Star》:从交互到渲染的沉浸式体验设计

🌌 一、项目概览:什么是 North Star? North Star 是由 Meta 官方推出并开源 的一款面向 Meta Quest 平台 的混合现实(MR)视觉演示项目。它不仅上线了 Horizon Store,更以完整的技术栈与高质量内容向开发者展示了如何在 VR/MR 设备上实现“视觉上限”和“交互潜力”的结…...

使用VS Code通过SSH编译Linux上的C++程序

引言 在软件开发领域&#xff0c;跨平台开发是一项常见需求。特别是对于C开发者来说&#xff0c;有时需要在Windows环境下编写代码&#xff0c;但却需要在Linux环境中编译和运行。这种情况在系统编程、嵌入式开发或高性能计算领域尤为常见。 Visual Studio Code (VS Code) 提…...

Datawhale 5月llm-universe 第2次笔记

第二章 使用 LLM API 开发应用 名词解释 Temperature 参数/场景低 Temperature&#xff08;0 ~ 0.3&#xff09;高 Temperature&#xff08;0.7 ~ 1.0&#xff09;输出特点保守、稳定、可预测创造性强、多样化、不可预测语言模型行为更少的随机性&#xff0c;倾向于选择高概…...

【Vue】CSS3实现关键帧动画

关键帧动画 两个重点keyframesanimation子属性 实现案例效果展示&#xff1a; 两个重点 keyframes 和 animation 作用&#xff1a;通过定义关键帧&#xff08;keyframes&#xff09;和动画(animation)规则&#xff0c;实现复杂的关键帧动画。 keyframes 定义动画的关键帧序列…...

Spring 模拟转账开发实战

一、转账业务场景分析 转账是金融类应用的核心场景之一&#xff0c;涉及付款方扣减金额和收款方增加金额两个关键操作。在开发中需解决以下问题&#xff1a; 业务层与数据层解耦&#xff1a;通过分层架构&#xff08;Service 层调用 Dao 层&#xff09;实现逻辑分离。数据库事…...

Baklib内容中台赋能资源管理升级

内容中台驱动管理升级 在数字化转型进程中&#xff0c;企业级内容管理工具的效能直接影响资源协同效率。以全渠道资源整合为核心的内容中台&#xff0c;通过集中化处理文档、FAQ及社区论坛等非结构化数据&#xff0c;有效解决信息孤岛问题。例如&#xff0c;某金融集团通过部署…...

数据结构(九)——排序

一、排序的基本概念 1.排序&#xff1a;重新排列表中的元素&#xff0c;使表中的元素满足按关键字有序 2.稳定性&#xff1a;Ri和Rj相对位置保持不变 3.内部排序&#xff1a;指在排序期间元素全部存在内存中的排序&#xff08;比较和移动&#xff09;&#xff0c;如插入排序…...

MinerU安装(pdf转markdown、json)

在Windows上安装MinerU&#xff0c;参考以下几个文章&#xff0c;可以成功安装&#xff0c;并使用GPU解析。 整体安装教程&#xff1a; MinerU本地化部署教程——一款AI知识库建站的必备工具 其中安装conda的教程&#xff1a; 一步步教你在 Windows 上轻松安装 Anaconda以及使…...