经典的卷积神经网络模型 - AlexNet

经典的卷积神经网络模型 - AlexNet

flyfish
AlexNet 是由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在 2012 年提出的一个深度卷积神经网络模型,在 ILSVRC-2012(ImageNet Large Scale Visual Recognition Challenge 2012)竞赛中取得了显著的成果,标志着深度学习在计算机视觉领域的一个重要里程碑。

ILSVRC 是一个大型视觉识别挑战赛,基于 ImageNet 数据集,每年吸引众多研究团队参加。 ILSVRC-2012 包含超过 1000 个类别和约 1500 万张带有注释的图片,是一个非常庞大的数据集。 AlexNet 在 ILSVRC-2012 竞赛中获得了 top-5 测试错误率为 15.3%,远低于当时其他参赛模型的错误率,通常在 26% 左右。top-5 错误率指的是模型预测中包含正确答案的前五个预测中至少有一个正确的比例。

import torchvision.models as models# Load the pretrained AlexNet model
alexnet = models.alexnet(pretrained=True)# Print the structure of the AlexNet model
print(alexnet)
AlexNet((features): Sequential((0): Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))(1): ReLU(inplace=True)(2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(3): Conv2d(64, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(4): ReLU(inplace=True)(5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(6): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(7): ReLU(inplace=True)(8): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(9): ReLU(inplace=True)(10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(11): ReLU(inplace=True)(12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False))(avgpool): AdaptiveAvgPool2d(output_size=(6, 6))(classifier): Sequential((0): Dropout(p=0.5, inplace=False)(1): Linear(in_features=9216, out_features=4096, bias=True)(2): ReLU(inplace=True)(3): Dropout(p=0.5, inplace=False)(4): Linear(in_features=4096, out_features=4096, bias=True)(5): ReLU(inplace=True)(6): Linear(in_features=4096, out_features=1000, bias=True))
)

在 AlexNet 模型中,输入和输出在以下位置:

  1. 输入
  • 输入是通过模型的第一层 Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))。输入数据通常是形状为 (N, 3, H, W) 的张量,其中 N 是批次大小,3 是通道数(例如,RGB 图像),HW 是图像的高度和宽度。
  1. 输出
  • 输出是通过模型的最后一层 Linear(in_features=4096, out_features=1000, bias=True)。输出数据是形状为 (N, 1000) 的张量,其中 N 是批次大小,1000 是类别数量(即,模型预测的每个类别的概率)。
import torch
import torchvision.models as models# 加载预训练的 AlexNet 模型
alexnet = models.alexnet(pretrained=True)# 创建一个示例输入,形状为 (1, 3, 224, 224)
input_data = torch.randn(1, 3, 224, 224)# 通过模型进行前向传播,获取输出
output = alexnet(input_data)# 输出结果的形状
print("输入形状:", input_data.shape)
print("输出形状:", output.shape)
输入形状: torch.Size([1, 3, 224, 224])
输出形状: torch.Size([1, 1000])

AlexNet 模型的描述

  1. 原始图片 :3x224x224 三通道彩色图片

  2. 卷积层 1 :64核,11x11卷积核,stride=4,padding=2,输出64x55x55
    激活层 1 :ReLU
    池化层 1 :3x3池化核,stride=2,padding=0,输出64x27x27

  3. 卷积层 2 :192核,5x5卷积核,stride=1,padding=2,输出192x27x27
    激活层 2 :ReLU
    池化层 2 :3x3池化核,stride=2,padding=0,输出192x13x13

  4. 卷积层 3 :384核,3x3卷积核,stride=1,padding=1,输出384x13x13
    激活层 3 :ReLU

  5. 卷积层 4 :256核,3x3卷积核,stride=1,padding=1,输出256x13x13
    激活层 4 :ReLU

  6. 卷积层 5 :256核,3x3卷积核,stride=1,padding=1,输出256x13x13
    激活层 5 :ReLU
    池化层 3 :3x3池化核,stride=2,padding=0,输出256x6x6

  7. 全连接层 1 :4096个神经元,接Dropout(p=0.5)和ReLU
    全连接层 2 :4096个神经元,接Dropout(p=0.5)和ReLU
    全连接层 3 :1000个神经元做分类

自定义一个与PyTorch提供的AlexNet一样结构的模型

