自监督与监督对比损失:设计逻辑、核心差异与实操选型指南
1. 两种对比损失到底在比什么自监督对比损失和监督对比损失这两个词放在一起很多人第一反应是“不就是有没有标签的区别吗”。这个理解不能说错但只停留在表面。真正落到代码和训练曲线上两者的差异远比“标签有无”复杂得多。我最初接触对比学习是在一个图像检索项目里当时用自监督方式预训练了一个骨干网络然后在少量标注数据上微调。后来因为业务需要又切到全监督对比损失做端到端训练。前后踩了不少坑也积累了一些比较实用的经验。这篇文章主要面向已经了解深度学习基础、正在做表征学习或度量学习相关工作的读者。如果你正在纠结“我的场景该用哪种对比损失”“为什么自监督训出来的特征在下游任务上不如监督版”“温度系数到底怎么调”这类问题下面的内容应该能帮你省下不少试错时间。我会从设计思路、核心细节、实操流程、常见问题四个维度展开尽量把每个选择背后的逻辑讲清楚。先给一个最直观的结论自监督对比损失解决的是“没有标签时如何构造正负样本”的问题监督对比损失解决的是“有标签时如何利用标签构造更有意义的正负样本”的问题。前者依赖数据增强后者依赖类别信息。两者在数学形式上高度相似但梯度行为、收敛速度、对超参数的敏感度差异很大。2. 核心思路与方案选型拆解2.1 自监督对比损失的设计逻辑自监督对比损失的核心思想是同一张图片经过两种不同的数据增强后得到的两个视图应该被映射到特征空间中相近的位置而不同图片的视图应该被推开。这里的关键在于“正样本对”的定义完全来自数据增强跟语义类别无关。以SimCLR为代表它的流程是这样的一张图经过随机裁剪、颜色抖动、高斯模糊等增强后得到两个视图这两个视图经过同一个编码器得到特征向量再经过一个投影头映射到低维空间最后用NT-Xent损失计算对比。正样本就是同一张图的两个视图负样本就是batch内其他图的所有视图。这种设计的好处非常明显不需要任何人工标注数据量可以无限扩大。但问题也很突出——数据增强的策略直接决定了学到的特征质量。如果增强过于激进比如把一张猫的图裁剪到只剩尾巴那正样本对之间的语义一致性就被破坏了模型学到的可能是颜色、纹理这些低级特征而不是语义特征。我实测下来自监督对比损失对batch size非常敏感。SimCLR原论文用了4096甚至8192的batch size因为负样本数量直接等于batch size乘以视图数减一。batch太小负样本不够模型容易学到退化解。后来MoCo用动量编码器和队列机制把负样本数量解耦出来才让自监督对比学习在普通显卡上变得可行。2.2 监督对比损失的设计逻辑监督对比损失SupCon在自监督的基础上引入标签信息。正样本不再局限于同一张图的两个视图而是同一类别的所有样本都互为正样本。负样本则是不同类别的样本。这个改动看似简单但影响是根本性的。自监督对比损失中正样本对的数量是固定的每个样本只有一个正样本对而监督对比损失中正样本对的数量随类别内样本数动态变化。这意味着梯度信号更丰富模型能学到类内紧凑、类间分离的特征表示。SupCon的损失函数形式是在NT-Xent基础上做了扩展对于锚点样本正样本集合是该类别内除自己以外的所有样本负样本集合是其他类别的所有样本。分母中的求和范围从“batch内所有其他样本”变成了“正样本集合和负样本集合的并集”。这里有一个容易忽略的细节监督对比损失对类别不平衡很敏感。如果某个类别的样本数远多于其他类别那这个类别的正样本对数量会爆炸式增长导致损失被这个类别主导。我在一个长尾分布的数据集上试过不做任何重采样或损失加权监督对比损失的效果甚至不如普通的交叉熵。2.3 两种方案的选型对比对比维度自监督对比损失监督对比损失正样本来源同一图的不同增强视图同一类别的所有样本负样本来源batch内其他图的所有视图其他类别的所有样本标签需求无需要类别标签对batch size敏感度极高中等数据增强依赖度极高中等类别不平衡敏感度不适用高典型代表SimCLR、MoCo、BYOLSupCon、Triplet Loss变体下游任务迁移性强但需要微调强可直接用于分类选型建议很直接如果你有大量无标签数据、只有少量标注数据先用自监督对比损失做预训练再用监督对比损失或交叉熵做微调。如果你有充足的标注数据直接上监督对比损失但要注意类别平衡和温度系数的调整。3. 核心细节解析与实操要点3.1 温度系数到底在调什么温度系数τ是对比损失里最玄学的超参数。它的作用是对相似度分数进行缩放控制softmax的尖锐程度。τ越小softmax越尖锐模型对难负样本的关注度越高τ越大softmax越平滑模型对所有负样本一视同仁。自监督对比损失通常需要较小的τ比如0.07到0.2之间。因为自监督的正样本对来自数据增强语义一致性相对较弱需要更尖锐的分布来迫使模型区分细粒度特征。监督对比损失可以用稍大的τ比如0.1到0.5因为类别标签提供了更强的语义信号不需要过度惩罚难负样本。我踩过的一个坑是直接把自监督的τ搬到监督场景结果模型在训练初期就崩溃了损失降到很低但特征全部塌缩到一个点。后来把τ从0.07调到0.2训练才稳定下来。原因是监督场景下正样本对数量多如果τ太小正样本之间的相似度被过度放大负样本的梯度被淹没模型学不到类间区分性。3.2 投影头的设计差异自监督对比损失通常需要一个额外的投影头projection head把编码器的输出映射到一个低维空间再做对比。这个投影头一般是一个两到三层的MLP输出维度在128到256之间。SimCLR的实验表明投影头的存在对自监督对比学习至关重要去掉后性能下降明显。监督对比损失对投影头的依赖没那么强。SupCon原论文里也用了投影头但消融实验显示去掉投影头后性能下降幅度小于自监督场景。我的理解是监督信号本身已经提供了足够的语义约束投影头更多是起到一个“缓冲”作用防止对比损失直接修改编码器的特征空间破坏预训练权重的通用性。实操建议自监督预训练阶段一定要加投影头而且投影头的输出维度不要太大128或256就够了。监督微调阶段可以把投影头去掉直接在编码器输出上接分类层。如果标注数据很少保留投影头做对比损失分类层单独训练效果会更稳。3.3 数据增强的策略选择自监督对比损失对数据增强的依赖是“生死级别”的。SimCLR的消融实验显示随机裁剪和颜色抖动是最关键的两个增强去掉任何一个都会导致性能大幅下降。高斯模糊和水平翻转也有贡献但相对次要。监督对比损失对数据增强的依赖度低很多。因为正样本来自同一类别的不同样本本身就有语义多样性不需要靠增强来构造正样本对。但适当的数据增强仍然有助于提升泛化能力尤其是随机裁剪和颜色抖动。这里有一个经验性的增强强度参考表增强类型自监督推荐强度监督推荐强度随机裁剪0.2-1.0尺度范围0.5-1.0尺度范围颜色抖动强度0.5-0.8强度0.2-0.5高斯模糊概率0.5核大小10%图像尺寸概率0.2-0.3水平翻转概率0.5概率0.5灰度化概率0.2概率0.1自监督场景下增强要“狠”因为模型需要从极端变换中学习不变性。监督场景下增强要“温和”因为过度增强可能改变类别语义比如把数字“6”旋转成“9”。3.4 负样本采样的工程细节自监督对比损失的负样本就是batch内其他样本实现上直接用矩阵乘法计算相似度矩阵然后mask掉对角线即可。但这里有一个内存陷阱如果batch size是4096特征维度是128相似度矩阵就是4096乘4096float32下占64MB看起来不大但反向传播时中间激活值会膨胀好几倍。我在一张24GB显存的卡上跑batch size 2048就已经接近极限了。监督对比损失的负样本采样更复杂因为需要根据标签mask掉同类别样本。实现上通常先计算相似度矩阵然后用标签矩阵构造正样本mask和负样本mask。这里要注意如果某个类别在batch内只有一个样本那这个样本没有正样本对应该从损失中排除。否则分母里会出现零除或者无效梯度。一个实用的技巧是在DataLoader里做类别平衡采样保证每个batch内每个类别至少有2个样本。这样既能保证正样本对的存在又能缓解类别不平衡问题。具体实现可以用WeightedRandomSampler权重设为类别频率的倒数。4. 实操过程与核心环节实现4.1 自监督对比损失的完整实现下面以PyTorch为例展示一个简化版的自监督对比损失实现。假设我们已经有了编码器和投影头输入是一个batch的图像经过两次增强后的特征。import torch import torch.nn as nn import torch.nn.functional as F class SelfSupervisedContrastiveLoss(nn.Module): def __init__(self, temperature0.07): super().__init__() self.temperature temperature def forward(self, features): # features: [2N, D]前N个是视图1后N个是视图2 batch_size features.shape[0] // 2 features F.normalize(features, dim1) # 计算相似度矩阵 sim_matrix torch.matmul(features, features.T) / self.temperature # 构造mask排除自身 mask torch.ones_like(sim_matrix) - torch.eye(2 * batch_size, devicefeatures.device) # 正样本对视图1的第i个和视图2的第i个 pos_sim torch.cat([torch.diag(sim_matrix, batch_size), torch.diag(sim_matrix, -batch_size)], dim0) # 计算损失 exp_sim torch.exp(sim_matrix) * mask denominator exp_sim.sum(dim1) loss -torch.log(torch.exp(pos_sim) / denominator) return loss.mean()这段代码的关键点在于正样本对的构造。torch.diag(sim_matrix, batch_size)取的是视图1和视图2之间的相似度torch.diag(sim_matrix, -batch_size)取的是视图2和视图1之间的相似度。两者拼接后得到2N个正样本对的相似度。注意这里的mask只排除了自身没有排除同一张图的两个视图之间的相互计算。实际上视图1和视图2之间的相似度既出现在正样本对里也出现在分母里这是正确的因为分母应该包含所有非自身的样本对。4.2 监督对比损失的完整实现监督对比损失的实现需要在自监督的基础上引入标签信息。class SupervisedContrastiveLoss(nn.Module): def __init__(self, temperature0.2): super().__init__() self.temperature temperature def forward(self, features, labels): # features: [N, D] # labels: [N] device features.device batch_size features.shape[0] features F.normalize(features, dim1) sim_matrix torch.matmul(features, features.T) / self.temperature # 构造正样本mask同类别为1不同类别为0 labels labels.view(-1, 1) pos_mask (labels labels.T).float().to(device) # 排除自身 pos_mask.fill_diagonal_(0) # 负样本mask不同类别为1 neg_mask 1 - pos_mask neg_mask.fill_diagonal_(0) # 计算损失 exp_sim torch.exp(sim_matrix) pos_sum (exp_sim * pos_mask).sum(dim1) neg_sum (exp_sim * neg_mask).sum(dim1) # 排除没有正样本的锚点 valid_mask pos_mask.sum(dim1) 0 loss -torch.log(pos_sum / (pos_sum neg_sum 1e-8)) loss loss[valid_mask] return loss.mean()这段代码里有一个细节值得展开pos_sum和neg_sum的计算方式。分母是pos_sum neg_sum也就是所有非自身样本的指数相似度之和。分子是pos_sum即所有正样本的指数相似度之和。这等价于把每个正样本单独计算损失再平均但实现上更高效。提示1e-8是为了防止除零虽然理论上pos_sum neg_sum不会为零但浮点运算下极小值可能下溢。4.3 训练流程与参数配置一个完整的对比学习训练流程通常包含以下阶段数据准备自监督阶段只需要无标签图像监督阶段需要标签。建议统一做一次数据清洗去掉损坏图像和极端长尾类别。增强管道自监督用强增强监督用弱增强。增强操作在GPU上做还是CPU上做我的经验是CPU做增强、GPU做前向反向用DataLoader的num_workers并行化避免GPU等数据。编码器选择ResNet-50是标配但如果你追求更高性能可以换Vision Transformer。不过ViT对数据量要求更高自监督场景下小数据集容易过拟合。优化器配置AdamW或LARS。自监督对比学习对优化器很敏感LARS在超大batch下更稳AdamW在中小batch下够用。学习率用余弦退火warmup 10个epoch。训练轮数自监督通常需要200到1000个epoch监督对比损失收敛快很多50到200个epoch就够了。评估方式自监督用线性探测冻结编码器只训分类层或kNN评估。监督对比损失直接看验证集准确率。我实测下来自监督对比学习在CIFAR-10这种小数据集上200个epoch的线性探测准确率能到85%左右但再往上提升就很慢了。监督对比损失在同样数据集上100个epoch就能到93%以上。差距主要来自标签提供的语义信息。4.4 关键参数的计算过程温度系数τ的选择可以通过一个简单的实验来确定。固定其他参数在验证集上跑一组τ值看线性探测准确率或验证损失。以自监督为例我通常从0.05开始以0.05为步长试到0.3。实测在CIFAR-10上τ0.1时线性探测准确率最高。τ0.05时训练损失下降很快但验证准确率低说明过拟合了难负样本。τ0.3时训练损失下降慢模型学到的特征区分度不够。监督对比损失的τ可以从0.1试到0.5。在类别数较多比如100类以上时τ可以取大一点因为负样本数量多不需要过度尖锐的分布。类别数少比如10类时τ取小一点迫使模型关注细粒度差异。Batch size的选择也有讲究。自监督对比学习batch size至少256推荐1024以上。如果显存不够用梯度累积模拟大batch但要注意BatchNorm的统计量会受影响建议换成GroupNorm或LayerNorm。监督对比学习batch size 128到512就够了因为正样本对的数量已经提供了足够的梯度信号。5. 常见问题与排查技巧实录5.1 损失下降但特征塌缩这是对比学习里最经典的问题。表现是训练损失持续下降但特征向量的范数趋近于零或者所有特征向量之间的余弦相似度都接近1。原因是模型找到了一个退化解把所有样本映射到同一个点这样正样本对的相似度最大负样本对的相似度也最大但损失函数里的分母和分子同时增大比值不变。解决方法有几个第一检查温度系数是否太小适当增大τ。第二检查是否有投影头没有的话加上。第三检查负样本数量是否足够增大batch size或使用队列机制。第四在损失里加一个均匀性正则项惩罚特征在超球面上的不均匀分布。5.2 监督对比损失对类别不平衡敏感前面提到过类别不平衡会导致损失被大类别主导。除了用WeightedRandomSampler做平衡采样还可以在损失里给每个类别的正样本对加权权重设为类别频率的倒数。或者用Focal Loss的思路对已经学得很好的样本降权。我试过一个更简单的做法在计算pos_sum时对每个锚点的正样本相似度取平均而不是求和。这样每个锚点的正样本贡献是均等的不受类别内样本数影响。但这样会改变损失的数学形式需要重新调τ。5.3 自监督预训练在下游任务上表现差可能的原因有增强策略太弱、投影头设计不合理、预训练数据与下游数据分布差异大、线性探测的学习率没调好。排查顺序建议先看增强策略随机裁剪和颜色抖动是否足够强。再看投影头输出维度是否太小小于64或太大大于512。然后看预训练数据量如果只有几万张图自监督对比学习很难学到通用特征不如直接用监督预训练。最后看线性探测的学习率通常比预训练学习率大10倍左右。5.4 训练不稳定损失震荡对比学习对学习率和batch size的交互很敏感。一个经验法则是学习率乘以batch size保持在一个常数附近。如果增大batch size学习率也要相应增大。另外warmup阶段很重要前5到10个epoch用线性warmup避免初期梯度太大导致模型发散。还有一个容易被忽略的点权重衰减。对比学习通常需要较大的权重衰减比如1e-4到1e-6。权重衰减太小模型容易过拟合太大特征会过度收缩。5.5 常见问题速查表问题现象可能原因排查方法解决方案损失下降但特征塌缩温度系数太小、无投影头、负样本不足检查特征范数和余弦相似度分布增大τ、加投影头、增大batch size监督损失被大类别主导类别不平衡统计每个类别的损失贡献平衡采样、类别加权、正样本取平均自监督下游表现差增强太弱、数据量不足可视化增强后的图像加强增强、增加数据、换监督预训练训练损失震荡学习率太大、warmup不足观察前10个epoch的损失曲线减小学习率、增加warmup显存不足batch size太大、相似度矩阵太大用torch.cuda.memory_summary查看梯度累积、混合精度、减小batch验证准确率不提升过拟合、学习率衰减太快对比训练和验证损失早停、增大权重衰减、调整衰减策略5.6 独家避坑技巧第一个技巧在自监督对比学习中把投影头的输出维度设为128但编码器的输出维度保持2048。这样投影头负责对比学习编码器保留更多信息给下游任务。微调时直接丢掉投影头用编码器的2048维特征。第二个技巧监督对比损失里正样本的相似度不要直接求和先做log-sum-exp再取平均。这样数值更稳定尤其是当正样本数量很大时。第三个技巧如果显存不够跑大batch可以用梯度检查点gradient checkpointing换显存。在PyTorch里用torch.utils.checkpoint包裹编码器的某些层显存占用能降30%到50%代价是训练速度慢20%左右。第四个技巧自监督预训练时用EMA指数移动平均更新编码器的副本评估时用EMA副本而不是原始编码器。这样评估结果更稳定线性探测准确率通常能提升1到2个百分点。第五个技巧监督对比损失和交叉熵损失可以联合训练。损失函数写成L L_supcon λ * L_ceλ取0.5到1.0。这样模型既能学到类内紧凑的特征又能保持分类边界的判别性。我在一个细粒度分类任务上试过联合训练比单独用监督对比损失准确率高3个点左右。6. 两种损失的组合使用与场景延展实际项目中自监督对比损失和监督对比损失并不是二选一的关系。一个常见的组合策略是先用自监督对比损失在大规模无标签数据上预训练然后用监督对比损失在标注数据上微调最后用交叉熵损失做分类头训练。这个三阶段流程的好处是自监督阶段学到通用的视觉特征监督对比阶段学到类别相关的度量空间交叉熵阶段学到分类边界。每个阶段的目标不同互补性很强。我在一个工业缺陷检测项目里用过这个流程。无标签的产线图像有50万张标注的缺陷图像只有5000张。自监督预训练用了300个epoch监督对比微调用了50个epoch最后交叉熵训练用了20个epoch。最终在测试集上的F1分数比直接用监督对比损失高了8个百分点比直接用交叉熵高了15个百分点。另一个延展方向是多模态对比学习。自监督对比损失可以扩展到图像-文本对用CLIP式的对比损失对齐视觉和语言特征。监督对比损失可以扩展到多标签场景每个样本有多个标签正样本定义为至少共享一个标签的样本对。还有一个值得关注的方向是难负样本挖掘。自监督对比损失里难负样本就是与锚点相似度高的其他样本。监督对比损失里难负样本是不同类别但特征相似的样本。显式地挖掘难负样本并加大其权重通常能提升特征区分度但要注意不要过度挖掘导致训练不稳定。我个人在实际操作中的体会是对比学习的核心不在于损失函数的形式而在于正负样本的构造方式。自监督靠增强监督靠标签但本质上都是在定义“什么应该相似什么应该不同”。把这个定义想清楚了损失函数只是实现工具。温度系数、batch size、投影头这些超参数都是在调节这个定义的严格程度。理解了这个底层逻辑调参就不会盲目。最后再分享一个小技巧如果你不确定该用哪种对比损失先跑一个小的消融实验。固定编码器和数据分别用自监督对比损失、监督对比损失、交叉熵损失训练相同的epoch看验证集上的线性探测准确率。通常监督对比损失在标注数据充足时最优自监督对比损失在标注数据稀缺时最优交叉熵在类别数少且标注充足时性价比最高。这个实验花不了多少时间但能帮你省下大量盲目调参的精力。

