VGG16迁移学习猫狗分类实战:从特征提取到微调全流程解析

迁移学习实战:从VGG16特征提取到微调的猫狗分类指南 迁移学习是一种复用预训练模型视觉先验的建模思路,其核心原理是利用在ImageNet等大规模数据集上训练好的卷积神经网络(如VGG16)作为通用特征提取器,再针对目标任务调整分类头部。该方法能显著缓解小数据集下从零训练导致的过拟合问题,同时降低对算力和标注样本的需求。在实际工程中,典型应用场景包括图像分类、目标检测和风格迁移等;当遇到数据规模有限或训练时间紧张的任务时,采用预训练模型加微调的策略往往能快速获得更高精度。本文以猫狗分类任务为例,完整展示了VGG16的架构细节、特征提取与分段微调的操作流程,并对比 阅读详情

1. 迁移学习到底解决了什么问题

干了这么多年计算机视觉,我见过太多人一上来就想从零搭建一个深度神经网络,然后拿猫狗分类这种入门项目练手。结果呢?训练了两三个小时,loss 死活不降,验证集准确率在 60% 上下抖动,然后就开始怀疑人生,怀疑显卡,怀疑自己是不是入错了行。其实问题往往不在你,而在你的思路——你试图用一个只有几千张图片的数据集,去喂饱一个需要上亿参数才能收敛的深度模型,这本来就不公平。

迁移学习的核心思想特别朴素: 先把别人已经训练好的模型拿过来,再让它适配你自己的任务。

以 VGG16 为例,这个模型在 ImageNet 上训练过,ImageNet 有一千多万张图片、两万多个类别。也就是说,VGG16 的卷积层已经学会了非常通用的视觉特征——边缘、纹理、形状、物体部件。这些东西对任何图像任务都有用。你要做的不是让模型重新认识世界,而是让它把已有的知识稍作调整,应用到猫狗分类这个具体任务上。

用生活里的话说,这就是“站在巨人的肩膀上”。你不需要重新发明轮子,你只需要把现成的轮子调整一下装到自己的车上。这个项目名为“VGG 猫狗分类”,实际上它的本质是: 用最经典的预训练网络,配合最经典的数据集,把迁移学习的完整流程跑通。

这篇文章适合谁看?刚入门深度学习、想搞懂迁移学习到底怎么操作的新手;已经跑通 MNIST 手写数字但想进阶真实图像任务的进阶者;还有那些明明有现成模型可用、却非要自己从零训练的网络“苦行僧”——希望你看完能省下这笔冤枉算力。

2. 数据集准备:猫狗分类的第一步不是写模型

2.1 Kaggle 猫狗数据集的结构与下载

猫狗分类最经典的数据集是 Kaggle 上的 Dogs vs. Cats,微软研究院发布的那个版本。整个数据集包含 25000 张猫和狗的图片,文件名直接标明了类别,比如 cat.1001.jpg 和 dog.5234.jpg 。这里有个小坑:文件名的编号不是从 0 开始连续排的,前 12500 张是猫,后 12500 张是狗,所以你没法简单地用奇偶性来切分标签。

下载完之后,强烈建议先把目录整理成 Keras ImageDataGenerator.flow_from_directory() 能直接识别的格式,否则后面要手动写数据加载逻辑,纯属给自己添堵。标准目录结构如下:

data/
├── train/
│   ├── cat/       # 猫图片
│   └── dog/       # 狗图片
├── validation/
│   ├── cat/
│   └── dog/
└── test/
    ├── cat/
    └── dog/

我实际的做法是写一个简单的 Python 脚本,遍历原始文件名,用 shutil.copy() 按比例分配到 train 和 validation 两个目录。常见比例是 80/20 或 90/10。注意一定要留出一部分数据做验证集,不要全部拿去训练。这里的“验证集”是你在训练过程中用来判断模型好坏的参照系,它和测试集的作用完全不同。

2.2 数据量不够怎么办:数据增强的正确姿势

25000 张图片听起来很多,但对于 VGG16 这种参数量动辄上亿的模型来说,其实非常有限。如果直接训练,过拟合几乎是必然的——训练集准确率 99%,验证集准确率只有 75%,这种惨状我见得太多了。

解决办法就是数据增强(Data Augmentation)。它的原理是:对原始图片做随机的几何变换和颜色扰动,相当于“免费”生成一批新的训练样本。一张猫的照片,水平翻转一下还是一张猫的照片,但模型看到的是不同角度的猫,泛化能力自然就上去了。

我常用的增强参数如下:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,          # 随机旋转角度范围
    width_shift_range=0.2,      # 水平平移比例
    height_shift_range=0.2,     # 垂直平移比例
    shear_range=0.2,            # 剪切变换强度
    zoom_range=0.2,             # 随机缩放比例
    horizontal_flip=True,       # 水平翻转
    fill_mode='nearest'         # 填充新像素的方式
)

注意 rescale=1./255 这一步必须放在最前面,因为预训练模型在训练时,图像像素值是归一化到 [0,1] 区间的。如果你忘了这步,输入分布不一致,迁移学习的优势会大打折扣。

验证集和测试集不要做任何增强,只需要 rescale 。原因很简单——验证集的作用是模拟真实的预测环境,你总不能指望在实际应用时也随机旋转、翻转图片来“凑一个更好”的结果吧。

