AGPCNet——Parameter()函数

parameter()函数:

在使用pytorch训练神经网络的时候,本质上面试训练一个函数,这个函数输入一个数据(比如cv中输入一张图像),输出一个预测(比如输出这一张图片中的物体是属于什么类别的)。然而在我们给定这个函数的结构(比如卷积、全连接等)之后,能学习的就是这个函数的参数了,我们再去设计一个损失函数,配合梯度下降法,使得我们学习到的函数(神经网络)能够尽量准确的完成预测的任务。

更加直白一点就是可以把这个函数理解为类型转换函数,将一个不可训练的类型tensor转换为可以训练的类型parameter并且将这个parameter绑定到这个module里面(net.parameter()中就有这个绑定的parameter,所以在参数优化的时候是可以进行优化的),所以经过类型转换这个self.v就变成了模型的一部分。成为了模型中的根据训练可以改动的参数了。使用这个函数的目的就是想让某些变量在学习的过程中不断地修改其自身的值以达到最优化。

torch.zero()函数:

torch.zeros(*sizes, out=None) → Tensor

返回一个全为标量0的张良,形状由可变参数size定义。

参数的含义:

size(int):整数序列,定义了输出的形状。

out(tensor,optional):结果张量

实战代码如下:

>>> torch.zeros(2, 3)
 
 0  0  0
 0  0  0
[torch.FloatTensor of size 2x3]生成2*3的张量矩阵
 
>>> torch.zeros(5)
 
 0
 0
 0
 0
 0
[torch.FloatTensor of size 5]
 
x=torch.zeros(2,3,4)
print(x)
 
tensor([[[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],
 
        [[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]]])生成2个3*4的矩阵
 
x=torch.zeros(2,3,4,5)
print(x)
 
tensor([[[[0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.]],
 
         [[0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.]],
 
         [[0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.]]],
 
 
        [[[0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.]],
 
         [[0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.]],
 
         [[0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0.]]]])
从后向前看,最后两位为数组的维度4*5,前一位3表示有3个4*5的矩阵,在前一位2表示,这样3个4*5的矩阵有2个,以此类推

参考地址:

https://blog.youkuaiyun.com/weixin_44966641/article/details/118730730?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165473591916781667840150%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165473591916781667840150&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-118730730-null-null.142^v11^pc_search_result_control_group,157^v13^control&utm_term=nn.Parameter&spm=1018.2226.3001.4187icon-default.png?t=M4ADhttps://blog.youkuaiyun.com/weixin_44966641/article/details/118730730?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165473591916781667840150%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165473591916781667840150&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-118730730-null-null.142^v11^pc_search_result_control_group,157^v13^control&utm_term=nn.Parameter&spm=1018.2226.3001.4187https://blog.youkuaiyun.com/qq_42518956/article/details/103876885?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165473952416780357219771%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165473952416780357219771&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-103876885-null-null.142^v11^pc_search_result_control_group,157^v13^control&utm_term=torch.zeros%281%29&spm=1018.2226.3001.4187icon-default.png?t=M4ADhttps://blog.youkuaiyun.com/qq_42518956/article/details/103876885?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165473952416780357219771%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165473952416780357219771&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-103876885-null-null.142^v11^pc_search_result_control_group,157^v13^control&utm_term=torch.zeros%281%29&spm=1018.2226.3001.4187

### `UNREFERENCED_PARAMETER` 的作用和使用场景 在驱动开发中,函数参数可能不会在函数体内被使用,但编译器会发出关于未使用参数的警告,尤其是在启用 `/W4` 级别警告的情况下。`UNREFERENCED_PARAMETER` 宏被用于抑制这些警告,确保代码在高警告级别下仍能顺利编译。 该宏定义在 `winnt.h` 头文件中,其展开形式为 `(P)`,其中 `P` 是传递的参数或表达式。它本质上是一个空操作,仅用于告知编译器该参数是故意未使用的,从而避免编译器报出无关警告[^1]。 例如,在 WDM 驱动中,`DriverEntry` 函数的两个参数 `DriverObject` 和 `RegistryPath` 在某些实现中可能未被使用,此时可以使用 `UNREFERENCED_PARAMETER` 来避免警告: ```cpp NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(DriverObject); UNREFERENCED_PARAMETER(RegistryPath); // 驱动初始化逻辑 return STATUS_SUCCESS; } ``` 在实际开发中,特别是在调试或重构代码阶段,开发者可能会临时移除某些参数的使用,此时该宏可以防止编译器发出不必要的警告,同时保留参数以便后续恢复使用。 ### 原理实现 `UNREFERENCED_PARAMETER(P)` 的实现本质上是一个强制类型转换表达式 `(void)(P)`,它将参数 `P` 转换为 `void` 类型,表示该变量被“使用”,但不执行任何操作。这种方式不会产生实际的运行时开销,仅用于满足编译器的语法检查。 其等效实现如下: ```cpp #define UNREFERENCED_PARAMETER(P) (void)(P) ``` 无论参数是基本类型还是指针类型,该宏都能安全地处理,避免了编译器对未使用变量的警告。 --- ### 示例代码 以下是一个使用 `UNREFERENCED_PARAMETER` 的完整驱动函数示例: ```cpp NTSTATUS DispatchCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp) { UNREFERENCED_PARAMETER(DeviceObject); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } ``` 在此函数中,`DeviceObject` 参数未被使用,因此使用 `UNREFERENCED_PARAMETER` 来避免编译器警告。 --- ### 总结 `UNREFERENCED_PARAMETER` 在驱动开发中是一个常见的宏,用于抑制编译器关于未使用参数的警告。它在 WDM 驱动和 KMDF 驱动中都适用,尤其适用于调试、重构或接口定义中暂时不需要使用某些参数的情况。其原理是通过将参数转换为 `void` 类型来模拟“使用”行为,从而避免编译器报错。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值