SZ:zip/内部函数外部函数/VGG模型/nn

news2025/4/8 14:37:37

zip:

  • -r recursion
  • -d delete
  • -m move (move隐藏的意思是,原文件会消失)想增加文件,不需要加参数
  • 什么参数也没有。如果zip压缩文件不存在,执行以上命令将会创建一个新的zip文件并将指定的文件添加进去。如果zip压缩文件已经存在,则新的文件将被追加到现有的zip文件中。

zip -r (recursively) SpikeZip.zip .\haq-master
在这里插入图片描述

内部函数,外部函数

如果不用nonlocal关键字,内部函数将会创建新的局部变量 index

def outer_function():
	index = 0
    def inner_function():
    	nonlocal index
        print("This is the inner function.")

    print("This is the outer function.")
    inner_function()

def another_function():
    inner_function()  # 这里会产生错误,因为 inner_function 不在该函数的作用域内

outer_function()
another_function()  # 这里会产生错误,因为 inner_function 不在该函数的作用域内

vscode ctrl+shift+z反撤销

VGG模型

__init__用来实例化vgg模型,总体架构分成五个layer用于特征提取和最后的classification用于分类。
每一个layer是一个列表,放到sequential容器里面。
这里说的layer是包含Con,BN,ReLU,Dropout四部分的,作为一个整体。注意,其实只有Con是决定out_channel的,即我们所说的W,后面只是对这个W参数的一些操作。
cfg中的数字代表经过每一层之后的特征向量的个数,即out_feature,作为下一层的input channel

'VGG16': [
        [64, 64, 'M'],
        [128, 128, 'M'],
        [256, 256, 256, 'M'],
        [512, 512, 512, 'M'],
        [512, 512, 512, 'M']
    ]
class VGG(nn.Module):
    def __init__(self, vgg_name, num_classes, dropout):
        super(VGG, self).__init__()
        self.init_channels = 3
        self.layer1 = self._make_layers(cfg[vgg_name][0], dropout)
        self.layer2 = self._make_layers(cfg[vgg_name][1], dropout)
        self.layer3 = self._make_layers(cfg[vgg_name][2], dropout)
        self.layer4 = self._make_layers(cfg[vgg_name][3], dropout)
        self.layer5 = self._make_layers(cfg[vgg_name][4], dropout)
        if num_classes == 1000:
            self.classifier = nn.Sequential(
                nn.Flatten(),
                nn.Linear(512*7*7, 4096),
                nn.ReLU(inplace=True),
                nn.Dropout(dropout),
                nn.Linear(4096, 4096),
                nn.ReLU(inplace=True),
                nn.Dropout(dropout),
                nn.Linear(4096, num_classes)
            )
        else:
            self.classifier = nn.Sequential(
                nn.Flatten(),
                nn.Linear(512, 4096),
                nn.ReLU(inplace=True),
                nn.Dropout(dropout),
                nn.Linear(4096, 4096),
                nn.ReLU(inplace=True),
                nn.Dropout(dropout),
                nn.Linear(4096, num_classes)
            )

        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
            elif isinstance(m, nn.BatchNorm2d):
                nn.init.constant_(m.weight, val=1)
                nn.init.zeros_(m.bias)
            elif isinstance(m, nn.Linear):
                nn.init.zeros_(m.bias)

    def _make_layers(self, cfg, dropout):
        layers = []
        for x in cfg:
            if x == 'M':
                layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
            else:
                layers.append(nn.Conv2d(self.init_channels, x, kernel_size=3, padding=1))
                layers.append(nn.BatchNorm2d(x))
                layers.append(nn.ReLU(inplace=True))
                layers.append(nn.Dropout(dropout))
                self.init_channels = x
        return nn.Sequential(*layers)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = self.layer3(out)
        out = self.layer4(out)
        out = self.layer5(out)
        out = self.classifier(out)
        return out
def vgg16(num_classes=10, dropout=0, **kargs):
    return VGG('VGG16', num_classes, dropout)

什么是神经元

参考这个
但具体什么意思fanin&fanout的定义,根据实际问题来。不过多赘述,这个已经通过实践学会了。

nn.linear()和nn.Conv2d() & 数据流

numpy格式的输出:
首先你要明确,如果你在程序中打印它们的类型,那么没有任何区别。通过np.array()定义的 numpy 数组,只有一种类型:<class ‘numpy.ndarray’>。
但是你要是打印他们的 shape ,区别立刻显现.

nn.linear()

简单过一遍流程。官方教程写的太好了!直接去看就行!
定义
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
self.weight = Parameter(torch.empty((out_features, in_features), **factory_kwargs))
下面是一个例子:重点在区分weight.shape & input,output.size & nn.Linear(in,out)不同维度代表的意思
《--------------------------------------------------------------------------------------------------------------------------------------------------------------------------》

m = nn.Linear(20, 30)
input = torch.randn(128, 20)
output = m(input)
print(output.size()) --> [128, 20] * [20, 30] ===> [128, 30]
print(m.weight.shape) --> [30, 20]!

