CNN核心机制深度解析:卷积池化原理 PyTorch实现经典网络

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。

本文系统讲解CNN核心原理、经典网络架构和图像分类实战,涵盖卷积层、池化层、LeNet/AlexNet/VGG/ResNet设计思想,并提供CIFAR-10/MNIST完整实现代码。

一、卷积神经网络核心组件

image.png

1.1 卷积层:特征提取的核心
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
# 创建示例输入图像 (1通道, 5x5)
input_image = torch.tensor([[1, 0, 0, 1, 0],[0, 1, 1, 0, 1],[1, 0, 1, 0, 1],[0, 1, 0, 1, 0],[1, 0, 1, 0, 1]
], dtype=torch.float32).unsqueeze(0).unsqueeze(0)  # 添加批次和通道维度
# 定义卷积核 (1个输出通道, 1个输入通道, 3x3)
conv_kernel = torch.tensor([[1, 0, 1],[0, 1, 0],[1, 0, 1]
], dtype=torch.float32).unsqueeze(0).unsqueeze(0)
# 创建卷积层
conv_layer = nn.Conv2d(in_channels=1, out_channels=1,kernel_size=3,bias=False,padding=0,  # 无填充stride=1     # 步长1
)
# 手动设置卷积核权重
conv_layer.weight.data = conv_kernel
# 执行卷积操作
output = conv_layer(input_image)
# 可视化结果
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(input_image[0, 0], cmap='gray')
plt.title('输入图像 (5x5)')
plt.subplot(1, 3, 2)
plt.imshow(conv_kernel[0, 0], cmap='gray')
plt.title('卷积核 (3x3)')
plt.subplot(1, 3, 3)
plt.imshow(output.detach()[0, 0], cmap='gray')
plt.title('卷积结果 (3x3)')
plt.tight_layout()
plt.show()

卷积运算数学原理:

image.png

关键参数解析:

image.png

1.2 池化层:特征降维与不变性
# 创建最大池化层
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)
# 创建平均池化层
avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)
# 输入数据 (模拟特征图)
feature_map = torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]
], dtype=torch.float32).view(1, 1, 4, 4)
# 执行池化操作
max_output = max_pool(feature_map)
avg_output = avg_pool(feature_map)
# 可视化结果
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(feature_map[0, 0], cmap='viridis')
plt.title('输入特征图 (4x4)')
plt.subplot(1, 3, 2)
plt.imshow(max_output[0, 0], cmap='viridis')
plt.title('最大池化结果 (2x2)')
plt.subplot(1, 3, 3)
plt.imshow(avg_output[0, 0], cmap='viridis')
plt.title('平均池化结果 (2x2)')
plt.tight_layout()
plt.show()
print("最大池化结果:\n", max_output)
print("平均池化结果:\n", avg_output)

池化层对比:

image.png

二、经典CNN架构解析

