小熊科技|PyTorch文本:01.聊天机器人教程( 五 )
outputvar函数执行与inputvar类似的函数 , 但他不返回长度张量 , 而是返回二进制 mask tensor 和最大目标句子长度 。 二进制 mask tensor 的大小与输出目标张量的大小相同 , 但作为PAD_token的每个元素都是0而其他元素都是1 。
batch2traindata只需要取一批句子对 , 并使用上述函数返回输入张量和目标张量 。
def indexesFromSentence(voc, sentence):return [voc.word2index[word] for word in sentence.split(' ')] + [EOS_token]# zip 对数据进行合并了 , 相当于行列转置了def zeroPadding(l, fillvalue=http://kandian.youth.cn/index/PAD_token):return list(itertools.zip_longest(*l, fillvalue=fillvalue))# 记录 PAD_token的位置为0 ,其他的为1def binaryMatrix(l, value=PAD_token):m = []for i, seq in enumerate(l):m.append([])for token in seq:if token == PAD_token:m[i].append(0)else:m[i].append(1)return m# 返回填充前(加入结束index EOS_token做标记)的长度 和 填充后的输入序列张量def inputVar(l, voc):indexes_batch = [indexesFromSentence(voc, sentence) for sentence in l]lengths = torch.tensor([len(indexes) for indexes in indexes_batch])padList = zeroPadding(indexes_batch)padVar = torch.LongTensor(padList)return padVar, lengths# 返回填充前(加入结束index EOS_token做标记)最长的一个长度 和 填充后的输入序列张量, 和 填充后的标记 maskdef outputVar(l, voc):indexes_batch = [indexesFromSentence(voc, sentence) for sentence in l]max_target_len = max([len(indexes) for indexes in indexes_batch])padList = zeroPadding(indexes_batch)mask = binaryMatrix(padList)mask = torch.ByteTensor(mask)padVar = torch.LongTensor(padList)return padVar, mask, max_target_len# 返回给定batch对的所有项目def batch2TrainData(voc, pair_batch):pair_batch.sort(key=lambda x: len(x[0].split(" ")), reverse=True)input_batch, output_batch = [], []for pair in pair_batch:input_batch.append(pair[0])output_batch.append(pair[1])inp, lengths = inputVar(input_batch, voc)output, mask, max_target_len = outputVar(output_batch, voc)return inp, lengths, output, mask, max_target_len# 验证例子small_batch_size = 5batches = batch2TrainData(voc, [random.choice(pairs) for _ in range(small_batch_size)])input_variable, lengths, target_variable, mask, max_target_len = batchesprint("input_variable:", input_variable)print("lengths:", lengths)print("target_variable:", target_variable)print("mask:", mask)print("max_target_len:", max_target_len)输出结果:
input_variable: tensor([[ 273,64,53,25,25],[ 188,542, 4095,200,200],[53,4,115,67, 3644],[ 660,4, 3600, 1531,2],[1258,4,4,4,0],[4,2,2,2,0],[2,0,0,0,0]])lengths: tensor([7, 6, 6, 6, 4])target_variable: tensor([[ 147,214,219,252,122],[47,4,389,387,27],[7,4,25,25,14],[1026,4,222,4,53],[1034,2,53,2,4],[12,0, 4096,0,4],[1113,0,6,0,4],[4,0,2,0,2],[2,0,0,0,0]])mask: tensor([[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 1, 1, 1, 1],[1, 0, 1, 0, 1],[1, 0, 1, 0, 1],[1, 0, 1, 0, 1],[1, 0, 0, 0, 0]], dtype=torch.uint8)max_target_len: 94.定义模型4.1 Seq2Seq模型Seq2Seq模型 我们聊天机器人的大脑是序列到序列(seq2seq)模型 。 seq2seq模型的目标是将可变长度序列作为输入 , 并使用固定大小的模型将可变长度序 列作为输出返回 。
推荐阅读
- 所持股份|万兴科技:公司控股股东、实际控制人吴太兵质押150万股
- 发布公告|数量过半!博创科技:天通股份累计减持约150万股
- 英雄科技聊数码|蔡崇信有实力买下篮网,那身价3200亿的马云,能买下几支NBA球队
- 科技前沿阵地|涨疯了!海思安防芯片遭哄抬“围剿”
- 月影浓|吴亦凡机械造型走秀 垫肩披风搭银框眼镜科技感足
- 中国历史发展过程|中国历史发展过程.中国的科技史界过去半个多世纪
- 天津|桂发祥:不再持有昆汀科技股份
- 消费|减持!天通股份:减持博创科技约32万股
- 处罚|老周侃股:吉鑫科技大股东应补偿踩雷投资者
- 华中科技大学|杯具!超本科线95分,本科有路不走,却梦幻般碰瓷,撞开专科的门