相关新闻

五相异步电机电磁性能分析与优化实践

五相异步电机电磁性能分析与优化实践

1. 异步电机电磁性能解析基础 五相异步电机作为多相电机的一种典型代表,相比传统三相电机具有转矩脉动小、容错能力强的特点。我们先从最基本的电磁原理说起:当定子绕组通入五相交流电时,会在气隙中产生旋转磁场。这个旋转磁场的转速我们称为…

2026/10/15 23:59:04 阅读更多 →
5相异步电机原理与优化实践

5相异步电机原理与优化实践

1. 异步电机基础认知:从洗衣机到工业产线每次按下洗衣机的启动按钮,里面传出的嗡嗡声其实就是一台小型异步电机在工作。这种看似简单的设备,却支撑着从家用电器到重型机械的各个领域。我们今天要讨论的5相异步电机,本质上就是这类…

2026/10/15 23:59:04 阅读更多 →
中英对照PDF打印防坑指南:从排版到验收全流程

中英对照PDF打印防坑指南:从排版到验收全流程

简介:《C919飞机电气元器件选用目录》中英对照PDF是面向航空电气设计、制造与维护人员的官方技术文件,由中国商用飞机有限责任公司发布,系统罗列了C919大型客机电气系统选用的元器件清单,覆盖电源、控制、通信导航、照明及仪表等关…