2.1 LeNet-5:CNN的开山之作
class LeNet(nn.Module):"""LeNet-5 架构 (1998)"""def __init__(self, num_classes=10):super().__init__()self.features = nn.Sequential(nn.Conv2d(1, 6, kernel_size=5),  # 28x28 -> 24x24nn.Tanh(),nn.AvgPool2d(kernel_size=2, stride=2),  # 24x24 -> 12x12nn.Conv2d(6, 16, kernel_size=5),  # 12x12 -> 8x8nn.Tanh(),nn.AvgPool2d(kernel_size=2, stride=2)   # 8x8 -> 4x4)self.classifier = nn.Sequential(nn.Linear(16*4*4, 120),nn.Tanh(),nn.Linear(120, 84),nn.Tanh(),nn.Linear(84, num_classes))def forward(self, x):x = self.features(x)x = torch.flatten(x, 1)x = self.classifier(x)return x
# 可视化LeNet结构
model = LeNet()
print(model)

LeNet-5设计思想:

首次提出卷积-池化交替结构

使用Tanh激活函数

平均池化代替最大池化

参数量仅6万,适合当时硬件

2.2 AlexNet:深度学习复兴里程碑
class AlexNet(nn.Module):"""AlexNet 架构 (2012)"""def __init__(self, num_classes=1000):super().__init__()self.features = nn.Sequential(nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),  # 227x227 -> 55x55nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),                  # 55x55 -> 27x27nn.Conv2d(96, 256, kernel_size=5, padding=2),          # 27x27 -> 27x27nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),                  # 27x27 -> 13x13nn.Conv2d(256, 384, kernel_size=3, padding=1),         # 13x13 -> 13x13nn.ReLU(inplace=True),nn.Conv2d(384, 384, kernel_size=3, padding=1),         # 13x13 -> 13x13nn.ReLU(inplace=True),nn.Conv2d(384, 256, kernel_size=3, padding=1),         # 13x13 -> 13x13nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),                  # 13x13 -> 6x6)self.avgpool = nn.AdaptiveAvgPool2d((6, 6))self.classifier = nn.Sequential(nn.Dropout(),nn.Linear(256*6*6, 4096),nn.ReLU(inplace=True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, num_classes),)def forward(self, x):x = self.features(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return x

AlexNet创新点:

首次使用ReLU激活函数解决梯度消失

引入Dropout防止过拟合

使用重叠池化提升特征丰富性

GPU并行训练加速(当时需两块GTX 580)

数据增强技术(随机裁剪、水平翻转)

2.3 VGG:深度增加的结构统一化
def make_vgg_layers(cfg, batch_norm=False):layers = []in_channels = 3for v in cfg:if v == 'M':layers += [nn.MaxPool2d(kernel_size=2, stride=2)]else:conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)if batch_norm:layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)]else:layers += [conv2d, nn.ReLU(inplace=True)]in_channels = vreturn nn.Sequential(*layers)
# VGG-16配置
cfg_16 = [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']
class VGG(nn.Module):def __init__(self, num_classes=1000, init_weights=True):super().__init__()self.features = make_vgg_layers(cfg_16)self.avgpool = nn.AdaptiveAvgPool2d((7, 7))self.classifier = nn.Sequential(nn.Linear(512*7*7, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, num_classes),)def forward(self, x):x = self.features(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return x

VGG核心思想:

使用更小的3×3卷积核替代大卷积核(减少参数量)

深度增加到16-19层

所有卷积层保持相同填充和步长

每阶段特征图尺寸减半,通道数加倍

2.4 ResNet:残差学习解决梯度消失
class BasicBlock(nn.Module):"""ResNet基础残差块"""expansion = 1def __init__(self, in_channels, out_channels, stride=1):super().__init__()self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)self.bn1 = nn.BatchNorm2d(out_channels)self.relu = nn.ReLU(inplace=True)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)self.bn2 = nn.BatchNorm2d(out_channels)# 下采样捷径连接self.downsample = nn.Sequential()if stride != 1 or in_channels != self.expansion*out_channels:self.downsample = nn.Sequential(nn.Conv2d(in_channels, self.expansion*out_channels, kernel_size=1, stride=stride, bias=False),nn.BatchNorm2d(self.expansion*out_channels))def forward(self, x):identity = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)# 捷径连接identity = self.downsample(identity)out += identityout = self.relu(out)return out
class ResNet(nn.Module):"""ResNet-18 实现"""def __init__(self, block=BasicBlock, layers=[2, 2, 2, 2], num_classes=1000):super().__init__()self.in_channels = 64# 初始卷积层self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)self.bn1 = nn.BatchNorm2d(64)self.relu = nn.ReLU(inplace=True)self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)# 残差块层self.layer1 = self._make_layer(block, 64, layers[0], stride=1)self.layer2 = self._make_layer(block, 128, layers[1], stride=2)self.layer3 = self._make_layer(block, 192, layers[2], stride=2)self.layer4 = self._make_layer(block, 256, layers[3], stride=2)# 分类器self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.fc = nn.Linear(256*block.expansion, num_classes)def _make_layer(self, block, out_channels, blocks, stride=1):layers = []layers.append(block(self.in_channels, out_channels, stride))self.in_channels = out_channels * block.expansionfor _ in range(1, blocks):layers.append(block(self.in_channels, out_channels))return nn.Sequential(*layers)def forward(self, x):x = self.conv1(x)x = self.bn1(x)x = self.relu(x)x = self.maxpool(x)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.fc(x)return x

ResNet核心创新:

残差连接:$F(x) + x$ 解决梯度消失

恒等映射:当输入输出维度相同时直接相加

瓶颈设计:1×1卷积降维升维(ResNet50+)

批量归一化:加速训练,提高稳定性

三、图像分类实战:MNIST手写数字

