在this article中有一个基于深度学习的模型,使用迁移学习和LSTM,作者使用了10倍交叉验证(如表3所示),并取结果的平均值。 我熟悉10倍交叉验证,因为我们需要划分数据并传递给模型,但是在这段代码(here)中,我不知道如何划分数据并传递它。你知道吗
有两个train/test/dev数据集(一个用于情感分析,另一个用于情感分析,我们都用于迁移学习,但我的重点是情感分析)。原始数据是以txt格式的几个文件,运行模型后,它会给出两个新的txt文件,一个用于预测标签,一个用于真实标签。你知道吗
在main file中有一行代码:
model = BiLstm(args, data, ckpt_path='./' + args.data_name + '_output/')
if args.mode=='train':
model.train(data)
sess = model.restore_last_session()
model.predict(data, sess)
if args.mode=='test':
sess = model.restore_last_session()
model.predict(data, sess)
其中“data”是一类数据(code),包括test/train/dev数据集: 我想我需要把分割后的数据传递到这里。如果我是对的,我如何进行分区并执行10倍交叉验证?你知道吗
data = Data('./data/'+args.data_name+'data_sample.bin','./data/'+args.data_name+'vocab_sample.bin',
'./data/'+args.data_name+'word_embed_weight_sample.bin',args.batch_size)
class Data(object):
def __init__(self,data_path,vocab_path,pretrained,batch_size):
self.batch_size = batch_size
data, vocab ,pretrained= self.load_vocab_data(data_path,vocab_path,pretrained)
self.train=data['train']
self.valid=data['valid']
self.test=data['test']
self.train2=data['train2']
self.valid2=data['valid2']
self.test2=data['test2']
self.word_size = len(vocab['word2id'])+1
self.max_sent_len = vocab['max_sent_len']
self.max_topic_len = vocab['max_topic_len']
self.word2id = vocab['word2id']
word2id = vocab['word2id']
#self.id2word = dict((v, k) for k, v in word2id.iteritems())
self.id2word = {}
for k, v in six.iteritems(word2id):
self.id2word[v]=k
self.pretrained=pretrained
从外观上看,似乎train方法可以获得会话并从现有模型继续训练
def train(self, data, sess=None)
因此,只需对现有代码和库进行非常小的更改,就可以像smth一样完成任务
首先加载所有数据并构建模型
然后创建交叉验证数据集,如smth
然后运行模型n次(10次用于10倍交叉验证)
记住要注意一些关键的想法
test
、train
和(在您的情况下)valid
的方式test
、train
和valid
的每个三元组的精确分割,可以随机进行,也可以每次进行不同的分割,只要保持一致n
次,或者创建n
模型,并选择最佳的模型来避免过度拟合这段代码只是一个草稿,您可以按照自己的意愿实现它,有一些很好的库已经实现了这样的功能,当然可以进行优化(不是每次都读取整个数据文件)
另一个需要考虑的问题是将模型创建与数据分离,特别是模型构造函数的
data
参数,从快速查看来看,它似乎只使用数据的维度,因此不传递整个对象是一个很好的做法此外,如果模型在它的状态(创建时)集成了
data
对象的其他属性,比如数据本身,那么我的代码可能无法工作,而且是一种更加外科化的方法希望对你有所帮助,为你指明正确的方向
相关问题 更多 >
编程相关推荐