10-кратный перекрестный проверочный питон - PullRequest
0 голосов
/ 13 октября 2019

Существует модель, основанная на глубоком обучении с использованием Transfer Learning и LSTM в этой статье , в которой автор использовал 10-кратную перекрестную проверку (как объяснено в таблице 3) и взял среднее значение результатов. Я знаком с 10-кратной перекрестной проверкой, поскольку нам нужно разделить данные и перейти к модели, однако в этом коде ( здесь ) я не могу понять, как разделить данные и передать их.

Существует два набора данных train / test / dev (один для анализа эмоций, а другой для анализа настроений, мы используем оба для трансферного обучения, но я сосредоточен на анализе эмоций). Необработанные данные находятся в паре файлов в формате txt, и после запуска модели, они дают два новых файла txt, один для прогнозируемых меток, один для истинных меток.

В * есть строка кода1009 * основной файл :

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)

, в котором «данные» - это класс данных ( код ), который включает наборы данных 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

1 Ответ

0 голосов
/ 14 октября 2019

кажется, что метод train может получить сеанс и продолжить обучение с существующей модели 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 модели ивыбрать лучшее, чтобы избежать переоснащения

это сотрудничествоde - это всего лишь черновик, вы можете реализовать его так, как вам хочется, есть замечательная библиотека, которая уже реализовала такую ​​функциональность, и, конечно, ее можно оптимизировать (не читая файлы данных целиком)

еще одинРассмотрение состоит в том, чтобы отделить создание модели от данных, особенно аргумента data конструктора модели, от быстрого взгляда кажется, что он использует только измерение данных, поэтому рекомендуется не пропускать весь объект

более того, если модель интегрирует другие свойства объекта data в его состоянии (при создании), как и сами данные, мой код может не работать и более хирургический подход

надеюсь, что это поможет, и направит вас в правильном направлении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...