2.3 图片尺寸:224x224 是硬性指标还是可商量?

VGG16 官方输入尺寸是 224x224。这个数字不是拍脑袋定的,它和 VGG 网络内部的池化层数量、全连接层的输入维度是紧密相关的。你在加载预训练模型时,模型结构里已经写死了最后的 Flatten 层输出维度,所以输入太大会报维度错误,输入太小则会丢失大量信息。

实际操作中,我建议直接用 target_size=(224, 224) ,不需要动脑筋。虽然你换成 299x299 或者 192x192 也能跑,但那个“能跑”是建立在模型内部结构自适应调整的基础上的,已经偏离了原始预训练模型的分布。既然用了迁移学习,就老老实实地用和预训练时一样的输入规格,这是最大的省心。

注意:数据增强中的 fill_mode='nearest' 在处理旋转、平移时产生的新像素点,用的是最近邻填充。这个在猫狗图片上表现不错,但在医学影像、遥感图像等场景里要慎重,因为那些领域的像素值语义更敏感。

3. VGG 网络结构拆解:搞懂你手里的巨人长什么样

3.1 卷积块:VGG16 为什么是“16”

VGG 这个名字源自牛津大学 Visual Geometry Group,它有两个常见版本:VGG16 和 VGG19。数字代表网络中的权重层数量。VGG16 有 13 个卷积层加 3 个全连接层,VGG19 则是 16 个卷积层加 3 个全连接层。

整个 VGG 的结构非常规整,它用大量 3x3 的小卷积核堆叠,替代了早期 AlexNet 中比较大的卷积核。连续两个 3x3 卷积的感受野,等效于一个 5x5 卷积;连续三个 3x3 卷积,等效于一个 7x7 卷积。这样做的好处有三点:一是参数量更少,二是引入了更多的非线性激活函数,让模型表达能力更强,三是在相同感受野下网络更深,能学到更抽象的特征。

我用表格整理一下 VGG16 的完整结构:

层块 包含层 输出尺寸 参数量
Block 1 Conv2D(64) x2 + MaxPool 112x112x64 约 3.8 万
Block 2 Conv2D(128) x2 + MaxPool 56x56x128 约 22 万
Block 3 Conv2D(256) x3 + MaxPool 28x28x256 约 88 万
Block 4 Conv2D(512) x3 + MaxPool 14x14x512 约 180 万
Block 5 Conv2D(512) x3 + MaxPool 7x7x512 约 180 万
FC 层 Flatten + Dense(4096) x2 + Dense(1000) 1x1x1000 约 1.02 亿

看到最后一行没?全连接层的参数量占了整个网络的绝大部分。这两层 4096 维的全连接,参数量加起来接近 1 亿,比所有卷积层加起来还多。这也是后来很多研究用全局平均池化替代全连接层的原因——参数量骤降,还能避免过拟合。

3.2 为什么 VGG 适合做迁移学习的底座

VGG 虽然结构简单,但它的分层特征非常清晰:浅层卷积学到的是边缘、颜色、纹理这些低级特征,中层学到的是物体部件(比如眼睛、耳朵的轮廓),深层学到的是完整的物体概念。这种层次化的特征提取能力,正是迁移学习最需要的。

当你做猫狗分类时,VGG 的浅层和中层卷积已经能很好地提取出“毛茸茸的轮廓”“三角形的耳朵”“圆溜溜的眼睛”这些关键特征。你需要做的只是把最后那 1000 类的输出,替换成你自己的两类输出,再重新训练一下后面的权重而已。

对比一下其他预训练模型:ResNet 靠残差连接解决了深层网络的退化问题,Inception 靠多尺度卷积核提升了表征能力,但它们做迁移学习的底层逻辑和 VGG 完全一样,只是特征提取模块的复杂度不同。VGG 因为结构简单、可解释性强,特别适合用来教学和入门。

3.3 VGG16 与 VGG19:选哪个更好?

很多初学者会纠结这个问题。我的回答很简单: 默认选 VGG16 。

VGG19 比 VGG16 多了 3 个卷积层,但在 ImageNet 上的性能提升微乎其微,参数量却增加了不少,训练和推理速度都更慢。在猫狗分类这种任务上,VGG16 的特征提取能力已经绰绰有余,VGG19 那多出来的非线性表达几乎发挥不了作用。除非你的任务特别难,比如细粒度图像分类(区分不同品种的猫、不同品种的狗),否则 VGG16 是效率最高的选择。

如果你想追求更好的性能,我反而建议直接换 ResNet50 或者 EfficientNet,而不是纠结同一个体系里的 VGG16 和 VGG19。迁移学习的选型思路是: 模型规模匹配任务复杂度 ,而不是一味追求更大的模型。

4. 迁移学习的两种核心策略:冻结还是微调

4.1 策略一:特征提取——把 VGG 当特征提取器

这是最保险的做法。把 VGG16 的卷积基(convolutional base)完整保留下来,权重全部冻结,也就是 trainable=False 。然后在这个卷积基的顶部接上一个全新的分类头,通常是一个全局平均池化层加一个 Dropout 层加一个 Dense 层。训练时只更新分类头的参数,卷积基的权重一动也不动。

