小熊科技|PyTorch文本:01.聊天机器人教程( 四 )
输出结果:
Start preparing training data ...Reading lines...Read 221282 sentence pairsTrimmed to 64271 sentence pairsCounting words...Counted words: 18008pairs:['there .', 'where ?']['you have my word . as a gentleman', 'you re sweet .']['hi .', 'looks like things worked out tonight huh ?']['you know chastity ?', 'i believe we share an art instructor']['have fun tonight ?', 'tons']['well no . . .', 'then that s all you had to say .']['then that s all you had to say .', 'but']['but', 'you always been this selfish ?']['do you listen to this crap ?', 'what crap ?']['what good stuff ?', 'the real you .']另一种有利于让训练更快收敛的策略是去除词汇表中很少使用的单词 。 减少特征空间也会降低模型学习目标函数的难度 。 我们通过以下两个步 骤完成这个操作:
使用voc.trim函数去除 MIN_COUNT 阈值以下单词。
如果句子中包含词频过小的单词 , 那么整个句子也被过滤掉 。
MIN_COUNT = 3 # 修剪的最小字数阈值
def trimRareWords(voc, pairs, MIN_COUNT):# 修剪来自voc的MIN_COUNT下使用的单词voc.trim(MIN_COUNT)# Filter out pairs with trimmed wordskeep_pairs = []for pair in pairs:input_sentence = pair[0]output_sentence = pair[1]keep_input = Truekeep_output = True# 检查输入句子for word in input_sentence.split(' '):if word not in voc.word2index:keep_input = Falsebreak# 检查输出句子for word in output_sentence.split(' '):if word not in voc.word2index:keep_output = Falsebreak# 只保留输入或输出句子中不包含修剪单词的对if keep_input and keep_output:keep_pairs.append(pair)print("Trimmed from {} pairs to {}, {:.4f} of total".format(len(pairs), len(keep_pairs), len(keep_pairs) / len(pairs)))return keep_pairs# 修剪voc和对pairs = trimRareWords(voc, pairs, MIN_COUNT)输出结果:keep_words 7823 / 18005 = 0.4345Trimmed from 64271 pairs to 53165, 0.8272 of total3.为模型准备数据尽管我们已经投入了大量精力来准备和清洗我们的数据 , 将它变成一个很好的词汇对象和一系列的句子对 , 但我们的模型最终希望数据以numerical torch张量作为输入 。 可以在seq2seq translation tutorial 中找到为模型准备处理数据的一种方法 。在该教程中 , 我们使用batch size大小为1 , 这意味着我们所要做的就是将句子对中的单词转换为词汇表中的相应索引 , 并将其提供给模型 。
但是 , 如果你想要加速训练或者想要利用GPU并行计算能力 , 则需要使用小批量mini-batches来训练 。
使用小批量mini-batches也意味着我们必须注意批量处理中句子长度的变化 。 为了容纳同一batch中不同大小的句子 , 我们将使我们的批量输 入张量大小(max_length , batch_size) , 其中短于max_length的句子在EOS_token之后进行零填充(zero padded) 。
如果我们简单地将我们的英文句子转换为张量 , 通过将单词转换为索引indicesFromSentence和零填充zero-pad , 我们的张量的大小将是(batch_size , max_length) , 并且索引第一维将在所有时间步骤中返回完整序列 。 但是 , 我们需要沿着时间对我们批量数据进行索引并且包 括批量数据中所有序列 。 因此 , 我们将输入批处理大小转换为(max_length , batch_size) , 以便跨第一维的索引返回批处理中所有句子的时 间步长 。我们在zeroPadding函数中隐式处理这个转置 。
inputvar函数是处理将句子转换为张量的过程 , 最终创建正确大小的零填充张量 。 它还返回批处理中每个序列的长度张量(tensor of lengths) ,长度张量稍后将传递给我们的解码器 。
推荐阅读
- 所持股份|万兴科技:公司控股股东、实际控制人吴太兵质押150万股
- 发布公告|数量过半!博创科技:天通股份累计减持约150万股
- 英雄科技聊数码|蔡崇信有实力买下篮网,那身价3200亿的马云,能买下几支NBA球队
- 科技前沿阵地|涨疯了!海思安防芯片遭哄抬“围剿”
- 月影浓|吴亦凡机械造型走秀 垫肩披风搭银框眼镜科技感足
- 中国历史发展过程|中国历史发展过程.中国的科技史界过去半个多世纪
- 天津|桂发祥:不再持有昆汀科技股份
- 消费|减持!天通股份:减持博创科技约32万股
- 处罚|老周侃股:吉鑫科技大股东应补偿踩雷投资者
- 华中科技大学|杯具!超本科线95分,本科有路不走,却梦幻般碰瓷,撞开专科的门
