Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

训练神经网络的一些技巧(1)

view函数

主要用法如下,参数中的-1代表补全维度

import torch

a = torch.Tensor(2,3)
print(a)

# tensor([[0.0000, 0.0000, 0.0000],

# [0.0000, 0.0000, 0.0000]])

print(a.view(1,-1))

# tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]])


随机选择 batch

可以利用random.choice(a) 函数,从a 中随机选取一个。下面可以作为一个模板,当你需要选取一个 batchsize 的训练数据时

[random.choice(pairs) for _ in range(batch_size)]


让一个 batch 所有的向量补全到相同长度

使用以下代码,输入一个 batch

def zeroPadding(l, fillvalue=PAD_token):
    return list(itertools.zip_longest(*l, fillvalue=fillvalue))


具体zip_longest 使用方法如下

itertools.zip_longest(*iterables, fillvalue=None)


保存模型的状态

pytorch 提供了方法 torch.save()torch.load() 供我们保存和加载模型

torch.save(obj, f)
torch.load(f)


其中obj 可以是任何东西,比如词典,类,Tensor,下面是一个实际例子,可以作为模板写入代码:

torch.save({
                'iteration': iteration,
                'en': encoder.state_dict(),
                'de': decoder.state_dict(),
                'en_opt': encoder_optimizer.state_dict(),
                'de_opt': decoder_optimizer.state_dict(),
                'loss': loss,
                'voc_dict': voc.__dict__,
                'embedding': embedding.state_dict()
            }, os.path.join(directory, '{}_{}.tar'.format(iteration, 'checkpoint')))


logging 记录训练过程

在以前如果不用 loggingbug 我都是用的 debug,但是训练过程数据量大,然后变量维度也大,一步一步调谁顶得住啊,所以可以用 logging 记录训练的过程。

首先先引入包,设置配置

import logging
logging.basicConfig(filename='train.log',
                    filemode='w',
                    level=logging.DEBUG,
                    format='%(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    )


对于你要记录的信息,根据下面的例子来改动:

logging.debug(f'after encodeing, we get encoder outputs {encoder_outputs.shape};ecoder_hidden{encoder_hidden.shape}')

Share

You may also like...

发表评论