Pytorch(笔记6)--nn.Module功能详解

    在接触了之前所说的Conv,pool,Batchnorm,ReLU等方法都是神经网络中常见的操作,我们可以根据这些方法来自定义网络模型,也可以根据需求对经典模型进行调整,他们都继承共同的抽象类nn.Module,其中包含好了很多函数。

1.nn.Sequential

   这个方法中可以封装多个子类,注意,一定继承nn.Module的类,在调用的时候,可以使用下面的方法

net = nn.Sequential(
nn.Conv2d(3,32,3,1,1),
nn.MaxPool2d(2,2),
nn.ReLU(inplace=True),
nn.BatchNorm2d(32)
)
x = t.rand(1,3,32,32)
x = net(x)
x.shape

2.nn.parameters

  这个是一个很重要的方法,用于存储模型训练中所有的参数信息,我们可以自定义需要学习的内容,

  • 添加自定义参数到net.parameters中,
self.gamma = Parameter(torch.zeros(1))

就可以将我们自定义的参数加入到优化参数列表中了

  • 查看参数shape
net=nn.Sequential(nn.Linear(4,2),nn.Linear(2,2))
list(net.parameters())[0].shape #查询网络参数结构
  • 查看参数列表
in:dict(net.named_parameters()).items()

out:[('1.weight', Parameter containing:
  tensor([[ 0.2523,  0.7062],
          [-0.6563, -0.6892]], requires_grad=True)),
 ('0.bias', Parameter containing:
  tensor([0.3603, 0.4283], requires_grad=True)),
 ('1.bias', Parameter containing:
  tensor([ 0.2454, -0.0655], requires_grad=True)),
 ('0.weight', Parameter containing:
  tensor([[-0.1277, -0.3428, -0.1208,  0.2463],
          [ 0.0940,  0.0312,  0.3777, -0.2666]], requires_grad=True))]
  • 定义优化器
optim = optim.SGD(net.parameters(),lr = 0.1)

3.nn.to(device)

通常我们在训练的过程中,都会指定cuda,或者使用CPU进行训练,可以使用这种方法来实现,使网络在GPU上进行训练

device = t.device("cuda" if t.cuda.is_available() else "cpu") #如果GPU允许就使用GPU
net = net.to(device)

4.save and load 

在训练过程中达到一定的acc或者一定的epoch,我们就会使网络结果持久化到本地,避免一些服务器异常的情况,在新增数据进行训练的时候也可以使用预训练的模型上进行

  self.load_state_dict(torch.load(‘model.pth’))

  t.save(net.state_dict(), name)

5.train and test

     在训练过程中,没训练几个epoch或者一些batch,就要进行val操作,至于val和test的区别,就是我们高三时候的每周一小考和高考一样,“把周测当高考,把高考当周测”,这是我的母校绥化一中的标语,哈哈,会不会有学弟学妹在看这篇博客。

net.to(device)#加载网络模型到GPU
...
net.train() #调整到训练状态
...
with torch.no_grad(): #标记为验证状态 
net.eval()
...

6.impoement own layer 

 只要知道了规则,继承nn.Module,就可以实现我们自己的网络结构,下面我分享一个,我经常使用的base_module

class BasicModule(t.nn.Module):
    """
    封装了nn.Module,主要是提供了save和load两个方法
    """
    def __init__(self):
        super(BasicModule,self).__init__()
        self.model_name=str(type(self))# 默认名字

    def load(self, path):
        """
        可加载指定路径的模型
        """
        self.load_state_dict(t.load(path))

    def save(self, name=None):
        """
        保存模型,默认使用“模型名字+时间”作为文件名
        """
        if name is None:
            prefix = 'checkpoints/' + self.model_name + '_'
            name = time.strftime(prefix + '%m%d_%H:%M:%S.pth')
        t.save(self.state_dict(), name)
        return name
        """
        获取参数优化器信息
        """
    def get_optimizer(self, lr, weight_decay):
        return t.optim.Adam(self.parameters(), lr=lr, weight_decay=weight_decay)


class Flat(t.nn.Module):
    """
    把输入reshape成(batch_size,dim_length)
    """
    def __init__(self):
        super(Flat, self).__init__()
        #self.size = size

    def forward(self, x):
        return x.view(x.size(0), -1)

    这几个方法都是训练中很常用的,只要按下面的语法就可以实现我们自己的神经网络了。

class Modulename(t.nn.Module,args=):
    def __init__(self):
        super(Modulename,self).__init__()

    希望这些常见的方法对你有一点帮助,欢迎指正,沟通! 坚持一件事或许很难,但坚持下来一定很酷!^_^

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值