深度学习与传统机器学习
传统的机器学习算法:特征工程,需要人工设计特征,既费时又需要专业知识。
深度学习能够自动从原始数据中学习到有用的特征,减少了对人工特征工程的需求。可以实现端到端的学习
深度学习与迁移学习
迁移学习
使用在大规模数据集上预训练的模型作为起点(例如:ImageNet数据集上预训练的卷积神经网络(CNN)),再使用少量标记数据对模型进行微调。
迁移学习实现
微调(Fine-tuning)是深度学习中一种有效的迁移学习策略。
-
一个大规模的数据集上预训练一个深度学习模型
-
在目标任务上进一步提高模型的性能,使用该任务下少量标记数据进行训练
-
固定大多数层的参数不变,防止在微调过程中这些层学到的通用特征被破坏。调整其他层参数。
ResNet
成就:ResNet能够成功训练超过100层的网络,这在之前是不可能实现的。
ResNet的核心是残差块(residual block)
主要部分:跳跃连接(Skip Connections):这是ResNet最关键的创新,通过跳跃连接,输入可以直接绕过一个或多个层传到输出,输出是输入与这些层的输出的加和。这种结构使得网络可以学习输入到输出的残差,而不是直接学习输出,这有助于缓解梯度消失问题。
EfficientNet
-
一种高效的卷积神经网络(CNN)架构。
-
通过一种新颖的网络缩放方法来提升模型的性能和效率。
-
EfficientNet 的核心是其 compound scaling 方法,该方法通过一个复合系数统一缩放网络的深度、宽度和分辨率。
baseline实践
epoch=2; batch_size=64; 全部数据集
最终得分:0.89448
模型:EfficientNet-B0
epoch=2; batch_size=64; 数据量10w
最终得分:0.95562
模型:EfficientNet-B0
epoch=2; batch_size=64; 全部数据集
最终得分:0.97676
代码部分
由于模型在线访问不了,我也是将模型从官网下载到本地,再修改部分代码来实现的。
不知道有没有问题,希望有看到的佬不吝赐教。
model_path="resnet18.pth" #https://huggingface.co/timm/resnet18.a1_in1k/resolve/main/pytorch_model.bin
model = timm.create_model('resnet18', num_classes=1000)
# 加载预训练的 state_dict
state_dict = torch.load(model_path)
# 移除最后一层的权重,因为我们要替换最后一层
state_dict.pop('fc.weight')
state_dict.pop('fc.bias')
# 加载其余参数
model.load_state_dict(state_dict, strict=False)
# 替换最后一层
num_features = model.fc.in_features
model.fc = torch.nn.Linear(num_features, 2)
model = model.cuda()
EfficientNet-B0的也是同理。