import torch.nn as nn
torch.version
除了nn别名以外,我们还引用了nn.functional,这个包中包含了神经网络中使用的一些常用函数,这些函数的特点是,不具有可学习的参数(如ReLU,pool,DropOut等),这些函数可以放在构造函数中,也可以不放,但是这里建议不放。
一般情况下我们会将nn.functional 设置为大写的F,这样缩写方便调用
import torch.nn.functional as F
一、常用操作
| 操作名 | 介绍 |
| — | — |
| nn.Conv2d | 在输入图像上应用2维卷积 |
| nn.MaxPool2d | 在输入图像上应用2维最大池化 |
| nn.AvgPool2d | 在输入图像上应用2维平均池化 |
| nn.ReLU | 应用非线性修正单元ReLU |
| nn.Linear | 对输入数据应用线性变换,也就是我们常说的全连接层 |
| nn.CrossEntropyLoss | 交叉熵损失函数 |
| nn.Upsample | 上采样,图像分割用的很多 |
| nn.Dropout | 应用Dropout层 |
| nn.MSELoss | 均方误差损失函数 |
| nn.BatchNorm1d | 应用BN层 |
因为方法太多,这里只是列举了一小部分,详细请自行去PyTorch官网查看。所列举的常用方法也只是以常用使用方式来进行举例(由于有些方法的参数实在是太多了,而且以我自己的能力也不一定能以书面文字的方式解释清楚)。
-
nn.Conv2d(in_channels,out_channels,kernel_size):可选参数这里省略了
-
in_channels(int):输入图像的通道数
-
out_channels(int):卷积生成的通道数
-
kernel_size(int or tuple):卷积核的size,如果是方形,用int;如果非方形,用tuple。
-
案例
With square kernels and equal stride
m = nn.Conv2d(16,33,3,stride = 2)
With square kernels and unequal stride and with padding
m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
input = torch.randn(20,16,50,100)
output = m(input)
-
nn.MaxPool2d(kernel_size,stride):这里列举了常用的几个参数,其余省略了
-
kernel_size(int or tuple):池化窗口size
-
stride(int or tuple):池化的步长
-
padding(int or tuple):池化的填充,默认为0
-
案例
pool of square window of size=3, stride=2
m = nn.MaxPool2d(3,stride = 2)
pool of non-square window
m = nn.MaxPool2d((3, 2), stride=(2, 1))
input = torch.randn(20, 16, 50, 32)
output = m(input)
-
nn.AvgPool2d(kernel_size,stride):这里列举了常用的几个参数,其余省略了
-
kernel_size(int or tuple):池化窗口size
-
stride(int or tuple):池化的步长
-
padding(int or tuple):池化的填充,默认为0
-
案例
pool of square window of size=3, stride=2
m = nn.AvgPool2d(3, stride=2)
pool of non-square window
m = nn.AvgPool2d((3, 2), stride=(2, 1))
input = torch.randn(20, 16, 50, 32)
output = m(input)
-
nn.Linear(in_features, out_features, bias)
-
in_features:输入特征数
-
out_features:输出特征数
-
bias:偏置
-
案例
m = nn.Linear(20, 30)
input = torch.randn(128, 20)
output = m(input)
print(output.size())
torch.Size([128, 30])
二、案例+相关代码注释
在这之前,首先我们需要了解一下PyTorch中已经给我们准备好的网络模型nn.Module。我们自己定义的网络模型只需要继承nn.Module,并实现它的forward()方法,PyTorch会根据Autograd,自动实现backward()函数,在forward函数中我们可以使用任何Tensor支持的函数,还可以使用if、for、print等Python语法,写法与标准Python写法是一致的。
class Net(nn.Module):
def init(self):
nn.Module子类的函数必须在构造函数中执行父类的构造函数
super(Net, self).init()
卷积层 '1’表示输入图片为单通道, '6’表示输出通道数,'3’表示卷积核为3*3
self.conv1 = nn.Conv2d(1, 6, 3)
#线性层,输入1350个特征,输出10个特征
self.fc1 = nn.Linear(1350, 10) #这里的1350是如何计算的呢?这就要看后面的forward函数
#正向传播
def forward(self, x):
print(x.size()) # 结果:[1, 1, 32, 32]
卷积 -> 激活 -> 池化
x = self.conv1(x) #根据卷积的尺寸计算公式,计算结果是30,具体计算公式后面第二章第四节 卷积神经网络 有详细介绍。
x = F.relu(x)
print(x.size()) # 结果:[1, 6, 30, 30]
x = F.max_pool2d(x, (2, 2)) #我们使用池化层,计算结果是15
x = F.relu(x)
print(x.size()) # 结果:[1, 6, 15, 15]
reshape,‘-1’表示自适应
#这里做的就是压扁的操作 就是把后面的[1, 6, 15, 15]压扁,变为 [1, 1350]
x = x.view(x.size()[0], -1)
print(x.size()) # 这里就是fc1层的的输入1350
x = self.fc1(x)
return x
net = Net()
print(net)
- 运行结果
Net(
(conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))
(fc1): Linear(in_features=1350, out_features=10, bias=True)
)
- 网络的可学习参数通过net.parameters()返回
for parameters in net.parameters():
print(parameters)
- 运行结果
Parameter containing:
tensor([[[[ 0.2745, 0.2594, 0.0171],
[ 0.0429, 0.3013, -0.0208],
[ 0.1459, -0.3223, 0.1797]]],
[[[ 0.1847, 0.0227, -0.1919],
[-0.0210, -0.1336, -0.2176],
[-0.2164, -0.1244, -0.2428]]],
[[[ 0.1042, -0.0055, -0.2171],
[ 0.3306, -0.2808, 0.2058],
[ 0.2492, 0.2971, 0.2277]]],
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
由于篇幅限制,小编在此截出几张知识讲解的图解
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
出几张知识讲解的图解**
[外链图片转存中…(img-8X0nHoib-1712804565557)]
[外链图片转存中…(img-ZVRt3w6E-1712804565558)]
[外链图片转存中…(img-y6dLJvVz-1712804565558)]
[外链图片转存中…(img-Hdzbh6WP-1712804565558)]
[外链图片转存中…(img-thl88XZn-1712804565558)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-29dHLI8J-1712804565559)]