请问代码第二行是得到了一个什么样的长度呢?为什么要这么取?

packed = pack_padded_sequence(x_lstm,#经过填充序列等长的输入数据
x['link_cross_len'].cpu(), #mini-batch中各个序列的实际长度。??
batch_first=True,
enforce_sorted=False)

rnn运行,需要输入一个数据队列,也就是多维度的tensor,而数据队列的长度不一定总是相同的。
比如,你原始的队列数据如下所示:

a = torch.tensor([1,2,3,4])
b = torch.tensor([5,6,7])
c = torch.tensor([7,8])
d = torch.tensor([9])
train_x = [a, b, c, d]

那么为了能够让rnn进行训练,我们会用0补齐b,c,d,也就是在末尾增加0,使其长度都是4,对齐长度的数据就是x_lstm了。
然后再送进pack_padded_sequenece()函数,这个函数的第二个参数也就是原始数据的各个队列的相应长度,如下所示:

# seq_len就是真实的序列长度
seq_len = [i.shape[0] for i in train_x]

以下是可运行的真实例子:

import torch
from torch.utils.data import Dataset, DataLoader
from torch.nn.utils.rnn import pad_sequence,pack_padded_sequence,pack_sequence,pad_packed_sequence

class MyData(Dataset):
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx]
# 扩展函数
def collate_fn(data):
    data.sort(key=lambda x: len(x), reverse=True)
    data = pad_sequence(data, batch_first=True, padding_value=0)
    return data

a = torch.tensor([1,2,3,4])
b = torch.tensor([5,6,7])
c = torch.tensor([7,8])
d = torch.tensor([9])
train_x = [a, b, c, d]
# seq_len就是真实的序列长度
seq_len = [i.shape[0] for i in train_x]

data = MyData(train_x)
# DataLoader补齐了那些短的队列,用0扩展了。
data_loader = DataLoader(data, batch_size=4, shuffle=False, collate_fn=collate_fn)
# 采用默认的 collate_fn 会报错
#data_loader = DataLoader(data, batch_size=2, shuffle=True)
batch_x = iter(data_loader).next()
# 使用pack_padded_sequence
batch_y = pack_padded_sequence(batch_x, seq_len, batch_first=True)
print("对应的原始数据长度\n",seq_len)
print("扩展后的队列\n",batch_x)
print("pack_padded_sequence后的队列\n",batch_y)

x应该是一个字典吧,x['link_cross_len']就是对应的长度,但应为其是一个tensor,pack_padded_sequence()第二个参数不能为tensorflow,就需要使用tensor.cpu()
转成正常类型的长度