【发布时间】:2019-11-18 12:08:20
【问题描述】:
我有一个来自torchtext 的Bucketiterator,我将它提供给pytorch 中的模型。迭代器的构造示例:
train_iter, val_iter = BucketIterator.splits((train,val),
batch_size=batch_size,
sort_within_batch = True,
device = device,
shuffle=True,
sort_key=lambda x: (len(x.src), len(x.trg)))
然后将数据馈送到这样的模型,我使用nn.Embedding 层。
class encoder(nn.Module):
def __init__(self, input_dim, emb_dim, hid_dim, n_layers, dropout):
super().__init__()
self.input_dim = input_dim
self.emb_dim = emb_dim
self.hid_dim = hid_dim
self.n_layers = n_layers
self.dropout = dropout
self.embedding = nn.Embedding(input_dim, emb_dim)
self.rnn = nn.LSTM(emb_dim, hid_dim, n_layers, dropout = dropout)
self.dropout = nn.Dropout(dropout)
def forward(self, src):
#src = [src sent len, batch size]
embedded = self.dropout(self.embedding(src))
#embedded = [src sent len, batch size, emb dim]
hidden_enc = []
outputs, hidden = self.rnn(embedded[0,:,:].unsqueeze(0))
for i in range(1,len(embedded[:,1,1])):
outputs, hidden = self.rnn(embedded[i,:,:].unsqueeze(0),hidden)
hidden_cpu = []
for k in range(len(hidden)):
hidden_cpu.append(hidden[k])
hidden_cpu[k] = hidden[k].cpu()
hidden_enc.append(tuple(hidden_cpu))
#outputs, hidden = self.rnn(embedded)
#outputs = [src sent len, batch size, hid dim * n directions]
#hidden = [n layers * n directions, batch size, hid dim]
#cell = [n layers * n directions, batch size, hid dim]
None
#outputs are always from the top hidden layer
return hidden, hidden_enc
但是,如果我希望嵌入是一次性编码的呢?我从事形式语言的工作,保留令牌之间的正交性会很好。 pytorch 或 torchtext 似乎没有任何功能可以执行此操作。
【问题讨论】:
-
PyTorch 没有内置它,但这会有所帮助吗:gist.github.com/jacobkimmel/4ccdc682a45662e514997f724297f39f
-
PyTorch 有
torch.nn.functional.one_hot(...),但如果我理解正确,您希望嵌入具有 one_hot 向量的相同属性;不只是将 N 个输入映射到 N 个 one_hot 向量,而是将 M >> N 映射到 N 个 one_hot 向量?有几种方法可以实现这一目标。让我们知道这是否是您想要的。 -
不,还没有,我正在研究括号语言和 seq2seq 模型关闭这些括号的能力,所以我想保持标记之间的距离,因此是一个热的。但我对如何为 M>>N 实现它很感兴趣,我觉得这可能有用吗?
-
但是你是否明白唯一的方法(假设你希望它们被一次性编码)是将多个标记折叠到同一个向量(对于 M > N),不要'你呢?对你来说可以吗?
-
是的,当然,我在想,如果它像嵌入层一样被训练,它可能会帮助网络在比标准 one-hot 更大的规模结构上做出离散决策。
标签: python machine-learning deep-learning pytorch torchtext