最全最详细的PyTorch神经网络创建~
话不多说直接开始~
神经网络的创建步骤
- 定义模型类,需要继承
nn.Module
- 定义各种层,包括卷积层、池化层、全连接层、激活函数等等
- 编写前向传播,规定信号是如何传输的
可以用 torchsummary
查看网络结构,如果没有的话,使用pip命令进行安装
Module: 神经网络的模板
import torch.nn as nn import torch.nn.functional as F class Model(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(1,20, 5) self.conv2 = nn.Conv2d(20, 50, 5) def forward(self, x): x = F.relu(self.conv1(x)) return F.relu(self.conv2(x))
神经网络中常见的各种层
常见的层包括:卷积层,池化层,全连接层,正则化层,激活层
导入层有两种方法:
一种是将其看作一个类,在torch.nn
里面
另一种是将其看作一个函数,在torch.nn.functional
里面可以调用
全连接层
全连接层又称为线性层,所以函数名叫 Linear
,执行的操作是𝑦=𝑥𝐴𝑇+𝑏
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
- in_feature代表输入数
- out_features代表输出数,即神经元数量
m = nn.Linear(2,3) input = torch.randn(5, 2) ouput = m(input) print(ouput.size()) 输出:torch.Size([5, 3])
先搭建个只有一层的网络,用 torchsummry
查看网络结构
from torch import nn from torchsummary import summary class NeuralNetwork( nn . Module): def _init_( self) : super()._init___() self.fc = nn.Linear(10,1,bias=False)# 如果 bias=True(默认),则有11个参数 def forward(self, x): x = self.fc(x) return x if _name_ == '_main__': network = NeuralNetwork()# print( network) summary ( network,(10,))
自定义输入到网络中,得到输出
import torch from torch import nn from torchsummary import summary class NeuralNetwork ( nn.Module): def _init_( self): super()._init___() self.fc = nn.Linear( 10,1) def forward(self,x ): x = self.fc(x) return x if _name_ == '_main_': network = NeuralNetwork() input = torch.randn(10) print("input = " ,input) output = network( input) print( "output = ", output) result = output. detach( ) .numpy() print( "result = " , result)
多个 FC 层之间可以连接起来
class NeuralNetwork( nn.Module) : def _init_( self): super()._init_() self.fc_1 = nn.Linear ( 1000, 100) self.fc_2 = nn.Linear ( 100,10) self.fc_3 = nn.Linear( 10,5) def forward( self,x): ×= self.fc_1(x) ×= self.fc_2(x) x= self.fc_3(x) return x
激活函数
常见的激活函数包括 sigmoid
,relu
,以及softmax
Sigmoid
sigmoid是早期的激活函数
- 将所有值压缩到0-1之间
ReLU
ReLU激活函数常放在全连接层、以及卷积层后面
调用方法都放在 nn.ReLU()
Softmax
softmax是在分类当中经常用到的激活函数,用来放在全连接网络的最后一层,Softmax函数通常用于多类分类问题的输出层,将输出转换为概率分布的形式。
import torch import torch.nn as nn m=nn.Softmax( dim=1) input = torch.randn(4,3) output = m( input)
- nn.softmax的dim参数表示在哪个维度上进行softmax操作。默认值为1,表示在输入张量的第二个维度(即列)上进行softmax操作。
随机失活方法Dropout
当 FC
层过多,容易对其中某条路径产生依赖,从而使得某些参数未能训练起来
为了防止上述问题,在 FC
层之间通常还会加入随机失活功能,也就是Dropout
层
它通过在训练过程中随机失活一部分神经元,从而增强模型的泛化能力。
m=nn.Dropout( p=0.5) input = torch.randn(6,8) output = m( input)
- 将一个列表,随机将一些值变为0
全连接网络处理一维信息
搭建以上的网络结构 ,组合全连接层,dropout层,激活函数,我们就可以构建出一个完整的全连接网络结构:
import torch from torch import nn from torchsummary import summary class NeuralNetwork( nn.Module): def _init_( self): super()._init_() self.relu = nn.ReLU() self.softmax = nn.softmax(dim=1) self.dropout = nn.Dropout(0.5) self.fc_1 = nn.Linear(1000, 100) self.fc_2 = nn.Linear(100,10) self.fc_3 = nn.Linear(10, 5) def forward(self, x): x = x.view(-1,1000)# view的存在,可以自动适应batchsize x = self.dropout( self.relu( self.fc_1(x) ) ) x = self.dropout( self.relu( self.fc_2(x) ) ) x= self.softmax ( self.fc_3(x)) return x
全连接网络处理二维图像
使用全连接网络处理二维图像信息,当二维特征(Feature Map)转为一维特征时,需要从高维压缩成一维,这时候可以用 tensor.view()
,或者用nn.Flatten(start_dim=1)
import torch import torch.nn as nn input_tensor = torch.randn(2, 3, 4) flatten_layer = nn.Flatten(start_dim=1) output_tensor = flatten_layer(input_tensor) print("Input Tensor:") print(input_tensor) print("Output Tensor:") print(output_tensor) Input Tensor: tensor([[[-0.5968, -0.0790, 0.0597, -0.2250], [ 0.1564, -0.1564, -0.0790, -0.1564], [-0.1564, -0.1564, -0.1564, -0.1564]], [[ 0.1564, -0.1564, -0.1564, -0.1564], [-0.1564, -0.1564, -0.1564, -0.1564], [-0.1564, -0.1564, -0.1564, -0.1564]]]) Output Tensor: tensor([[-0.5968, -0.0790, 0.0597, -0.2250, 0.1564, -0.1564, -0.0790, -0.1564], [-0.1564, -0.1564, -0.1564, -0.1564, -0.1564, -0.1564, -0.1564, -0.1564]])
PyTorch中的模型创建(二)+https://developer.aliyun.com/article/1544697?spm=a2c6h.13148508.setting.24.2a1e4f0e5cwuHg