如何保证神经网络训练结果的复现性
通过在python模块最开始设置随机种子,使得之后所有生成的随机数相同。
torch.manual_seed(10000)
np.random.seed(10000)
random.seed(10000)
DataLoader()多核加载
# 只有在数据量很大的时候使用多核加载才能提高速度,数据量小时反而会降低速度
train_loader = DataLoader(dataset=torch_dataset, batch_size=batch_size, shuffle=False) # , num_workers=2)
Linear() 层
nn.Linear()层的使用无需初始化weight和bias,这些pytorch都自动初始化了,如果有需要可以在forward()方法中手动初始化。
def init_weights(self):
init_range = 0.1
self.linear.bias.data.zero_()
self.linear.weight.data.uniform_(-init_range, init_range)
self.linear.weight.data.zero_()
LSTM()层输入输出
lstm层的输入可以为
output, hidden = self.lstm(x, hidden)
也可以让pytorch自动初始化hidden,即不传入hidden,写作
output, _ = self.lstm(x)
pytorch默认初始化相当于如下操作,建议使用默认的初始化。
def init_hidden(self, batch_size, required_grad=True):
weight = next(self.parameters())
new_weight = weight.new_zeros((self.num_layers, batch_size, self.hidden_size),
requires_grad=required_grad)
weight_tuple = (new_weight, new_weight)
return weight_tuple
def repackage_hidden(h):
if isinstance(h, torch.Tensor):
return h.