Browse Source

fix import bug

tags/v0.4.10
yunfan 5 years ago
parent
commit
ca145d2050
3 changed files with 34 additions and 17 deletions
  1. +1
    -1
      reproduction/seqence_labelling/ner/data/OntoNoteLoader.py
  2. +3
    -1
      reproduction/seqence_labelling/ner/model/dilated_cnn.py
  3. +30
    -15
      reproduction/seqence_labelling/ner/train_idcnn.py

+ 1
- 1
reproduction/seqence_labelling/ner/data/OntoNoteLoader.py View File

@@ -6,7 +6,7 @@ from fastNLP import Vocabulary
from fastNLP import Const from fastNLP import Const
from reproduction.utils import check_dataloader_paths from reproduction.utils import check_dataloader_paths


from fastNLP.io.dataset_loader import ConllLoader
from fastNLP.io import ConllLoader
from reproduction.seqence_labelling.ner.data.utils import iob2bioes, iob2 from reproduction.seqence_labelling.ner.data.utils import iob2bioes, iob2


class OntoNoteNERDataLoader(DataSetLoader): class OntoNoteNERDataLoader(DataSetLoader):


+ 3
- 1
reproduction/seqence_labelling/ner/model/dilated_cnn.py View File

@@ -106,7 +106,9 @@ class IDCNN(nn.Module):
if self.crf is not None and target is not None: if self.crf is not None and target is not None:
loss = self.crf(y.transpose(1, 2), t, mask) loss = self.crf(y.transpose(1, 2), t, mask)
else: else:
# t.masked_fill_(mask == 0, -100)
y.masked_fill_((mask == 0)[:,None,:], -100)
# f_mask = mask.float()
# t = f_mask * t + (1-f_mask) * -100
loss = F.cross_entropy(y, t, ignore_index=-100) loss = F.cross_entropy(y, t, ignore_index=-100)
return loss return loss




+ 30
- 15
reproduction/seqence_labelling/ner/train_idcnn.py View File

@@ -7,13 +7,14 @@ from torch.optim import SGD, Adam
from fastNLP import Const from fastNLP import Const
from fastNLP import RandomSampler, BucketSampler from fastNLP import RandomSampler, BucketSampler
from fastNLP import SpanFPreRecMetric from fastNLP import SpanFPreRecMetric
from fastNLP import Trainer
from fastNLP import Trainer, Tester
from fastNLP.core.metrics import MetricBase from fastNLP.core.metrics import MetricBase
from reproduction.seqence_labelling.ner.model.dilated_cnn import IDCNN from reproduction.seqence_labelling.ner.model.dilated_cnn import IDCNN
from fastNLP.core.utils import Option from fastNLP.core.utils import Option
from fastNLP.modules.encoder.embedding import CNNCharEmbedding, StaticEmbedding from fastNLP.modules.encoder.embedding import CNNCharEmbedding, StaticEmbedding
from fastNLP.core.utils import cache_results from fastNLP.core.utils import cache_results
from fastNLP.core.vocabulary import VocabularyOption from fastNLP.core.vocabulary import VocabularyOption
import fitlog
import sys import sys
import torch.cuda import torch.cuda
import os import os
@@ -31,7 +32,7 @@ def get_path(path):
ops = Option( ops = Option(
batch_size=128, batch_size=128,
num_epochs=100, num_epochs=100,
lr=5e-4,
lr=3e-4,
repeats=3, repeats=3,
num_layers=3, num_layers=3,
num_filters=400, num_filters=400,
@@ -39,18 +40,18 @@ ops = Option(
gradient_clip=5, gradient_clip=5,
) )


@cache_results('ontonotes-min_freq0-case-cache')
@cache_results('ontonotes-case-cache')
def load_data(): def load_data():
print('loading data') print('loading data')
# data = OntoNoteNERDataLoader(encoding_type=encoding_type).process(
# data_path = get_path('workdir/datasets/ontonotes-v4')
# lower=False,
# word_vocab_opt=VocabularyOption(min_freq=0),
# )
data = Conll2003DataLoader(task='ner', encoding_type=encoding_type).process(
paths=get_path('workdir/datasets/conll03'),
lower=False, word_vocab_opt=VocabularyOption(min_freq=0)
data = OntoNoteNERDataLoader(encoding_type=encoding_type).process(
paths = get_path('workdir/datasets/ontonotes-v4'),
lower=False,
word_vocab_opt=VocabularyOption(min_freq=0),
) )
# data = Conll2003DataLoader(task='ner', encoding_type=encoding_type).process(
# paths=get_path('workdir/datasets/conll03'),
# lower=False, word_vocab_opt=VocabularyOption(min_freq=0)
# )


# char_embed = CNNCharEmbedding(vocab=data.vocabs['cap_words'], embed_size=30, char_emb_size=30, filter_nums=[30], # char_embed = CNNCharEmbedding(vocab=data.vocabs['cap_words'], embed_size=30, char_emb_size=30, filter_nums=[30],
# kernel_sizes=[3]) # kernel_sizes=[3])
@@ -88,11 +89,11 @@ model = IDCNN(init_embed=word_embed,
kernel_size=3, kernel_size=3,
use_crf=ops.use_crf, use_projection=True, use_crf=ops.use_crf, use_projection=True,
block_loss=True, block_loss=True,
input_dropout=0.5, hidden_dropout=0.0, inner_dropout=0.0)
input_dropout=0.5, hidden_dropout=0.2, inner_dropout=0.2)


print(model) print(model)


callbacks = [GradientClipCallback(clip_value=ops.gradient_clip, clip_type='norm'),]
callbacks = [GradientClipCallback(clip_value=ops.gradient_clip, clip_type='value'),]
metrics = [] metrics = []
metrics.append( metrics.append(
SpanFPreRecMetric( SpanFPreRecMetric(
@@ -123,8 +124,9 @@ metrics.append(
LossMetric(loss=Const.LOSS) LossMetric(loss=Const.LOSS)
) )


optimizer = Adam(model.parameters(), lr=ops.lr, weight_decay=1e-4)
# scheduler = LRScheduler(LambdaLR(optimizer, lr_lambda=lambda epoch: 1 / (1 + 0.05 * epoch)))
optimizer = Adam(model.parameters(), lr=ops.lr, weight_decay=0)
scheduler = LRScheduler(LambdaLR(optimizer, lr_lambda=lambda epoch: 1 / (1 + 0.05 * epoch)))
callbacks.append(scheduler)
# callbacks.append(LRScheduler(CosineAnnealingLR(optimizer, 15))) # callbacks.append(LRScheduler(CosineAnnealingLR(optimizer, 15)))
# optimizer = SWATS(model.parameters(), verbose=True) # optimizer = SWATS(model.parameters(), verbose=True)
# optimizer = Adam(model.parameters(), lr=0.005) # optimizer = Adam(model.parameters(), lr=0.005)
@@ -138,3 +140,16 @@ trainer = Trainer(train_data=data.datasets['train'], model=model, optimizer=opti
check_code_level=-1, check_code_level=-1,
callbacks=callbacks, num_workers=2, n_epochs=ops.num_epochs) callbacks=callbacks, num_workers=2, n_epochs=ops.num_epochs)
trainer.train() trainer.train()

torch.save(model, 'idcnn.pt')

tester = Tester(
data=data.datasets['test'],
model=model,
metrics=metrics,
batch_size=ops.batch_size,
num_workers=2,
device=device
)
tester.test()


Loading…
Cancel
Save