写在前面
这是本人编写的首个基于调库的机器学习程序,算是一个简单的练手项目。
本程序可以根据输入的中文姓名推测其对应的性别
根据人的名字判断人的性别是一个很有意思的工作,我们可以用朴素贝叶斯法,SVN法或神经网络解决。Python有一个库叫做ngender,它采用朴素贝叶斯进行预测,然而,该模型面对。
本人基于Pytorch,采用embedding+LSTM+Linear的神经网络模型进行性别的预测,准确率达到了88%
代码已经上传至GitHub,[这是GitHub链接](AlphaINF/name2gender: Gender prediction of chinese name based on LSTM (github.com))
效果如图
本人将在下文中,详细介绍模型的结构和使用方法
文件结构
本程序包含以下几个文件,文件结构如下图所示
每个文件的用途如下表所示
文件名 | 用途 |
---|---|
name2gender.py | 用于保存模型的结构 |
main.py | 直接运行即可输入名字进行性别预测 |
test.py | 用于运行测试集的代码 |
finetune.py | 用于训练的代码 |
utils.py | 一些工具(比如csv的读取工具) |
net.pth | 训练好的神经网络 |
ccnc.csv | 数据集1(采用ccnc_loader进行读取),包含有约350w组数据,每组数据的格式为(姓氏,名字,姓名,性别),采用换行和tab间隔 |
train.csv | 数据集2(采用csv_loader进行读取),包含有约20w组数据,每组数据的格式为(姓名,性别),采用换行和逗号间隔 |
test.csv/ccnc-tiny.csv | 测试集 |
模型结构
我们可以通过mane2gender.py来了解模型的结构
import torch.nn as nn
class name2gender(nn.Module):
def __init__(self, input_size, embedding_size, rnn_hidden_size, hidden_size, output_size=2):
super(name2gender, self).__init__()
self.embeddings = nn.Embedding(input_size, embedding_size, padding_idx=0)
self.drop = nn.Dropout(p=0.1)
self.rnn = nn.LSTM(input_size=embedding_size, hidden_size=rnn_hidden_size, batch_first=True)
self.linear1 = nn.Linear(rnn_hidden_size, hidden_size)
self.activation = nn.ReLU()
self.linear2 = nn.Linear(hidden_size, output_size)
self.output_size = output_size
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, name, length):
now = self.embeddings(name)
now = self.drop(now)
input_packed = nn.utils.rnn.pack_padded_sequence(now, length, batch_first=True, enforce_sorted=False)
_, (ht, _) = self.rnn(input_packed, None)
out = self.linear1(ht)
out = self.activation(out)
out = self.linear2(out)
out = out.view(-1, self.output_size)
out = self.softmax(out)
return out
(还没写完)
标签:中文,rnn,nn,self,LSTM,out,性别,hidden,size From: https://www.cnblogs.com/alphainf/p/16922301.html