in_features in_features (int) – size of each input sample
指的是输入的二维张量的大小,即输入的[batch_size, size]中的size
out_featuresout_features (int) – size of each output sample
指的是输出的二维张量的大小,即输出的二维张量的形状为[batch_size,output_size],当然,它也代表了该全连接层的神经元个数。
在这里插入图片描述

从输入输出的张量的shape角度来理解,相当于一个输入为[batch_size, in_features]的张量变换成了[batch_size, out_features]的输出张量。
《--------------------------------------------------------------------------------------------------------------------------------------------------------------------------》
从源码吃透:
让我们来看看逻辑:
首先要有定义,实例化Class linear第一步:看init
init中定义了许多内部的属性,是由你给定的参数初始化的,这样你就可以知道其内部属性和你给的参数的关系,你可以用.访问。可以看到self.weight使用parameter生成的,证明weight是可学习的元素。同时可以发现其torchsize是(out_features, in_features)
后面调用了类下的方法reset_parameters()后,完成初始化。

def __init__(self, in_features: int, out_features: int, bias: bool = True,
                 device=None, dtype=None) -> None:
        factory_kwargs = {'device': device, 'dtype': dtype}
        super().__init__()
        self.in_features = in_features
        self.out_features = out_features
        self.weight = Parameter(torch.empty((out_features, in_features), **factory_kwargs))
        if bias:
            self.bias = Parameter(torch.empty(out_features, **factory_kwargs))
        else:
            self.register_parameter('bias', None)
        self.reset_parameters()

实例化完成之后,我们还想知道需要传入和传出什么,这时候需要看的是forward方法实现。BTW,当今的forward不会需要你显式地调用。而是使用torch.nn.Sequential自动管理层的前向传播过程。
我们可以发现forward接受一个input参数,类型是Tensor,其返回值为Tensor
可以看到他调用的是F中的Linear方法。

def forward(self, input: Tensor) -> Tensor:
        return F.linear(input, self.weight, self.bias)

def extra_repr(self) -> str:
        return 'in_features={}, out_features={}, bias={}'.format(
            self.in_features, self.out_features, self.bias is not None
        )

那我们最后看一下forward具体怎么实现的:注意注释中的内容。
在这里插入图片描述
可以解释weight为什么是(out_features, in_features)。在实际计算的时候是对W求转置,与input做矩阵乘。
一切不明皆在代码中!

nn.Conv2d

定义:torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
在这里插入图片描述

