姓名国别分类

代码整理-B站网课链接

数据下载

import torch, time, math
import matplotlib.pyplot as plt
import numpy as np
import gzip, csv
from torch.utils.data import Dataset
from torch.utils.data import DataLoaderHIDDEN_SIZE = 100
BATCH_SIZE = 256
N_LAYER = 2
N_EPOCHS = 10
N_CHARS = 128
USE_GPU = Falseclass NameDataset(Dataset):def __init__(self, is_train_set = True):filename = 'data/names_train.csv.gz' if is_train_set else 'data/names_test.csv.gz'with gzip.open(filename, 'rt') as f:reader = csv.reader(f)rows = list(reader)self.names = [row[0] for row in rows]self.len = len(self.names)self.countries = [row[1] for row in rows]self.country_list = list(sorted(set(self.countries)))self.country_dict = self.getCountryDict()self.country_num = len(self.country_list)def __getitem__(self, item):return self.names[item], self.country_dict[self.countries[item]]def __len__(self):return self.lendef getCountryDict(self):country_dict = dict()for idx, country_name in enumerate(self.country_list, 0):country_dict[country_name] = idxreturn country_dictdef idx2country(self, index):return self.country_list[index]def getCountriesNum(self):return self.country_numtrainset = NameDataset(is_train_set=True)
train_loader = DataLoader(trainset, batch_size=BATCH_SIZE, shuffle=True)
testset = NameDataset(is_train_set=False)
test_loader = DataLoader(testset, batch_size=BATCH_SIZE, shuffle=False)
N_COUNTRY = trainset.getCountriesNum()class RNNClassifier(torch.nn.Module):def __init__(self, input_size, hidden_size, output_size, n_layers=1, bidirectional=True):super(RNNClassifier, self).__init__()self.hidden_size = hidden_sizeself.n_layers = n_layersself.n_directions = 2 if bidirectional else 1self.embedding = torch.nn.Embedding(input_size, hidden_size)self.gru = torch.nn.GRU(hidden_size, hidden_size, n_layers, bidirectional=bidirectional)self.fc = torch.nn.Linear(hidden_size * self.n_directions, output_size)def _init_hidden(self, batch_size):hidden = torch.zeros(self.n_layers * self.n_directions, batch_size, self.hidden_size)return create_tensor(hidden)def forward(self, input, seq_lenths):input = input.t()batch_size = input.size(1)hidden = self._init_hidden(batch_size)embedding = self.embedding(input)gru_input = torch.nn.utils.rnn.pack_padded_sequence(embedding, seq_lenths)output, hidden = self.gru(gru_input, hidden)if self.n_directions == 2:hidden_cat = torch.cat([hidden[-1], hidden[-2]], dim=1)else: hidden_cat = hidden[-1]fc_output = self.fc(hidden_cat)return fc_outputdef name2list(name):arr = [ord(c) for c in name]return arr, len(arr)
def create_tensor(tensor):if USE_GPU:devece = torch.device('cuda:0')tensor = tensor.to(devece)return tensor
def make_tensors(names, countries):sequence_and_lengths = [name2list(name) for name in names]name_sequences = [sl[0] for sl in sequence_and_lengths]seq_lengths = torch.LongTensor([sl[1] for sl in sequence_and_lengths])countries = countries.long()seq_tensor = torch.zeros(len(name_sequences), seq_lengths.max()).long()for idx, (seq, seq_len) in enumerate(zip(name_sequences, seq_lengths), 0):seq_tensor[idx, :seq_len] = torch.LongTensor(seq)seq_lengths, perm_idx = seq_lengths.sort(dim=0, descending=True)seq_tensor = seq_tensor[perm_idx]countries = countries[perm_idx]return create_tensor(seq_tensor), create_tensor(seq_lengths), create_tensor(countries)def time_since(since):s = time.time() - sincem = math.floor(s / 60)s -= m * 60return '%dm %ds' % (m, s)def drawAcc(acc_list):epoch = np.arange(1, len(acc_list)+1, 1)acc_list = np.array(acc_list)plt.plot(epoch, acc_list)plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.grid()plt.show()def trainModel():total_loss = 0for i, (names, countries) in enumerate(train_loader, 1):inputs, seq_lengths, target = make_tensors(names, countries)output = classifier(inputs, seq_lengths)loss = criterion(output, target)optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()if i % 10 == 0:print(f'[{time_since(start)}] Epoch {epoch}', end='')print(f'[{i * len(inputs)} / {len(trainset)}]', end='')print(f'loss = {total_loss / (i * len(inputs))}')return total_lossdef testModel():correct = 0total = len(testset)print('evaluating trained model...')with torch.no_grad():for i, (names, countries) in enumerate(test_loader, 1):inputs, seq_lengths, target = make_tensors(names, countries)output = classifier(inputs, seq_lengths)pred = output.max(dim=1, keepdim=True)[1]correct += pred.eq(target.view_as(pred)).sum().item()rate =  correct / totalpercent = '%.2f' % (100 * rate)print(f'Test set: Accuracy {correct} / {total} {percent}%')return  rateif __name__ ==  '__main__':classifier = RNNClassifier(N_CHARS, HIDDEN_SIZE, N_COUNTRY, N_LAYER)if USE_GPU:devece = torch.devece('cuda:0')classifier.to(devece)criterion = torch.nn.CrossEntropyLoss()optimizer = torch.optim.Adam(classifier.parameters(), lr=0.01)start = time.time()print("Training for %d epochs..." % N_EPOCHS)acc_list = []for epoch in range(1, N_EPOCHS + 1):trainModel()acc = testModel()acc_list.append(acc)drawAcc(acc_list)

