Utilities
工具函数
torch.nn.utils.clip_grad_norm(parameters, max_norm, norm_type=2)[source]
Clips gradient norm of an iterable of parameters.
正则項的值由所有的梯度计算出来,就像他们连成一个向量一样。梯度被in-place operation修改。
参数说明:
- parameters (Iterable[Variable]) – 可迭代的Variables,它们的梯度即将被标准化。
- max_norm (float or int) – clip后,gradients p-norm 值
- norm_type (float or int) – 标准化的类型,p-norm. 可以是inf 代表 infinity norm.
返回值:
所有参数的p-norm值。
torch.nn.utils.rnn.PackedSequence(_cls, data, batch_sizes)[source]
Holds the data and list of batch_sizes of a packed sequence.
All RNN modules accept packed sequences as inputs. 所有的RNN模块都接收这种被包裹后的序列作为它们的输入。
NOTE: 这个类的实例不能手动创建。它们只能被 pack_padded_sequence() 实例化。
参数说明:
- data (Variable) – 包含打包后序列的Variable。
- batch_sizes (list[int]) – 包含 mini-batch 中每个序列长度的列表。
torch.nn.utils.rnn.pack_padded_sequence(input, lengths, batch_first=False)[source]
这里的pack,理解成压紧比较好。 将一个 填充过的变长序列 压紧。(填充时候,会有冗余,所以压紧一下)
输入的形状可以是(T×B× )。T是最长序列长度,B是batch size,代表任意维度(可以是0)。如果batch_first=True的话,那么相应的input size就是(B×T×*)
。
Variable中保存的序列,应该按序列长度的长短排序,长的在前,短的在后。即input[:,0]代表的是最长的序列,input[:, B-1]保存的是最短的序列。
NOTE: 只要是维度大于等于2的input都可以作为这个函数的参数。你可以用它来打包labels,然后用RNN的输出和打包后的labels来计算loss。通过PackedSequence对象的.data属性可以获取 Variable。
参数说明:
- input (Variable) – 变长序列 被填充后的 batch
- lengths (list[int]) – Variable 中 每个序列的长度。
- batch_first (bool, optional) – 如果是True,input的形状应该是BTsize。
返回值:
一个PackedSequence 对象。
torch.nn.utils.rnn.pad_packed_sequence(sequence, batch_first=False)[source]
填充packed_sequence。
上面提到的函数的功能是将一个填充后的变长序列压紧。 这个操作和pack_padded_sequence()是相反的。把压紧的序列再填充回来。
返回的Varaible的值的size是 T×B×, T 是最长序列的长度,B 是 batch_size,如果 batch_first=True,那么返回值是B×T×。
Batch中的元素将会以它们长度的逆序排列。
参数说明:
- sequence (PackedSequence) – 将要被填充的 batch
- batch_first (bool, optional) – 如果为True,返回的数据的格式为 B×T×*。
返回值: 一个tuple,包含被填充后的序列,和batch中序列的长度列表。
例子:
import torchimport torch.nn as nnfrom torch.autograd import Variablefrom torch.nn import utils as nnutilsbatch_size = 2max_length = 3hidden_size = 2n_layers =1tensor_in = torch.FloatTensor([[1, 2, 3], [1, 0, 0]]).resize(2,3,1)tensorin = Variable( tensor_in ) #[batch, seq, feature], [2, 3, 1]seq_lengths = [3,1] # list of integers holding information about the batch size at each sequence step# pack itpack = nn_utils.rnn.pack_padded_sequence(tensor_in, seq_lengths, batch_first=True)# initializernn = nn.RNN(1, hidden_size, n_layers, batch_first=True)h0 = Variable(torch.randn(n_layers, batch_size, hidden_size))#forwardout, = rnn(pack, h0)# unpackunpacked = nn_utils.rnn.pad_packed_sequence(out)print(unpacked)