2026/10/15 23:59:04 阅读更多 →

最新新闻

白盒卡通化:可解释图像风格迁移技术解析

白盒卡通化:可解释图像风格迁移技术解析

1. 项目概述:这不只是读论文,而是拆解一张“数字漫画滤镜”的设计图纸“Learning to Cartoonize Using White-box Cartoon Representations”——这个标题乍看像一串学术密码,但把它掰开揉碎,其实就是讲:如何用可解释、…

2026/10/16 0:51:28 阅读更多 →
WiresharkPortable无权限抓包原理与实战避坑指南

WiresharkPortable无权限抓包原理与实战避坑指南

简介:WiresharkPortable是一款开箱即用的便携式网络协议分析器,面向网络管理员、安全工程师与开发人员,专为无安装环境下的实时抓包、协议解析与流量诊断设计。资源包体为20.16MB的RAR压缩文件,虽未提供具体文件列表,但…

2026/10/16 0:50:28 阅读更多 →
SpringBoot+Vue三模认证系统设计与落地难点

SpringBoot+Vue三模认证系统设计与落地难点

简介:这是一套基于SpringBoot与Vue实现的前后端分离一卡通消费系统源码,面向计算机专业本科生及Java初学者,适用于课程设计、毕业设计等实践场景,支持人脸认证、二维码支付和实体IC卡刷卡三种主流消费方式。资源共748个文件&#…

