CNNs: AlexNet补充

article/2025/10/2 4:55:11

CNNs: AlexNet的补充

  • 导言
  • 对`AlexNet`模型进行调整
  • 模型不同层的表征
  • 其他探索
  • 总结

导言

上上篇和上一篇我们详细地讲述了AlexNet的网络结构和不同超参数对同一数据集的不同实验现象。

本节,我们就AlexNet的一些其他相关问题进行解剖,如修改AlexNet参数量调整和不同层的feature map表征的意义(当然,不同模型的不同层的feature map所表征的特征也有所不同,我们仅对模型做一个简单的探索)

AlexNet模型进行调整

本节,我们对AlexNet进行简单实验,将每一层的参数量减半(相当于Alex当初在一张显卡上的模型结构)。

相关代码如下:

import torch
import torch.nn as nn
from torchsummary import summaryclass AlexNet(nn.Module):def __init__(self, class_num = 5):super(AlexNet, self).__init__()self.features = nn.Sequential(# input[3, 227, 227]  output[48, 55, 55]nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=0),nn.ReLU(inplace=True),# output[48, 27, 27]nn.MaxPool2d(kernel_size=3, stride=2),# output[128, 27, 27]nn.Conv2d(48, 128, kernel_size=5, padding=2),nn.ReLU(inplace=True),# output[128, 13, 13]nn.MaxPool2d(kernel_size=3, stride=2),# output[192, 13, 13]nn.Conv2d(128, 192, kernel_size=3, padding=1),nn.ReLU(inplace=True),# output[192, 13, 13]nn.Conv2d(192, 192, kernel_size=3, padding=1),nn.ReLU(inplace=True),# output[128, 13, 13]nn.Conv2d(192, 128, kernel_size=3, padding=1),nn.ReLU(inplace=True),# output[128, 6, 6]nn.MaxPool2d(kernel_size=3, stride=2),)self.classifier = nn.Sequential(nn.Linear(128 * 6 * 6, 2048),nn.ReLU(inplace=True),nn.Dropout(p=0.5),nn.Linear(2048, 2048),nn.ReLU(inplace=True),nn.Linear(2048, class_num),)def forward(self, x):x = self.features(x)x = torch.flatten(x, start_dim=1)x = self.classifier(x)return x

以下是基于调整过AlexNet模型参数batch size为8和16的实验结果。
在这里插入图片描述
以下是基于未调整过AlexNet模型参数batch size为8和16的实验结果。
在这里插入图片描述
由实验结果表明,调整过AlexNet模型并没有未调整过模型的效果好。当然,我们并不是想要表明调整模型参数的效果没有原模型的效果好,模型的调整也需要综合数据集、超参数等各种因素去进行优化。模型的调整也有可能会对不同实验带来更好的效果,如ZFNet(这一篇文献我们将在下一个CNNs系列进行讲解)。

模型不同层的表征

为了能够窥视AlexNet卷积层的feature map,我们将AlexNet网络的编写稍作修改,其改变后的模型如下。

import torch
import torch.nn as nn
from torchsummary import summaryclass AlexNet(nn.Module):def __init__(self, class_num = 5):super(AlexNet, self).__init__()self.conv1 = nn.Sequential(# input[3, 224, 224]  output[96, 55, 55]nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=0),nn.ReLU(inplace=True),# output[96, 27, 27]nn.MaxPool2d(kernel_size=3, stride=2))self.conv2 = nn.Sequential(# output[256, 27, 27]nn.Conv2d(96, 256, kernel_size=5, padding=2),nn.ReLU(inplace=True),# output[256, 13, 13]nn.MaxPool2d(kernel_size=3, stride=2))self.conv3 = nn.Sequential(# output[384, 13, 13]nn.Conv2d(256, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),# output[384, 13, 13]nn.Conv2d(384, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),# output[256, 13, 13]nn.Conv2d(384, 256, kernel_size=3, padding=1),nn.ReLU(inplace=True),# output[256, 6, 6]nn.MaxPool2d(kernel_size=3, stride=2),)self.fc = nn.Sequential(nn.Linear(256 * 6 * 6, 2048),nn.ReLU(inplace=True),nn.Dropout(p=0.5),nn.Linear(2048, 2048),nn.ReLU(inplace=True),nn.Linear(2048, class_num),)def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)output = self.fc(x.view(-1, 256 * 6 * 6))return output

基于以上代码的修改,我们将网络结构调整为三个卷积层。(当然,为了能够看到更加细节的feture map我们还可以进行拆分)

首先,我们使用上一篇的结论进行训练,并将模型保存至model目录中。

epoch <= 18, lr = 0.01
epoch > 18 ,lr = 0.003
epochs = 150
batch_size = 16

然后,我们将训练好的模型加载进来并且使用训练好的模型对图像进行预测。项目源码.

import sys
sys.path.append('.')import cv2
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
from PIL import Image
from utils_module import param_settings
from torchvision.models.feature_extraction import get_graph_node_names
from torchvision.models.feature_extraction import create_feature_extractortransform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(227),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
model_path = param_settings.SAVE_PATH
load_model = torch.load(model_path)# nodes, _ = get_graph_node_names(load_model)
# print(nodes)feature_extractor = create_feature_extractor(load_model, return_nodes={"conv1":"output1","conv2":"output2","conv3":"output3","fc":"output4"})test_img_path = 'G:/learning/05dataset/pokeman/test/4.jpg'img = Image.open(test_img_path)
img = transform(img)#转换维度
img = img.unsqueeze(0).to(device)out = feature_extractor(img) 
size = len(out["output1"][0])
for i in range(0, size):plt.imshow(out["output1"][0].cpu()[i,:,:].detach().numpy())size = len(out["output2"][0])
for i in range(0, size):plt.imshow(out["output2"][0].cpu()[i,:,:].detach().numpy())size = len(out["output3"][0])
for i in range(0, size):plt.imshow(out["output3"][0].cpu()[i,:,:].detach().numpy())
# 这里没有分通道可视化
plt.imshow(out["output1"][0].cpu().transpose(0, 1).sum(1).detach().numpy())
plt.imshow(out["output2"][0].cpu().transpose(0, 1).sum(1).detach().numpy())
plt.imshow(out["output3"][0].cpu().transpose(0, 1).sum(1).detach().numpy())
plt.show()
nodes, _ = get_graph_node_names(load_model)
print(nodes)

可以使用get_graph_node_names获取网络结构,并使用create_feature_extractor进行提取对应结构的特征图。
我们使用的测试图片如图所示:
在这里插入图片描述
卷积网络1的输出特征图如图所示,输出feature mapshape为[96, 27, 27]:
在这里插入图片描述
卷积网络2的输出特征图如图所示,输出feature mapshape为[256, 13, 13]:
在这里插入图片描述
由实验结果表明,卷积网络2所表征的意义十分抽象,已经和原图像中物体相差较远。

卷积网络2的输出特征图如图所示,输出feature mapshape为[256, 6, 6]:
在这里插入图片描述
以上是对不同的卷积网络不同通道进行的抽样,可以看到,基本上从第二个卷积网络生成的feature map会越来越抽象,很难表示feature与原图中物体的关系。

下面是将三个卷积网络的生成的feature map没有拆分通道的图像:
在这里插入图片描述

其他探索

本节,我们验证了文献AlexNet中的一个结论:如果两幅图像产生的特征激活向量具有很小的欧几里得分离,我们可以说神经网络的更高层次认为它们是相似的。(If two images produce feature activation vectors with a small Euclidean separation, we can say that the higher levels of the neural network consider them to be similar)
在这里插入图片描述
上图是第一列中的五个ILSVRC-2010测试图像。剩余的列示出了在最后一个隐藏层中产生特征向量的六个训练图像,其具有与测试图像的特征向量的最小欧几里得距离。其原理与以图搜图的功能类似。

我们复现了这部分的实验,源码地址。
以下是部分实验结果展示,图中共有三行11张图像,第一行第一张图片是我们在网上随机找到的宝可梦图像,第二行和第三行是训练集中图像与测试图像的特征向量的最小欧几里得距离的前十张图像。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

至此,我们对AlexNet探究就结束了。当然,我们对AlexNet的探索仅仅是管中窥豹,下一篇CNNs系列的文章ZFNet将跟随文章对AlexNet做进一步的探索,以及对修改后的模型做进一步的探索!


http://chatgpt.dhexx.cn/article/cu4tQdXU.shtml

相关文章

深度学习-浅谈CNNs

偶尔看到了这篇文章&#xff0c;感觉作者写的很容易理解&#xff0c;对于初步认识CNNs有很大的帮助&#xff0c;若想查看原文&#xff0c;请点击此处。 关于神经网络的学习方法&#xff0c;总结起来的要点有以下几点&#xff1a; BP算法 激励函数正则化与交叉验证等其他防止过…

【GSCNN】GSCNN:Gated Shape CNNs for Semantic Segmentation论文记录

目录 简单不看版&#xff1a; 摘要 一、介绍 二、相关工作 三、Gated Shape CNN 代码 四、实验 五&#xff0e;总结 论文&#xff1a;https://arxiv.org/abs/1907.05740 代码&#xff1a;GitHub - nv-tlabs/GSCNN: Gated-Shape CNN for Semantic Segmentation (ICCV 2…

CNNs和视觉Transformer:分析与比较

探索视觉Transformer和卷积神经网络&#xff08;CNNs&#xff09;在图像分类任务中的有效性。 图像分类是计算机视觉中的关键任务&#xff0c;在工业、医学影像和农业等各个领域得到广泛应用。卷积神经网络&#xff08;CNNs&#xff09;是该领域的一项重大突破&#xff0c;被广…

你应该知道的9篇深度学习论文(CNNs 理解)

当时看到英文的博客&#xff0c;本想翻译给感兴趣的同学们看看&#xff0c;没想到已经有人翻译&#xff0c;于是进行了转载&#xff0c;留给自己和更多的人学习&#xff0c;本文仅供参考。 英文博客&#xff1a;https://adeshpande3.github.io/adeshpande3.github.io/The-9-Dee…

【神经网络】CNN

CNN工作原理笔记 卷积神经网络定义卷积运算池化激活函数全连接反向传播算法其他应用延伸知识 首先放个学习视频链接: 大白话讲解卷积神经网络工作原理. 卷积神经网络定义 CNN其实就相当于黑箱&#xff0c;有输入有输出 输入&#xff1a;二维像素阵列 输出&#xff1a;判决结果…

CNN+RNN

CNN,RNN(recurrent, 下同)结合到一起可以建立一个更好的model 1. CRNN&#xff08;先CNN&#xff0c;后RNN&#xff09; References: An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition 一般用于基…

CNNs: ZFNet之CNN的可视化网络介绍

CNNs: ZFNet之CNN的可视化网络介绍 导言Deconvnet1. Unpooling2. ReLU3. Transpose conv AlexNet网络修改AlexNet Deconv网络介绍特征可视化 导言 上一个内容&#xff0c;我们主要学习了AlexNet网络的实现、超参数对网络结果的影响以及网络中涉及到一些其他的知识点&#xff0…

吊炸天的CNNs,这是我见过最详尽的图解!(上)

导读&#xff1a;卷积神经网络&#xff08;CNNs&#xff09;在“自动驾驶”、“人脸识别”、“医疗影像诊断”等领域&#xff0c;都发挥着巨大的作用。这一无比强大的算法&#xff0c;唤起了很多人的好奇心。当阿尔法狗战胜了李世石和柯杰后&#xff0c;人们都在谈论“它”。但…

深度学习—CNN

CNN简介 卷积神经网络 – CNN 最擅长的就是图片的处理。它受到人类视觉神经系统的启发。 CNN 有2大特点&#xff1a; 能够有效的将大数据量的图片降维成小数据量能够有效的保留图片特征&#xff0c;符合图片处理的原则 目前 CNN 已经得到了广泛的应用&#xff0c;比如&…

吊炸天的CNNs,这是我见过最详尽的图解!(下)

【摘要】本文详细介绍了卷积神经网络的运行原理&#xff0c;特别是池化、全连接等过程。为了使大家更快、更轻松的入门&#xff0c;文章没有晦涩难懂的术语和公式&#xff0c;全部采用“图形”的方式来描述。文末的延展阅读部分&#xff0c;更加入了彩色图片卷积原理的手工演算…

CNNs:ZFNet之基于AlexNet特征可视化实验分析

CNNs:ZFNet之基于AlexNet特征可视化实验分析 导言基于AlexNet网络的实验分析实验一:不同卷积层特征提取分析实验二&#xff1a;不同卷积层提取特征收敛分析 ZFNet网络介绍基于ZFNet网络的实验分析实验三&#xff1a;针对AlexNet特征提取改善可视化实验四&#xff1a;特征不变性…

CNN详细学习

前馈神经网络 MLP&#xff1a;multi-layer percetron Feed Forward and Back error propagation解决异或划分问题 缺点&#xff1a; 容易过拟合容易陷入局部最优化梯度消失计算资源不充分&#xff0c;训练集小 DNN 深一点效果好&#xff0c;宽一点容易理解&#xff0c;发现…

CNNs 入门论文汇总

Introduction 本文主要总结了卷积神经网络在机器视觉领域的重要发展及其应用。我们将介绍几篇重要的公开发表的论文&#xff0c;讨论它们为何重要。前一半的论文&#xff08;AlexNet到ResNet&#xff09;将主要涉及整体系统架构的发展和演变&#xff0c;后一半论文将主要集中在…

论文阅读和分析:《DeepGCNs: Can GCNs Go as Deep as CNNs?》

下面所有博客是个人对EEG脑电的探索&#xff0c;项目代码是早期版本不完整&#xff0c;需要完整项目代码和资料请私聊。 数据集 1、脑电项目探索和实现(EEG) (上)&#xff1a;研究数据集选取和介绍SEED 相关论文阅读分析&#xff1a; 1、EEG-SEED数据集作者的—基线论文阅读和…

Gated-SCNN: Gated Shape CNNs for Semantic Segmentation

目录 作者 一、Model of Gated-SCNN 二、 Gated Shape CNN 1.Regular Stream 2.Shape Stream 3. Gate Conv Layer 4.ASPP 5 总代码 三 损失函数 1.BoundaryBCELoss 2.DualTaskLoss 作者 一、Model of Gated-SCNN 文章使用了双流CNN来处理语义分割中的边界问题&#xff0c;分为R…

(整理)吊炸天的CNNs,这是我见过最详尽的图解!(下)

之前在CSDN上看到这篇文章&#xff0c;觉得通俗易懂&#xff0c;写的非常好。不过近来再次查看&#xff0c;发现文章的照片莫名其妙的没有了&#xff0c;没有图就根本看不懂了。找到了之前关注的微信公众号&#xff1a;AI传送门 。 在里面找到了这篇文章&#xff0c;决定再把这…

CNNs详尽图解

已经成为每一个初入人工智能——特别是图像识别领域的朋友&#xff0c;都渴望探究的秘密。 本文通过“算法可视化”的方法&#xff0c;将卷积神经网络的原理&#xff0c;呈献给大家。教程分为上、下两个部分&#xff0c;通篇长度不超过7000字&#xff0c;没有复杂的数学公式&a…

学习笔记:利用CNNs进行图像分类

1.神经网络图像(CNNs)分类简介 本文将重点关注卷积神经网络&#xff0c;也被称为CNNs或Convnets。CNNs是一种特殊类型的神经网络&#xff0c;特别适合于图像数据。自2012年以来&#xff0c;ImageNet竞赛&#xff08;ImageNet&#xff09;一直由CNN架构赢得。 在本文中&#x…

(整理)吊炸天的CNNs,这是我见过最详尽的图解!(上)

之前在CSDN上看到这篇文章&#xff0c;觉得通俗易懂&#xff0c;写的非常好。不过近来再次查看&#xff0c;发现文章的照片莫名其妙的没有了&#xff0c;没有图就根本看不懂了。找到了之前关注的微信公众号&#xff1a;AI传送门 。 在里面找到了这篇文章&#xff0c;决定再把这…