def train_epoch(self, epoch_idx, model, train_batches): # Turn on training mode which enables dropout and BNorm. model.train() np.random.shuffle(train_batches) # shuffling data running_losses = [] epoch_losses = [] num_train_batches = len(train_batches) bar = create_progress_bar('train_loss') for batch_idx in bar(range(num_train_batches)): self.optimizer.zero_grad() loss_var = self.train_step(model, train_batches[batch_idx]) loss_data = loss_var.data[0] loss_var.backward() # compute gradients self.optimizer.step() # update weights running_losses = ([loss_data] + running_losses)[:20] bar.dynamic_messages['train_loss'] = np.mean(running_losses) epoch_losses.append(loss_data) epoch_loss_avg = np.mean(epoch_losses) return epoch_loss_avg
def draw_prediction_errors(bad_dgs, tgt_dir): if not os.path.exists(tgt_dir): os.makedirs(tgt_dir) num_items = len(bad_dgs) logger.info('Drawing %d graphs with errors in --> %s', len(bad_dgs), tgt_dir) bar = create_progress_bar() # for idx in bar(range(num_items // 100)): for idx in bar(range(num_items)): dg = bad_dgs[idx] error_data = dg.graph['errors'] if not error_data is None: for child, head, target in error_data[:2]: nx.set_node_attributes(dg, values={child: 'red'}, name='color') nx.set_node_attributes(dg, values={head: 'blue'}, name='color') # nx.set_node_attributes(dg, values={head: 'setlinewidth(3)'}, name='style') # if 'lo' in dg.node[child]: # nx.set_node_attributes(dg, values={dg.node[child]['lo']: 'green'}, name='color') # # if 'ro' in dg.node[child]: # nx.set_node_attributes(dg, values={dg.node[child]['ro']: 'green'}, name='color') png_fname = os.path.join(tgt_dir, '%d.png' % idx) gold_snt = dg.graph['snt'] pred_snt = ' '.join( [dg.node[n]['GOLD_FORM'] for n in dg.graph['node_order']]) draw_graph(dg, label='%s\n%s' % (gold_snt, pred_snt), layout='dot', fname=png_fname, rename_nodes=True) logger.info('Done')
def compute_val_loss(self, model, dev_batches): total_loss = 0 running_losses = [] num_dev_batches = len(dev_batches) bar = create_progress_bar('dev_loss') for batch_idx in bar(range(num_dev_batches)): loss_var = self.train_step(model, dev_batches[batch_idx]) loss_data = loss_var.data[0] # Record loss running_losses = ([loss_data] + running_losses)[:20] bar.dynamic_messages['dev_loss'] = np.mean(running_losses) total_loss += loss_data total_loss_avg = total_loss / num_dev_batches return total_loss_avg