pytorch resize函数,pytorch实现resnet50
本文主要介绍pytorch常用函数的定义和resnet模型的修改实例。有需要的朋友可以借鉴一下,希望能有所帮助。祝你进步很大,早日升职加薪。
00-1010模型定义常用函数使用神经网络。Parameter()来设计新图层nn . sequential nn . modulelist()nn . module prediction()nn . flatten模型修改案例修改模型图层添加外部输入
目录
模型定义常用函数
进口火炬
从火炬进口nn
类MyLinear(nn。模块):
def __init__(自身,输入特征,输出特征):
超级()。__init__()
自重=nn。参数(torch.randn(in_features,out_features))
self.bias=nn参数(torch.randn(out_features))
定义转发(自身,输入):
返回(输入@自身重量)自身偏差
利用nn.Parameter()设计新的层
一个有序容器,神经网络模块会按照传入构造函数的顺序添加到计算图中进行执行,以神经网络模块为元素的有序字典也可以作为传入参数。顺序适用于快速验证结果,易于阅读。但是,顺序的使用也会使模型定义失去灵活性。例如,当需要在模型中间添加外部输入时,它不适合顺序实现。
net=nn。顺序(
( fc1 ,MyLinear(4,3)),
(‘act’,nn。ReLU()),
( fc2 ,MyLinear(3,1))
)
nn.Sequential
该列表接收属于nn的子模块(或层)的表。模块类)作为输入,然后它还可以像list一样执行追加和扩展操作。同时,子模块或层的权重将被自动添加到网络中。
net=nn。ModuleList([nn。线性(784,256),nn。ReLU()])
Net.append (nn.linear (256,10)) # #追加操作类似于List
Print(net[-1]) #索引访问like列表
打印(网络)
线性(输入特征=256,输出特征=10,偏差=真)
模块列表(
(0):线性(输入特征=784,输出特征=256,偏差=真)
(1): ReLU()
(2):线性(输入特征=256,输出特征=10,偏差=真)
)
需要注意的是nn。ModuleList没有定义网络,它只是将不同的模块存储在一起。
ModuleList列表中元素的顺序并不代表它们在网络中的真实位置顺序,只有在forward函数指定了各层的顺序后,模型的定义才算完成。
具体实现可以用for循环来完成:
班级模型(nn。模块):
def __init__(self,):
超级()。__init__()
self.modulelist=.
.
定义向前(自身,x):
用于self.modulelist:中的层
x=层(x)
返回x
nn.ModuleList()
国防部;摩登派青年
uleDict和ModuleList的作用类似,只是ModuleDict能够更方便地为神经网络的层添加名称。
net = nn.ModuleDict({linear: nn.Linear(784, 256),
act: nn.ReLU(),
})
net[output] = nn.Linear(256, 10) # 添加
print(net[linear]) # 访问
print(net.output)
print(net)
Linear(in_features=784, out_features=256, bias=True)Linear(in_features=256, out_features=10, bias=True)
ModuleDict(
(act): ReLU()
(linear): Linear(in_features=784, out_features=256, bias=True)
(output): Linear(in_features=256, out_features=10, bias=True)
)
ModuleList和ModuleDict在某个完全相同的层需要重复出现多次时,非常方便实现,可以一行顶多行;当我们需要之前层的信息的时候,比如 ResNets 中的残差计算,当前层的结果需要和之前层中的结果进行融合,一般使用 ModuleList/ModuleDict 比较方便。
nn.Flatten
展平输入的张量: 28x28 -> 784
input = torch.randn(32, 1, 5, 5)m = nn.Sequential(
nn.Conv2d(1, 32, 5, 1, 1),
nn.Flatten()
)
output = m(input)
output.size()
模型修改案例
有了上面的一些常用方法,我们可以修改现有的一些开源模型,这里通过介绍修改模型层、添加额外输入的案例来帮助我们更好地理解。
修改模型层
以pytorch官方视觉库torchvision预定义好的模型ResNet50为例,探索如何修改模型的某一层或者某几层。
我们先看看模型的定义:
import torchvision.models as modelsnet = models.resnet50()
print(net)
ResNet((conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU(inplace=True)
(maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
(layer1): Sequential(
(0): Bottleneck(
(conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
..............
(avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
(fc): Linear(in_features=2048, out_features=1000, bias=True)
)
为了适配ImageNet,fc层输出是1000,若需要用这个resnet模型去做一个10分类的问题,就应该修改模型的fc层,将其输出节点数替换为10。另外,我们觉得一层全连接层可能太少了,想再加一层。
可以做如下修改:
from collections import OrderedDictclassifier = nn.Sequential(OrderedDict([(fc1, nn.Linear(2048, 128)),
(relu1, nn.ReLU()),
(dropout1,nn.Dropout(0.5)),
(fc2, nn.Linear(128, 10)),
(output, nn.Softmax(dim=1))
]))
net.fc = classifier # 将模型(net)最后名称为“fc”的层替换成了我们自己定义的名称为“classifier”的结构
添加外部输入
有时候在模型训练中,除了已有模型的输入之外,还需要输入额外的信息。比如在CNN网络中,我们除了输入图像,还需要同时输入图像对应的其他信息,这时候就需要在已有的CNN网络中添加额外的输入变量。
基本思路是:将原模型添加输入位置前的部分作为一个整体,同时在forward中定义好原模型不变的部分、添加的输入和后续层之间的连接关系,从而完成模型的修改。
我们以torchvision的resnet50模型为基础,任务还是10分类任务。不同点在于,我们希望利用已有的模型结构,在倒数第二层增加一个额外的输入变量add_variable来辅助预测。
具体实现如下:
class Model(nn.Module):def __init__(self, net):
super(Model, self).__init__()
self.net = net
self.relu = nn.ReLU()
self.dropout = nn.Dropout(0.5)
self.fc_add = nn.Linear(1001, 10, bias=True)
self.output = nn.Softmax(dim=1)
def forward(self, x, add_variable):
x = self.net(x)
# add_variable (batch_size, )->(batch_size, 1)
x = torch.cat((self.dropout(self.relu(x)), add_variable.unsqueeze(1)),1)
x = self.fc_add(x)
x = self.output(x)
return x
修改好的模型结构进行实例化,就可以使用
import torchvision.models as modelsnet = models.resnet50()
model = Model(net).cuda()
# 使用时输入两个inputs
outputs = model(inputs, add_var)
参考资料:
Pytorch模型定义与深度学习自查手册
以上就是pytorch常用函数定义及resnet模型修改实例的详细内容,更多关于pytorch函数resnet模型修改的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。