我使用“Chainer”编写了一个程序来训练我的模型,数据来自于另一个使用Python的yield
的函数。我观察到的是,每个epoch的数据大小都在变化。
def load(file_path): with codecs.open(path, 'r', 'utf-8') as read_f: for l in read_f: yield l.strip()def data(): for i1 in load(args.train1) x1,y1 = list(map(int,i1.strip().split('\t'))) tr_data1.add((x1,y1)) tr_data1 = list(tr_data1) for i2 in load(args.train2) x2,y2 = list(map(int,i2.strip().split('\t'))) tr_data2.add((x2,y2)) tr_data2 = list(tr_data2)def pos_neg(args): p1,n1,p2,n2 = list(), list(), list(), list() random.shuffle(tr_data1) random.shuffle(tr_data2) for i, j in it.zip_longest(range(len(tr_data1)), range(len(tr_data2)), fillvalue='-'): '''negative set generation''' if len(p)==0 or len(p) <= args.batch and len(p)==0 or len(p) <= args.batch: p1.append(tr_data1[i]) n1.append('''negative for train set1''') p2.append(tr_data2[j]) n2.append('''negative for train set2''') else: yield p1,n1,p2,n2 p1,n1,p2,n2 = [tr_data1[i]],['''negative for train set1'''],[tr_data2[j]],['''negative for train set2'''] if len(p1) != 0 or len(p2) != 0: yield p1,n1,p2,n2def train(args, model): for p1, n1, p2, n2 in pos_neg(args): print("len of pos_train1 neg_train1 pos_train2 neg_train2:", len(p1), len(n1), len(p2), len(n2))Main Epoch = 0len of pos_train1 neg_train1 pos_train2 neg_train2: 17460 17460 17460 17460Main Epoch = 1len of pos_train1 neg_train1 pos_train2 neg_train2: 17465 17465 17465 17465Main Epoch = 2len of pos_train1 neg_train1 pos_train2 neg_train2: 17407 17407 17407 17407
请问有人能解释一下输入数据大小变化的原因吗?
还有什么方法可以避免这种情况吗?
回答:
你可以尝试运行一个跳过函数或者为负样本生成设置一个比例,与你的正样本集合并行进行。