深度学习 ———— 迁移学习
迁移学习原理
- 什么是迁移学习?
- 迁移学习利用在大规模数据集(如ImageNet)上预训练的模型,改装小数据集(如CIFAR-10)。
- 优势:
- 减少训练时间:预训练模型已学习通用特征(如边缘、纹理)。
- 提升性能:小数据集(如CIFAR-10,50K样本)也能达到很高的准确率。
- 降低过度:预训练权重提供强正则化。
- 两种模式:
- 特征提取:中心层,仅训练全连接层,适合小数据集。
- 压力:解冻部分或全部层,调整权重,适合中大型数据集。
- CIFAR-10 需求:
- 自建CNN(Day 6)准确率~83-88%,设定于数据量和模型深度。
- 迁移学习(ResNet18)可利用ImageNet特征,预计~90-95%。
- 步骤关键:
- 加载预训练模型(如ResNet18)。
- 修改输出层(ImageNet的1000类→CIFAR-10的10类)。
- 选择冻结/消耗策略,设置优化器和学习率。
PyTorch实现迁移学习
- 预训练模型:
- PyTorch的torchvision.models提供ResNet18、VGG16等模型。
- 加载:models.resnet18(pretrained=True)(PyTorch < 1.13)或models.resnet18(weights='IMAGENET1K_V1')(新版)。
- 修改模型:
- 替换全连接层:model.fc = nn.Linear(in_features, 10)。
- 冻结参数:
- requires_grad=False顶层设置层,减少计算量。
-
for param in model.parameters():param.requires_grad = False model.fc.requires_grad = True
- 压力:策略
- 学习率低(如lr=0.0001)影响全连接层或最后几层。
- 差异化学习率:底层层用上下lr,全连接层用上下lr。
- 优化器:
- Adam 或 SGD(带动量),殴打第 5 天的 StepLR。
- 注意事项:
- CIFAR-10图像小(32x32),需调整输入(transforms.Resize(224))车载ResNet。
- 冻结过高层可能会破坏稳定性,解冻过早可能会重新预演训练权。
迁移学习的核心流程(以 PyTorch 为例)
我们以图像任务(如医学图像、CT图像)为例,迁移一个预训练的分割模型,如 UNet 或 nnU-Net:
步骤 1:加载预训练模型
import torch
from unet_model import UNet # 或者使用 torchvision.models, timm 等库model = UNet(in_channels=1, out_channels=2) # 比如你的CT图像是单通道的
model.load_state_dict(torch.load('pretrained_model.pth'))
步骤 2:根据任务需求调整最后的输出层
比如你现在是2类(脑出血 vs 背景):
model.out_conv = torch.nn.Conv2d(64, 2, kernel_size=1)
步骤 3:选择是否冻结部分层(迁移策略选择)
冻结部分层
如果你的数据量小,而且和原任务相似:
for param in model.encoder.parameters():param.requires_grad = False
只训练 decoder 和输出层,有助于防止过拟合。
全部解冻
如果你数据够用,或者原始任务差距较大,建议全部训练。
步骤 4:定义优化器和学习率(关键)
如果你只训练部分层,可以设置不同的学习率:
optimizer = torch.optim.Adam([{'params': model.encoder.parameters(), 'lr': 1e-5},{'params': model.decoder.parameters(), 'lr': 1e-4},{'params': model.out_conv.parameters(), 'lr': 1e-3},
])
也可以统一使用较小学习率,比如 1e-4
。
步骤 5:开始训练 + 验证模型效果
正常训练即可,重点监控:
-
Dice Score、IoU、Accuracy
-
验证集 loss 是否下降
-
是否过拟合(训练/验证差距大)
二、根据实际情况选择迁移方式
情况 | 推荐迁移方式 | 是否冻结 | 学习率设置 |
---|---|---|---|
🔹 你数据很少(<20) | 迁移预训练 + 只训练最后几层 | 冻结大部分层 | 1e-4 ~1e-3 |
🔹 你数据中等(20~200) | 预训练模型基础上全模型微调 | 不冻结 | 1e-4 |
🔹 你数据多(>200) | 可选择从头训练 / 微调 | 不冻结 | 1e-4 ~5e-4 |
🔹 新任务和预训练任务差异很大 | 微调底层,保持高层不变 | 冻结部分 | 层间设不同学习率 |
🔹 输入模态改变(如RGB→灰度) | 修改输入通道 + 再训练第一层 | 不冻结前几层 | 1e-4 |
三、进阶技巧
1. 分阶段训练策略(渐进式迁移)
先只训练输出层 ➜ 再解冻 encoder 共同训练
2. MixUp、CutMix、图像增强
缓解数据少的问题,提高泛化能力。
3. 使用调度器调整学习率
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min')
四、迁移学习在 nnU-Net 中的具体策略
nnU-Net 场景 | 操作建议 |
---|---|
微调已有模型 | 用 --pretrained_weights 参数指定 |
数据少 | 使用 3d_lowres 或者减少训练 epoch |
模态不同 | 修改 dataset.json 中的 modality 信息,重新预处理 |
类别不同 | 自动适配输出通道,不需手动改网络结构 |
五、代码模板示例(PyTorch)
# 假设你迁移的是一个 UNet 模型
model = UNet(in_channels=1, out_channels=2)# 加载预训练参数(除最后一层)
state_dict = torch.load("pretrained.pth")
state_dict.pop("out_conv.weight")
state_dict.pop("out_conv.bias")
model.load_state_dict(state_dict, strict=False)# 设置优化器
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)# 训练循环略
六、遇到的问题与解决办法
问题 | 原因 | 解决方式 |
---|---|---|
训练不收敛 | 迁移层不匹配 / 学习率过高 | 降低学习率,重检查层结构 |
验证集效果差 | 模型过拟合 | 数据增强、冻结部分层 |
迁移失败 | 原模型任务差异大 | 尝试训练更多层或换模型 |
迁移学习的核心实际上就是要根据任务的不同,合理地选择哪些层冻结、哪些层解冻,以及如何调整各层的参数。
迁移学习的关键要素
-
是否冻结神经网络层
-
冻结层意味着这些层的参数在训练过程中不会更新,通常是为了防止过拟合,或者如果你有非常小的训练数据集,冻结部分层可以避免模型过于依赖数据中的噪声。
-
解冻层意味着这些层的参数会参与反向传播和优化,通常用于微调模型,使得网络能更好地适应新的任务。
-
-
冻结多少层
-
**低层(例如卷积层)**通常学习的是一些低级特征(如边缘、纹理等),这些特征在很多任务中是通用的,因此可以冻结。
-
**高层(例如全连接层、分类层)**通常学习的是与特定任务相关的高级特征,这些层可能需要解冻,进行微调。
-
-
是否需要修改某些层的参数
-
输出层:通常,输出层需要根据你当前任务的类别数进行调整。例如,如果原模型是用于10类分类,而你的任务是二分类,那么需要调整输出层的神经元个数。
-
输入层:如果你的输入数据的形态与预训练模型不同(例如通道数不同),那么需要调整输入层。
-
-
不同层的学习率
-
如果你冻结了低层,通常设置较低的学习率只训练高层。冻结低层后,高层可以使用较大的学习率进行微调。
-
如果全网络都解冻,那么可以设置统一学习率或根据层进行不同学习率的设置。
-
示例:
-
冻结卷积层(低层):
低层卷积层主要提取边缘、纹理等基础特征,对于不同的图像任务通常是通用的。所以你可以冻结这些层,避免它们受到训练数据集的影响。 -
微调全连接层(高层):
高层通常用于提取与任务紧密相关的特征。在这个肺部X光图像分类的任务中,模型需要学会分辨“是否有肺炎”,这个特定任务的特征需要重新训练。
from torchvision import models
import torch.nn as nn# 加载预训练的ResNet18模型
model = models.resnet18(pretrained=True)# 冻结所有卷积层
for param in model.parameters():param.requires_grad = False# 解冻全连接层(用于分类任务)
model.fc = nn.Linear(512, 2) # 2表示二分类任务# 只训练最后一层
optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-4)
在这个例子中,只有全连接层(即 model.fc
)会参与训练,其他层都被冻结。
示例:微调整个网络
如果你有较多的训练数据(比如几千张图像),你可以解冻整个模型,进行微调:
# 加载预训练的ResNet18模型
model = models.resnet18(pretrained=True)# 解冻整个模型
for param in model.parameters():param.requires_grad = True# 重新定义全连接层
model.fc = nn.Linear(512, 2)# 设置优化器,训练整个网络
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
在这种情况下,整个模型的所有参数都会被训练,模型能够更好地适应新的数据和任务。
小结:
-
冻结层:决定了哪些层的参数不参与训练(通常是低层特征提取部分),以减少计算负担或避免过拟合。
-
解冻层:决定了哪些层的参数会更新,通常涉及任务相关的高级特征部分(如分类层)。
-
调整输出层:根据任务要求,修改输出层的结构(如类别数)。
实现逐步训练
第一步:加载预训练模型并冻结全部参数
以 ResNet18
为例:
import torchvision.models as modelsmodel = models.resnet18(pretrained=True)# 冻结所有参数(不参与训练)
for param in model.parameters():param.requires_grad = False
第二步:替换最后的输出层(根据任务类别数量)
CIFAR-10 有 10 个类别:
import torch.nn as nnnum_classes = 10
model.fc = nn.Linear(model.fc.in_features, num_classes)
这时候,只有最后一层(fc)是可训练的。
第三步:逐步解冻 + 分阶段训练
这里是关键 —— 每轮训练后解冻部分网络层,例如从layer4
开始逐渐解冻到layer3
、layer2
……
你可以按如下方式写:
第 1 阶段:只训练 fc 层(已经自动解冻)
# 只优化 fc 层的参数
optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-3)# 训练若干 epoch
train_model(model, dataloader, optimizer, ...)
第 2 阶段:解冻 layer4(最靠近输出的残差层)
for name, param in model.named_parameters():if "layer4" in name:param.requires_grad = True# 优化 layer4 + fc 层参数
params_to_optimize = [p for p in model.parameters() if p.requires_grad]
optimizer = torch.optim.Adam(params_to_optimize, lr=1e-4)# 再训练若干 epoch
train_model(model, dataloader, optimizer, ...)
第 3 阶段:解冻 layer3,再训练……
for name, param in model.named_parameters():if "layer3" in name:param.requires_grad = Trueparams_to_optimize = [p for p in model.parameters() if p.requires_grad]
optimizer = torch.optim.Adam(params_to_optimize, lr=1e-5)train_model(model, dataloader, optimizer, ...)
解冻技巧建议:
层名 | 含义 | 推荐做法 |
---|---|---|
conv1 / bn1 | 提取基础纹理、边缘等 | 不建议轻易解冻(除非任务差别极大) |
layer1 / layer2 | 中间特征 | 后期可逐步解冻 |
layer3 / layer4 | 高层语义特征 | 可先解冻 |
fc | 输出层 | 一定要训练 |
逐步微调的顺序
步骤 | 微调层级 | 说明 |
---|---|---|
1️⃣ | 只训练最后一层(fc 或分类头) | 最安全,先学新任务输出 |
2️⃣ | 解冻高层(如 ResNet 的 layer4) | 学习高层语义,适配新任务 |
3️⃣ | 解冻中层(如 layer3) | 逐步扩展学习能力 |
4️⃣ | 解冻低层(如 conv1, layer1) | 仅当任务差异大或图像域变化大时使用 |
小总结
阶段 | 冻结情况 | 优化哪些层 | 学习率 |
---|---|---|---|
阶段1 | 冻结全部层,fc 除外 | 只训练 fc | 1e-3 |
阶段2 | 解冻 layer4 | 训练 layer4 + fc | 1e-4 |
阶段3 | 解冻 layer3 | 训练 layer3 + layer4 + fc | 1e-5 |
逐步训练实际上就是通过if判断语句,冻结或者解冻特定的深度学习层,来达到从低到高逐步训练的效果
附加建议
-
每阶段训练 5~10 个 epoch 观察效果,不要急于解冻太多层;
-
使用 学习率调度器 或手动降低学习率,以免破坏已学好的权重;
-
使用验证集观察是否过拟合。
迁移学习示例 Resnet18应用到CIFAR-10数据集
import torch
import torch.nn as nn
import torch.optim as optim
from PyQt6.QtGui.QRawFont import weight
from PyQt6.QtWidgets.QWidget import sizeHint
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix, classification_report
from transformers import FLAX_MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING
from CIFAR10_CNN import train_transform, criterionclass Cutout: #数据预处理 随机覆盖def __init__(self,size,p=0.5):self.size = size #覆盖图片的大小self.p = p #随机覆盖的概率def __call__(self, img):if torch.rand(1)>self.p: #随机生成0到1之间的数 通过判断语句来决定是否覆盖return imgh, w = img.shape[1:] #img的形状为 b w h 输出图片的高和宽cx = torch.randint(0, w, (1,)) #再 宽 上随机生成覆盖图片的横坐标的中心cy = torch.randint(0, h, (1,))#再 高 上随机生成覆盖图片的纵坐标的中心x1 = torch.clamp(cx - self.size // 2, 0, w)x2 = torch.clamp(cx + self.size // 2, 0, w)y1 = torch.clamp(cy - self.size // 2, 0, h) #后面的参数 是设置坐标的最值y2 = torch.clamp(cy + self.size // 2, 0, h) #计算 覆盖图片的四个顶角的坐标img[:, y1:y2, x1:x2] = 0 #把这个区域的像素值设置为0 完成遮挡return img#数据预处理
train_transform = transforms.Compose([transforms.Resize(224), #本来图片的大小为32*32 但是resnet18这个预训练模型的数据图片大小为224*224 所以要将输入的训练集数据改为适应resnet模型的图片大小transforms.RandomCrop(224,padding=28), #随机裁剪transforms.RandomHorizontalFlip(), #水平翻转transforms.ColorJitter(brightness=0.2,contrast=0.2,saturation=0.2,hue=0.1) #颜色抖动transforms.ToTensor(),Cutout(size=16,p=0.5), #调整 size 适应 224x224transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3)) #随机选择一块矩形区域,并将其像素内容擦除#p 应用此变换的概率,0.5 表示 50% 概率进行擦除。#scale=(min_area, max_area) 擦除区域在整个图像面积中的占比范围。比如:0.02~0.33 表示面积占 2%~33%。#ratio=(min_ratio, max_ratio) 擦除区域的宽高比(w/h),例如 0.3~3.3 表示形状可以是细长的也可以是扁平的。#value(可选) 擦除区域填充的像素值(默认是 0,即黑色),可以设为 random 进行随机填充。])test_transform = transforms.Compose([transforms.Resize(224),transforms.ToTensor(),transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
])#数据集加载
train_dataset = datasets.CIFAR10(root='./data', train=True, transform=train_transform, download=True)
test_dataset = datasets.CIFAR10(root='./data', train=False, transform=test_transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)#迁移学习 模型主体
model = models.resnet18(weight = 'IMAGENET1K') # 加载 ImageNet 预训练权重
for param in model.parameters():param.requires_grad = False #冻结模型中的所有参数
num_ftrs = model.fc.in_features #获得 预训练模型的全连接层的 输入数据的大小
model.fc = nn.Linear(num_ftrs,10) #重新设置 模型的全连接层的输出大小 比如CIFAR-10 的 10 类输出 所以输出数据的大小改为10for param in model.fc.parameters():param.requires_grad = True #将全连接层解冻 方便后面对全连接层的微调#图像增强
#Mixup 是一种图像增强技术,它通过将两张图像线性叠加,以及对应标签也按比例线性叠加,从而构造新的训练样本。
#目的是提高模型的泛化能力、鲁棒性,降低过拟合。
def mixup_data(x,y,alpha=1.0):lam = torch.distributions.beta.Beta(alpha, alpha).sample()batch_size = x.size(0)index = torch.randperm(batch_size).to(x.device)mixed_x = lam * x + (1 - lam) * x[index]y_a, y_b = y, y[index]return mixed_x, y_a, y_b, lamdef mixup_criterion(criterion, pred, y_a, y_b, lam):return lam * criterion(pred, y_a) + (1 - lam) * criterion(pred, y_b)criterion = nn.CrossEntropyLoss(label_smoothing=0.1)
optimizer = optim.Adam(model.fc.parameters(),lr=0.001)#仅仅优化全连接层的参数
scheduler = optim.lr_scheduler.StepLR(optimizer,step_size=2,gamma=0.1)
epochs = 5
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)train_accs = []
test_accs = []
for epoch in range(epochs):model.train()correct = 0total = 0total_loss = 0for images,labels in train_loader:images,labels =images.to(device),labels.to(device)if torch.rand(1)<0.5images, y_a, y_b, lam = mixup_data(images, labels, alpha=1.0)logits = model(images)loss = mixup_criterion(criterion, logits, y_a, y_b, lam)else:logits = model(images)loss = criterion(logits, labels)optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item() * len(images)pred = torch.argmax(logits, dim=1)correct += (pred == labels).sum().item()total += len(labels)train_acc = correct / totaltrain_accs.append(train_acc)print(f"Epoch {epoch + 1}, Loss: {total_loss / total:.4f}, Train Acc: {train_acc:.4f}")#计算模型整体的准确率model.eval() #将模型设置为评估模式correct = 0total = 0with torch.no_grad():for images, labels in test_loader:images, labels = images.to(device), labels.to(device)logits = model(images)pred = torch.argmax(logits, dim=1)correct += (pred == labels).sum().item()total += len(labels)test_acc = correct / totaltest_accs.append(test_acc)print(f"Test Acc: {test_acc:.4f}")scheduler.step()# 其他详细的评估指标 精确率 召回率 混淆矩阵
model.eval()
all_preds = []
all_labels = []
with torch.no_grad():for images, labels in test_loader:images, labels = images.to(device), labels.to(device)logits = model(images)preds = torch.argmax(logits, dim=1)all_preds.extend(preds.cpu().numpy())all_labels.extend(labels.cpu().numpy())
#将测试集的测试结果和其他数据记录下来 方便后面的评估的计算#计算各种评估指标
accuracy = sum(p == l for p, l in zip(all_preds, all_labels)) / len(all_labels)
cm = confusion_matrix(all_labels, all_preds) #混淆矩阵
report = classification_report(all_labels, all_preds, target_names=['airplane', 'automobile', 'bird', 'cat', 'deer','dog', 'frog', 'horse', 'ship', 'truck']) #分类报告,包含每一类的 精确率 precision,召回率 recall,F1 值 f1-score,支持样本数 support# Print results
print(f"Test Accuracy: {accuracy:.4f}")
print("\nClassification Report:")
print(report)# Visualize confusion matrix
plt.figure(figsize=(10, 8))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',xticklabels=train_dataset.classes,yticklabels=train_dataset.classes)
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()# Plot accuracy curves
plt.figure(figsize=(8, 6))
plt.plot(train_accs, label='Train Accuracy')
plt.plot(test_accs, label='Test Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Train vs Test Accuracy')
plt.legend()
plt.show()
相关文章:
深度学习 ———— 迁移学习
迁移学习原理 什么是迁移学习? 迁移学习利用在大规模数据集(如ImageNet)上预训练的模型,改装小数据集(如CIFAR-10)。优势: 减少训练时间:预训练模型已学习通用特征(如边…...
第十七章,反病毒---防病毒网管
基于杀毒软件的一种防御技术,是一种被动 的防御技术。 防病毒网关和主机上的杀毒软件在功能上互补和协作的关系。 病毒 --- 一般是感染或者附着在应用程序或文件中的;一般都是通过邮件或文件共享的方式进行传 输,从而对主机进行破坏 。 计…...
信赖域策略优化TRPO算法详解:python从零实现
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
powershell_bypass.cna 插件(适配 Cobalt Strike 4.0 的免费版本下载地址)
目录 1. powershell_bypass.cna 插件(适配 Cobalt Strike 4.0 的免费版本下载地址) 2. 生成 EXE 文件时出现 "运行异常,请查看 Script Console" 的处理方法 处理步骤 3. powershell_bypass.cna 插件的功能及实际操作步骤 功能…...
从Dockerfile 构建docker镜像——保姆级教程
从Dockfile开始 dockerfile简介开始构建1、编辑dockerfile2、构建镜像3、拉取镜像4、推送到镜像仓库 镜像的优化1、优化的基本原则2、多阶段构建 dockerfile简介 开始构建 1、编辑dockerfile # 使用官方的 Python 3.8 镜像作为基础镜像 FROM python:3.8-slim# 设置工作目录 …...
Mac配置php开发环境(多PHP版本,安装Redis)
配置PHP开发环境 配置多版本PHP 因为开发需要,有时需要根据项目及时切换多个版本,除了使用Docker以外,常用的就是直接在mac配置PHP版本 使用 Homebrew Mac 可以通过 Homebrew 来安装或切换 PHP 版本: brew update brew insta…...
Quorum协议原理与应用详解
一、Quorum 协议核心原理 基本定义 Quorum 是一种基于 读写投票机制 的分布式一致性协议,通过权衡一致性(C)与可用性(A)实现数据冗余和最终一致性。其核心规则为: W(写成功副本数) …...
五一旅游潮涌:数字化如何驱动智慧旅游升级
文化和旅游部5月6日公布2025年“五一”假期文化和旅游市场情况,经文化和旅游部数据中心测算,假期5天,全国国内出游3.14亿人次,同比增长6.4%;国内游客出游总花费1802.69亿元,同比增长8.0%。在这组流动的数字…...
WPF 3D图形编程核心技术解析
一、三维坐标系系统 WPF采用右手坐标系系统,空间定位遵循: X 轴 → 右 Y 轴 → 上 Z 轴 → 观察方向 X轴 \rightarrow 右\quad Y轴 \rightarrow 上\quad Z轴 \rightarrow 观察方向 X轴→右Y轴→上Z轴→观察方向 三维坐标值表示为 ( x , y , z ) (x, y,…...
BLURRR剪辑软件免费版:创意剪辑,轻松上手,打造个性视频
BLURRR剪辑软件免费版是一款功能强大、简约易用且充满创意的视频剪辑软件。它集多种功能于一体,无论是新手还是资深用户,都能通过简单的操作剪辑出高质量、富有创意的视频。BLURRR不仅提供了丰富的剪辑工具,还划分了不同的内容模块࿰…...
TIME - MoE 模型代码 3.2——Time-MoE-main/time_moe/datasets/time_moe_dataset.py
源码:GitHub - Time-MoE/Time-MoE: [ICLR 2025 Spotlight] Official implementation of "Time-MoE: Billion-Scale Time Series Foundation Models with Mixture of Experts" 这段代码定义了一个用于时间序列数据处理的 TimeMoEDataset 类,支…...
解决SQL Server SQL语句性能问题(9)——正确使用索引
前述章节中,我们介绍和讲解了SQL调优所需要的基本知识和分析方法,那么,通过前述这些知识和方法定位到问题后,接下来,我们该怎么做呢?那就是本章的内容,给出解决SQL语句性能问题的、科学而合理的方案和方法。 本章主要对解决SQL语句性能问题的几种常用方法进行说明和讲解…...
【论文阅读】FreePCA
FreePCA: Integrating Consistency Information across Long-short Frames in Training-free Long Video Generation via Principal Component Analysis 原文摘要 问题背景 核心挑战: 长视频生成通常依赖在短视频上训练的模型,但由于视频帧数增加会导致数…...
leetcode 383. Ransom Note
题目描述 代码 class Solution { public:bool canConstruct(string ransomNote, string magazine) {vector<int> table(26,0);for(char ch : magazine){table[ch-a];}for(char ch : ransomNote){table[ch-a]--;if(table[ch-a] < 0)return false;}return true;} };...
SAF利用由Varjo和AFormX开发的VR/XR模拟器推动作战训练
通过将AFormX的先进军用飞行模拟器与Varjo的行业领先的VR/XR硬件相结合,斯洛文尼亚武装部队正以经济高效、沉浸式的训练方式培训战斗机飞行员,以提高其战术准备和作战效率。 挑战:获得战术军事航空训练的机会有限 军事航空训练长期以来一直…...
基于公共卫生大数据收集与智能整合AI平台构建测试:从概念到实践
随着医疗健康数据的爆发式增长,如何有效整合、分析和利用这些数据已成为公共卫生领域的重要挑战。传统方法往往难以应对数据的复杂性、多样性和海量性,而人工智能技术的迅猛发展为解决这些挑战提供了新的可能性。基于数据整合与公共卫生大数据的AI平台旨在构建一个全面的生态…...
【Pandas】pandas DataFrame clip
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.clip([lower, upper, axis, inplace])用于截…...
深度学习基础--目标检测常见算法简介(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO)
博主简介:努力学习的22级本科生一枚 🌟;探索AI算法,C,go语言的世界;在迷茫中寻找光芒🌸 博客主页:羊小猪~~-CSDN博客 内容简介:常见目标检测算法简介…...
嵌套路由~
### 作业 - App.vue vue <script setup></script> <template> <router-link to"/home">首页</router-link> <router-link to"/profile">个人资料</router-link> <router-link to"/posts"&g…...
影楼精修-牙齿美型修复算法解析
本文介绍影楼修图中的牙齿美型修复功能的算法实现。 我们大部分人的牙齿看起来都可能会有一些问题,比如牙齿不平整,大门牙,牙齿泛黄,牙齿发黑,牙齿残缺等等,拍照之后影响美观度,正是这个爱美的…...
k8s之ingress
在前面我们已经知道,Service对集群之外暴露服务的主要方式有两种:NodePort 和 LoadBalance,但是这两种方式,都有一定的缺点 NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就更加明显,L4转发,无法根据http header和path进行路由转发…...
PDF文档解析新突破:图表识别、公式还原、手写字体处理,让AI真正读懂复杂文档!
要想LLM大模型性能更佳,我们需要喂给模型看得懂的高质量数据。那有没有一种方法,能让我们把各种文档“读懂”,再喂给大模型使用呢? 如果你用传统OCR工具直接从PDF中提取文本,结果往往是乱序、缺失、格式错乱。因为实际…...
Ubuntu 第11章 网络管理_常用的网络配置命令
为了管理网络,Linux提供了许多非常有用的网络管理命令。利用这些命令,一方面可以有效地管理网络,另一方面出现网络故障时,可以快速进行诊断。本节将对Ubuntu提供的网络管理命令进行介绍。 11.2.1 ifconfig命令 关于ifconfig命令&…...
C++ 观察者模式详解
观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象(主题)状态改变时,所有依赖它的对象(观察者)都会自动得到通知并更新。 核…...
不止是UI库:React如何重塑前端开发范式?
React:引领现代前端开发的声明式UI库 在当今快速发展的前端世界,React以其声明式、组件化和高效的特性,稳坐头把交椅,成为构建交互式用户界面的首选JavaScript库。本文将带你快速了解React的核心魅力、主要优势以及生态发展&…...
MapReduce报错 HADOOP_HOME and hadoop.home.dir are unset.
运行课程讲解内容出现这个报错: 1、在电脑里解压之前发过的Hadoop安装包 2、配置用户变量 3、配置系统变量 4、配置系统Path变量 5、下载链接的两个文件: 链接: https://pan.baidu.com/s/1aCcpGGR1EE4hEZW624rFmQ?pwd56tv 提取码: 56tv –来自百度…...
深入探索Laravel框架中的Blade模板引擎
Laravel是一个广泛使用的PHP框架,以其简洁、优雅和强大的功能著称。Blade是Laravel内置的模板引擎,提供了一套简洁而强大的模板语法,帮助开发者轻松构建视图层。本文将深入探讨Blade模板引擎的特性、使用方法和最佳实践。 1. Blade模板引擎简…...
分析NVIDIA的股价和业绩暴涨的原因
NVIDIA自2016年以来股价与业绩的持续高增长,是多重因素共同作用的结果。作为芯片行业的领军企业,NVIDIA抓住了技术、战略、市场与行业趋势的机遇。以下从技术创新、战略布局、市场需求、财务表现及外部环境等维度,深入分析其成功原因…...
P2572 [SCOI2010] 序列操作 Solution
Description 给定 01 01 01 序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),并定义 f ( l , r ) [ ( ∑ i l r a i ) r − l 1 ] f(l,r)[(\sum\limits_{il}^r a_i)r-l1] f(l,r)[(il∑rai)r−l1]. 执行 m m m 个操作&am…...
初等数论--欧拉函数积性的证明
文章目录 1. 简介2. 证明一:唯一分解定理容斥原理3. 证明二:中国剩余定理4. 引理证明5. 参考 1. 简介 欧拉函数 ϕ ( n ) \phi(n) ϕ(n)表示在小于等于 n n n的正整数中与 n n n互质的个数。 如 ϕ ( 6 ) 2 ( 1 5 ) ϕ ( 12 ) 4 ( 1 5 7 11 ) \phi(…...
MCP(Model Context Protocol)是专为LLM(大语言模型)应用设计的标准化协议
核心定义 MCP(Model Context Protocol)是专为LLM(大语言模型)应用设计的标准化协议,通过安全可控的方式向AI应用暴露数据和功能。主要提供以下能力: 标准化的上下文管理安全的功能调用接口跨平台的数据交…...
Midscene.js Chrome 插件实战:AI 驱动的 UI 自动化测试「喂饭教程」
Midscene.js Chrome 插件实战:AI 驱动的 UI 自动化测试「喂饭教程」 前言一、Midscene.js 简介二、环境准备与插件安装1. 安装 Chrome 插件2. 配置模型与 API Key三、插件界面与功能总览四、实战演练:用自然语言驱动网页自动化1. 典型场景一(Action):账号登录步骤一:打开…...
Python在大数据机器学习模型的多模态融合:深入探索与实践指南
一、多模态融合的全面概述 1.1 多模态融合的核心概念 多模态融合(Multimodal Fusion)是指将来自不同传感器或数据源(如图像、文本、音频、视频、传感器数据等)的信息进行有效整合,以提升机器学习模型的性能和鲁棒性。在大数据环境下,多模态融合面临着独特的挑战和机遇: 数…...
C++ 访问者模式详解
访问者模式(Visitor Pattern)是一种行为设计模式,它允许你将算法与对象结构分离,使得可以在不修改现有对象结构的情况下定义新的操作。 核心概念 设计原则 访问者模式遵循以下设计原则: 开闭原则:可以添…...
实验-有限状态机2(数字逻辑)
目录 一、实验内容 1.1 介绍 1.2 内容 二、实验步骤 2.1 电路原理图 2.2 步骤 2.3 状态图 4.4 状态转换表和输出表 2.5 具体应用场景 三、调试 四、实验使用环境 五、实验小结与思考 5.1 遇到的问题及解决方法 5.2 实验收获 一、实验内容 1.1 介绍 在解决更复…...
IC解析之TPS92682-Q1(汽车LED灯控制IC)
目录 1 IC特性介绍2 主要参数3 接口定义4 工作原理分析TPS92682-Q1架构工作模式典型应用通讯协议 控制帧应答帧协议5 总结 1 IC特性介绍 TPS92682 - Q1 是德州仪器(TI)推出的一款双通道恒压横流控制器,同时还具有各种电器故障保护,…...
数据结构-堆
目录 heapq 导入 初始化 插入元素 返回最小值 PriorityQueue 导入 初始化 入队 出队 堆是一颗树,其每个节点都有一个值,且(小根堆:每个父节点都小于等于其子节点 (在进树时不断进行比较 STL中的 priority…...
提升编程效率的利器:Zed高性能多人协作代码编辑器
在当今这个快节奏的开发环境中,一个高效、灵活的代码编辑器无疑对开发者们起着至关重要的支持作用。Zed,作为来自知名编辑器Atom和语法解析器Tree-sitter的创造者的心血之作,正是这样一款高性能支持多人合作的编辑神器。本文将带领大家深入探…...
【25软考网工】第六章 网络安全(1)网络安全基础
博客主页: christine-rr-CSDN博客 专栏主页: 软考中级网络工程师笔记 大家好,我是christine-rr !目前《软考中级网络工程师》专栏已经更新二十多篇文章了,每篇笔记都包含详细的知识点,希望能帮助到你! 今日…...
Java中的包装类
目录 为什么要有包装类 包装类的作用 基本数据类型和包装类的对应关系 包装类的核心功能 装箱(Boxing)和拆箱(Unboxing) 装箱: 拆箱: 类型转换 字符串<----->基本类型 进制转换 自动装箱与…...
催缴机器人如何实现停车费追缴“零遗漏”?
面对高达35%的停车欠费率,传统人工催缴模式因效率低、成本高、覆盖有限等问题,难以应对海量欠费订单的挑战。本文带大家探究“催缴机器人”如何实现停车费追缴“零遗漏”,实现从“被动催缴”到“主动管理”的跨越。 智慧停车欠费自动化追缴系…...
Oracle 执行计划中的 ACCESS 和 FILTER 详解
Oracle 执行计划中的 ACCESS 和 FILTER 详解 在 Oracle 执行计划中,ACCESS 和 FILTER 是两个关键的操作类型,它们描述了 Oracle 如何检索和处理数据。理解这两个概念对于 SQL 性能调优至关重要。 ACCESS(访问) ACCESS 表示 Ora…...
使用FastAPI微服务在AWS EKS中构建上下文增强型AI问答系统
系统概述 本文介绍如何使用FastAPI在AWS Elastic Kubernetes Service (EKS)上构建一个由多个微服务组成的AI问答系统。该系统能够接收用户输入的提示(prompt),通过调用其他微服务从AWS ElastiCache on Redis和Amazon DynamoDB获取相关上下文,然后利用AW…...
oracle dblink varchar类型查询报错记录
在使用Oracle DBLink(数据库链接)查询VARCHAR类型数据时,有时会遇到报错问题。这些错误可能与数据类型转换、字符集设置、数据库版本兼容性等因素有关。本文将详细分析常见的报错原因及其解决方法。 一、常见报错及其原因 1. ORA-01722: in…...
计算人声录音后电平的大小(dB SPL->dBFS)
计算人声录音后电平的大小 这里笔记记录一下,怎么计算已知大小的声音,经过麦克风、声卡录制后软件内录得的音量电平值。(文章最后将计算过程整理为Python代码,方便复用) 假设用正常说话的声音大小65dB(SP…...
Android kernel日志中healthd关键词意义
Android kernel日志中healthd关键词意义 在kernel的healthd日志中会打印电池信息。通常比较关心的是电池温度,剩余电量,电压,电池健康,电池状况等。 level:剩余电量。 voltage:电压。 temperatureÿ…...
操作系统面试问题(4)
32.什么是操作系统 操作系统是一种管理硬件和软件的应用程序。也是运行在计算机中最重要的软件。它为硬件和软件提供了一种中间层,让我们无需关注硬件的实现,把心思花在软件应用上。 通常情况下,计算机上会运行着许多应用程序,它…...
【nestjs】一般学习路线
nestjs中文文档 其实几个月前也对nestjs进行了学习,前前后后看了很多文档、博客,另外也找了相应的代码看了,但最后也还是一知半解,只是知道大概怎么写,怎么用。 这次下定决心再次看一遍,从代码学习到文档…...
多线程面试题总结
基础概念 进程与线程的区别 进程:操作系统资源分配的基本单位,有独立内存空间线程:CPU调度的基本单位,共享进程资源对比: 创建开销:进程 > 线程通信方式:进程(IPC)、线程(共享内存)安全性:进程更安全(隔离),线程需要同步线程的生命周期与状态转换 NEW → RUNNABLE …...
面试常考算法2(核心+acm模式)
15. 三数之和 核心代码模式 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ansnew ArrayList<>();Arrays.sort(nums);int lennums.length;int pre2000000;for(int i0;i<len-2;i){while(i<len-…...