姓名国别分类代码:PyTorch深度学习实践 - Lecture_13_RNN Classifier相关推荐

  1. 《PyTorch深度学习实践》06 逻辑斯蒂回归 代码

    视频:06.逻辑斯蒂回归_哔哩哔哩_bilibili 参考文章:pytorch 深度学习实践 第6讲 逻辑斯蒂回归_会游泳的小雁的博客-CSDN博客 网络模型的基本框架 1步骤: 1.Prepare ...

  2. 【Pytorch深度学习实践】B站up刘二大人之BasicCNN Advanced CNN -代码理解与实现(9/9)

    这是刘二大人系列课程笔记的 最后一个笔记了,介绍的是 BasicCNN 和 AdvancedCNN ,我做图像,所以后面的RNN我可能暂时不会花时间去了解了: 写在前面: 本节把基础个高级CNN放在一 ...

  3. 笔记|(b站)刘二大人:pytorch深度学习实践(代码详细笔记,适合零基础)

    pytorch深度学习实践 笔记中的代码是根据b站刘二大人的课程所做的笔记,代码每一行都有注释方便理解,可以配套刘二大人视频一同使用. 用PyTorch实现线性回归 # 1.算预测值 # 2.算los ...

  4. 《PyTorch深度学习实践》

    [<PyTorch深度学习实践>完结合集] https://www.bilibili.com/video/BV1Y7411d7Ys/?share_source=copy_web&v ...

  5. 【PyTorch深度学习实践 | 刘二大人】B站视频教程笔记

    资料 [参考:<PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili] [参考 分类专栏:PyTorch 深度学习实践_错错莫的博客-CSDN博客] 全[参考 分类专栏:PyT ...

  6. PyTorch深度学习实践

    根据学习情况随时更新. 2020.08.14更新完成. 参考课程-刘二大人<PyTorch深度学习实践> 文章目录 (一)课程概述 (二)线性模型 (三)梯度下降算法 (四)反向传播 (五 ...

  7. 【Pytorch深度学习实践】B站up刘二大人课程笔记——目录与索引(已完结)

    从有代码的课程开始讨论 [Pytorch深度学习实践]B站up刘二大人之LinearModel -代码理解与实现(1/9) [Pytorch深度学习实践]B站up刘二大人之 Gradient Desc ...

  8. 《PyTorch 深度学习实践》第10讲 卷积神经网络(基础篇)

    文章目录 1 卷积层 1.1 torch.nn.Conv2d相关参数 1.2 填充:padding 1.3 步长:stride 2 最大池化层 3 手写数字识别 该专栏内容为对该视频的学习记录:[&l ...

  9. 刘二大人 PyTorch深度学习实践 笔记 P6 逻辑斯蒂回归

    刘二大人 PyTorch深度学习实践 笔记 P6 逻辑斯蒂回归 P6 逻辑斯蒂回归 1.torchversion 提供的数据集 2.基本概念 3.代码实现 P6 逻辑斯蒂回归 1.torchversi ...

  10. PyTorch深度学习实践概论笔记9-SoftMax分类器

    上一讲PyTorch深度学习实践概论笔记8-加载数据集中,主要介绍了Dataset 和 DataLoader是加载数据的两个工具类.这一讲介绍多分类问题如何解决,一般会用到SoftMax分类器. 0 ...

最新文章

  1. DropDownList实现可输入可选择
  2. 【Python】学习笔记总结3(Python文件操作)
  3. STM32F0xx_SPI读写(Flash)配置详细过程
  4. 平方环法_2019环法挑战赛加速诸暨“运动之城”建设 推动“体育+旅游”新热潮...
  5. Pytorch 自定义激活函数前向与反向传播 sigmoid
  6. Codeforces Round #736 (Div. 1Div2)
  7. [react] 说说你对声明式编程的理解?
  8. (王道408考研操作系统)第三章内存管理-第一节1:内存基础知识、程序编译运行原理
  9. plsql的异常提示怎么定位_oracle plsql 异常信息怎样查看
  10. 从化工技术员到微软最有价值专家(MVP)--我的IT从业路
  11. 阶段3 2.Spring_02.程序间耦合_3 程序的耦合和解耦的思路分析1
  12. The Bits(找规律)
  13. 教你用报表工具搭建企业考核系统
  14. html跑马灯效果代码加速,网页特效_跑马灯特效代码大全一
  15. TMDb数据分析报告
  16. Aliplayer的各种坑
  17. 常用设计模式——抽象工厂模式
  18. 深度学习面试题2018
  19. 1.2Sakura语法基础篇
  20. word中实现奇数页和偶数页页眉不同,奇数页使用本章编号和标题,偶数页使用其他统一文字

热门文章

  1. React-native设置全局函数globle【适用于有组件嵌套时】
  2. 新版虚拟服务器,新版tplink路由器虚拟服务器(端口映射)设置教程
  3. 信号完整性(SI)电源完整性(PI)学习笔记(十)传输线的物理基础(三)
  4. matlab画散点图
  5. Unity游戏开始界面制作教学
  6. WPF教程二:理解WPF的布局系统和常用的Panel布局
  7. 软考中级软件设计师学习资料分享
  8. 千月双端影视APP源码
  9. linux 内核配置详解
  10. java 二叉树排序算法