3.1 数据准备与预处理
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])
# 加载MNIST数据集
train_data = datasets.MNIST('./data', train=True, download=True, transform=transform)
test_data = datasets.MNIST('./data', train=False, transform=transform)
# 创建数据加载器
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)
test_loader = DataLoader(test_data, batch_size=1000)
# 可视化样本
plt.figure(figsize=(10, 5))
for i in range(10):plt.subplot(2, 5, i+1)plt.imshow(train_data[i][0][0], cmap='gray')plt.title(f"Label: {train_data[i][1]}")plt.axis('off')
plt.tight_layout()
plt.show()
3.2 简化版CNN实现
class CNN_MNIST(nn.Module):"""MNIST专用CNN"""def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)self.pool = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(64*7*7, 128)self.fc2 = nn.Linear(128, 10)self.dropout = nn.Dropout(0.25)def forward(self, x):# 输入: [batch, 1, 28, 28]x = self.pool(nn.functional.relu(self.conv1(x)))  # -> [14,14]x = self.pool(nn.functional.relu(self.conv2(x)))  # -> [7,7]x = torch.flatten(x, 1)  # -> [batch, 64*7*7]x = self.dropout(x)x = nn.functional.relu(self.fc1(x))x = self.dropout(x)x = self.fc2(x)return x
# 初始化模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = CNN_MNIST().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 训练函数
def train(epoch):model.train()for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()if batch_idx % 100 == 0:print(f'Train Epoch: {epoch} [{batch_idx*len(data)}/{len(train_loader.dataset)}'f' ({100.*batch_idx/len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')
# 测试函数
def test():model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)accuracy = 100. * correct / len(test_loader.dataset)print(f'\n测试集: 平均损失: {test_loss:.4f}, 准确率: {correct}/{len(test_loader.dataset)} ({accuracy:.2f}%)\n')return accuracy
# 训练循环
accuracies = []
for epoch in range(1, 6):  # 训练5个epochtrain(epoch)acc = test()accuracies.append(acc)
# 可视化训练结果
plt.plot(accuracies)
plt.title('MNIST分类准确率')
plt.xlabel('Epochs')
plt.ylabel('Accuracy (%)')
plt.grid(True)
plt.show()

829c6639-410b-4f95-8e0f-39106e06a257.jpg

四、图像分类实战:CIFAR-10

4.1 数据加载与增强
# CIFAR-10数据增强
train_transform = transforms.Compose([transforms.RandomHorizontalFlip(),transforms.RandomCrop(32, padding=4),transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616))
])
test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616))
])
# 加载CIFAR-10数据集
train_data = datasets.CIFAR10('./data', train=True, download=True, transform=train_transform)
test_data = datasets.CIFAR10('./data', train=False, transform=test_transform)
# 创建数据加载器
train_loader = DataLoader(train_data, batch_size=128, shuffle=True, num_workers=2)
test_loader = DataLoader(test_data, batch_size=256, shuffle=False, num_workers=2)
# 类别名称
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
# 可视化样本
plt.figure(figsize=(10, 5))
for i in range(10):plt.subplot(2, 5, i+1)img = train_data[i][0].permute(1, 2, 0)  # CHW -> HWCimg = img * torch.tensor([0.2470, 0.2435, 0.2616]) + torch.tensor([0.4914, 0.4822, 0.4465])plt.imshow(img.clamp(0, 1))plt.title(classes[train_data[i][1]])plt.axis('off')
plt.tight_layout()
plt.show()
4.2 ResNet实现CIFAR-10分类
# 定义ResNet模型
def resnet18(num_classes=10):return ResNet(BasicBlock, [2, 2, 2, 2], num_classes=num_classes)
# 初始化模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = resnet18(num_classes=10).to(device)
# 损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[100, 150], gamma=0.1)
# 训练循环
def train(epoch):model.train()for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()if batch_idx % 100 == 0:print(f'Train Epoch: {epoch} [{batch_idx*len(data)}/{len(train_loader.dataset)}'f' ({100.*batch_idx/len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')
# 测试函数
def test():model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)accuracy = 100. * correct / len(test_loader.dataset)print(f'\n测试集: 平均损失: {test_loss:.4f}, 准确率: {correct}/{len(test_loader.dataset)} ({accuracy:.2f}%)\n')return accuracy
# 训练循环
best_acc = 0
for epoch in range(1, 181):  # 训练180个epochtrain(epoch)acc = test()scheduler.step()# 保存最佳模型if acc > best_acc:best_acc = acctorch.save(model.state_dict(), 'cifar10_resnet18.pth')print(f"当前最佳准确率: {best_acc:.2f}%")
# 可视化分类结果
def visualize_predictions():model.eval()dataiter = iter(test_loader)images, labels = next(dataiter)images, labels = images[:10].to(device), labels[:10].to(device)outputs = model(images)_, preds = torch.max(outputs, 1)# 反归一化图像images = images.cpu()mean = torch.tensor([0.4914, 0.4822, 0.4465])std = torch.tensor([0.2470, 0.2435, 0.2616])images = images * std.view(1, 3, 1, 1) + mean.view(1, 3, 1, 1)plt.figure(figsize=(15, 5))for i in range(10):plt.subplot(2, 5, i+1)img = images[i].permute(1, 2, 0).numpy()plt.imshow(img.clip(0, 1))plt.title(f"真实: {classes[labels[i]]}\n预测: {classes[preds[i]]}")plt.axis('off')plt.tight_layout()plt.show()
visualize_predictions()

