搜索
bottom↓
回复: 34

分享一个输入姓名,利用TenFlow预测性别的程序

[复制链接]

出25入84汤圆

发表于 2018-7-5 14:29:41 | 显示全部楼层 |阅读模式
本帖最后由 chun2495 于 2018-7-5 14:36 编辑

采用tensorflow对35万个姓名和性别进行学习,学习完成保存模型。
用保存的模型对输入的姓名进行性别预测。
先贴个图:


开发环境:win10 64位
软件:pycharm, python3.6, tensorflow1.50, pyinstaller 3.3.1

用pyinstaller来打包
  1. pyinstaller test.py --hidden-import="pandas._libs.tslibs.timedeltas"
复制代码


打包后的文件太大,放在网盘里,需要的可以下载。
链接:https://pan.baidu.com/s/1erAmMaYENdWE71dMnv07eQ 密码:dl0y

代码如下:
  1. #!/usr/bin/python3.6
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import tensorflow as tf

  5. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
  6. NameDataSet = 'name.csv'

  7. train_x = []
  8. train_y = []
  9. with open(NameDataSet, 'r', encoding='UTF-8') as f:
  10.     first_line = True
  11.     for line in f:
  12.         if first_line is True:
  13.             first_line = False
  14.             continue
  15.         sample = line.strip().split(',')
  16.         if len(sample) == 2:
  17.             train_x.append(sample[0])
  18.             if sample[1] == '男':
  19.                 train_y.append([0, 1])  # 男
  20.             else:
  21.                 train_y.append([1, 0])  # 女

  22. # max_name_length = max([len(name) for name in train_x])
  23. # print("最长名字的字符数: %s" % max_name_length)
  24. max_name_length = 5

  25. # 词汇表(参看聊天机器人练习)
  26. counter = 0
  27. vocabulary = {}
  28. for name in train_x:
  29.     counter += 1
  30.     tokens = [word for word in name]
  31.     for word in tokens:
  32.         if word in vocabulary:
  33.             vocabulary[word] += 1
  34.         else:
  35.             vocabulary[word] = 1

  36. vocabulary_list = [' '] + sorted(vocabulary, key=vocabulary.get, reverse=True)
  37. # print(len(vocabulary_list))

  38. # 字符串转为向量形式
  39. vocab = dict([(x, y) for (y, x) in enumerate(vocabulary_list)])
  40. train_x_vec = []
  41. for name in train_x:
  42.     name_vec = []
  43.     for word in name:
  44.         name_vec.append(vocab.get(word))
  45.     while len(name_vec) < max_name_length:
  46.         name_vec.append(0)
  47.     train_x_vec.append(name_vec)

  48. input_size = max_name_length
  49. num_classes = 2

  50. batch_size = 64
  51. num_batch = len(train_x_vec) // batch_size

  52. X = tf.placeholder(tf.int32, [None, input_size])
  53. Y = tf.placeholder(tf.float32, [None, num_classes])

  54. dropout_keep_prob = tf.placeholder(tf.float32)


  55. def neural_network(vocabulary_size, embedding_size=128, num_filters=128):
  56.     # embedding layer
  57.     with tf.device('/cpu:0'), tf.name_scope("embedding"):
  58.         W = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
  59.         embedded_chars = tf.nn.embedding_lookup(W, X)
  60.         embedded_chars_expanded = tf.expand_dims(embedded_chars, -1)
  61.     # convolution + maxpool layer
  62.     filter_sizes = [3, 4, 5]
  63.     pooled_outputs = []
  64.     for i, filter_size in enumerate(filter_sizes):
  65.         with tf.name_scope("conv-maxpool-%s" % filter_size):
  66.             filter_shape = [filter_size, embedding_size, 1, num_filters]
  67.             W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1))
  68.             b = tf.Variable(tf.constant(0.1, shape=[num_filters]))
  69.             conv = tf.nn.conv2d(embedded_chars_expanded, W, strides=[1, 1, 1, 1], padding="VALID")
  70.             h = tf.nn.relu(tf.nn.bias_add(conv, b))
  71.             pooled = tf.nn.max_pool(h, ksize=[1, input_size - filter_size + 1, 1, 1], strides=[1, 1, 1, 1], padding='VALID')
  72.             pooled_outputs.append(pooled)

  73.     num_filters_total = num_filters * len(filter_sizes)
  74.     # h_pool = tf.concat(3, pooled_outputs)
  75.     h_pool = tf.concat(pooled_outputs, 3)
  76.     h_pool_flat = tf.reshape(h_pool, [-1, num_filters_total])
  77.     # dropout
  78.     with tf.name_scope("dropout"):
  79.         h_drop = tf.nn.dropout(h_pool_flat, dropout_keep_prob)
  80.     # output
  81.     with tf.name_scope("output"):
  82.         W = tf.get_variable("W", shape=[num_filters_total, num_classes])
  83.         b = tf.Variable(tf.constant(0.1, shape=[num_classes]))
  84.         output = tf.nn.xw_plus_b(h_drop, W, b)

  85.     return output


  86. # 训练
  87. def train_neural_network():
  88.     output = neural_network(len(vocabulary_list))

  89.     optimizer = tf.train.AdamOptimizer(1e-3)
  90.     loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=output, labels=Y))
  91.     grads_and_vars = optimizer.compute_gradients(loss)
  92.     train_op = optimizer.apply_gradients(grads_and_vars)

  93.     saver = tf.train.Saver(tf.global_variables())
  94.     with tf.Session() as sess:
  95.         sess.run(tf.global_variables_initializer())

  96.         for e in range(201):
  97.             for i in range(num_batch):
  98.                 batch_x = train_x_vec[i * batch_size: (i + 1) * batch_size]
  99.                 batch_y = train_y[i * batch_size: (i + 1) * batch_size]
  100.                 _, loss_ = sess.run([train_op, loss], feed_dict={X: batch_x, Y: batch_y, dropout_keep_prob: 0.5})
  101.                 print("%s %s %s" % (e, i, loss_))
  102.             if e % 50 == 0:
  103.                 saver.save(sess, "./name2sex.model", global_step=e)


  104. # train_neural_network()


  105. # 使用训练的模型
  106. def detect_sex(name_list):
  107.     x = []
  108.     for name in name_list:
  109.         NameVec = []
  110.         for word in name:
  111.             NameVec.append(vocab.get(word))
  112.         while len(NameVec) < max_name_length:
  113.             NameVec.append(0)
  114.         x.append(NameVec)

  115.     output = neural_network(len(vocabulary_list))

  116.     saver = tf.train.Saver(tf.global_variables())
  117.     with tf.Session() as sess:
  118.         # 恢复前一次训练
  119.         ckpt = tf.train.get_checkpoint_state('.')
  120.         if ckpt is not None:
  121.             # print(ckpt.model_checkpoint_path)
  122.             saver.restore(sess, ckpt.model_checkpoint_path)
  123.         else:
  124.             print("没找到模型")

  125.         predictions = tf.argmax(output, 1)
  126.         res = sess.run(predictions, {X: x, dropout_keep_prob: 1.0})

  127.         i = 0
  128.         for name in name_list:
  129.             print(name, '女' if res[i] == 0 else '男')
  130.             i += 1


  131. if __name__ == '__main__':
  132.     InputName = input("请输入姓名:")
  133.     detect_sex([InputName])
  134.     input("\n输入回车结束")
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-7-5 14:40:07 | 显示全部楼层
之前在网上看别人分享过,同姓名的夫妇,结婚证上两个相同的名字,而且更有巧合的同年同月同日生的同名夫妇;
头像被屏蔽

