nlp - PyTorch - 稀疏张量没有步幅

标签 nlp pytorch lstm tensor tf-idf

我正在使用 TF-IDF 方法和 LSTM 使用以下代码为包含 1000 条评论的小数据集构建第一个情感分析模型。我正在通过预处理来准备训练数据并将其输入到矢量化器,如下所示

def tfidf_features(X_train, X_val, X_test):
tfidf_vectorizer = TfidfVectorizer(analyzer='word', token_pattern = '(\S+)', min_df = 5, max_df = 
0.9, ngram_range=(1,2))
X_train=tfidf_vectorizer.fit_transform(X_train)
X_val=tfidf_vectorizer.transform(X_val)
X_test=tfidf_vectorizer.transform(X_test)

return X_train, X_val, X_test, tfidf_vectorizer.vocabulary_

我使用下面的代码将 csr_matrix 转换为 pytorch 张量

def spy_sparse2torch_sparse(data):
samples=data.shape[0]
features=data.shape[1]
values=data.data
coo_data=data.tocoo()
indices=torch.LongTensor([coo_data.row,coo_data.col])
t=torch.sparse.FloatTensor(indices,torch.from_numpy(values).float(),[samples,features])
return t

我得到的训练句子张量是这样的

   tensor(indices=tensor([[  0,   0,   1,  ..., 599, 599, 599],
                   [ 97, 131,  49,  ..., 109,  65,  49]]),
   values=tensor([0.6759, 0.7370, 0.6076,  ..., 0.3288, 0.3927, 0.3288]),
   size=(600, 145), nnz=1607, layout=torch.sparse_coo)

我正在使用下面的代码创建一个 TensorDataSet,其中我还将标签数据从凹凸不平转换为 torch 张量

train_data = TensorDataset(train_x, torch.from_numpy(train_y))

我已经定义了 LSTM 网络并使用以下参数调用它

n_vocab = len(vocabulary)
n_embed = 100
n_hidden = 256
n_output = 1   # 1 ("positive") or 0 ("negative")
n_layers = 2

net = Sentiment_Lstm(n_vocab, n_embed, n_hidden, n_output, n_layers)

我还定义了损失和优化器。现在我正在使用以下代码训练我的模型

print_every = 100
step = 0
n_epochs = 4  # validation loss increases from ~ epoch 3 or 4
clip = 5  # for gradient clip to prevent exploding gradient problem in LSTM/RNN

for epoch in range(n_epochs):
h = net.init_hidden(batch_size)

for inputs, labels in train_loader:
    step += 1

    # making requires_grad = False for the latest set of h
    h = tuple([each.data for each in h])   

    net.zero_grad()
    output, h = net(inputs)
    loss = criterion(output.squeeze(), labels.float())
    loss.backward()
    nn.utils.clip_grad_norm(net.parameters(), clip)
    optimizer.step()

    if (step % print_every) == 0:
        net.eval()
        valid_losses = []
        v_h = net.init_hidden(batch_size)

        for v_inputs, v_labels in valid_loader:
            v_inputs, v_labels = inputs.to(device), labels.to(device)

            v_h = tuple([each.data for each in v_h])

            v_output, v_h = net(v_inputs)
            v_loss = criterion(v_output.squeeze(), v_labels.float())
            valid_losses.append(v_loss.item())

        print("Epoch: {}/{}".format((epoch+1), n_epochs),
              "Step: {}".format(step),
              "Training Loss: {:.4f}".format(loss.item()),
              "Validation Loss: {:.4f}".format(np.mean(valid_losses)))
        net.train()

但是,我在 output, h = net(inputs) 行上遇到了一个重大错误,为 RuntimeError:稀疏张量没有步长

其他网站上给出的解决方法无法理解。我期望需要进行确切的代码更改才能解决此问题。

最佳答案

Pytorch 不支持稀疏(S)到稀疏矩阵的乘法。

让我们考虑一下: torch.sparse.mm(c1,c2),其中c1和c2是sparse_coo_tensor矩阵。

情况1:如果我们尝试将 c1 和 c2 设为 S --> 它会给出错误 RuntimeError:稀疏张量没有步幅。

情况2:如果c1 是稠密的(D) 并且c2 是S --> 它会给出相同的错误。

情况3:仅当c1为S且c2为D时 --> 工作正常。

引用:https://blog.csdn.net/w55100/article/details/109086131

我猜你的 Sentiment_Lstm 中发生的矩阵乘法可能属于前两种情况。从而引发此错误。

通过使用密集输入格式,它应该可以工作。

关于nlp - PyTorch - 稀疏张量没有步幅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61364160/

相关文章:

python - 在 NLTK 解析器语法中混合单词和 PoS 标签

javascript - 如何使用 nlp-compromise 在 JavaScript 中进行基本的语境化?

python - .contigious() 在 PyTorch 中做什么?

permissions - PyTorch 权限错误 : [Errno 13] Permission denied: '/.torch'

python - 从 PyTorch 中的 BiLSTM (BiGRU) 获取最后一个状态

python - 如何从字符串中找到多词字符串,并在Python中对其进行标记?

c++ - 语言检测

python - 正常和拉普拉斯的 KL 散度未在 TensorFlow Probability 和 PyTorch 中实现

machine-learning - 你能让 LSTM 手动忘记上下文吗?

python - 在 LSTM 层之前具有嵌入层的 Keras LSTM