Exemplo n.º 1
0
def videoGetter(filename,
                outdir='out/prepro/',
                update_rate=50):
    DEST_IMG_SIZE = (270, 480)
    cap = VideoCapture(filename)
    frameCount = int(cap.get(CAP_PROP_FRAME_COUNT))
    frameWidth = int(cap.get(CAP_PROP_FRAME_WIDTH))
    frameHeight = int(cap.get(CAP_PROP_FRAME_HEIGHT))
    status = Progbar(frameCount, text=filename)
    # Note that for some reason, cv2 reads images hieght and then width
    buf = empty(
        (frameCount, DEST_IMG_SIZE[1], DEST_IMG_SIZE[0], 3), dtype('int8'))
    raw = empty((frameWidth, frameHeight, 3), dtype('uint8'))
    middle = empty((DEST_IMG_SIZE[1], DEST_IMG_SIZE[0], 3), dtype('uint8'))
    fc = 0
    ret = True
    while (fc < frameCount and ret):
        ret, temp = cap.read()
        middle[:, :, :] = resize(
            raw, None, fx=0.25, fy=0.25, interpolation=INTER_AREA)
        buf[fc] = (middle.astype('int8') - 255 // 2)
        if fc % update_rate == 0:
            status.update(fc)
        fc += 1
    cap.release()
    del cap, raw, middle
    filename = filename.rsplit('/', 1)[1]
    outpath = outdir + filename.rsplit('.', 1)[0] + '.npy'
    return save(outpath, buf)
Exemplo n.º 2
0
def train_step(model, data, summary_op, summary_writer):
    """Train one epoch
    """
    start_time = time.time()
    sess = model.sess
    runopts = tf.RunOptions(report_tensor_allocations_upon_oom=True)
    prog = Progbar(target=data.num_batches)
    iterator = data.dataset.make_initializable_iterator()
    next_element = iterator.get_next()
    sess.run(iterator.initializer)
    for idx in range(data.num_batches):
        try:
            dataset = sess.run(next_element)
        except tf.errors.OutOfRangeError:
            break
        feed_dict = feed.build_feed_dict(model, dataset,
                                         data.max_sentence_length, True)
        if 'bert' in model.config.emb_class:
            # compute bert embedding at runtime
            bert_embeddings = sess.run([model.bert_embeddings_subgraph],
                                       feed_dict=feed_dict,
                                       options=runopts)
            if idx == 0:
                tf.logging.debug('# bert_token_ids')
                t = dataset['bert_token_ids'][:1]
                tf.logging.debug(' '.join([str(x) for x in np.shape(t)]))
                tf.logging.debug(' '.join([str(x) for x in t]))
                tf.logging.debug('# bert_token_masks')
                t = dataset['bert_token_masks'][:1]
                tf.logging.debug(' '.join([str(x) for x in np.shape(t)]))
                tf.logging.debug(' '.join([str(x) for x in t]))
                tf.logging.debug('# bert_embedding')
                t = bert_embeddings[0][:1]
                tf.logging.debug(' '.join([str(x) for x in np.shape(t)]))
                tf.logging.debug(' '.join([str(x) for x in t]))
                tf.logging.debug('# bert_wordidx2tokenidx')
                t = dataset['bert_wordidx2tokenidx'][:1]
                tf.logging.debug(' '.join([str(x) for x in np.shape(t)]))
                tf.logging.debug(' '.join([str(x) for x in t]))
            # update feed_dict
            feed.update_feed_dict(model, feed_dict, bert_embeddings,
                                  dataset['bert_wordidx2tokenidx'])
            step, summaries, _, loss, accuracy, f1, learning_rate = \
                sess.run([model.global_step, summary_op, model.train_op, \
                          model.loss, model.accuracy, model.f1, \
                          model.learning_rate], feed_dict=feed_dict, options=runopts)
        else:
            step, summaries, _, loss, accuracy, f1, learning_rate = \
                sess.run([model.global_step, summary_op, model.train_op, \
                          model.loss, model.accuracy, model.f1, \
                          model.learning_rate], feed_dict=feed_dict, options=runopts)

        summary_writer.add_summary(summaries, step)
        prog.update(idx + 1,
                    [('step', step), ('train loss', loss),
                     ('train accuracy', accuracy), ('train f1', f1),
                     ('lr(invalid if use_bert_optimization)', learning_rate)])
    duration_time = time.time() - start_time
    out = '\nduration_time : ' + str(duration_time) + ' sec for this epoch'
    tf.logging.debug(out)
Exemplo n.º 3
0
    def run_epoch(self, sess, merged, data):
        prog = Progbar(target=1 + int(data.data_size / TRAIN_BATCH_SIZE),
                       file_given=self.log)

        losses = list()
        i = 0
        batch = data.get_selected_passage_batch()
        while batch is not None:
            q_batch = batch['question']
            p_batch = batch['passage']
            a_batch = batch['answer']
            s_t_batch = batch['start_token']
            dropout = batch['dropout']

            loss = self.train_on_batch(sess, merged, q_batch, p_batch,
                                       s_t_batch, dropout, a_batch)
            tf.summary.scalar('Loss per Batch', loss)
            losses.append(loss)

            prog.update(i + 1, [("train loss", loss)])

            batch = data.get_selected_passage_batch()

            i += 1

        return losses
Exemplo n.º 4
0
    def run_epoch(self, sess, merged, data):
        prog = Progbar(target=1 + int(data.data_size / TRAIN_BATCH_SIZE), file_given=self.log)
        
        losses = list()
        i = 0
        batch = data.get_selected_passage_batch()
        while batch is not None:
            q_batch = batch['question']
            p_batch = batch['passage']
            a_batch = batch['answer']
            s_t_batch = batch['start_token']
            dropout = batch['dropout']
            self._temp_test_answer_indices = a_batch

            loss = self.train_on_batch(sess, merged, q_batch, p_batch, s_t_batch, dropout, a_batch)
            tf.summary.scalar('Loss per Batch', loss)
            losses.append(loss)

            prog.update(i + 1, [("train loss", loss)])

            batch = data.get_selected_passage_batch()
            if i % 1200 == 0 and i > 0:
                self.log.write('\nNow saving file...')
                saver.save(sess, SAVE_MODEL_DIR)
                self.log.write('\nSaved...')
            i += 1
        return losses
Exemplo n.º 5
0
    def predict(self, sess, saver, data):
        self.predicting = True
        prog = Progbar(target=1 + int(data.data_size / TRAIN_BATCH_SIZE), file_given=self.log)
        
        preds = list()
        i = 0
        
        data.reset_iter()
        batch = data.get_selected_passage_batch(predicting=True)
        while batch is not None:
            q_batch = batch['question']
            p_batch = batch['passage']
            s_t_batch = batch['start_token']
            a_batch = np.zeros((q_batch.shape[0], OUTPUT_MAX_LENGTH), dtype=np.int32)
            dropout = batch['dropout']

            prediction = self.predict_on_batch(sess, q_batch, p_batch, s_t_batch, dropout, a_batch)
            preds.append(prediction)

            prog.update(i + 1, [("Predictions going...", 1)])

            batch = data.get_selected_passage_batch(predicting=True)
            i += 1

        return preds
Exemplo n.º 6
0
def main(filenames, device='/gpu:2'):
    print("[Info] Loading Model")
    sess = tf.Session()
    K.set_session(sess)
    model = load_model(os.path.join(MODEL_DIR, 'from_tony.h5'))
    to_tf = tf.placeholder(tf.float32, shape=(None, 16, 112, 112, 3))
    output_tensor = model(to_tf)
    mean_cube = np.load(os.path.join(MODEL_DIR, 'train01_16_128_171_mean.npy'))
    mean_cube = np.transpose(mean_cube, (1, 2, 3, 0))
    to_net = np.empty((16, 112, 112, 3))
    for filename in filenames:
        print("[Info] Loading videos")
        vid = np.load(os.path.join(OUTDIR, 'preprocessed',
                                   filename)).astype(np.float32)
        temp = np.zeros((16,) + vid.shape[1:])
        end_frame = vid.shape[0]
        output = np.empty((vid.shape[0], 8192))
        status = Progbar(target=end_frame, text=filename.rsplit('.', 1)[0])
        for frm_ind, frame in enumerate(vid):
            if frm_ind < 8:
                temp[(8 - frm_ind):] = vid[:frm_ind + 8]
                temp[:(8 - frm_ind)] = 0
            elif end_frame < frm_ind + 8:
                temp[:(16 + (end_frame - (frm_ind + 8)))] = vid[frm_ind - 8:]
            else:
                temp[:, :, :, :] = vid[(frm_ind - 8):(frm_ind + 8), :, :, :]
            temp -= mean_cube
            to_net[:, :, :, :] = temp[:, 8:120, 30:142, :]
            output[frm_ind] = sess.run(output_tensor,
                                       feed_dict={to_tf: np.array([to_net])})
            # with tf.device(device):
            #     output[frm_ind] = model.predict_on_batch(np.array([to_net]))
            if frm_ind % 50:
                status.update(frm_ind)
        np.save(os.path.join(OUTDIR, 'extracted', filename), output)
Exemplo n.º 7
0
def evaluate(model, config, val_loader):
    model.eval()
    opt = config['opt']
    pad_label_id = config['pad_label_id']

    eval_loss = 0.
    criterion = nn.CrossEntropyLoss(ignore_index=pad_label_id).to(opt.device)
    n_batches = len(val_loader)
    prog = Progbar(target=n_batches)
    preds = None
    ys = None
    with torch.no_grad():
        for i, (x, y) in enumerate(val_loader):
            x = to_device(x, opt.device)
            y = to_device(y, opt.device)
            if opt.use_crf:
                logits, prediction = model(x)
                mask = torch.sign(torch.abs(x[0])).to(torch.uint8).to(
                    opt.device)
                log_likelihood = model.crf(logits,
                                           y,
                                           mask=mask,
                                           reduction='mean')
                loss = -1 * log_likelihood
            else:
                logits = model(x)
                loss = criterion(logits.view(-1, model.label_size), y.view(-1))
            if preds is None:
                if opt.use_crf: preds = to_numpy(prediction)
                else: preds = to_numpy(logits)
                ys = to_numpy(y)
            else:
                if opt.use_crf:
                    preds = np.append(preds, to_numpy(prediction), axis=0)
                else:
                    preds = np.append(preds, to_numpy(logits), axis=0)
                ys = np.append(ys, to_numpy(y), axis=0)
            eval_loss += loss.item()
            prog.update(i + 1, [('eval curr loss', loss.item())])
    eval_loss = eval_loss / n_batches
    if not opt.use_crf: preds = np.argmax(preds, axis=2)
    # compute measure using seqeval
    labels = model.labels
    ys_lbs = [[] for _ in range(ys.shape[0])]
    preds_lbs = [[] for _ in range(ys.shape[0])]
    for i in range(ys.shape[0]):  # foreach sentence
        for j in range(ys.shape[1]):  # foreach token
            if ys[i][j] != pad_label_id:
                ys_lbs[i].append(labels[ys[i][j]])
                preds_lbs[i].append(labels[preds[i][j]])
    ret = {
        "loss": eval_loss,
        "precision": precision_score(ys_lbs, preds_lbs),
        "recall": recall_score(ys_lbs, preds_lbs),
        "f1": f1_score(ys_lbs, preds_lbs),
        "report": classification_report(ys_lbs, preds_lbs, digits=4),
    }
    print(ret['report'])
    return ret
Exemplo n.º 8
0
def get_data(label_dict, path):
    lens = [arr.values.shape[0] for arr in label_dict.values()]
    rtn_arr = np.empty((sum(lens), 128, 171, 3), dtype=np.float32)
    status = Progbar(len(lens))
    [(
        fill_arr(ind, rtn_arr,
                 np.load(pthjn(path,
                               arr.rsplit('.', 1)[0] + '.npy')), lens,
                 lens[ind]),
        status.update(ind, text=arr.rsplit('.', 1)[0]),
    ) for ind, arr in enumerate(label_dict.keys())]
    return rtn_arr
Exemplo n.º 9
0
	def predict(self, sess, data):
		self.testing = False
		prog = Progbar(target=1 + int(data.data_size / TRAIN_BATCH_SIZE), file_given=self.log)
		
		preds = list()
		i = 0
		
		batch = data.get_batch(predicting=True)
		while batch is not None:
			q_batch = batch['question']
			p_batch = batch['passage']
			dropout = batch['dropout']

			prediction = self.predict_on_batch(sess, q_batch, p_batch, dropout)
			preds.append(prediction)

			prog.update(i + 1, [("Predictions going...", 1)])

			batch = data.get_batch(predicting=True)
			i += 1

		return preds
Exemplo n.º 10
0
    def run_epoch(self, sess, data):
        prog = Progbar(target=1 + int(data.data_size / TRAIN_BATCH_SIZE),
                       file_given=self.log)

        losses = list()
        i = 0
        batch = data.get_batch()
        while batch is not None:
            q_batch = batch[0]
            p_batch = batch[1]
            a_batch = batch[2]
            s_t_batch = batch[3]

            loss = self.train_on_batch(sess, q_batch, p_batch, s_t_batch,
                                       a_batch)
            losses.append(loss)

            prog.update(i + 1, [("train loss", loss)])

            batch = data.get_batch()
            i += 1
        return losses
Exemplo n.º 11
0
    def predict(self, sess, saver, data):
        prog = Progbar(target=1 + int(data.data_size / TRAIN_BATCH_SIZE),
                       file_given=self.log)

        preds = list()
        i = 0

        batch = data.get_batch(batch_size=TRAIN_BATCH_SIZE)
        while batch is not None:
            q_batch = batch[0]
            p_batch = batch[1]
            s_t_batch = batch[3]

            prediction = self.predict_on_batch(sess, q_batch, p_batch,
                                               s_t_batch)
            preds.append(prediction)

            prog.update(i + 1, [("Predictions going...", 1)])

            batch = data.get_batch(batch_size=TRAIN_BATCH_SIZE)
            i += 1

        return preds
Exemplo n.º 12
0
    def run_epoch(self, sess, data):
        prog = Progbar(target=1 + int(data.data_size / TRAIN_BATCH_SIZE), file_given=self.log)
        
        losses = list()
        i = 0
        batch = data.get_batch()
        while batch is not None:
            q_batch = batch[0]
            p_batch = batch[1]
            a_batch = batch[2]
            s_t_batch = batch[3]

            loss = self.train_on_batch(sess, q_batch, p_batch, s_t_batch, a_batch)
            losses.append(loss)

            prog.update(i + 1, [("train loss", loss)])

            batch = data.get_batch()
            if i % 1200 == 0 and i > 0:
                self.log.write('\nNow saving file...')
                saver.save(sess, SAVE_MODEL_DIR)
                self.log.write('\nSaved...')
            i += 1
        return losses
Exemplo n.º 13
0
 def _work(self, cls):
     frame_cnt = 0
     self.long_enough = self.lens_df.loc[cls].apply(
         lambda lst: map(lambda lgn: lgn > self.min_len, lst))
     status = Progbar(self.min_frame_cnt, text=cls)
     self.chk_long_enough()
     while frame_cnt < self.min_frame_cnt:
         self.chk_long_enough()
         if len(self.long_enough.index) == 0:
             status.update(frame_cnt, force=True)
             print("\n")
             return
         smp_pick = choice(list(enumerate(self.long_enough.values)))
         run_pick = choice(list(enumerate(smp_pick[-1])))
         while not run_pick[-1]:
             run_pick = choice(list(enumerate(smp_pick[-1])))
         src = self.long_enough.index.values[smp_pick[0]]
         self.run.append((src,
                          self.runs_df.loc[cls, src]
                          [run_pick[0]],))
         frame_cnt += self.lens_df.loc[cls, src][run_pick[0]]
         status.update(frame_cnt)
         self.long_enough.iloc[smp_pick[0]][run_pick[0]] = False
         self.chk_long_enough()
Exemplo n.º 14
0
def train_epoch(model, config, train_loader, val_loader, epoch_i):
    opt = config['opt']

    optimizer = config['optimizer']
    scheduler = config['scheduler']
    writer = config['writer']
    scaler = config['scaler']
    pad_label_id = config['pad_label_id']

    criterion = nn.CrossEntropyLoss(ignore_index=pad_label_id).to(opt.device)
    n_batches = len(train_loader)
    prog = Progbar(target=n_batches)
    # train one epoch
    model.train()
    train_loss = 0.
    st_time = time.time()
    optimizer.zero_grad()
    for local_step, (x,y) in enumerate(train_loader):
        global_step = (len(train_loader) * epoch_i) + local_step
        x = to_device(x, opt.device)
        y = to_device(y, opt.device)
        if opt.use_crf:
            with autocast(enabled=opt.use_amp):
                if opt.use_profiler:
                    with profiler.profile(profile_memory=True, record_shapes=True) as prof:
                        logits, prediction = model(x)
                    print(prof.key_averages().table(sort_by="self_cpu_memory_usage", row_limit=10))
                else:
                    logits, prediction = model(x)
                mask = torch.sign(torch.abs(x[0])).to(torch.uint8).to(opt.device)
                log_likelihood = model.crf(logits, y, mask=mask, reduction='mean')
                loss = -1 * log_likelihood
                if opt.gradient_accumulation_steps > 1:
                    loss = loss / opt.gradient_accumulation_steps
        else:
            with autocast(enabled=opt.use_amp):
                if opt.use_profiler:
                    with profiler.profile(profile_memory=True, record_shapes=True) as prof:
                        logits = model(x)
                    print(prof.key_averages().table(sort_by="self_cpu_memory_usage", row_limit=10))
                else:
                    logits = model(x)
                # reshape for computing loss
                logits_view = logits.view(-1, model.label_size)
                y_view = y.view(-1)
                loss = criterion(logits_view, y_view)
                if opt.gradient_accumulation_steps > 1:
                    loss = loss / opt.gradient_accumulation_steps
        # back-propagation - begin
        scaler.scale(loss).backward()
        if (local_step + 1) % opt.gradient_accumulation_steps == 0:
            scaler.unscale_(optimizer)
            torch.nn.utils.clip_grad_norm_(model.parameters(), opt.max_grad_norm)
            scaler.step(optimizer)
            scaler.update()
            optimizer.zero_grad()
            if opt.use_transformers_optimizer: scheduler.step()
        # back-propagation - end
        train_loss += loss.item()
        if writer: writer.add_scalar('Loss/train', loss.item(), global_step)
        curr_lr = scheduler.get_last_lr()[0] if scheduler else optimizer.param_groups[0]['lr']
        prog.update(local_step+1,
                    [('global step', global_step),
                     ('train curr loss', loss.item()),
                     ('lr', curr_lr)])
    train_loss = train_loss / n_batches

    # evaluate
    eval_ret = evaluate(model, config, val_loader)
    eval_loss = eval_ret['loss']
    eval_f1 = eval_ret['f1']
    curr_time = time.time()
    elapsed_time = (curr_time - st_time) / 60
    st_time = curr_time
    curr_lr = scheduler.get_last_lr()[0] if scheduler else optimizer.param_groups[0]['lr']
    logger.info('{:3d} epoch | {:5d}/{:5d} | train loss : {:10.6f}, valid loss {:10.6f}, valid f1 {:.4f}| lr :{:7.6f} | {:5.2f} min elapsed'.\
            format(epoch_i, local_step+1, len(train_loader), train_loss, eval_loss, eval_f1, curr_lr, elapsed_time)) 
    if writer:
        writer.add_scalar('Loss/valid', eval_loss, global_step)
        writer.add_scalar('F1/valid', eval_f1, global_step)
        writer.add_scalar('LearningRate/train', curr_lr, global_step)
    return eval_loss, eval_f1
Exemplo n.º 15
0
def dev_step(model, data, summary_writer, epoch):
    """Evaluate dev data
    """
    sess = model.sess
    runopts = tf.RunOptions(report_tensor_allocations_upon_oom=True)
    sum_loss = 0.0
    sum_accuracy = 0.0
    sum_f1 = 0.0
    sum_output_indices = None
    sum_logits_indices = None
    sum_sentence_lengths = None
    trans_params = None
    global_step = 0
    prog = Progbar(target=data.num_batches)
    iterator = data.dataset.make_initializable_iterator()
    next_element = iterator.get_next()
    sess.run(iterator.initializer)

    # evaluate on dev data sliced by batch_size to prevent OOM(Out Of Memory).
    for idx in range(data.num_batches):
        try:
            dataset = sess.run(next_element)
        except tf.errors.OutOfRangeError:
            break
        feed_dict = feed.build_feed_dict(model, dataset,
                                         data.max_sentence_length, False)
        if 'bert' in model.config.emb_class:
            # compute bert embedding at runtime
            bert_embeddings = sess.run([model.bert_embeddings_subgraph],
                                       feed_dict=feed_dict,
                                       options=runopts)
            # update feed_dict
            feed.update_feed_dict(model, feed_dict, bert_embeddings,
                                  dataset['bert_wordidx2tokenidx'])
        global_step, logits_indices, sentence_lengths, loss, accuracy, f1 = \
            sess.run([model.global_step, model.logits_indices, model.sentence_lengths, \
                      model.loss, model.accuracy, model.f1], feed_dict=feed_dict)
        prog.update(idx + 1, [('dev loss', loss), ('dev accuracy', accuracy),
                              ('dev f1', f1)])
        sum_loss += loss
        sum_accuracy += accuracy
        sum_f1 += f1
        sum_output_indices = np_concat(sum_output_indices,
                                       np.argmax(dataset['tags'], 2))
        sum_logits_indices = np_concat(sum_logits_indices, logits_indices)
        sum_sentence_lengths = np_concat(sum_sentence_lengths,
                                         sentence_lengths)
        idx += 1
    avg_loss = sum_loss / data.num_batches
    avg_accuracy = sum_accuracy / data.num_batches
    avg_f1 = sum_f1 / data.num_batches
    tag_preds = model.config.logits_indices_to_tags_seq(
        sum_logits_indices, sum_sentence_lengths)
    tag_corrects = model.config.logits_indices_to_tags_seq(
        sum_output_indices, sum_sentence_lengths)
    tf.logging.debug('\n[epoch %s/%s] dev precision, recall, f1(token): ' %
                     (epoch, model.config.epoch))
    token_f1, l_token_prec, l_token_rec, l_token_f1 = TokenEval.compute_f1(
        model.config.class_size, sum_logits_indices, sum_output_indices,
        sum_sentence_lengths)
    tf.logging.debug('[' + ' '.join([str(x) for x in l_token_prec]) + ']')
    tf.logging.debug('[' + ' '.join([str(x) for x in l_token_rec]) + ']')
    tf.logging.debug('[' + ' '.join([str(x) for x in l_token_f1]) + ']')
    chunk_prec, chunk_rec, chunk_f1 = ChunkEval.compute_f1(
        tag_preds, tag_corrects)
    tf.logging.debug('dev precision(chunk), recall(chunk), f1(chunk): %s, %s, %s' % \
        (chunk_prec, chunk_rec, chunk_f1) + \
        '(invalid for bert due to X tag)')

    # create summaries manually.
    summary_value = [
        tf.Summary.Value(tag='loss', simple_value=avg_loss),
        tf.Summary.Value(tag='accuracy', simple_value=avg_accuracy),
        tf.Summary.Value(tag='f1', simple_value=avg_f1),
        tf.Summary.Value(tag='token_f1', simple_value=token_f1),
        tf.Summary.Value(tag='chunk_f1', simple_value=chunk_f1)
    ]
    summaries = tf.Summary(value=summary_value)
    summary_writer.add_summary(summaries, global_step)

    return token_f1, chunk_f1, avg_f1
Exemplo n.º 16
0
def dev_step(model, data, summary_writer, epoch):
    """Evaluate dev data
    """
    def np_concat(sum_var, var):
        if sum_var is not None:
            sum_var = np.concatenate((sum_var, var), axis=0)
        else:
            sum_var = var
        return sum_var

    sess = model.sess
    runopts = tf.RunOptions(report_tensor_allocations_upon_oom=True)
    sum_loss = 0.0
    sum_accuracy = 0.0
    sum_f1 = 0.0
    sum_output_indices = None
    sum_logits_indices = None
    sum_sentence_lengths = None
    trans_params = None
    global_step = 0
    prog = Progbar(target=data.num_batches)
    iterator = data.dataset.make_initializable_iterator()
    next_element = iterator.get_next()
    sess.run(iterator.initializer)

    # evaluate on dev data sliced by batch_size to prevent OOM(Out Of Memory).
    for idx in range(data.num_batches):
        try:
            dataset = sess.run(next_element)
        except tf.errors.OutOfRangeError:
            break
        feed_dict = feed.build_feed_dict(model, dataset,
                                         data.max_sentence_length, False)
        if 'bert' in model.config.emb_class:
            # compute bert embedding at runtime
            bert_embeddings = sess.run([model.bert_embeddings_subgraph],
                                       feed_dict=feed_dict,
                                       options=runopts)
            # update feed_dict
            feed_dict[model.bert_embeddings] = feed.align_bert_embeddings(
                config, bert_embeddings, dataset['bert_wordidx2tokenidx'], idx)
        global_step, logits_indices, sentence_lengths, loss, accuracy, f1 = \
            sess.run([model.global_step, model.logits_indices, model.sentence_lengths, \
                      model.loss, model.accuracy, model.f1], feed_dict=feed_dict)
        prog.update(idx + 1, [('dev loss', loss), ('dev accuracy', accuracy),
                              ('dev f1(tf_metrics)', f1)])
        sum_loss += loss
        sum_accuracy += accuracy
        sum_f1 += f1
        sum_output_indices = np_concat(sum_output_indices,
                                       np.argmax(dataset['tags'], 2))
        sum_logits_indices = np_concat(sum_logits_indices, logits_indices)
        sum_sentence_lengths = np_concat(sum_sentence_lengths,
                                         sentence_lengths)
        idx += 1
    avg_loss = sum_loss / data.num_batches
    avg_accuracy = sum_accuracy / data.num_batches
    avg_f1 = sum_f1 / data.num_batches
    tag_preds = model.config.logits_indices_to_tags_seq(
        sum_logits_indices, sum_sentence_lengths)
    tag_corrects = model.config.logits_indices_to_tags_seq(
        sum_output_indices, sum_sentence_lengths)
    seqeval_prec = precision_score(tag_corrects, tag_preds)
    seqeval_rec = recall_score(tag_corrects, tag_preds)
    seqeval_f1 = f1_score(tag_corrects, tag_preds)
    tf.logging.debug('\n[epoch %s/%s] dev precision(seqeval), recall(seqeval), f1(seqeval): %s, %s, %s' % \
        (epoch, model.config.epoch, seqeval_prec, seqeval_rec, seqeval_f1))

    # create summaries manually.
    summary_value = [
        tf.Summary.Value(tag='loss', simple_value=avg_loss),
        tf.Summary.Value(tag='accuracy', simple_value=avg_accuracy),
        tf.Summary.Value(tag='f1(tf_metrics)', simple_value=avg_f1),
        tf.Summary.Value(tag='f1(seqeval)', simple_value=seqeval_f1)
    ]
    summaries = tf.Summary(value=summary_value)
    summary_writer.add_summary(summaries, global_step)

    return seqeval_f1, avg_f1
Exemplo n.º 17
0
def dev_step(sess, model, config, data, summary_writer, epoch):
    idx = 0
    nbatches = (len(data.sentence_tags) + config.dev_batch_size -
                1) // config.dev_batch_size
    prog = Progbar(target=nbatches)
    sum_loss = 0.0
    sum_accuracy = 0.0
    sum_logits = None
    sum_sentence_lengths = None
    trans_params = None
    global_step = 0
    # evaluate on dev data sliced by dev_batch_size to prevent OOM
    for ptr in range(0, len(data.sentence_tags), config.dev_batch_size):
        config.is_training = False
        feed_dict = {
            model.input_data_pos_ids:
            data.sentence_pos_ids[ptr:ptr + config.dev_batch_size],
            model.output_data:
            data.sentence_tags[ptr:ptr + config.dev_batch_size],
            model.is_train:
            config.is_training,
            model.sentence_length:
            data.max_sentence_length
        }
        feed_dict[model.input_data_word_ids] = data.sentence_word_ids[
            ptr:ptr + config.dev_batch_size]
        feed_dict[model.input_data_wordchr_ids] = data.sentence_wordchr_ids[
            ptr:ptr + config.dev_batch_size]
        if config.emb_class == 'elmo':
            feed_dict[
                model.
                elmo_input_data_wordchr_ids] = data.sentence_elmo_wordchr_ids[
                    ptr:ptr + config.dev_batch_size]
        if config.emb_class == 'bert':
            feed_dict[
                model.
                bert_input_data_token_ids] = data.sentence_bert_token_ids[
                    ptr:ptr + config.batch_size]
            feed_dict[
                model.
                bert_input_data_token_masks] = data.sentence_bert_token_masks[
                    ptr:ptr + config.batch_size]
            feed_dict[
                model.
                bert_input_data_segment_ids] = data.sentence_bert_segment_ids[
                    ptr:ptr + config.batch_size]
        global_step, logits, trans_params, sentence_lengths, loss, accuracy = \
                 sess.run([model.global_step, model.logits, model.trans_params, model.sentence_lengths, \
                           model.loss, model.accuracy], feed_dict=feed_dict)
        prog.update(idx + 1, [('dev loss', loss), ('dev accuracy', accuracy)])
        sum_loss += loss
        sum_accuracy += accuracy
        sum_logits = np_concat(sum_logits, logits)
        sum_sentence_lengths = np_concat(sum_sentence_lengths,
                                         sentence_lengths)
        idx += 1
    sum_loss = sum_loss / nbatches
    sum_accuracy = sum_accuracy / nbatches
    print('[epoch %s/%s] dev precision, recall, f1(token): ' %
          (epoch, config.epoch))
    token_f1 = TokenEval.compute_f1(config.class_size, sum_logits,
                                    data.sentence_tags, sum_sentence_lengths)

    if config.use_crf:
        viterbi_sequences = viterbi_decode(sum_logits, trans_params,
                                           sum_sentence_lengths)
        tag_preds = data.logits_indices_to_tags_seq(viterbi_sequences,
                                                    sum_sentence_lengths)
    else:
        sum_logits_indices = np.argmax(sum_logits, 2)
        tag_preds = data.logits_indices_to_tags_seq(sum_logits_indices,
                                                    sum_sentence_lengths)
    sum_output_data_indices = np.argmax(data.sentence_tags, 2)
    tag_corrects = data.logits_indices_to_tags_seq(sum_output_data_indices,
                                                   sum_sentence_lengths)
    prec, rec, f1 = ChunkEval.compute_f1(tag_preds, tag_corrects)
    print('dev precision, recall, f1(chunk): ', prec, rec, f1,
          ', this is no meaningful for emb_class=bert')
    chunk_f1 = f1
    m = chunk_f1
    # create summaries manually
    summary_value = [
        tf.Summary.Value(tag='loss_1', simple_value=sum_loss),
        tf.Summary.Value(tag='accuracy_1', simple_value=sum_accuracy),
        tf.Summary.Value(tag='token_f1', simple_value=token_f1),
        tf.Summary.Value(tag='chunk_f1', simple_value=chunk_f1)
    ]
    summaries = tf.Summary(value=summary_value)
    summary_writer.add_summary(summaries, global_step)

    m = token_f1
    return m
Exemplo n.º 18
0
def train_step(sess, model, config, data, summary_op, summary_writer):
    start_time = time.time()
    runopts = tf.RunOptions(report_tensor_allocations_upon_oom=True)
    idx = 0
    nbatches = (len(data.sentence_tags) + config.batch_size -
                1) // config.batch_size
    prog = Progbar(target=nbatches)
    for ptr in range(0, len(data.sentence_tags), config.batch_size):
        config.is_training = True
        feed_dict = {
            model.input_data_pos_ids:
            data.sentence_pos_ids[ptr:ptr + config.batch_size],
            model.output_data:
            data.sentence_tags[ptr:ptr + config.batch_size],
            model.is_train:
            config.is_training,
            model.sentence_length:
            data.max_sentence_length
        }
        feed_dict[model.input_data_word_ids] = data.sentence_word_ids[
            ptr:ptr + config.batch_size]
        feed_dict[model.input_data_wordchr_ids] = data.sentence_wordchr_ids[
            ptr:ptr + config.batch_size]
        if config.emb_class == 'elmo':
            feed_dict[
                model.
                elmo_input_data_wordchr_ids] = data.sentence_elmo_wordchr_ids[
                    ptr:ptr + config.batch_size]
        if config.emb_class == 'bert':
            feed_dict[
                model.
                bert_input_data_token_ids] = data.sentence_bert_token_ids[
                    ptr:ptr + config.batch_size]
            feed_dict[
                model.
                bert_input_data_token_masks] = data.sentence_bert_token_masks[
                    ptr:ptr + config.batch_size]
            feed_dict[
                model.
                bert_input_data_segment_ids] = data.sentence_bert_segment_ids[
                    ptr:ptr + config.batch_size]
        step, summaries, _, loss, accuracy, learning_rate, bert_embeddings = \
               sess.run([model.global_step, summary_op, model.train_op, \
                         model.loss, model.accuracy, model.learning_rate, model.bert_embeddings], feed_dict=feed_dict, options=runopts)
        if config.emb_class == 'bert' and idx == 0:
            print("# bert_token_ids")
            t = data.sentence_bert_token_ids[:3]
            print(np.shape(t))
            print(t)
            print("# bert_token_masks")
            t = data.sentence_bert_token_masks[:3]
            print(np.shape(t))
            print(t)
            print("# bert_embedding")
            t = bert_embeddings[:3]
            print(np.shape(t))
            print(t)

        summary_writer.add_summary(summaries, step)
        prog.update(idx + 1, [('step', step), ('train loss', loss),
                              ('train accuracy', accuracy),
                              ('lr', learning_rate)])
        idx += 1
    duration_time = time.time() - start_time
    out = 'duration_time : ' + str(duration_time) + ' sec for this epoch'
    sys.stderr.write(out + '\n')