[pytorch] 图像识别之mixup/cutout/Margin loss....简单实现

本人kaggle分享链接:https://www.kaggle.com/c/bengaliai-cv19/discussion/128592

 

Mixup

from torchtoolbox.tools import mixup_data, mixup_criterion

alpha = 0.2
for i, (data, labels) in enumerate(train_data):
    data = data.to(device, non_blocking=True)
    labels = labels.to(device, non_blocking=True)

    data, labels_a, labels_b, lam = mixup_data(data, labels, alpha)
    optimizer.zero_grad()
    outputs = model(data)
    loss = mixup_criterion(Loss, outputs, labels_a, labels_b, lam)

    loss.backward()
    optimizer.update()
 

Cutout

from torchvision import transforms
from torchtoolbox.transform import Cutout

_train_transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    Cutout(),
    transforms.RandomHorizontalFlip(),
    transforms.ColorJitter(0.4, 0.4, 0.4),
    transforms.ToTensor(),
    normalize,
])

ArcLoss
CosLoss
L2Softmax

from torchtoolbox.nn.loss import ArcLoss, CosLoss, L2Softmax

 

reference:https://github.com/PistonY/torch-toolbox

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个简单的基于PyTorch的中文实体命名识别模型实现: 首先,需要对中文文本进行分词,可以使用jieba分词库进行分词: ```python import jieba def segment(text): return list(jieba.cut(text)) ``` 接下来,需要将文本中的实体标记出来,可以使用BIO(Beginning, Inside, Outside)标记法。例如,对于句子“张三在北京工作”,可以标记为: ```python ['张', '三', '在', '北', '京', '工', '作'] ['B-PER', 'I-PER', 'O', 'B-LOC', 'I-LOC', 'O', 'O'] ``` 其中,B-PER表示人名的起始位置,I-PER表示人名的中间位置,B-LOC表示地名的起始位置,I-LOC表示地名的中间位置,O表示非实体。 标记实体的过程可以使用正则表达式来实现: ```python import re def label_entity(text, entities): labels = ['O'] * len(text) for entity in entities: pattern = re.compile(entity) match = pattern.search(text) if match: start = match.start() end = match.end() labels[start] = 'B-' + entity_type for i in range(start+1, end): labels[i] = 'I-' + entity_type return labels ``` 最后,可以使用PyTorch来训练一个实体命名识别模型,例如使用BiLSTM-CRF模型: ```python import torch import torch.nn as nn import torch.optim as optim class BiLSTM_CRF(nn.Module): def __init__(self, vocab_size, tag_to_ix, embedding_dim, hidden_dim): super(BiLSTM_CRF, self).__init__() self.embedding_dim = embedding_dim self.hidden_dim = hidden_dim self.vocab_size = vocab_size self.tag_to_ix = tag_to_ix self.tagset_size = len(tag_to_ix) self.word_embeds = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim // 2, num_layers=1, bidirectional=True) self.hidden2tag = nn.Linear(hidden_dim, self.tagset_size) self.transitions = nn.Parameter(torch.randn(self.tagset_size, self.tagset_size)) self.transitions.data[tag_to_ix['O'], :] = -10000 self.transitions.data[:, tag_to_ix['O']] = -10000 self.transitions.data[tag_to_ix['O'], tag_to_ix['O']] = 0 self.transitions.data[tag_to_ix['B-PER'], tag_to_ix['I-PER']] = -10000 self.transitions.data[tag_to_ix['I-PER'], tag_to_ix['B-PER']] = -10000 self.transitions.data[tag_to_ix['B-LOC'], tag_to_ix['I-LOC']] = -10000 self.transitions.data[tag_to_ix['I-LOC'], tag_to_ix['B-LOC']] = -10000 self.hidden = self.init_hidden() def init_hidden(self): return (torch.randn(2, 1, self.hidden_dim // 2), torch.randn(2, 1, self.hidden_dim // 2)) def _forward_alg(self, feats): init_alphas = torch.full((1, self.tagset_size), -10000.) init_alphas[0][self.tag_to_ix['O']] = 0. forward_var = init_alphas for feat in feats: alphas_t = [] for next_tag in range(self.tagset_size): emit_score = feat[next_tag].view(1, -1).expand(1, self.tagset_size) trans_score = self.transitions[next_tag].view(1, -1) next_tag_var = forward_var + trans_score + emit_score alphas_t.append(torch.logsumexp(next_tag_var, dim=1).view(1)) forward_var = torch.cat(alphas_t).view(1, -1) terminal_var = forward_var + self.transitions[self.tag_to_ix['O']] alpha = torch.logsumexp(terminal_var, dim=1) return alpha def _get_lstm_features(self, sentence): self.hidden = self.init_hidden() embeds = self.word_embeds(sentence).view(len(sentence), 1, -1) lstm_out, self.hidden = self.lstm(embeds, self.hidden) lstm_out = lstm_out.view(len(sentence), self.hidden_dim) lstm_feats = self.hidden2tag(lstm_out) return lstm_feats def _score_sentence(self, feats, tags): score = torch.zeros(1) tags = torch.cat([torch.tensor([self.tag_to_ix['O']], dtype=torch.long), tags]) for i, feat in enumerate(feats): score = score + self.transitions[tags[i + 1], tags[i]] + feat[tags[i + 1]] score = score + self.transitions[self.tag_to_ix['O'], tags[-1]] return score def _viterbi_decode(self, feats): backpointers = [] init_vvars = torch.full((1, self.tagset_size), -10000.) init_vvars[0][self.tag_to_ix['O']] = 0 forward_var = init_vvars for feat in feats: bptrs_t = [] viterbivars_t = [] for next_tag in range(self.tagset_size): next_tag_var = forward_var + self.transitions[next_tag] best_tag_id = argmax(next_tag_var) bptrs_t.append(best_tag_id) viterbivars_t.append(next_tag_var[0][best_tag_id].view(1)) forward_var = (torch.cat(viterbivars_t) + feat).view(1, -1) backpointers.append(bptrs_t) terminal_var = forward_var + self.transitions[self.tag_to_ix['O']] best_tag_id = argmax(terminal_var) path_score = terminal_var[0][best_tag_id] best_path = [best_tag_id] for bptrs_t in reversed(backpointers): best_tag_id = bptrs_t[best_tag_id] best_path.append(best_tag_id) start = best_path.pop() assert start == self.tag_to_ix['O'] best_path.reverse() return path_score, best_path def forward(self, sentence): lstm_feats = self._get_lstm_features(sentence) score, tag_seq = self._viterbi_decode(lstm_feats) return score, tag_seq ``` 在训练过程中,可以使用交叉熵损失函数和随机梯度下降优化器: ```python def train(model, optimizer, train_data): for sentence, tags in train_data: model.zero_grad() sentence_in = prepare_sequence(sentence, word_to_ix) targets = torch.tensor([tag_to_ix[t] for t in tags], dtype=torch.long) loss = model.neg_log_likelihood(sentence_in, targets) loss.backward() optimizer.step() def prepare_sequence(seq, to_ix): idxs = [to_ix[w] for w in seq] return torch.tensor(idxs, dtype=torch.long) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值