image.png

五、CNN设计最佳实践

架构设计原则:

graph LR
A[输入层] --> B[卷积层1]
B --> C[激活函数]
C --> D[池化层]
D --> E[卷积层2]
E --> F[激活函数]
F --> G[池化层]
G --> H[...]
H --> I[全连接层]
I --> J[输出层]

超参数选择指南:

image.png

性能优化技巧:

  • 使用深度可分离卷积减少参数量

  • 添加残差连接提升训练深度

  • 使用注意力机制提升特征选择能力

  • 实施混合精度训练加速计算

迁移学习策略:

# 加载预训练模型
pretrained_model = torchvision.models.resnet50(pretrained=True)
# 冻结卷积层权重
for param in pretrained_model.parameters():param.requires_grad = False
# 替换分类器
pretrained_model.fc = nn.Linear(pretrained_model.fc.in_features, num_classes)

关键要点总结

卷积层核心功能:

  • 局部感受野提取特征

  • 权重共享减少参数量

  • 平移不变性处理位置变化

  • 经典架构演进:

image.png

图像分类实战流程:

# 1. 数据加载与增强
transform = ...
dataset = ...
dataloader = ...
# 2. 模型构建
model = ...
# 3. 训练配置
criterion = ...
optimizer = ...
# 4. 训练循环
for epoch in range(epochs):for data in dataloader:# 前向传播# 计算损失# 反向传播# 参数更新
# 5. 模型评估
test_accuracy = ...

CNN应用领域扩展:

  • 目标检测(YOLO, Faster R-CNN)

  • 语义分割(U-Net, DeepLab)

  • 人脸识别(FaceNet)

  • 医学影像分析

  • 自动驾驶视觉系统

掌握这些CNN核心知识和实战技能后,你已具备开发复杂计算机视觉应用的基础能力。下一步可以探索目标检测、图像分割等高级任务,或深入研究Transformer在CV领域的应用!更多AI大模型应用开发学习视频和资料尽在聚客AI学院。

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

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

相关文章

6个月Python学习计划 Day 17 - 继承、多态与魔术方法

第三周 Day 4 🎯 今日目标 理解类的继承和方法重写掌握多态思想及其实际应用了解并使用常见的魔术方法(如 str、len 等) 🧬 类的继承(Inheritance) Python 支持单继承与多继承,常用语法如下&…

抖音怎么下载视频

抖音作为一款短视频社交平台,凭借其独特的短视频形式和丰富的内容,吸引了大量用户。有些用户在欣赏完抖音视频后,想要将其保存下来,以便日后观看。如何在抖音下载视频呢?本文将为您详细介绍抖音视频下载的技巧和方法。…

使用MinIO搭建自己的分布式文件存储

目录 引言: 一.什么是 MinIO ? 二.MinIO 的安装与部署: 三.Spring Cloud 集成 MinIO: 1.前提准备: (1)安装依赖: (2)配置MinIO连接: &…

uni-app 如何实现选择和上传非图像、视频文件?

在 uni-app 中实现选择和上传非图像、视频文件,可根据不同端(App、H5、小程序)的特点,采用以下方法: 一、通用思路(多端适配优先推荐) 借助 uni.chooseFile 选择文件,再用 uni.upl…

正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-12.1 Linux内核启动流程简介

前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …

UDP与TCP通信协议技术解析

文章目录 协议基础原理TCP:可靠的面向连接通信UDP:高效的无连接通信 性能特征分析TCP性能表现UDP性能表现 应用场景分析TCP适用场景UDP适用场景 技术实现考量错误处理策略网络资源利用 选择决策框架可靠性需求评估性能要求分析 混合方案设计协议组合策略…

mysql 页的理解和实际分析

