mirror of
https://github.com/wassname/Castor.git
synced 2026-09-09 11:13:20 +08:00
Replication of STOA for Reuters Dataset (#152)
* Add ReutersTrainer, ReutersEvaluator options in Factory classes * Add Reuters to Kim-CNN command line arguments * Fix SST dataset path according to changes in Kim-CNN args The dataset path in args.py was made to point at the dataset folder rather than dataset/SST folder. Hence SST folder was added to paths in the SST dataset class * Add Reuters dataset class, and support in __main__ * Add Reuters dataset trainers and evaluators * Remove debug print statement in reuters_evaluator * Fix rounding bug in reuters_trainer and reuters_evaluator * Add LSTM for baseline text classification measurements * Add eval metrics for lstm_baseline * Set batch_first param in lstm_baseline * Remove onnx args from lstm_baseline * Pack padded sequences in LSTM_baseline * Add TensorBoardX support for Reuters trainer * Add Arxiv Academic Paper Dataset (AAPD) * Add Hidden Bottleneck Layer to BiLSTM * Fix packing of padded tensors in Reuters * Add cmdline args for Hidden Bottleneck Layer for BiLSTM * Include pre-padding lengths in AAPD dataset * Remove duplication of preprocessing code in AAPD * Remove batch_size condition in ReutersTrainer
This commit is contained in:
@@ -12,6 +12,7 @@ from datasets.snli import SNLI
|
||||
from datasets.sts2014 import STS2014
|
||||
from datasets.quora import Quora
|
||||
from datasets.reuters import Reuters
|
||||
from datasets.aapd import AAPD
|
||||
|
||||
class UnknownWordVecCache(object):
|
||||
"""
|
||||
@@ -92,6 +93,11 @@ class DatasetFactory(object):
|
||||
train_loader, dev_loader, test_loader = Reuters.iters(dataset_root, word_vectors_file, word_vectors_dir, batch_size, device=device, unk_init=UnknownWordVecCache.unk)
|
||||
embedding = nn.Embedding.from_pretrained(Reuters.TEXT_FIELD.vocab.vectors)
|
||||
return Reuters, embedding, train_loader, test_loader, dev_loader
|
||||
elif dataset_name == 'aapd':
|
||||
dataset_root = os.path.join(castor_dir, os.pardir, 'Castor-data', 'datasets', 'AAPD/')
|
||||
train_loader, dev_loader, test_loader = AAPD.iters(dataset_root, word_vectors_file, word_vectors_dir, batch_size, device=device, unk_init=UnknownWordVecCache.unk)
|
||||
embedding = nn.Embedding.from_pretrained(AAPD.TEXT_FIELD.vocab.vectors)
|
||||
return AAPD, embedding, train_loader, test_loader, dev_loader
|
||||
else:
|
||||
raise ValueError('{} is not a valid dataset.'.format(dataset_name))
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ class EvaluatorFactory(object):
|
||||
'pit2015': PIT2015Evaluator,
|
||||
'twitterurl': PIT2015Evaluator,
|
||||
'Reuters': ReutersEvaluator,
|
||||
'AAPD': ReutersEvaluator,
|
||||
'SNLI': SNLIEvaluator,
|
||||
'sts2014': STS2014Evaluator,
|
||||
'Quora': QuoraEvaluator
|
||||
|
||||
@@ -14,11 +14,14 @@ class ReutersEvaluator(Evaluator):
|
||||
total_loss = 0
|
||||
|
||||
for batch_idx, batch in enumerate(self.data_loader):
|
||||
scores = self.model(batch.text)
|
||||
scores = self.model(batch.text[0], lengths=batch.text[1])
|
||||
scores_rounded = F.sigmoid(scores).round().long()
|
||||
|
||||
# Using binary accuracy
|
||||
for tensor1, tensor2 in zip(F.sigmoid(scores).round().long(), batch.label):
|
||||
for tensor1, tensor2 in zip(scores_rounded, batch.label):
|
||||
if np.array_equal(tensor1, tensor2):
|
||||
n_dev_correct += 1
|
||||
|
||||
total_loss += F.binary_cross_entropy_with_logits(scores, batch.label.float(), size_average=False).item()
|
||||
|
||||
accuracy = 100. * n_dev_correct / len(self.data_loader.dataset.examples)
|
||||
|
||||
@@ -26,6 +26,7 @@ class TrainerFactory(object):
|
||||
'pit2015': PIT2015Trainer,
|
||||
'twitterurl': PIT2015Trainer,
|
||||
'Reuters': ReutersTrainer,
|
||||
'AAPD': ReutersTrainer,
|
||||
'snli': SNLITrainer,
|
||||
'sts2014': STS2014Trainer,
|
||||
'quora': QuoraTrainer
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import time
|
||||
import os
|
||||
|
||||
import datetime
|
||||
import numpy as np
|
||||
import os
|
||||
import torch
|
||||
import torch.nn.functional as F
|
||||
import numpy as np
|
||||
from tensorboardX import SummaryWriter
|
||||
|
||||
from .trainer import Trainer
|
||||
from utils.serialization import save_checkpoint
|
||||
|
||||
|
||||
class ReutersTrainer(Trainer):
|
||||
@@ -21,6 +22,7 @@ class ReutersTrainer(Trainer):
|
||||
self.log_template = ' '.join(
|
||||
'{:>6.0f},{:>5.0f},{:>9.0f},{:>5.0f}/{:<5.0f} {:>7.0f}%,{:>8.6f},{},{:12.4f},{}'.split(','))
|
||||
self.dev_log_template = ' '.join('{:>6.0f},{:>5.0f},{:>9.0f},{:>5.0f}/{:<5.0f} {:>7.0f}%,{:>8.6f},{:8.6f},{:12.4f},{:12.4f}'.split(','))
|
||||
self.writer = SummaryWriter(log_dir="tensorboard_logs/" + datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S"))
|
||||
|
||||
def train_epoch(self, epoch):
|
||||
self.train_loader.init_epoch()
|
||||
@@ -29,7 +31,7 @@ class ReutersTrainer(Trainer):
|
||||
self.iterations += 1
|
||||
self.model.train()
|
||||
self.optimizer.zero_grad()
|
||||
scores = self.model(batch.text)
|
||||
scores = self.model(batch.text[0], lengths=batch.text[1])
|
||||
# Using binary accuracy
|
||||
for tensor1, tensor2 in zip(F.sigmoid(scores).round().long(), batch.label):
|
||||
if np.array_equal(tensor1, tensor2):
|
||||
@@ -44,6 +46,11 @@ class ReutersTrainer(Trainer):
|
||||
# Evaluate performance on validation set
|
||||
if self.iterations % self.dev_log_interval == 1:
|
||||
dev_acc, dev_loss = self.dev_evaluator.get_scores()[0]
|
||||
niter = epoch * len(self.train_loader) + batch_idx
|
||||
self.writer.add_scalar('Train/Loss', loss.data[0], niter)
|
||||
self.writer.add_scalar('Dev/Loss', dev_loss, niter)
|
||||
self.writer.add_scalar('Train/Accuracy', train_acc, niter)
|
||||
self.writer.add_scalar('Dev/Accuracy', dev_acc, niter)
|
||||
print(self.dev_log_template.format(time.time() - self.start,
|
||||
epoch, self.iterations, 1 + batch_idx, len(self.train_loader),
|
||||
100. * (1 + batch_idx) / len(self.train_loader), loss.item(),
|
||||
|
||||
Reference in New Issue
Block a user