layer.conv.weight.shape:`[ C o u t C_{out} Cout, C i n C_{in} Cin, H H H, W W W] 注意和input和output参数区分,也要和定义nn.Conv2d传入的参数区分。

if transposed:
  self.weight = Parameter(torch.empty((in_channels, out_channels // groups, *kernel_size), **factory_kwargs))
else:
  self.weight = Parameter(torch.empty((out_channels, in_channels // groups, *kernel_size), **factory_kwargs))
if bias:
  self.bias = Parameter(torch.empty(out_channels, **factory_kwargs))

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

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

相关文章

SpringBoot+Jpa+Thymeleaf实现增删改查

SpringBootJpaThymeleaf实现增删改查 这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例。 1、pom依赖 pom 包里面添加Jpa 和 Thymeleaf 的相关包引用 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.…

网络层IP协议的基本原理 数据链路层ARP协议 域名解析以及一些重要技术

目录 1 网络层IP协议协议头格式网段划分DHCPCIDR&#xff1a;基于子网掩码的划分方式特殊的IP号IP地址的数量限制私有IP地址和公网IP地址路由路由表 2 数据链路层 — 局域网的转发问题以太网认识以太网以太网帧格式局域网通信原理 MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对…

重要消息:这类PEFC证书即将失效!

【重要消息&#xff1a;这类PEFC证书即将失效&#xff01;】 所有按照2013年版标准颁发的PEFC证书都将于 2023年11月14日失效。 在此之前&#xff0c;PEFC执行标准为PEFC ST 2002:2013&#xff0c;现更改为PEFC ST 2002:2020&#xff0c;即从2013年版改为2020年版。 1. 如果您的…

中国嗅觉经济产业分析

随着人们对健康和福祉的重视程度不断提升&#xff0c;嗅觉行业也开始关注个人的舒适感和情绪平衡。香氛产品、空气清新剂和芳香疗法等产品受到越来越多人的青睐&#xff0c;帮助人们创造舒适、放松和愉悦的环境。也越来越多中国消费者对香水香氛有自己独特的作用感知。我们将这…

Windows Active Directory密码同步

大多数 IT 环境中&#xff0c;员工需要记住其默认 Windows Active Directory &#xff08;AD&#xff09; 帐户以外的帐户的单独凭据&#xff0c;最重要的是&#xff0c;每个密码还受不同的密码策略和到期日期的约束&#xff0c;为不同的帐户使用单独的密码会增加用户忘记密码和…

高校在线心理咨询系统的设计与实现(论文+源码)_kaic

高校在线心理咨询系统的设计与实现 摘 要 近年来,随着社会的发展&#xff0c;大学生面临的各方面压力越来越大&#xff0c;比如学习生 活的压力、角色转换、交际困难、情感困惑、就业困难等等&#xff0c; 因对这些压力处理 不当而导致的大学生心理健康问题越来越多&#xff0…

案例解析|河道水位及水资源远程监控方案

随着国家工业的发展&#xff0c;水资源越来越紧张&#xff0c;同时对于水污染加重&#xff0c;也导致可利用水资源越发稀缺&#xff0c;因此对河道水位进行监测&#xff0c;实现水资源的远程监控就显得非常重要。 河道水位及水资源远程监控方案&#xff0c;不仅可以对河道的水…

CASAtomic原子操作详解

一、CAS&#xff08;Compare And Swap&#xff09; 1、CAS介绍 CAS原理&#xff1a;假设有三个值&#xff0c;E&#xff08;旧值&#xff09;、U&#xff08;需要更新的值&#xff09;、V&#xff08;内存中真实的值&#xff09;&#xff0c;具体参照下图&#xff1a; 作用&a…

图论算法|深度优先搜索理论基础|797.所有可能的路径|广度优先搜索BFS理论基础|200. 岛屿数量

深度优先搜索&#xff08;dfs&#xff09;理论基础 dfs是可一个方向去搜&#xff0c;不到黄河不回头&#xff0c;直到遇到绝境了&#xff0c;搜不下去了&#xff0c;在换方向&#xff08;换方向的过程就涉及到了回溯&#xff09;。递归和回溯是相辅相成的 void dfs(参数) {if…

史上最全,接口测试-Fiddler抓包常用功能总结(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Fiddler中常用的功…

三、函数-1.概念和分类

一、定义 函数——是指一段可以直接被另一段程序调用的程序或代码。 程序或代码在MySQL内置了&#xff0c;可以直接调用这些函数。 二、作用 三、分类 字符串函数数值函数日期函数流程函数

性能测试之并发用户数的估计

在计算并发用户数之前&#xff0c;需要先了解2个概念。 并发用户&#xff1a;指的是现实系统中同时操作业务的用户&#xff0c;在性能测试工具中一般称为虚拟用户。并发用户这些用户的最大特征是和服务器产生了交互&#xff0c;这种交互既可以是单向的传输数据&#xff0c;也可…

【社媒营销】如何提升销量和品牌推广?

随着社交媒体的普及和发展&#xff0c;社媒营销已经成为了提升销量和品牌推广的重要方式。社媒营销不仅可以为企业带来更多的曝光率和知名度&#xff0c;还可以帮助企业与消费者建立更加亲密的联系&#xff0c;提升消费者忠诚度和购买意愿。本文一秒推小编将从以下几个方面探讨…

【论文阅读】Feature Inference Attack on Shapley Values

摘要 研究背景 近年来&#xff0c;解释性机器学习逐渐成为一个热门的研究领域。解释性机器学习可以帮助我们理解机器学习模型是如何进行预测的&#xff0c;它可以提高模型的可信度和可解释性。Shapley值是一种解释机器学习模型预测结果的方法&#xff0c;它可以计算每个特征对…

Fragment的基本用法、Fragment和活动间的通信、Fragment的生命周期、动态加载布局的技巧

一、Fragment的简单用法 1、制作Fragment 1.1 新建一个布局文件left_fragment.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"ve…

【小白必看】轻松获取王者荣耀英雄皮肤图片的Python爬虫程序

文章目录 前言项目运行效果图导入模块和库伪装请求头获取英雄列表遍历英雄列表创建英雄目录访问英雄主页并解析HTML代码获取皮肤名称下载皮肤图片完整代码总结 前言 当谈到王者荣耀游戏时&#xff0c;无法忽视的是其丰富多样的英雄皮肤。这些皮肤不仅为玩家提供了个性化的游戏…

文本预处理——文本特征处理

目录 文本特征处理n-gram特征文本长度规范 文本特征处理 n-gram特征 文本长度规范

《面试1v1》Kafka消息是采用Pull还是Push模式

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

(学习笔记-硬件结构)CPU如何执行程序?

冯诺依曼模型 冯诺依曼模型主要由五部分组成&#xff1a;运算器、控制器、存储器、输入设备、输出设备。 控制器&#xff08;Control Unit&#xff09;&#xff1a;从内存中取指令、翻译指令、分析指令&#xff0c;然后根据指令的内存向有关部件发送控制命令&#xff0c;控制相…

E2E工程问题:小周期转大周期Gateway

摘要&#xff1a; 本文讨论一个具体的工程问题&#xff0c;E2E报文对应的信号&#xff0c;由小周期转大周期导致的E2E校验失败问题。 工程中&#xff0c;网关节点很重要的一个功能就是路由。当然&#xff0c;E2E&#xff08;End to End&#xff09;报文也可路由&#xff0c;但…