为什么这样能行?因为 VGG16 的卷积基已经是一个强大的通用特征提取器了。猫和狗在图像层面的差异——毛色、耳朵形状、脸部比例、体型轮廓——这些特征在卷积基的输出里已经足够区分了。你只需要一个简单的分类器把这些特征映射到“猫”或“狗”的标签上即可。

这个策略的优势特别明显:

  • 训练速度快 :只训练几个全连接层,参数数量少,即使没 GPU 用 CPU 也能在合理时间内跑完。
  • 不容易过拟合 :卷积基权重固定,能动的参数少,数据量小也不是大问题。
  • 对新任务非常稳 :哪怕你的数据集只有几千张图片,这种玩法也能取得不错的效果。

我在实际项目中,首选永远是特征提取方案。先跑通整个流程,有了一个 baseline,再去考虑更复杂的微调。

4.2 策略二:微调——让巨人重新学习一部分技能

微调(Fine-tuning)是在特征提取的基础上,解冻卷积基的后面几层,让它们的权重也参与训练。这样做的直觉是:VGG16 在 ImageNet 上学到的特征是通用的,但你的猫狗数据集有自己的特殊性——图片风格、拍摄角度、光照条件都和 ImageNet 不同。通过微调,模型可以针对你的数据分布做小幅度的调整,性能往往能再上一个台阶。

但微调有几个至关重要的注意事项,我踩过不少坑:

  1. 微调层数不宜太多 :一般只解冻最后一个卷积块(Block 5),甚至只解冻 Block 5 的最后几层。底层特征太通用,动了反而容易破坏原始特征提取能力。
  2. 微调的学习率必须更小 :因为没有冻结的预训练权重已经在一个很优的局部极小值附近了,学习率太大会直接把它踢出低谷。我常用 1e-5 或者 5e-6 这个量级。
  3. 先在冻结模式下训练好分类头,再解冻和微调 :如果一上来就直接微调整个网络,随机初始化的分类头会产生巨大的梯度,反向传播会把预训练权重的特征破坏得一塌糊涂。

4.3 两种策略的选择标准

这是一个值得认真思考的问题。我自己总结了一套选择标准:

场景 推荐策略
数据集很小(<5000 张) 特征提取,千万不要微调
数据集中等(5000-20000 张) 特征提取 + 少量微调
数据集较大(>20000 张) 微调,自由发挥空间大
新任务和 ImageNet 相差很远 特征提取,微调收益低
新任务和 ImageNet 很接近 微调,效果提升明显

猫狗分类这个任务和 ImageNet 里的任务(包括猫狗类别)非常接近,而且我们有 25000 张数据,属于中等规模。所以我最终采用了“两步走”策略:先特征提取跑 baseline,再加微调提精度。这也是我推荐给所有迁移学习新手的标准套路。

5. 完整代码实战:从加载模型到最终预测

5.1 加载预训练模型与构建分类头

环境方面,我用的是 TensorFlow 2.x 加 Keras 接口,Python 3.8 以上,一张 8GB 显存的 GPU 就足够了。如果你没有 GPU,CPU 跑特征提取方案勉强能行,但微调阶段会很煎熬。

import tensorflow as tf
from tensorflow.keras.applications import VGG16
from tensorflow.keras.models import Model
from tensorflow.keras.layers import GlobalAveragePooling2D, Dense, Dropout
from tensorflow.keras.optimizers import Adam

# 加载预训练模型,不包括顶部分类器
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# 冻结所有卷积层
base_model.trainable = False

# 构建新的分类头
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dropout(0.5)(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.3)(x)
predictions = Dense(1, activation='sigmoid')(x)

model = Model(inputs=base_model.input, outputs=predictions)
model.compile(optimizer=Adam(learning_rate=1e-4),
              loss='binary_crossentropy',
              metrics=['accuracy'])
model.summary()

几个细节我需要单独解释一下:

  • include_top=False 这个参数很关键,它表示加载的 VGG16 不包含最顶部的 1000 类分类器。我们要用自己的分类头替换它。
  • 最后一层用 sigmoid 是因为这是二分类任务,输出一个介于 0 和 1 之间的概率值。多分类任务则应该用 softmax 。
  • GlobalAveragePooling2D() 替代了 Flatten,因为前者能把每个特征图压缩成一个值,大大减少参数量,同时天然具备一定的平移不变性。

5.2 特征提取方案训练流程

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(224, 224),
    batch_size=32,
    class_mode='binary'
)

validation_generator = validation_datagen.flow_from_directory(
    'data/validation',
    target_size=(224, 224),
    batch_size=32,
    class_mode='binary'
)

# 回调函数:保存最佳模型,早停,学习率衰减
callbacks = [
    ModelCheckpoint('cat_dog_feature_extraction.h5', monitor='val_accuracy', save_best_only=True),
    EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True),
    ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3, min_lr=1e-7)
]

history = model.fit(
    train_generator,
    steps_per_epoch=train_generator.samples // 32,
    epochs=20,
    validation_data=validation_generator,
    validation_steps=validation_generator.samples // 32,
    callbacks=callbacks
)

这里 flow_from_directory 会自动根据子目录名生成标签,猫的标签是 0,狗的标签是 1,顺序取决于目录的字母排序。如果你的数据集目录结构和我一致(先是 cat 后是 dog),那标签映射就没问题。如果不对,可以用 classes 参数手动指定。

