PyTorch实战(X) - - 神经网络常见细节技巧

神经网络常见细节技巧

  • 定义模型时:
initrange = 0.5 / self.embed_size
       self.out_embed = nn.Embedding(self.vocab_size, self.embed_size, sparse=False)
       self.out_embed.weight.data.uniform_(-initrange, initrange) //权重初始化的一种方法
  • torch.bmm()为batch间的矩阵相乘(b,n,m)*(b,m,p)=(b,n,p)
  • 取出self.in_embed数据参数
 def input_embeddings(self):   // 取出self.in_embed数据参数
        return self.in_embed.weight.data.cpu().numpy()
  • USE CUDA
USE_CUDA = torch.cuda.is_available()
if USE_CUDA:
model = model.cuda()   
  • 余弦相似度
sklearn.metrics.pairwise.cosine_similarity(word1_embed, word2_embed))
  • 保存与加载
torch.save(model.state_dict(), "embedding-{}.th".format(EMBEDDING_SIZE))
model.load_state_dict(torch.load("embedding-{}.th".format(EMBEDDING_SIZE)))
  • 定义模型时权重初始化
def __init__()中self.init_weights()
def init_weights(self):
        initrange = 0.1
        self.encoder.weight.data.uniform_(-initrange, initrange)
        self.decoder.bias.data.zero_()
        self.decoder.weight.data.uniform_(-initrange, initrange)
  • 定义模型时,hidden初始化,若forward(self,input,hidden),则在后续调用hidden=model.init_hidden(),再将hidden传入
def init_hidden(self, bsz, requires_grad=True):
        weight = next(self.parameters())
        if self.rnn_type == 'LSTM':
            return (weight.new_zeros((self.nlayers, bsz, self.nhid), requires_grad=requires_grad),
                    weight.new_zeros((self.nlayers, bsz, self.nhid), requires_grad=requires_grad))
        else:
            return weight.new_zeros((self.nlayers, bsz, self.nhid), requires_grad=requires_grad)
  • 把一个hidden state和计算图之前的历史分离,避免梯度消失或爆炸
def repackage_hidden(h):
    if isinstance(h, torch.Tensor):
        return h.detach()
    else:
        return tuple(repackage_hidden(v) for v in h)
  • 根据epoch训练次数来调整学习率(learning rate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, 0.5)

在每次训练最后若模型效果较好,保存模型,否则scheduler.step()

  • 返回参数个数
def count_parameters(model):
return sum(p.numel() for p in model.parameters() if p.requires_grad)
  • glove 初始化模型
pretrained_embedding = TEXT.vocab.vectors // glove
model.embed.weight.data.copy_(pretrained_embedding)

UNK_IDX = TEXT.vocab.stoi[TEXT.unk_token]
model.embed.weight.data[PAD_IDX] = torch.zeros(EMBEDDING_SIZE)
model.embed.weight.data[UNK_IDX] = torch.zeros(EMBEDDING_SIZE)
  • torch.round()返回四舍五入最近的整数
torch.round(sigmoid(preds)
  • gradient clipping
torch.nn.utils.clip_grad_norm_(model.parameters(), 5.)#防止模型gradient太大
  • train和valuate时,valuate不需要计算梯度,不需要优化更新,过程虽然相似,却只需要返回评估结果
with torch.no_grad()
model.eval()
model.train()
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值