在使用torchtext.data.TabularDataset分割训练集测试集时发现遇到了奇怪的问题
代码如下:
self.TEXT = data.Field(init_token='<start>', eos_token='<eos>', lower=True, tokenize='spacy', fix_length=16)
self.LABEL = data.Field(sequential=False, unk_token=None)
f = lambda ex: len(ex.text) <= 15 and ex.label != 'neutral'
fields = [(None, None), ('text',self.TEXT),('label', self.LABEL)]
input_data = data.TabularDataset(path = './data/0221.csv', format='csv', fields = fields,skip_header = True)
train, val = input_data.split(split_ratio=0.8, random_state=random.seed(SEED),stratified=True, strata_field='label')
#这里使用了stratified我看注释是用于分层抽样,感觉应该是让分层抽样更加均匀合理,因此就使用了
上面这段代码放在一个独立的类里,我发现每次加载时得到的词汇表的大小时不一样的,但是打印len(train)和len(val)时每一次都是固定的数量。纳闷了,在网上搜,要固定随机数种子,于是加上了下面的代码
SEED = 1234
torch.manual_seed(SEED)
np.random.seed(SEED)
random.seed(SEED)
torch.cuda.manual_seed(SEED)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
但是情况依然没有好转,怀疑还是在分割的地方有问题,于是把分割数据集的代码变成了
train, val = input_data.split(split_ratio=0.8, random_state=random.seed(SEED))
这样测试后果然每一次都是一样的词汇数量了(vocab大小),不知道sklearn的train_test_split()是不是一样的,欢迎交流指点!