2026/10/16 0:50:28 阅读更多 →
从Excel到Web:ASP.NET值班排班管理系统的数据库设计与部署实践

从Excel到Web:ASP.NET值班排班管理系统的数据库设计与部署实践

简介:一套面向企事业单位值班管理场景的ASP.NET WebForms源码项目,基于Visual Studio 2010与Access数据库开发,包含登录认证、值班排班、部门与人员维护、历史值班查询、离岗登记等常用功能,适合需要快速搭建轻量级B/S值班系统的开…

2026/10/16 0:50:28 阅读更多 →
Python生成HL7 CDA文件:结构解析、代码实现与踩坑指南

Python生成HL7 CDA文件:结构解析、代码实现与踩坑指南

简介:这是一款专为医疗信息化场景设计的轻量工具,旨在生成符合HL7 CDA标准(临床文档架构)的XML文件,面向需要处理电子病历、检验报告等结构化数据的开发与实施人员,可显著降低手工编写CDA文档的难度与出错率…

2026/10/16 0:50:28 阅读更多 →
OpenCV图像几何变换原理与实战:从坐标映射到工业级应用

OpenCV图像几何变换原理与实战:从坐标映射到工业级应用

1. 项目概述:为什么图像几何变换是OpenCV入门绕不开的硬功夫“图像几何变换”这六个字,乍一听像数学课上的抽象概念,但只要你打开手机相册修图、用美颜App拉长脸型、在短视频里给视频加个旋转特效,甚至只是把一张歪斜的证件照扶正…

2026/10/16 0:50:27 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →