根据姓名判断性别-人工智能

简介: 本帖训练一个可以根据姓名判断性别的CNN模型;我使用自己爬取的35万中文姓名进行训练。使用同样的数据集还可以训练起名字模型,参看:TensorFlow练习7: 基于RNN生成古诗词https://github.com/tensorflow/models/tree/master/namignizerTensorFlow练习13: 制作一个简单的聊天机器人准备姓名数据集我上网找了一下,并没有找到现成的中文姓名数据集,额,看来只能自己动手了。

本帖训练一个可以根据姓名判断性别的CNN模型;我使用自己爬取的35万中文姓名进行训练。

使用同样的数据集还可以训练起名字模型,参看:

准备姓名数据集

我上网找了一下,并没有找到现成的中文姓名数据集,额,看来只能自己动手了。

我写了一个简单的Python脚本,爬取了上万中文姓名,格式整理如下:

[python]  view plain  copy
  1. 姓名,性别  
  2. 安镶怡,女  
  3. 饶黎明,男  
  4. 段焙曦,男  
  5. 苗芯萌,男  
  6. 覃慧藐,女  
  7. 芦玥微,女  
  8. 苏佳琬,女  
  9. 王旎溪,女  
  10. 彭琛朗,男  
  11. 李昊,男  
  12. 利欣怡,女  
  13. # 貌似有很多名字男女通用  

数据集:https://pan.baidu.com/s/1hsHTEU4。

训练模型

[python]  view plain  copy
  1. import tensorflow as tf  
  2. import numpy as np  
  3.    
  4. name_dataset = 'name.csv'  
  5.    
  6. train_x = []  
  7. train_y = []  
  8. with open(name_dataset, 'r') as f:  
  9.     first_line = True  
  10.     for line in f:  
  11.         if first_line is True:  
  12.             first_line = False  
  13.             continue  
  14.         sample = line.strip().split(',')  
  15.         if len(sample) == 2:  
  16.             train_x.append(sample[0])  
  17.             if sample[1] == '男':  
  18.                 train_y.append([01])  # 男  
  19.             else:  
  20.                 train_y.append([10])  # 女  
  21.    
  22. max_name_length = max([len(name) for name in train_x])  
  23. print("最长名字的字符数: ", max_name_length)  
  24. max_name_length = 8  
  25.    
  26. # 数据已shuffle  
  27. #shuffle_indices = np.random.permutation(np.arange(len(train_y)))  
  28. #train_x = train_x[shuffle_indices]  
  29. #train_y = train_y[shuffle_indices]  
  30.    
  31. # 词汇表(参看聊天机器人练习)  
  32. counter = 0  
  33. vocabulary = {}  
  34. for name in train_x:  
  35.     counter += 1  
  36.     tokens = [word for word in name]  
  37.     for word in tokens:  
  38.         if word in vocabulary:  
  39.             vocabulary[word] += 1  
  40.         else:  
  41.             vocabulary[word] = 1  
  42.    
  43. vocabulary_list = [' '] + sorted(vocabulary, key=vocabulary.get, reverse=True)  
  44. print(len(vocabulary_list))  
  45.    
  46. # 字符串转为向量形式  
  47. vocab = dict([(x, y) for (y, x) in enumerate(vocabulary_list)])  
  48. train_x_vec = []  
  49. for name in train_x:  
  50.     name_vec = []  
  51.     for word in name:  
  52.         name_vec.append(vocab.get(word))  
  53.     while len(name_vec) < max_name_length:  
  54.         name_vec.append(0)  
  55.     train_x_vec.append(name_vec)  
  56.    
  57. #######################################################  
  58.    
  59. input_size = max_name_length  
  60. num_classes = 2  
  61.    
  62. batch_size = 64  
  63. num_batch = len(train_x_vec) // batch_size  
  64.    
  65. X = tf.placeholder(tf.int32, [None, input_size])  
  66. Y = tf.placeholder(tf.float32, [None, num_classes])  
  67.    
  68. dropout_keep_prob = tf.placeholder(tf.float32)  
  69.    
  70. def neural_network(vocabulary_size, embedding_size=128, num_filters=128):  
  71.     # embedding layer  
  72.     with tf.device('/cpu:0'), tf.name_scope("embedding"):  
  73.         W = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.01.0))  
  74.         embedded_chars = tf.nn.embedding_lookup(W, X)  
  75.         embedded_chars_expanded = tf.expand_dims(embedded_chars, -1)  
  76.     # convolution + maxpool layer  
  77.     filter_sizes = [3,4,5]  
  78.     pooled_outputs = []  
  79.     for i, filter_size in enumerate(filter_sizes):  
  80.         with tf.name_scope("conv-maxpool-%s" % filter_size):  
  81.             filter_shape = [filter_size, embedding_size, 1, num_filters]  
  82.             W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1))  
  83.             b = tf.Variable(tf.constant(0.1, shape=[num_filters]))  
  84.             conv = tf.nn.conv2d(embedded_chars_expanded, W, strides=[1111], padding="VALID")  
  85.             h = tf.nn.relu(tf.nn.bias_add(conv, b))  
  86.             pooled = tf.nn.max_pool(h, ksize=[1, input_size - filter_size + 111], strides=[1111], padding='VALID')  
  87.             pooled_outputs.append(pooled)  
  88.    
  89.     num_filters_total = num_filters * len(filter_sizes)  
  90.     h_pool = tf.concat(3, pooled_outputs)  
  91.     h_pool_flat = tf.reshape(h_pool, [-1, num_filters_total])  
  92.     # dropout  
  93.     with tf.name_scope("dropout"):  
  94.         h_drop = tf.nn.dropout(h_pool_flat, dropout_keep_prob)  
  95.     # output  
  96.     with tf.name_scope("output"):  
  97.         W = tf.get_variable("W", shape=[num_filters_total, num_classes], initializer=tf.contrib.layers.xavier_initializer())  
  98.         b = tf.Variable(tf.constant(0.1, shape=[num_classes]))  
  99.         output = tf.nn.xw_plus_b(h_drop, W, b)  
  100.           
  101.     return output  
  102. # 训练  
  103. def train_neural_network():  
  104.     output = neural_network(len(vocabulary_list))  
  105.    
  106.     optimizer = tf.train.AdamOptimizer(1e-3)  
  107.     loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(output, Y))  
  108.     grads_and_vars = optimizer.compute_gradients(loss)  
  109.     train_op = optimizer.apply_gradients(grads_and_vars)  
  110.    
  111.     saver = tf.train.Saver(tf.global_variables())  
  112.     with tf.Session() as sess:  
  113.         sess.run(tf.global_variables_initializer())  
  114.    
  115.         for e in range(201):  
  116.             for i in range(num_batch):  
  117.                 batch_x = train_x_vec[i*batch_size : (i+1)*batch_size]  
  118.                 batch_y = train_y[i*batch_size : (i+1)*batch_size]  
  119.                 _, loss_ = sess.run([train_op, loss], feed_dict={X:batch_x, Y:batch_y, dropout_keep_prob:0.5})  
  120.                 print(e, i, loss_)  
  121.             # 保存模型  
  122.             if e % 50 == 0:  
  123.                 saver.save(sess, "name2sex.model", global_step=e)  
  124.    
  125. train_neural_network()  
  126.    
  127. # 使用训练的模型  
  128. def detect_sex(name_list):  
  129.     x = []  
  130.     for name in name_list:  
  131.         name_vec = []  
  132.         for word in name:  
  133.             name_vec.append(vocab.get(word))  
  134.         while len(name_vec) < max_name_length:  
  135.             name_vec.append(0)  
  136.         x.append(name_vec)  
  137.    
  138.     output = neural_network(len(vocabulary_list))  
  139.    
  140.     saver = tf.train.Saver(tf.global_variables())  
  141.     with tf.Session() as sess:  
  142.         # 恢复前一次训练  
  143.         ckpt = tf.train.get_checkpoint_state('.')  
  144.         if ckpt != None:  
  145.             print(ckpt.model_checkpoint_path)  
  146.             saver.restore(sess, ckpt.model_checkpoint_path)  
  147.         else:  
  148.             print("没找到模型")  
  149.    
  150.         predictions = tf.argmax(output, 1)  
  151.         res = sess.run(predictions, {X:x, dropout_keep_prob:1.0})  
  152.    
  153.         i = 0  
  154.         for name in name_list:  
  155.             print(name, '女' if res[i] == 0 else '男')  
  156.             i += 1  
  157.    
  158. detect_sex(["白富美""高帅富""王婷婷""田野"])  

执行结果:

TensorFlow练习18: 根据姓名判断性别


本文已获原作者授权转载,附上链接: http://blog.csdn.net/u014365862/article/details/53869732

相关文章
|
人工智能 并行计算 TensorFlow
同一个问题,Gemini、ChatGPT、Copilot、通义千问和文心一言会怎么答?
同一个问题,Gemini、ChatGPT、Copilot、通义千问和文心一言会怎么答?
|
5月前
|
数据采集 人工智能 自然语言处理
AI终于能听懂宝宝说话了!ChildMandarin:智源研究院开源的低幼儿童中文语音数据集,覆盖22省方言
ChildMandarin是由智源研究院与南开大学联合推出的开源语音数据集,包含41.25小时3-5岁儿童普通话语音数据,覆盖中国22个省级行政区,为儿童语音识别和语言发展研究提供高质量数据支持。
530 20
AI终于能听懂宝宝说话了!ChildMandarin:智源研究院开源的低幼儿童中文语音数据集,覆盖22省方言
|
Linux 网络安全 开发工具
|
10月前
|
Linux Python
Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
在 Linux 系统中,了解目录下的文件数量是常见的需求。本文介绍了多种方法,包括使用 `ls` 和 `wc` 命令组合、`find` 命令、`tree` 命令以及编程方式(如 Python)。无论你是新手还是有经验的用户,都能找到适合自己的方法。掌握这些技巧将提高你在 Linux 系统中的操作效率。
358 4
|
7月前
|
人工智能 运维 Cloud Native
全面开测 - 零门槛,即刻拥有DeepSeek-R1满血版,百万token免费用
DeepSeek是当前热门的推理模型,尤其擅长数学、代码和自然语言等复杂任务。2024年尾,面对裁员危机,技术进步的学习虽减少,但DeepSeek大模型的兴起成为新的学习焦点。满血版DeepSeek(671B参数)与普通版相比,在性能、推理能力和资源需求上有显著差异。满血版支持实时联网数据更新和多轮深度对话,适用于科研、教育和企业级应用等复杂场景。 阿里云提供的满血版DeepSeek部署方案对普通用户特别友好,涵盖云端调用API及各尺寸模型的部署方式,最快5分钟、最低0元即可实现。
989 68
|
10月前
|
前端开发 Java 数据库
如何实现一个项目,小白做项目-java
本教程涵盖了从数据库到AJAX的多个知识点,并详细介绍了项目实现过程,包括静态页面分析、数据库创建、项目结构搭建、JSP转换及各层代码编写。最后,通过通用分页和优化Servlet来提升代码质量。
170 1
|
11月前
|
机器学习/深度学习 搜索推荐 大数据
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
【10月更文挑战第2天】在处理大规模数据集的推荐系统项目时,提高检索模型的召回率成为关键挑战。本文分享了通过改进特征工程(如加入用户活跃时段和物品相似度)和优化模型结构(引入注意力机制)来提升召回率的具体策略与实现代码。严格的A/B测试验证了新模型的有效性,为改善用户体验奠定了基础。这次实践加深了对特征工程与模型优化的理解,并为未来的技术探索提供了方向。
491 2
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
|
Linux Perl
Linux进行文件字符串替换
【8月更文挑战第5天】Linux进行文件字符串替换
962 3
|
10月前
|
安全 Linux 数据安全/隐私保护
BIOS中Secure Boot灰色无法更改解决方法详解
在电脑Bios设置中,有一项“Secure Boot”相关设置,很多小伙伴们不知道Secure Boot什么意思,也不知道如何设置。另外,有时候这个Secure Boot是灰色的无法更改,这又要如何解决呢?
5517 15
|
12月前
|
前端开发 开发者 UED
前端只是切图仔?来学学给开发人看的UI设计
该文章针对前端开发者介绍了UI设计的基本原则与实践技巧,覆盖了布局、色彩理论、字体选择等方面的知识,并提供了设计工具和资源推荐,帮助开发者提升产品的视觉与交互体验。