出0入0汤圆

发表于 2018-7-5 14:41:48 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出20入128汤圆

发表于 2018-7-5 14:50:49 | 显示全部楼层
armok 发表于 2018-7-5 14:41
同年同月同日生的同名夫妇,估计是因为太巧合了,于是顺水推舟....

这个不好描述啊~~

A在A上面,A在A下面,都不好区分了~~

出0入0汤圆

发表于 2018-7-5 15:12:21 来自手机 | 显示全部楼层
李靖是男的女的?

出0入0汤圆

发表于 2018-7-5 15:12:47 | 显示全部楼层
哈哈,借地贴一下我以前做过的一个
Gender Guesser v0.10.0 已发布

演示地址:
http://demo.wudilabs.org/lab/gender_guesser/

那时还没有现在很火的 TensorFlow, 自己直接做的训练,感兴趣的可以对比一下结果

出25入84汤圆

 楼主| 发表于 2018-7-5 15:57:29 | 显示全部楼层
wudicgi 发表于 2018-7-5 15:12
哈哈,借地贴一下我以前做过的一个
《Gender Guesser v0.10.0 已发布》

嗯 都是拿大样本来分析
不同的是,你那种是人工建立算法,tf是自己组建节点和算法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出25入84汤圆

 楼主| 发表于 2018-7-5 16:00:59 | 显示全部楼层
mangocity 发表于 2018-7-5 15:12
李靖是男的女的?



数据库中应该叫靖的男的多

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-7-5 17:10:16 | 显示全部楼层
我输了2个人的名字都预测错了。

出0入0汤圆

发表于 2018-7-5 17:16:56 来自手机 | 显示全部楼层
来个难题,金星是男的女的?

出0入0汤圆

发表于 2018-7-5 17:30:53 来自手机 | 显示全部楼层
楼主对seq2seq模型了解吗?求科普一下啊

出25入84汤圆

 楼主| 发表于 2018-7-5 17:47:40 | 显示全部楼层
brentcao 发表于 2018-7-5 17:30
楼主对seq2seq模型了解吗?求科普一下啊


我暂时还没有做这个,粗略的说下,深度学习神经网络包括全连接网络、卷积网络、循环网络。
像手写识别、二分法识别图像分类等不需要反馈的一般用全连接和卷积网络多,比如LeNet-5、AlexNet、Inception-3等。
但对于需要反馈的场合,比如翻译(结合前后段)、语音识别等就需要使用循环神经网络。比如LSTM、seq2seq等。
主要看应用场合。

出0入0汤圆

发表于 2018-7-5 17:52:19 来自手机 | 显示全部楼层
我刚刚看了word2vec 下面看seq2seq,看不懂了

出0入0汤圆

发表于 2018-7-5 17:59:10 | 显示全部楼层
修改修改能预测股票或彩票吗?

出25入84汤圆

 楼主| 发表于 2018-7-5 18:05:10 | 显示全部楼层
trave_yang 发表于 2018-7-5 17:59
修改修改能预测股票或彩票吗?

不能,股票无规律,或者说熵太大。

出20入25汤圆

发表于 2018-7-5 18:34:41 | 显示全部楼层
楼主能把训练过程做一个教程就好了

出0入0汤圆

发表于 2018-7-5 18:40:00 来自手机 | 显示全部楼层
armok 发表于 2018-7-5 14:41
同年同月同日生的同名夫妇,估计是因为太巧合了,于是顺水推舟....

之前有个同事,名字叫富贵,他老婆是他大学同学,名字叫如意,估计也是因为名字巧合,所以就顺水推舟。

出0入0汤圆

发表于 2018-7-9 09:16:41 | 显示全部楼层
看截图,楼主是在windows下跑tf?tf不是只能linux下跑?

出25入84汤圆

 楼主| 发表于 2018-7-9 09:19:02 | 显示全部楼层
meerlin 发表于 2018-7-9 09:16
看截图,楼主是在windows下跑tf?tf不是只能linux下跑?

可以的,看我博客
https://blog.csdn.net/chun307/article/details/79237889

出0入0汤圆

发表于 2018-7-9 09:43:39 | 显示全部楼层
chun2495 发表于 2018-7-9 09:19
可以的,看我博客
https://blog.csdn.net/chun307/article/details/79237889

你喜欢数学公式么

出25入84汤圆

 楼主| 发表于 2018-7-9 09:58:09 | 显示全部楼层
meerlin 发表于 2018-7-9 09:43
你喜欢数学公式么

..........

出0入10汤圆

发表于 2018-7-9 09:59:12 | 显示全部楼层
这个是靠大数据来推算的, 错误肯定是难免的

出0入0汤圆

发表于 2018-7-9 10:21:02 | 显示全部楼层
kstepbill84 发表于 2018-7-5 14:40
之前在网上看别人分享过,同姓名的夫妇,结婚证上两个相同的名字,而且更有巧合的同年同月同日生的同名夫妇 ...

这就是传说中的日本人了

出0入0汤圆

发表于 2018-7-9 15:16:47 | 显示全部楼层
名字数据库哪来的

出25入84汤圆

 楼主| 发表于 2018-12-13 16:21:19 | 显示全部楼层
huangqi412 发表于 2018-7-9 15:16
名字数据库哪来的

别人分享的

出0入0汤圆

发表于 2019-1-8 20:09:13 | 显示全部楼层
不错,后面名字预测的也不错,好象没有看到数据库

出0入0汤圆

发表于 2019-1-8 20:59:27 来自手机 | 显示全部楼层
数据集有没有?我也想玩玩

出0入0汤圆

发表于 2019-1-9 09:12:31 | 显示全部楼层
楼主输下试试,金星是男是女

出25入84汤圆

 楼主| 发表于 2019-1-9 15:37:34 | 显示全部楼层
zjrenyu 发表于 2019-1-9 09:12
楼主输下试试,金星是男是女

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出25入84汤圆

 楼主| 发表于 2019-1-9 15:39:36 | 显示全部楼层
love_zjb 发表于 2019-1-8 20:59
数据集有没有?我也想玩玩

链接:https://pan.baidu.com/s/1G4HzODcnw0sOZOHE7sVGwQ
提取码:18nt
复制这段内容后打开百度网盘手机App,操作更方便哦

出0入0汤圆

发表于 2019-1-9 20:54:14 来自手机 | 显示全部楼层
chun2495 发表于 2019-1-9 15:39
链接:https://pan.baidu.com/s/1G4HzODcnw0sOZOHE7sVGwQ
提取码:18nt
复制这段内容后打开百度网盘手 ...

谢啦

出0入0汤圆

发表于 2019-1-10 10:57:47 | 显示全部楼层
本帖最后由 jiangxingyuan 于 2019-1-10 16:48 编辑

我讲个真实的笑话,我有两个同事,都是男的。一个名字里面有个“红”字的。另一个同事名字里有个“荣”。有次两人出差,分在同一房间住。结果那个名字带“荣”的老婆后来查他老公的手机记录,刚好看到她老公和一个名字带“红“的人住一个房。他老婆兴师问罪,那人解释了半天。最后,只好打电话给那个名字带红的同事给他老婆解释。刚好那个带“红“字的同事在接电话解释的时候,他老婆也听到了。还是说什么出差搞对象的事。一查记录,她老公和一个带“荣”的人住一起。然后也兴师问罪。结果两人解释了很久,才搞清楚,还搞到全公司的人都知道了。

出130入20汤圆

发表于 2019-1-10 11:09:10 | 显示全部楼层
哈哈,以前有个客户的部门经理,男的,就叫x小红

出25入84汤圆

 楼主| 发表于 2019-1-10 15:09:25 | 显示全部楼层
jiangxingyuan 发表于 2019-1-10 10:57
我讲个真实的笑话,我有两个同事,都是男的。一个名字里面有个“红”字的。另一个同事名字里有个“荣”。有 ...

然后他们就能放心的搞基了。

出0入0汤圆

发表于 2019-1-10 15:38:42 | 显示全部楼层

人工智能很牛逼嘛,就是变性了也能查出来原来是什么性别
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 17:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表