目录 页(Page)是 Innodb 存储引擎用于管理数据的最小磁盘单位B树的一般高度记录在页中的存储 innodb ibd文件innodb 页类型分析ibd文件查看数据表的行格式查看ibd文件 分析 ibd的第4个页:B-tree Node类型先分析File Header(38字节-描述页信息…

【优选算法】C++滑动窗口

1、长度最小的子数组 思路&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 滑动窗口// 1.left0,right0// 2.进窗口( nums[right])// 3.判断// 出窗口// (4.更新结果)// 总和大于等于 target 的长度最小的 子数组…

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…

408考研逐题详解:2009年第33题

2009年第33题 在 OSI 参考模型中&#xff0c;自下而上第一个提供端到端服务的层次是&#xff08; &#xff09; A. 数据链路层 \qquad B. 传输层 \qquad C. 会话层 \qquad D.应用层 解析 本题主要考查 OSI 参考模型各层的核心功能、端到端服务的定义。 OSI 参考模型&am…

CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found

Nginx1.24编译时&#xff0c;报LuaJIT2.x错误&#xff0c; configuring additional modules adding module in /www/server/nginx/src/ngx_devel_kit ngx_devel_kit was configured adding module in /www/server/nginx/src/lua_nginx_module checking for LuaJIT 2.x ... not…

自制喜悦字贴

一、想法 据说&#xff0c;把“喜悦”两个字挂在家里显眼的地方&#xff0c;时常看到&#xff0c;就能心情愉悦。刚好最近在学习前端flex布局&#xff0c;用代码实现&#xff0c;导出图片&#xff0c;打印出来&#xff0c;帖在家里&#xff0c;非常nice。现在分享给大家。 二…

每日八股文6.3

每日八股-6.3 Mysql1.COUNT 作用于主键列和非主键列时&#xff0c;结果会有不同吗&#xff1f;2.MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;OUTER JOIN&#xff09;有什么主要的区别&#xff1f;3.能详细描述一下 MySQL 执行一条查询 SQL 语句的…

量化面试绿皮书:6. 烧绳子计时

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 6. 烧绳子计时 你有两根绳子&#xff0c;每根绳子燃烧需要1小时。但是任何一根绳子在不同点都有不同的密度&#xff0c;所以不能保证绳子内不…

2-深度学习挖短线股1

选短线个股的流程 &#xff08;1&#xff09;数据预处理&#xff0c;根据短线个股筛选标准&#xff0c;给个股日线数据打标。 &#xff08;2&#xff09;模型训练&#xff0c;针对每只股票&#xff0c;训练得到分类模型。 &#xff08;3&#xff09;结果预测&#xff0c;根据训…

【数据分析】探索婴儿年龄变化对微生物群落(呼吸道病毒和细菌病原体)结构的影响

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍1. 混合效应逻辑回归模型2. 随机森林模型3. Maaslin2 分析加载R包数据下载导入数据数据预处理混合效应逻辑回归模型分析微生物群落结构随年龄的变化随机森林模型预测病原体定植Maas…

实战:子组件获取父组件订单信息

最佳实践建议 优先使用 props&#xff1a;适合父子组件直接通信&#xff0c;数据流向清晰复杂场景用 eventBus&#xff1a;跨组件通信推荐使用 mitt 库避免过度使用 $parent&#xff1a;会导致组件耦合度高&#xff0c;难以维护provide/inject 适用于跨层级&#xff1a;如主题…

Spring Security深度解析:构建企业级安全框架

Spring Security深度解析:构建企业级安全框架 本文将深入探讨Spring Security安全框架的核心原理、架构设计和实际应用,帮助开发者全面掌握企业级应用安全防护技术。 目录 Spring Security概述核心架构与原理认证机制详解授权机制详解核心组件分析配置与集成高级特性应用安全…

计算矩阵A和B的乘积

根据矩阵乘法规则&#xff0c;编程计算矩阵的乘积。函数fix_prod_ele()是基本方法编写&#xff0c;函数fix_prod_opt()是优化方法编写。 程序代码 #define N 3 #define M 4 typedef int fix_matrix1[N][M]; typedef int fix_matrix2[M][N]; int fix_prod_ele(f…

《Brief Bioinform》: 鼠脑单细胞与Stereo-seq数据整合算法评估

一、写在前面 基因捕获效率、分辨率一直是空间转录组细胞类型识别的拦路虎&#xff0c;许多算法能够整合单细胞(single-cell, sc)或单细胞核(single-nuclear, sn)数据与空间转录组数据&#xff0c;从而帮助空转数据的细胞类型注释。此前我们介绍过近年新出炉的Stereo-seq平台&…