对于自动求导的理解:https://blog.csdn.net/qjk19940101/article/details/79557204
对nn.Linear的理解: https://blog.csdn.net/dss_dssssd/article/details/82977170
torch.arange
torch.arange(start, end, step=1, out=None) → Tensor
返回一个1维张量,长度为 floor((end−start)/step)。包含从start
到end
,以step
为步长的一组序列值(默认步长为1)。
参数:
例子:
>>> torch.arange(1, 4)
1
2
3
[torch.FloatTensor of size 3]
>>> torch.arange(1, 2.5, 0.5)
1.0000
1.5000
2.0000
[torch.FloatTensor of size 3]
torch.ones
torch.ones(*sizes, out=None) → Tensor
返回一个全为1 的张量,形状由可变参数sizes
定义。
参数:
>>> torch.ones(2, 3)
1 1 1
1 1 1
[torch.FloatTensor of size 2x3]
>>> torch.ones(5)
1
1
1
1
1
[torch.FloatTensor of size 5]
torch.normal()
torch.normal(means, std, out=None)
返回一个张量,包含从给定参数means
,std
的离散正态分布中抽取随机数。 均值means
是一个张量,包含每个输出元素相关的正态分布的均值。 std
是一个张量,包含每个输出元素相关的正态分布的标准差。 均值和标准差的形状不须匹配,但每个张量的元素个数须相同。
参数:
torch.normal(means=torch.arange(1, 11), std=torch.arange(1, 0, -0.1))
1.5104 #从N(1,1)中抽取随机数
1.6955 #从N(2,0.9)中抽取随机数
2.4895 #从N(3,0.8)抽取随机数
4.9185
4.9895
6.9155
7.3683
8.1836
8.7164
9.8916 #从N(9,0.1中抽取随机数)
[torch.FloatTensor of size 10]
Linear layers
class torch.nn.Linear(in_features, out_features, bias=True)
对输入数据做线性变换:y=Ax+b
参数:
形状:
变量:
例子:
>>> m = nn.Linear(20, 30)
>>> input = autograd.Variable(torch.randn(128, 20))
>>> output = m(input)
>>> print(output.size())
torch.nn.GRU(*args, **kwargs)
z t z_t zt是更新门, r t r_t rt控制 h t h_t ht的下一个候选值 n t n_t nt与 h t − 1 h_{t-1} ht−1有多大的相关性, n t n_t nt是候选值, h t h_t ht是t时刻的隐藏层状态
参数说明:
默认为True
。默认为False
dropout
,该参数的默认值为0。丢失概率的意思是,若丢失概率为p,则每一个输出节点以概率 p 置0(不工作)
Inputs: input, h_0
packed variable
。Outputs: output, h_n
torch.nn.utils.rnn.PackedSequence
,那么输出也是torch.nn.utils.rnn.PackedSequence
。变量:
weight_ih_l[k] – 第k层可学习的input-hidden权重( W i r ∣ W i i ∣ W i n W_{ir}|W_{ii}|W_{in} Wir∣Wii∣Win),形状为(input_size x 3*hidden_size)
weight_hh_l[k] – 第k层可学习的hidden-hidden权重( W h r ∣ W h i ∣ W h n W_{hr}|W_{hi}|W_{hn} Whr∣Whi∣Whn),形状为(hidden_size x 3*hidden_size)。
bias_ih_l[k] – 第k层可学习的input-hidden偏置( b i r ∣ b i i ∣ b i n b_{ir}|b_{ii}|b_{in} bir∣bii∣bin),形状为( 3*hidden_size)
bias_hh_l[k] – 第k层可学习的hidden-hidden偏置( b h r ∣ b h i ∣ b h n b_{hr}|b_{hi}|b_{hn} bhr∣bhi∣bhn),形状为( 3*hidden_size)。
例子:
>>> rnn = nn.GRU(10, 20, 2)
>>> input = torch.randn(5, 3, 10)
>>> h0 = torch.randn(2, 3, 20)
>>> output, hn = rnn(input, h0)
torch.nn.utils.rnn.pack_padded_sequence(input, lengths, batch_first=False)
这里的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的形状应该是B*T*size
。
返回值:
一个PackedSequence
对象。
torch.nn.utils.rnn.pad_packed_sequence(sequence, batch_first=False)
填充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中序列的长度列表。
注:不管 batch_first 是否是True,都会输出这个长度列表, 即输出填充前每个批次的长度。这里的长度指的是行数。
import torch
import torch.nn as nn
from torch.autograd import Variable
from torch.nn import utils as nn_utils
batch_size = 2
max_length = 3
hidden_size = 2
n_layers =1
tensor_in = torch.FloatTensor([[1, 2, 3], [1, 0, 0]]).resize_(2,3,1)
tensor_in = 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 it
pack = nn_utils.rnn.pack_padded_sequence(tensor_in, seq_lengths, batch_first=True)
# initialize
rnn = nn.RNN(1, hidden_size, n_layers, batch_first=True)
h0 = Variable(torch.randn(n_layers, batch_size, hidden_size))
#forward
out, _ = rnn(pack, h0)
# unpack
unpacked = nn_utils.rnn.pad_packed_sequence(out)
print(unpacked)
select(dim, index) → Tensor or number
在给定索引处沿选定维度切片,此函数返回给定维度的索引位置的张量。
关于维度这个概念,请参看这个
参数:
注意:
select()等效于切片。例如,tensor.select(0, index)
等效于tensor[index]
,tensor.select(2, index)
等效于tensor[:, :, index]
.
class torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2, scale_grad_by_freq=False, sparse=False)
一个保存了固定字典和大小的简单查找表。
这个模块常用来保存词嵌入和用下标检索它们。模块的输入是一个下标的列表,输出是对应的词嵌入。
参数:
int
) - 嵌入字典的大小注意:这里字典的大小的意思是,输入向量的值要小于字典大小,即范围在0~num_embeddings-1之间
int
) - 每个嵌入向量的 sizeint, optional
) - 如果提供的话,输出遇到此值时其嵌入向量为零向量float, optional
) - 如果提供的话,会重新归一化词嵌入,使它们的范数小于提供的值float, optional
) - 对于max_norm选项计算p范数时的pboolean, optional
) - 如果提供的话,会根据字典中单词频率缩放梯度变量:
形状: