this article中有一个基于深度学习的模型,该模型使用Transfer Learning和LSTM,作者使用了10倍交叉验证(如表3所述)并取结果的平均值。 我熟悉10折交叉验证,因为我们需要分割数据并传递给模型,但是在这段代码(here)中,我无法弄清楚如何对数据进行分区和传递。
有两个训练/测试/开发数据集(一个用于情感分析,一个用于情感分析,我们都将它们用于迁移学习,但我的重点是情感分析)。原始数据以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)
其中“数据”是一类数据(code),其中包括测试/训练/开发数据集: 我想我需要在这里传递分割后的数据。如果我是对的,该如何分区并执行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
答案 0 :(得分:0)
从外观上看,训练方法似乎可以获取会话并继续从现有模型def train(self, data, sess=None)
进行训练
因此,只需对现有代码和库进行很小的更改,就可以做到
首先加载所有数据并构建模型
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)
model = BiLstm(args, data, ckpt_path='./' + args.data_name + '_output/')
然后创建类似的交叉验证数据集
def get_new_data_object():
return 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)
cross_validation = []
for i in range(10):
tmp_data = get_new_data_object()
tmp_data.train= #get 90% of tmp_data['train']
tmp_data.valid= #get 90% of tmp_data['valid']
tmp_data.test= #get 90% of tmp_data['test']
tmp_data.train2= #get 90% of tmp_data['train2']
tmp_data.valid2= #get 90% of tmp_data['valid2']
tmp_data.test2= #get 90% of tmp_data['test2']
cross_validation.append(tmp_data)
比运行模型n次(10次交叉验证要运行10次)
sess = null
for data in cross_validation:
model.train(data, sess)
sess = model.restore_last_session()
记住要注意一些关键思想
test
,train
和(根据您的情况)valid
test
,train
和valid
的每个三元组,数据的分割必须是精确的分割,它可以随机进行,也可以每次进行不同的处理,只要一致 n
次或创建n
模型并选择最佳模型以避免过度拟合此代码只是草稿,您可以按自己的方式实现它,有一些很棒的库已经实现了这种功能,当然可以进行优化(不必每次都读取整个数据文件)
还有一个考虑因素是从数据中分离出模型的创建,尤其是模型构造函数的data
arg,从快速的外观看,它似乎仅使用数据的维数,因此它不是一个好习惯通过整个物体
此外,如果模型在状态下(在创建时)集成data
对象的其他属性(例如数据本身),则我的代码可能无法正常工作,并且会采用更具手术效果的方法
希望它会有所帮助,并为您指明正确的方向