Pytorch 模型构建方法

import torch
import torch.nn as nn
import torch.nn.functional as F


Pytorch基础构建模型方法

方法一:较为通用的方法

class Net(nn.Module):

  def __init__(self):

    self.conv = nn.Conv2d(in_channel,out_channel,kernel_size,stride,padding,bias)

    self.dense = dense1 = torch.nn.Linear(32 * 3 * 3, 128)

  def forward(self,x):

    x = F.max_pool2d(F.relu(self.conv(x)))

    x = x.view(x.size(0),-1)

    x = self.dense(x)

    x = F.sigmoid(x)

    return x

 

方法二:使用sequential进行包装

1、基本用法

class Net(nn.Module):

  def __init__(self):

    self.conv = nn.Sequential(

      nn.Conv2d(in_channel,out_channel,kernel_size,stride,padding,bias),

      nn.ReLU()

      nn.BatchNorm2d(out_Channel),

      nn.MaxPool2d(2)

)

    self.dense = nn.Sequential(

      nn.Linear(out_channel*W*H),

      nn.ReLU(),

)

  def forward(x):

    x = self.conv(x)

    x = x.view(x.size(0),-1)

    x = self.dense(x)

    return 0

 

2、可增加层次命名

class Net(nn.Module):

  def __init__(self):

    self.conv = nn.Sequential()

    self.conv.add_module('name',nn.Conv2d(in_channel,out_channel,kernel_size,stride,padding,bias),)

    self.conv.add_module('name',nn.ReLU())

    self.conv.add_module('name',nn.BatchNorm2d(out_Channel))

    self.conv.add_module('name',nn.MaxPool2d(2))

    self.dense = nn.Sequential()

    self.dense .add_module('name',nn.Linear(out_channel*W*H))

    self.dense .add_module('name',nn.ReLU())

  def forward(x):

    x = self.conv(x)

    x = x.view(x.size(0),-1)

    x = self.dense(x)

    return 0

 

3、使用字典的方式进行命名

class Net4(torch.nn.Module):
    def __init__(self):
        super(Net4, self).__init__()
        self.conv = nn.Sequential(
            OrderedDict(
                [
                    ("name", nn.Conv2d(in_channel,out_channel,kernel_size,stride,padding,bias),
                    ("name", nn.ReLU()),
                    ("name", nn.MaxPool2d(2))
                ]
            ))

        self.dense = torch.nn.Sequential(
            OrderedDict([
                ("name", nn.Linear(in_channel,out_channel,kernel_size,stride,padding,bias)),
                ("name", nn.ReLU())
            ])
        )

    def forward(self, x):
        conv_out = self.conv1(x)
        res = conv_out.view(conv_out.size(0), -1)
        out = self.dense(res)
        return out

四 使用ModuleList()进行构建

相比于sequential ,ModuleList可以进行改变顺序进行调用

class Net(nn.Module):
    def __init__(self, nf,t, activation='prelu', dropout=False, bn='batch', bias=False):
        super(Net, self).__init__()
        self.t = t
        self.down_convs = nn.ModuleList()
        for i in range(t):
            self.down_convs.append(
                ConvBlock(nf, nf * 2, kernel_size=3, stride=2, padding=1, activation=activation,
                          droput=dropout, norm=bn, bias=bias)
            )

    def forward(self, x):
            for i in range(self.t):
                feature_layer = self.down_convs[i](feature_layer)
            return feature_layer

posted on 2020-12-08 17:05  L丶Miao  阅读(161)  评论(0)    收藏  举报

导航