训练过程大概十几分钟就能跑完。特征提取方案在验证集上的准确率一般能达到 97% 到 99%,这个数字已经相当可观了。你要知道,一个从零训练的网络在处理同样的数据时,能达到 90% 就已经算非常不错了。

5.3 微调方案训练流程:关键在“解冻”的时机

特征提取跑完之后,我们进入微调阶段。这时要解冻 VGG16 的最后一个卷积块,并大幅降低学习率:

# 解冻 Block5 的卷积层
base_model.trainable = True

# 冻结 Block1 到 Block4,只保留 Block5 可训练
for layer in base_model.layers:
    if 'block5' not in layer.name:
        layer.trainable = False
    else:
        layer.trainable = True

# 重新编译,必须在你设置完 trainable 之后
model.compile(optimizer=Adam(learning_rate=1e-5),
              loss='binary_crossentropy',
              metrics=['accuracy'])

这里有一个必须先理解的点:在 Keras 中, model.compile() 会锁定当前的可训练参数集合。如果你在 compile 之后再去修改 layer.trainable ,新的设置不会生效。所以顺序一定是——先改 trainable ,再 compile 。

微调阶段我通常跑 10 到 15 个 epoch,学习率保持在 1e-5 这种极低水平。这里要特别关注验证集指标,如果验证集准确率不升反降,说明微调的负面影响大于正面收益,果断回退到特征提取阶段的模型权重。

注意:微调阶段不要用 EarlyStopping 的 patience 设置得太小,因为验证集损失在小学习率下会表现出波动,太激进的早停策略反而会掐断后续的收益。我一般设 patience=8 。

5.4 加载最佳模型做预测与可视化分析

训练完成后,加载最佳模型对测试集做预测,并可视化一些典型样例:

import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing import image
import numpy as np

def predict_image(img_path):
    img = image.load_img(img_path, target_size=(224, 224))
    img_array = image.img_to_array(img) / 255.0
    img_array = np.expand_dims(img_array, axis=0)
    pred = model.predict(img_array)[0][0]
    if pred > 0.5:
        return f'狗 (置信度: {pred:.2f})'
    else:
        return f'猫 (置信度: {1-pred:.2f})'

# 举个例子
print(predict_image('data/test/cat/cat_001.jpg'))

可视化验证集的预测结果时,我习惯把一个 batch 的图片和预测置信度一起输出,然后把预测错误的样本单独保存到一个文件夹里。这是最朴素的错误分析方法——你一眼就能看出模型是在什么类型的图片上犯错,是光线太暗、姿态太奇怪,还是背景干扰太严重。这些信息比准确率数字本身更有价值。

5.5 代码完整流程的组织方式

初学者经常犯的毛病是把所有代码堆在一个脚本里,跑完了就没了。我更推荐这种分模块的组织方式:

project/
├── config.py          # 所有路径和超参数集中管理
├── data_prepare.py    # 数据下载、划分、目录整理
├── build_model.py     # 构建模型和加载预训练权重
├── train.py           # 训练逻辑,包含特征提取和微调两阶段
├── evaluate.py        # 验证集评估与图表输出
└── predict.py         # 对单张图片或批量预测

这样做的好处是当你换了新数据集来做迁移学习时,只需要改 config.py 里的路径和类别数,其他模块复用就行,不用从头重写。

6. 训练中的坑与排查技巧实录

6.1 数据准备阶段的常见问题

图片格式混乱。 我拿到的数据集有 JPG、PNG 甚至有些损坏的图片。Keras 的 flow_from_directory 默认能处理大部分情况,但如果某个文件本身损坏了,会直接报错中断训练。解决办法是在数据准备阶段做一次过滤检查,用 PIL 打开每一张图片,如果 verify() 失败就跳过。

from PIL import Image

def verify_images(folder_path):
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.endswith(('.jpg', '.jpeg', '.png')):
                path = os.path.join(root, file)
                try:
                    img = Image.open(path)
                    img.verify()
                except Exception as e:
                    print(f'损坏图片: {path}, 错误: {e}')

标签反了。 我见过不下十个新手在训练完后发现模型把猫和狗分反了。原因大多是目录名和标签映射搞混了。在训练前,建议打印 train_generator.class_indices 检查一下映射关系。如果用的是 class_mode='binary' ,0 和 1 的顺序代表着不同的类别,一定要确认清楚。

6.2 训练过程中的典型故障

我在跑这个项目时实际遇到过一个让我印象特别深的问题:训练开始时准确率直接冲到 95% 以上,然后就不再变化了,loss 也一直在低位震荡。这不是什么好事,这是典型的 数据泄漏 迹象——我在数据准备时不小心把同一张图片同时放进了训练集和验证集。

排查思路是这样的:随机抽取几对训练集和验证集的图片,做哈希对比,果然发现重了。后来我在划分数据时加了一步自动去重,对所有图片计算 MD5 哈希,删除重复项再划分。虽然多花了一分钟,但避免了之后的疑似“作弊”行为。

