VGG16模块的可视化
VGG16简介:
VGG是继AlexNet之后的后起之秀,相对于AlexNet他有如下特点:
1,更深的层数!相对于仅有8层的AlexNet而言,VGG把层数增加到了16和19层。


2,更小的卷积核!不仅如此,相对于AlexNet中的大卷积核(如下图中的 11x11和5x5卷积核),VGG中只使用了3x3的小卷积核。

3,更深的网络,更多的非线性。通过用多个3x3的小filter去替换AlexNet中的大卷积核,不仅能够保持原有的感受野,还能让网络变得更深。
而且,由于网络加深了,模型的非线性也增加了(一般情况下,卷积层指的都是2D卷积后接一个非线性激活函数ReLU)。因此,网络的特征表示能力也加强了(ability of representation learning)。
ips: 表示学习(representation learning)是什么?
"表示学习是指从原始数据中自动学习特征或表示的一种方法,而不是依赖于人工设计的特征。在传统的机器学习中,特征工程(feature engineering)是一个重要的步骤,需要人工设计和选择合适的特征以便于模型学习。但是,表示学习通过算法自动提取数据的特征,减少了对人工干预的依赖。"


VGG16各层feature map可视化实战
一般情况下,一旦模型训练好之后(本例中是用ImageNet预先训练好的VGG16模型)随便喂一副输入图像,就能得到分类结果。但为了更好的理解模型所学习到的卷积核究竟是什么样的?这些卷积核和输入图像卷积后会得到什么样的结果?之所以最终会习得这样的卷积核?
这些问题都可以通过观察卷积后得到的activation map/feature map帮助人们明白。实际上有点类似于debug,只需把所有的中间结果保留下来就好了。
Part I 用预先训练好的模型对图像分类
1,导入需要的用到的库函数
from tensorflow.keras.applications.vgg16 import VGG16,preprocess_input,decode_predictions
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
# 设置字体为 SimHei (黑体)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 避免中文字体显示不正常
plt.rcParams['axes.unicode_minus'] = False
2,导入基于ImageNet数据库预先训练好的Vgg16模型
为了看到prediction的分类结果,这里导入的是包含顶层(也就是全连接层FC和softmax层)的完整模型,并且命名为naive_model。
#使用基于imagenet预先训练好的模型
naive_model=VGG16(weights='imagenet')
3,导入原始输入图像,并对图像做适当的预处理以VGG16输入图像的要求
以一只螳螂为例,这是原始图像:

#load image同时resize到224x224的尺寸
myimg_path='images\mantis.jpg'
# 读取图像
myimg = image.load_img(myimg_path)
print(f"原始图像的尺寸为:{myimg.size}")
#imshow
fig=plt.figure()
plt.imshow(myimg)
plt.title("original image")
# 调整图像大小
myimg = myimg.resize((224, 224))
print(f"resize后的尺寸:{myimg.size}")
# 将图片转换为numpy数组
myimg_array = image.img_to_array(myimg)
# 对图片进行VGG16模型所需的预处理
myimg_array = preprocess_input(myimg_array)
#经过预处理后的图像
plt.figure()
plt.imshow(myimg_array)
plt.title("preprocessed image")
# 扩展维度以匹配模型期望的输入形状
myimg_array = np.expand_dims(myimg_array, axis=0)
print(f"拓展维度后的尺寸:{myimg_array.shape}")
这是经过预处理后的图像:

预处理过程共分为四步:1,把图像尺寸缩放为224x224。2,将图像类型转换为numpy数组。3,调用VGG16自带的preprocess函数。4,拓展一个维度。


2万+

被折叠的 条评论
为什么被折叠?