import torch
import torch.nn as nnclass AlexNet(nn.Module):def __init__(self, num_classes=1000):super(AlexNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(64, 192, kernel_size=5, stride=1, padding=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(192, 384, kernel_size=3, stride=1, padding=1),nn.ReLU(inplace=True),nn.Conv2d(384, 256, kernel_size=3, stride=1, padding=1),nn.ReLU(inplace=True),nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2))self.avgpool = nn.AdaptiveAvgPool2d((6, 6))self.classifier = nn.Sequential(nn.Dropout(),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplace=True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, num_classes),)def forward(self, x):x = self.features(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return x# 创建 AlexNet 实例
model = AlexNet(num_classes=1000)# 打印模型结构
print(model)

nn.MaxPool2d 计算过程和可视化

import torch
import torch.nn as nn# 创建一个示例输入,形状为 (1, 1, 4, 4)
input_data = torch.tensor([[[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]]], dtype=torch.float32)# 创建最大池化层
maxpool = nn.MaxPool2d(kernel_size=2, stride=2)# 计算最大池化层的输出
output = maxpool(input_data)
print(output)

在这里插入图片描述可视化代码

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
import imageiodef visualize_maxpool2d():input_data = torch.tensor([[[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]]], dtype=torch.float32)maxpool = nn.MaxPool2d(kernel_size=2, stride=2)original_data = input_data[0, 0].numpy()pooled_data = maxpool(input_data).numpy()[0, 0]frames = []fig, axes = plt.subplots(1, 2, figsize=(10, 4))# 绘制原始数据cax1 = axes[0].matshow(original_data, cmap='Blues')for (i, j), val in np.ndenumerate(original_data):axes[0].text(j, i, f'{val:.0f}', ha='center', va='center', color='red')axes[0].set_title('Original Data')fig.colorbar(cax1, ax=axes[0])# 初始化池化后的数据图cax2 = axes[1].matshow(np.zeros_like(pooled_data), cmap='Blues', vmin=0, vmax=pooled_data.max())axes[1].set_xticks([])axes[1].set_yticks([])axes[1].set_title(f'Max Pooled Data')fig.colorbar(cax2, ax=axes[1])# 更新函数def update_frame(i, j):sub_matrix = original_data[i*2:i*2+2, j*2:j*2+2]pooled_value = pooled_data[i, j]# 更新原始数据窗口的矩形框rect = plt.Rectangle((j*2-0.5, i*2-0.5), 2, 2, linewidth=2, edgecolor='yellow', facecolor='none')axes[0].add_patch(rect)# 更新池化后的数据new_pooled_data = np.zeros_like(pooled_data)new_pooled_data[i, j] = pooled_valuecax2.set_array(new_pooled_data)for (ii, jj), val in np.ndenumerate(new_pooled_data):if val > 0:axes[1].text(jj, ii, f'{val:.0f}', ha='center', va='center', color='red')plt.savefig(f'maxpool_{i}_{j}.png')frames.append(imageio.imread(f'maxpool_{i}_{j}.png'))rect.remove()  # 移除矩形框以便下一个帧绘制for i in range(2):for j in range(2):update_frame(i, j)# 保存为 GIF 动画imageio.mimsave('maxpool.gif', frames, fps=1,loop=0)# 可视化并保存 GIF 动画
visualize_maxpool2d()

nn.AdaptiveAvgPool2d 计算过程和可视化

import torch
import torch.nn as nn# 创建一个示例输入,形状为 (1, 1, 4, 4)
input_data = torch.tensor([[[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]]], dtype=torch.float32)# 创建自适应平均池化层
adaptive_avgpool = nn.AdaptiveAvgPool2d((2, 2))# 计算自适应平均池化层的输出
output = adaptive_avgpool(input_data)
print(output)
tensor([[[[ 3.5000,  5.5000],[11.5000, 13.5000]]]])

在这里插入图片描述
可视化代码

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
import imageiodef visualize_adaptiveavgpool2d():input_data = torch.tensor([[[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]]], dtype=torch.float32)adaptive_avgpool = nn.AdaptiveAvgPool2d((2, 2))original_data = input_data[0, 0].numpy()pooled_data = adaptive_avgpool(input_data).numpy()[0, 0]frames = []fig, axes = plt.subplots(1, 2, figsize=(10, 4))# 绘制原始数据cax1 = axes[0].matshow(original_data, cmap='Blues')for (i, j), val in np.ndenumerate(original_data):axes[0].text(j, i, f'{val:.0f}', ha='center', va='center', color='red')axes[0].set_title('Original Data')fig.colorbar(cax1, ax=axes[0])# 初始化池化后的数据图cax2 = axes[1].matshow(np.zeros_like(pooled_data), cmap='Blues', vmin=0, vmax=pooled_data.max())axes[1].set_xticks([])axes[1].set_yticks([])axes[1].set_title(f'Adaptive Avg Pooled Data')fig.colorbar(cax2, ax=axes[1])# 更新函数def update_frame(i, j):h_step = original_data.shape[0] // 2w_step = original_data.shape[1] // 2sub_matrix = original_data[i*h_step:(i+1)*h_step, j*w_step:(j+1)*w_step]pooled_value = pooled_data[i, j]# 更新原始数据窗口的矩形框rect = plt.Rectangle((j*w_step-0.5, i*h_step-0.5), w_step, h_step, linewidth=2, edgecolor='yellow', facecolor='none')axes[0].add_patch(rect)# 更新池化后的数据new_pooled_data = np.zeros_like(pooled_data)new_pooled_data[i, j] = pooled_valuecax2.set_array(new_pooled_data)for (ii, jj), val in np.ndenumerate(new_pooled_data):if val > 0:axes[1].text(jj, ii, f'{val:.1f}', ha='center', va='center', color='red')plt.savefig(f'adaptiveavgpool_{i}_{j}.png')frames.append(imageio.imread(f'adaptiveavgpool_{i}_{j}.png'))rect.remove()  # 移除矩形框以便下一个帧绘制for i in range(2):for j in range(2):update_frame(i, j)# 保存为 GIF 动画imageio.mimsave('adaptiveavgpool.gif', frames, fps=1,loop=0)# 可视化并保存 GIF 动画
visualize_adaptiveavgpool2d()

ReLU(Rectified Linear Unit)

ReLU ( x ) = ( x ) + = max ⁡ ( 0 , x ) \text{ReLU}(x) = (x)^+ = \max(0, x) ReLU(x)=(x)+=max(0,x)
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as pltdef relu(x):return np.maximum(0, x)# 生成输入数据
x = np.linspace(-10, 10, 400)
y = relu(x)# 创建图形
plt.figure(figsize=(8, 6))
plt.plot(x, y, label='ReLU(x)', color='b')
plt.title('ReLU Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.axhline(0, color='gray', lw=0.5)
plt.axvline(0, color='gray', lw=0.5)
plt.grid(True)
plt.legend()
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学习-list

List(列表的定义语法) [元素1, 元素2, 元素3, ......] 什么是元素? 数据容器内的每一份数据,都称之为元素 元素的类型有限制吗? 元素的数据类型没有任何限制,甚至元素也可以是列表,这样就定义了嵌套列表 但是打印…

【实践总结】Python使用Pandas 读取Excel文件,将其中的值转换为字符串的方法

假设你的Excel的列有一行是这个样子的; 如果直接解析就会按照float字段处理,所以现在需要将他们按照字符串去读取出来。正确的做法如下说生意 import pandas as pddf pd.read_excel(ExcelPath, sheet_nameSHEET,dtype{Version: str})在这里我们使用的方法就是dtyp…

怎么使用MarkDown画矩阵

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 今天写文章需要用到矩阵,记录一下 画矩阵需要用到特殊的语法 (1)画普通矩阵,不带括号的 $$be…

【3】系统标定

文章目录 雷达标定相机主雷达标定底盘动力学标定车辆循迹验证建图 雷达标定 主要是为了获得到lidar到imu的tf关系。imu为父坐标lidar为子坐标。其他雷达标定到主lidar坐标系下。 标定的结果都是生成一个是四元数。 #mermaid-svg-crOWRnT4UE0jtJVy {font-family:"trebuch…

linux内核驱动第一课(基于RK3568)

学习Linux驱动需要以下基础知识: C语言编程:掌握C语言是开发Linux驱动程序的基本要求。操作系统原理:了解操作系统的基本概念和原理,如进程管理、内存管理、中断处理等。Linux内核:熟悉Linux内核的结构和工作机制&…

Vue报错:Module not found: Error: Can‘t resolve ‘less-loader‘ in ‘文件地址‘

原因&#xff1a;Webpack无法找到 less-loader 模块&#xff0c;但在<style langless></style>中进行使用。less-loader 是一个Webpack的加载器&#xff0c;它用于将less文件编译成CSS。如果Webpack无法解析这个加载器&#xff0c;它就无法处理less文件&#xff0c…

【STM32HAL库学习】通信方式:USART、IIC、SPI

通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 通信接口区别 名称引脚双工时钟电平设备USARTTX、RX全双工异步单端点对点I2CSCL、SDA半双工同步单端多设备SPISCLK、MOSI、MISO、CS全双工同步单端多设备CANCAN_H、CAN_L半双工异步差分多设…

Halcon机器视觉定位--模板匹配

一 Halcon模板匹配归纳 二 形状匹配算子介绍 find_shape_model( Image ,//待搜索图像 ModelID, //模版图像 AngleStart, //起始角度 AngleExtent, //角度范围 MinScore, //最小匹配分数 NumMatches, //匹配数目 MaxOverlap, //重叠度 SubPixel, //搜索精度 Greediness ,//自信度…

【免费数字孪生平台】医院数据可视化的新选择

随着大数据、云计算、人工智能等技术的深度融合&#xff0c;医院数据智能化升级已成为推动医疗服务质量飞跃的关键力量。 医院作为守护生命健康的前沿阵地&#xff0c;每天处理着海量的医疗数据。从患者病历、检查结果到医疗设备运行状态、医疗资源分配&#xff0c;每一项数据都…

还用老气的Excel做报表?试试这款“免费”可视化工具,快速制作3D智慧社区!

随着科技的飞速发展&#xff0c;智慧社区已经成为现代城市管理的重要组成部分。作为这一领域的核心工具&#xff0c;3D智慧社区可视化大屏凭借其先进的技术和强大的功能&#xff0c;正在逐步改变我们的生活方式。今天给大家分享一个 基于山海鲸可视化开发的3D可视化大屏的案例—…

【哈尔滨等保测评标准解析】

哈尔滨信息安全等级保护测评&#xff08;等保测评&#xff09;标准解析如下&#xff1a; 一、总体概述 哈尔滨市在进行等保测评时&#xff0c;遵循国家统一的标准框架&#xff0c;并结合本省的实际情况&#xff0c;形成了具有地方特色的安全防护模式。等保测评的主要目的是确…

DFS练习

105 从前序与中序遍历序列构造二叉树 import java.util.HashMap; import java.util.Map;class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int val) {this.val val;} }public class Letcode105 {public TreeNode bulidTree(int[] preOrder, int[] inOrd…

探囊取物之多形式登录页面(基于BootStrap4)

基于BootStrap4的登录页面&#xff0c;支持手机验证码登录、账号密码登录、二维码登录、其它统一登录 低配置云服务器&#xff0c;首次加载速度较慢&#xff0c;请耐心等候&#xff1b;演练页面可点击查看源码 预览页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/pr…

上帝之眼(BEVSee):多相机间无需标定,将各自目标统一到同一坐标系下(代码开源,提供数据集)

Abstract 我们解决了一个新的问题&#xff0c;即在鸟瞰视角&#xff08;BEV&#xff09;中无需预先给定相机校准的多视角相机和目标注册问题。这将多视角目标注册问题提升到一个新的无需校准的阶段&#xff0c;从而极大地缓解了许多实际应用中的限制。然而&#xff0c;这是一个…

Unity 3D软件下载安装;Unity 3D游戏制作软件资源包获取!

Unity3D&#xff0c;它凭借强大的功能和灵活的特性&#xff0c;在游戏开发和互动内容创作领域发挥着举足轻重的作用。 作为一款顶尖的游戏引擎&#xff0c;Unity3D内置了先进的物理引擎——PhysX。这一物理引擎堪称业界翘楚&#xff0c;能够为开发者提供全方位、高精度的物理模…

认识软件测试

认识软件测试 软件测试能力要求一、软件测试的步骤1.需求2.测试点3.测试用例4.执行测试用例5.缺陷管理6.测试报告 一、测试用例&#xff08;test case&#xff09;**用例编写要素**&#xff1a; 测试用例设计方法1.等价类2.边界值3.判定表法4.场景法 软件测试能力要求 软件测试…

Linux系统中交叉编译opencv库

目标&#xff1a;将opencv进行交叉编译&#xff0c;使其能在rk3326板子上运行使用。 环境&#xff1a; ubuntu&#xff1a;18.04 opencv:4.5.4 opencv源码从挂网下载&#xff1a;opencv源码下载地址 交叉编译链&#xff1a;gcc-arm-10.3-linux-gun 一.环境准备 1.交叉编译链我…

CVPR 最佳学生论文,一键启动「BioCLIP 生物分类的层次预测 Demo」,帮你快速识别生物种类

很多生物由于外形的相似程度较高&#xff0c;难以使用肉眼进行区分。美国俄亥俄州立大学、微软研究院、加州大学欧文分校、伦斯勒理工学院共同发布了「BioCLlP: A Vision Foundation Model for the Tree of Life」&#xff0c; 基于 TREEOFLIFE-10M 这样的大规模标记数据集&…

【面试系列】AI研究员高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

HR人才测评,如何考察想象力?

什么是想象力&#xff1f; 想象力是指&#xff0c;人们通过在已有物质的基础上&#xff0c;通过大脑想象、加工、创造出新事物的能力&#xff0c;举一个非常简单的例子&#xff0c;在提到鸟这种生活的时候&#xff0c;大家会联想到各种各样不同鸟的品种。 在企业招聘中常常应…