Loss 异常放大怎么办? 这个问题在微调阶段最常见。特征提取阶段 loss 已经降到 0.1 左右了,一进入微调看到 loss 突然跳到 0.8 甚至更高。这通常是因为解冻权重后,原始的卷积特征被大幅更新导致输出分布突变。解决办法就是前面说的:先用小学习率配合预训练权重做“热启动”,让模型慢慢适应新的训练模式。如果 loss 猛涨,立刻停掉,检查学习率是否过大,或者是否误解冻了太多层。

6.3 模型效果不佳时的排查顺序

有新手问我,验证集准确率只有 85%,该怎么提高?我建议大家按这个顺序排查:

  1. 先看训练集准确率 :如果训练集准确率也很低,说明模型欠拟合,需要增大模型容量、增加训练时间、调高学习率。
  2. 如果训练集很高而验证集低 :过拟合了。增加数据增强强度、增加 Dropout、增加训练集数量,或减少微调的层数。
  3. 检查数据质量 :验证集里是否有标签错误的图片。猫狗数据集偶尔有一两张虚影或明显误标,手动清洗能带来立竿见影的效果。
  4. 检查输入预处理 :确保验证/测试阶段也用 rescale=1./255 ,否则输入分布不一致导致性能下降。这个坑真的非常常见。

7. 进一步提升效果的几个方向

猫狗分类的 baseline 跑通之后,如果你想在这个项目上继续深挖,有几个方向很值得尝试。

换成更现代的骨干网络。 VGG16 是 2014 年的结构了,虽然经典,但在效率和性能上已经落后于新一代的网络。直接换成 ResNet50、EfficientNetB0 或 ConvNeXt,只改一行代码,准确率又能往上提一截。迁移学习的框架完全一样,只是换底座而已。ResNet50 的残差结构让它在深层次上比 VGG 更有优势,EfficientNet 则在同样的计算预算下做到了更强的精度。

尝试多模型集成。 把 VGG16、ResNet50、EfficientNetB0 三个模型的预测结果做加权平均,通常能比单模型高出 1% 到 2% 的准确率。缺点是推理时间变长,需要三倍的显存或计算量。在猫狗这种规模适中的数据集上,这个办法简单粗暴但有效。

从更深的迁移学习概念中找灵感。 你在热搜里会看到“直推式迁移学习”“元学习”“域适应”这些词。它们的本质都是在追问同一个问题:预训练模型学到的知识,如何更精准地迁移到目标任务上?直推式迁移学习关注源域和目标域之间的差距,通过调整特征分布让模型在新数据上表现更好;元学习则是“学习如何学习”,让模型从多个相关任务中总结出共通的快速适应能力。理解了 VGG 猫狗分类的迁移逻辑,你再去看这些更高级的策略,会发现很多思想是相通的。

实现类激活图可视化。 想看模型到底在关注图片的哪些区域,可以用 Grad-CAM 生成热力图。你会发现模型在做猫狗分类时,关注点通常在耳朵、眼睛和脸部轮廓上。这既是模型解释性的展示,也是验证模型有没有学到合理特征的重要手段。如果热力图显示模型关注的是背景,那就要警惕模型是否学到了数据集里的无关偏差。

8. 最后的实际操作心得

跑了这么多遍迁移学习项目,我最想说的一点是:迁移学习的门槛真的不高,但要把效果做扎实,需要你耐住性子做实验记录。

我自己的习惯是每次跑实验都建一个文本文件,记下当时的超参数(学习率、epoch 数、batch size、解冻层数、增强参数),然后记下最终的验证集准确率和 loss。这个习惯帮我省去了无数次“我当时是怎么跑到 98% 的?”的懊恼。实验记录看起来简单,却是提升调参效率最有效的方法,没有之一。

还有一个小技巧值得分享:在训练过程中定期保存模型权重,不要只依赖最终的 ModelCheckpoint 。我吃过一次亏——训练到第 12 个 epoch 时意外断电,然后发现唯一的 checkpoint 还停留在第 5 个 epoch。后来我改用每 3 个 epoch 保存一次全部权重,虽然磁盘空间多花了一点,但训练中断时最多损失 3 个 epoch 的进度,这个代价完全值得。

回到猫狗分类这个项目本身。当你成功跑完“特征提取 + 微调”两阶段训练,看到验证集准确率从 97% 爬到 99% 的时候,你其实已经掌握了深度学习里最核心的工程方法论——如何站在已有成果的基础上做出自己的东西。这个思路可以迁移到任何图像分类任务上,不限于猫和狗。我自己后来用同样的流程处理过中草药识别、工业质检、卫星图像分类,步骤几乎一模一样,只是换了数据集和骨干网络而已。

所谓“站在巨人的肩膀上”,本质上是一种高效的问题解决思路:先找到最好的现成工具,理解它的边界,再花最小的成本让它适配你的问题。这不是取巧,而是工程能力的体现。希望这篇分享能帮你迈出这一步。

VGG16迁移学习实战:猫狗二分类全流程精解 迁移学习是深度学习中复用预训练模型能力的核心技术,其本质在于特征提取与任务适配的协同优化。VGG16凭借结构清晰、梯度稳定、全连接层可解释性强等优势,成为小样本、中等算力场景下图像分类的高鲁棒性主干选择。相比ResNet或MobileNet,它在特征空间分辨率保持、冻结/解冻策略可控性及部署兼容性方面具有独特工程价值。该技术广泛应用于工业质检、边缘设备识别、农业病害分析等需快速落地且稳定性优先的场景。本文以猫狗二分类为典型任务,系统覆盖数据清洗陷阱、Grad-CAM可视化归因、ONNX轻量化压缩、多进程下B 阅读详情

相关推荐

从零到一:基于PyTorch与VGG16的猫狗分类实战解析

本文详细解析了如何使用PyTorch和VGG16实现猫狗分类的完整流程,从环境配置、数据集处理到模型训练与部署。通过迁移学习技巧和实用训练策略,帮助开发者快速掌握深度学习项目实战要点,特别适合初学者入门计算机视觉领域。

weixin_30342209的博客 321

使用 TensorFlow 与 VGG16 实现猫狗分类:完整项目解析

迁移学习能让我们站在 “巨人” 的肩膀上,利用预训练模型(如在大规模数据集imagenet上训练好的 VGG16)提取的通用特征,加速当前任务的模型训练与性能提升。加载 VGG16 模型时,去掉顶层的分类层(# 构建VGG16模型# 冻结预训练层在 VGG16 提取特征的基础上,添加自定义的全连接层作为分类头,实现对猫狗二分类任务的适配。通过Sequential。

2401_84931705的博客 764

3种CNN架构对比:从零搭建、VGG16迁移学习与ResNet50在猫狗识别上的性能实测

本文对比了3种CNN架构在猫狗识别任务中的性能表现,包括从零搭建的轻量级CNN、VGG16迁移学习和ResNet50迁移学习。实验结果显示,ResNet50在验证准确率和F1分数上表现最佳,尤其适合小规模数据集。文章还提供了详细的实现代码和工程实践建议,帮助开发者优化模型性能。

weixin_29038537的博客 305

VGG16迁移学习实战:猫狗分类项目全流程解析

在深度学习图像分类任务中,当可用数据规模有限时,从零训练深度网络往往面临欠拟合、收敛缓慢与效果不稳定等挑战。迁移学习通过复用在大规模数据集上预训练好的模型权重,将通用视觉特征迁移至新任务,为小样本场景提供了高效解决方案。VGG16作为经典卷积神经网络,凭借规整的结构和成熟的预训练权重,成为迁移学习入门的理想选择。其卷积层可提取边缘、纹理等通用特征,全连接层则通过微调适配特定分类目标,实现从1000类图像识别到猫狗二分类的平滑过渡。本文以PyTorch为框架,系统讲解加载预训练权重、冻结特征层、替换分类头、两

weixin_29057065的博客 91

面向数据稀缺问题的迁移学习实践-VGG16模型微调实例解析【附核心实战代码】

迁移学习的核心思想是,将从源任务(source task)中学到的知识转移到目标任务(target task)中。这种方法能够帮助我们在目标任务中减少训练时间、提高精度,尤其是在目标任务的数据不够丰富时。源任务(Source Task):已解决的任务,通常拥有大量的标注数据。目标任务(Target Task):待解决的任务,可能存在数据匮乏的情况。源领域(Source Domain)**与**目标领域(Target Domain):指源任务和目标任务所对应的数据分布。知识迁移。

一键难忘的博客 4027

TensorFlow 1.x猫狗识别实战包:VGG16微调+TFRecord数据封装+单图预测

这个资源包提供一套完整、可直接运行的猫狗图像二分类实现,基于TensorFlow 1.x环境,主干网络采用预训练VGG16模型并进行迁移学习。代码包含从原始图片构建高效TFRecord数据集的脚本(create_and_read_TFRecord2.py),带Dropout正则化的VGG16模型定义(VGG16_model.py),支持断点续训与模型保存的训练流程(train_model.py),以及多种测试方式:单张图像快速预测(test_one.py)、简易批量验证(test_simple.py)和模型

m5n6o7的博客 224

迁移学习实战:用VGG16预训练模型微调实现猫狗图像分类

在深度学习图像分类任务中,从零训练卷积神经网络往往需要海量数据与高昂算力,而迁移学习通过复用ImageNet等大型数据集上预训练好的模型权重,让中小规模数据集也能达到极高准确率。VGG16作为经典CNN架构,以规整的卷积-池化堆叠和3x3小卷积核设计著称,其特征提取层在迁移到猫狗分类等新任务时表现出色。本文从迁移学习的核心概念出发,区分直推式与归纳式迁移,解析VGG16网络结构,并介绍冻结特征提取与全模型微调两种策略,涵盖数据预处理、增强、超参数配置与常见问题排查。通过PyTorch加载预训练权重,仅需少量

weixin_42544663的博客 104

VCSA 6.7证书过期别慌!手把手教你通过SSH修改系统时间恢复登录(附STS证书修复脚本)

本文详细介绍了VCSA 6.7证书过期的应急处理方案,包括通过SSH修改系统时间临时恢复登录、全面更新证书体系以及专项修复STS证书的实战步骤。文章还提供了后期验证和系统加固的建议,帮助运维人员有效应对证书过期问题,确保虚拟化平台的稳定运行。

weixin_31292729的博客 416

迁移学习实战:用VGG16预训练模型实现猫狗分类

深度学习入门常以图像分类任务作为起点,但直接从零训练卷积神经网络不仅耗时,还容易因数据不足而陷入过拟合。迁移学习的核心在于复用预训练模型在大型数据集上学到的通用视觉特征,通过冻结底层卷积层并仅训练顶部分类层,大幅降低训练成本并提升精度。这一技术尤其适合数据量有限的场景,如小规模图像分类、目标检测等。本文以经典的VGG16为骨干,详细讲解预训练权重的加载、特征提取与微调两种迁移策略,并给出基于PyTorch的完整实践方案,帮助读者快速掌握迁移学习的基本流程与调参技巧。

weixin_42639633的博客 169

避坑指南:ros2_control在Gazebo中的常见配置错误及解决方案

本文系统梳理了在Gazebo仿真环境中配置ros2_control框架时最常见的错误,并提供了详细的解决方案。重点解析了YAML配置文件的结构陷阱、URDF/XACRO中关键标签的正确写法、Launch文件的启动顺序管理,并分享了实用的调试命令与故障排查思路,帮助开发者高效避坑,实现流畅的关节运动控制。

q5r6s7的博客 972

ESP32-CAM实战:从零构建高精度QR二维码识别系统

本文详细介绍了如何使用ESP32-CAM构建高精度QR二维码识别系统,涵盖硬件配置、开发环境搭建、二维码识别库选择与优化、完整系统实现及实战问题排查。通过优化识别算法和电源管理,系统可实现快速、稳定的二维码识别,适用于物联网设备绑定等场景。

weixin_42524703的博客 433

迁移学习实战:用VGG16轻松搞定猫狗图像分类

图像分类是计算机视觉中最常见的任务之一,但要从零训练一个高精度的深度卷积网络,往往需要海量数据和大量算力。迁移学习通过复用ImageNet等大型数据集上预训练好的模型参数,让新任务无需从零开始学习基础特征,从而大幅降低训练成本。VGG16作为经典卷积神经网络,其分层特征提取能力在自然图像上表现优异,非常适合小样本分类场景。本文将围绕迁移学习的核心原理,介绍如何利用PyTorch加载预训练VGG16,通过冻结特征层、替换分类器以及微调策略,在猫狗二分类任务上取得高准确率。同时还会分享数据增强、学习率调节、过拟

weixin_29531177的博客 43

STM32Cubemx+CanFestival:从零到一的CANopen移植实战

本文详细介绍了如何使用STM32CubeMX和CanFestival实现CANopen协议栈的移植,从开发环境搭建到核心配置步骤,再到调试与问题排查。通过实战经验分享,帮助开发者快速掌握STM32与CANopen的结合应用,提升嵌入式系统开发效率。

weixin_42558093的博客 420

迁移学习与VGG16实战:五分钟看懂猫狗图像分类

深度学习入门常被数据量和训练成本劝退。迁移学习通过复用ImageNet等大型数据集上的预训练模型,让小型图像分类任务无需从零训练。VGG16结构规整、预训练权重成熟,是学习特征提取和微调的理想选择。从迁移学习的基本概念出发,解析VGG16的卷积结构与预训练权重原理,展示如何借助Keras构建猫狗分类器,并讨论数据增强、冻结层、学习率调节等工程实践。该方法已在经典猫狗数据集上验证,能快速达到较高精度,适合小数据量自然图像分类场景。

weixin_28235513的博客 178

modelsim软件安装教程及踩坑(极简版)

1.安装的网盘链接:链接:https://pan.baidu.com/s/1ltUfssyXlCnqDmLhWyhlwA提取码:jery 2.步骤(参考博文):https://blog.youkuaiyun.com/weixin_42693097/article/details/90523692?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163521788716780357213801%2522%252C%2522scm%2522%253A%2522

subtitle_的博客 3780

数据仓库从明细到汇总:DWD与DWS层建模实战指南

DWS层的“主题”是指业务分析的核心场景,通常分为“用户主题、商品主题、订单主题、营销主题”等。主题的定义需紧密结合业务需求,避免“为了汇总而汇总”。例如,电商平台的核心业务需求包括“用户活跃度分析”“商品销售情况分析”“订单转化分析”,对应的DWS层主题即可定义为“用户主题汇总表”“商品主题汇总表”“订单主题汇总表”。主题定义时需注意“粒度适中”——汇总粒度既不能过细(否则与DWD层重复,失去汇总意义),也不能过粗(否则无法满足细分分析需求)。

2401_83088008的博客 645

VGG迁移学习猫狗分类实战:从原理到调参全解析

迁移学习作为深度学习领域的高效训练范式,通过复用预训练模型在大型数据集(如ImageNet)上学习到的通用视觉特征,有效解决了小数据集下训练深度网络容易过拟合、算力成本高等问题。其核心原理在于低层卷积层对边缘、纹理、形状等基础特征的提取具有跨任务通用性,仅需替换顶部分类器并微调少量层,即可适配新的分类任务。这一特性为图像分类等计算机视觉应用提供了极佳的技术路径,尤其在医疗影像识别、工业质检等样本稀缺的工程场景中价值显著。本文将基于猫狗图像分类任务,系统解析如何利用VGG网络结合预训练权重实现高精度分类,涵盖

weixin_31499265的博客 68

PCL 直通滤波

内容抄自优快云点云侠:[【2024最新版】PCL点云处理算法汇总(C++长期更新版)](https://blog.youkuaiyun.com/qq_36686437/article/details/114160640)。质量无忧,永久免费,可放心复制粘贴。

m0_51204289的博客 903

用VGG16迁移学习实现猫狗图像分类的完整实践

迁移学习是一种让模型站在预训练基础上解决新任务的技术,其核心在于复用大规模数据集(如ImageNet)上学到的通用特征,避免从零训练带来的数据不足与算力开销。VGG16作为经典卷积神经网络,结构简洁、预训练权重成熟,常被用作特征提取器。通过冻结底层卷积层、微调高层分类头,即可用少量样本快速得到高精度图像分类模型。该方案尤其适用于数据量有限的中小规模项目,如智能硬件中的宠物识别、安防中的物体检测等场景。本文基于猫狗分类这一经典任务,完整展示VGG16结合迁移学习的工程落地流程,涵盖环境配置、数据增强、分层冻结

weixin_33624741的博客 56

AI大模型探索之路-应用篇11:AI大模型应用智能评估(Ragas)

随着人工智能技术的飞速发展,AI大模型(LLM)已经成为了推动技术创新和应用的关键因素。这些大模型在语言理解、图像识别、自然语言生成等领域展现出了惊人的能力。然而,随着模型规模的增大,它们对计算资源的消耗、环境适应性、模型稳定性、安全性和可解释性等方面也提出了新的挑战。因此,对AI大模型进行智能评估变得至关重要,以确保它们在实际应用中的稳定性、可靠性和有效性。本文将详细介绍Ragas框架,一个专为AI大模型设计的智能评估工具。

寻道AI,探索AI无限可能! 5546

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VGG16深度解析:从原理到猫狗分类实战

VGG16是计算机视觉中经典的卷积神经网络架构,其核心在于3×3小卷积核的重复堆叠与固定池化策略,实现了特征抽象层级细化与计算效率的平衡。该设计使模型具备强可解释性、稳定梯度流和鲁棒迁移能力,广泛应用于图像分类、缺陷检测、医疗影像等场景。作为ImageNet预训练基线,VGG16常被用作数据质量探针、特征提取校准器和训练稳定器,尤其适合中小规模数据集的迁移学习。本文结合猫狗分类任务,详解输入尺寸规范(224×224中心裁剪)、BGR归一化参数、7×7×512语义压缩枢纽、冻结微调策略及Dropout部署陷阱

weixin_32296621的博客 151

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

迁移学习+VGG猫狗分类:从原理到实践的完整指南

在深度学习图像识别任务中,从头训练卷积神经网络往往面临数据量不足、算力开销大、模型精度提升困难等问题。迁移学习通过复用ImageNet等大型数据集上预训练好的模型权重,将底层通用视觉特征(如边缘、纹理、形状)迁移到新任务中,显著降低了训练成本并提升分类准确率。VGG作为经典的深度卷积网络架构,凭借其规整的3x3小卷积核堆叠设计,成为迁移学习常用的骨干网络之一。理解VGG的结构特点、预训练参数的预处理方式以及特征层冻结与微调策略,是工程落地的关键。本文以猫狗二分类为例,深入解析迁移学习在图像识别中的实际应用,

weixin_29057237的博客 120

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

PyTorch实战:用VGG16和ResNet18搞定猫狗分类(附完整代码)

本文详细介绍了如何使用PyTorch实现VGG16和ResNet18模型进行猫狗分类任务,包括数据准备、模型构建、训练优化和部署推理。通过对比两种经典CNN架构的性能和特点,帮助开发者快速掌握深度学习图像分类的实战技巧,并提供完整的代码示例和优化策略。

o5p6q的博客 304

VGG16迁移学习实战:如何用少量数据提升图像分类效果

当遇到数据量不足时,传统深度学习模型容易过拟合。迁移学习通过复用预训练模型的特征提取能力,只需微调最后几层即可获得不错的效果。VGG16在ImageNet上训练的卷积核能捕捉通用图像特征,非常适合作为基础模型。对于需要演示的项目,还能一键生成可交互的网页应用,直观展示模型预测效果。这种全流程支持让研究者能更专注算法本身,而非环境搭建。- 内置TensorFlow/PyTorch等主流框架。数据增强:通过旋转/翻转生成更多训练样本。- 无需配置环境即可运行完整训练流程。早停机制:监控验证集性能防止过拟合。

GreenLeaf78的博客 347

CNN迁移学习实战:从VGG16微调到工业部署的12个关键细节

卷积神经网络(CNN)是计算机视觉任务的核心架构,其本质是将原始像素空间映射为高层语义特征的过程。迁移学习通过复用ImageNet等大规模数据集预训练的权重,显著降低小样本场景下的训练难度与过拟合风险。技术价值体现在模型收敛更快、所需标注数据更少、泛化能力更强;典型应用场景包括工业缺陷检测、医疗影像分类和农业病虫害识别。本文聚焦VGG16迁移学习落地实践,深入解析冻结策略、GlobalAveragePooling替代Flatten、tf.data高效加载及TensorFlow 2.11环境兼容性等真实工程细

weixin_30387423的博客 659
上一篇: CVPR视觉错觉挑战赛:测试VLM鲁棒性的前沿战场
下一篇: OpenResearch实战:Claude Code、Codex、OpenCode、Cursor组合搭建开源研究工作流
otter_ai
博客等级 码龄10年 56粉丝 1万+原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值