分享一个输入姓名,利用TenFlow预测性别的程序
本帖最后由 chun2495 于 2018-7-5 14:36 编辑采用tensorflow对35万个姓名和性别进行学习,学习完成保存模型。
用保存的模型对输入的姓名进行性别预测。
先贴个图:
开发环境:win10 64位
软件:pycharm, python3.6, tensorflow1.50, pyinstaller 3.3.1
用pyinstaller来打包
pyinstaller test.py --hidden-import="pandas._libs.tslibs.timedeltas"
打包后的文件太大,放在网盘里,需要的可以下载。
链接:https://pan.baidu.com/s/1erAmMaYENdWE71dMnv07eQ 密码:dl0y
代码如下:
#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
import os
import tensorflow as tf
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
NameDataSet = 'name.csv'
train_x = []
train_y = []
with open(NameDataSet, 'r', encoding='UTF-8') as f:
first_line = True
for line in f:
if first_line is True:
first_line = False
continue
sample = line.strip().split(',')
if len(sample) == 2:
train_x.append(sample)
if sample == '男':
train_y.append()# 男
else:
train_y.append()# 女
# max_name_length = max()
# print("最长名字的字符数: %s" % max_name_length)
max_name_length = 5
# 词汇表(参看聊天机器人练习)
counter = 0
vocabulary = {}
for name in train_x:
counter += 1
tokens =
for word in tokens:
if word in vocabulary:
vocabulary += 1
else:
vocabulary = 1
vocabulary_list = [' '] + sorted(vocabulary, key=vocabulary.get, reverse=True)
# print(len(vocabulary_list))
# 字符串转为向量形式
vocab = dict([(x, y) for (y, x) in enumerate(vocabulary_list)])
train_x_vec = []
for name in train_x:
name_vec = []
for word in name:
name_vec.append(vocab.get(word))
while len(name_vec) < max_name_length:
name_vec.append(0)
train_x_vec.append(name_vec)
input_size = max_name_length
num_classes = 2
batch_size = 64
num_batch = len(train_x_vec) // batch_size
X = tf.placeholder(tf.int32, )
Y = tf.placeholder(tf.float32, )
dropout_keep_prob = tf.placeholder(tf.float32)
def neural_network(vocabulary_size, embedding_size=128, num_filters=128):
# embedding layer
with tf.device('/cpu:0'), tf.name_scope("embedding"):
W = tf.Variable(tf.random_uniform(, -1.0, 1.0))
embedded_chars = tf.nn.embedding_lookup(W, X)
embedded_chars_expanded = tf.expand_dims(embedded_chars, -1)
# convolution + maxpool layer
filter_sizes =
pooled_outputs = []
for i, filter_size in enumerate(filter_sizes):
with tf.name_scope("conv-maxpool-%s" % filter_size):
filter_shape =
W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1))
b = tf.Variable(tf.constant(0.1, shape=))
conv = tf.nn.conv2d(embedded_chars_expanded, W, strides=, padding="VALID")
h = tf.nn.relu(tf.nn.bias_add(conv, b))
pooled = tf.nn.max_pool(h, ksize=, strides=, padding='VALID')
pooled_outputs.append(pooled)
num_filters_total = num_filters * len(filter_sizes)
# h_pool = tf.concat(3, pooled_outputs)
h_pool = tf.concat(pooled_outputs, 3)
h_pool_flat = tf.reshape(h_pool, [-1, num_filters_total])
# dropout
with tf.name_scope("dropout"):
h_drop = tf.nn.dropout(h_pool_flat, dropout_keep_prob)
# output
with tf.name_scope("output"):
W = tf.get_variable("W", shape=)
b = tf.Variable(tf.constant(0.1, shape=))
output = tf.nn.xw_plus_b(h_drop, W, b)
return output
# 训练
def train_neural_network():
output = neural_network(len(vocabulary_list))
optimizer = tf.train.AdamOptimizer(1e-3)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=output, labels=Y))
grads_and_vars = optimizer.compute_gradients(loss)
train_op = optimizer.apply_gradients(grads_and_vars)
saver = tf.train.Saver(tf.global_variables())
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for e in range(201):
for i in range(num_batch):
batch_x = train_x_vec
batch_y = train_y
_, loss_ = sess.run(, feed_dict={X: batch_x, Y: batch_y, dropout_keep_prob: 0.5})
print("%s %s %s" % (e, i, loss_))
if e % 50 == 0:
saver.save(sess, "./name2sex.model", global_step=e)
# train_neural_network()
# 使用训练的模型
def detect_sex(name_list):
x = []
for name in name_list:
NameVec = []
for word in name:
NameVec.append(vocab.get(word))
while len(NameVec) < max_name_length:
NameVec.append(0)
x.append(NameVec)
output = neural_network(len(vocabulary_list))
saver = tf.train.Saver(tf.global_variables())
with tf.Session() as sess:
# 恢复前一次训练
ckpt = tf.train.get_checkpoint_state('.')
if ckpt is not None:
# print(ckpt.model_checkpoint_path)
saver.restore(sess, ckpt.model_checkpoint_path)
else:
print("没找到模型")
predictions = tf.argmax(output, 1)
res = sess.run(predictions, {X: x, dropout_keep_prob: 1.0})
i = 0
for name in name_list:
print(name, '女' if res == 0 else '男')
i += 1
if __name__ == '__main__':
InputName = input("请输入姓名:")
detect_sex()
input("\n输入回车结束")
之前在网上看别人分享过,同姓名的夫妇,结婚证上两个相同的名字,而且更有巧合的同年同月同日生的同名夫妇; armok 发表于 2018-7-5 14:41
同年同月同日生的同名夫妇,估计是因为太巧合了,于是顺水推舟....
这个不好描述啊~~
A在A上面,A在A下面,都不好区分了~~ 李靖是男的女的? 哈哈,借地贴一下我以前做过的一个
《Gender Guesser v0.10.0 已发布》
演示地址:
http://demo.wudilabs.org/lab/gender_guesser/
那时还没有现在很火的 TensorFlow, 自己直接做的训练,感兴趣的可以对比一下结果
wudicgi 发表于 2018-7-5 15:12
哈哈,借地贴一下我以前做过的一个
《Gender Guesser v0.10.0 已发布》
嗯 都是拿大样本来分析
不同的是,你那种是人工建立算法,tf是自己组建节点和算法。
mangocity 发表于 2018-7-5 15:12
李靖是男的女的?
数据库中应该叫靖的男的多 我输了2个人的名字都预测错了。 来个难题,金星是男的女的? 楼主对seq2seq模型了解吗?求科普一下啊 brentcao 发表于 2018-7-5 17:30
楼主对seq2seq模型了解吗?求科普一下啊
我暂时还没有做这个,粗略的说下,深度学习神经网络包括全连接网络、卷积网络、循环网络。
像手写识别、二分法识别图像分类等不需要反馈的一般用全连接和卷积网络多,比如LeNet-5、AlexNet、Inception-3等。
但对于需要反馈的场合,比如翻译(结合前后段)、语音识别等就需要使用循环神经网络。比如LSTM、seq2seq等。
主要看应用场合。 我刚刚看了word2vec 下面看seq2seq,看不懂了 修改修改能预测股票或彩票吗? trave_yang 发表于 2018-7-5 17:59
修改修改能预测股票或彩票吗?
不能,股票无规律,或者说熵太大。 楼主能把训练过程做一个教程就好了 armok 发表于 2018-7-5 14:41
同年同月同日生的同名夫妇,估计是因为太巧合了,于是顺水推舟....
之前有个同事,名字叫富贵,他老婆是他大学同学,名字叫如意,估计也是因为名字巧合,所以就顺水推舟。 看截图,楼主是在windows下跑tf?tf不是只能linux下跑? meerlin 发表于 2018-7-9 09:16
看截图,楼主是在windows下跑tf?tf不是只能linux下跑?
可以的,看我博客
https://blog.csdn.net/chun307/article/details/79237889 chun2495 发表于 2018-7-9 09:19
可以的,看我博客
https://blog.csdn.net/chun307/article/details/79237889
你喜欢数学公式么{:smile:} meerlin 发表于 2018-7-9 09:43
你喜欢数学公式么
.......... 这个是靠大数据来推算的, 错误肯定是难免的
kstepbill84 发表于 2018-7-5 14:40
之前在网上看别人分享过,同姓名的夫妇,结婚证上两个相同的名字,而且更有巧合的同年同月同日生的同名夫妇 ...
这就是传说中的日本人了 名字数据库哪来的 huangqi412 发表于 2018-7-9 15:16
名字数据库哪来的
别人分享的 不错,后面名字预测的也不错,好象没有看到数据库 数据集有没有?我也想玩玩 楼主输下试试,金星是男是女{:titter:} zjrenyu 发表于 2019-1-9 09:12
楼主输下试试,金星是男是女
love_zjb 发表于 2019-1-8 20:59
数据集有没有?我也想玩玩
链接:https://pan.baidu.com/s/1G4HzODcnw0sOZOHE7sVGwQ
提取码:18nt
复制这段内容后打开百度网盘手机App,操作更方便哦 chun2495 发表于 2019-1-9 15:39
链接:https://pan.baidu.com/s/1G4HzODcnw0sOZOHE7sVGwQ
提取码:18nt
复制这段内容后打开百度网盘手 ...
谢啦 本帖最后由 jiangxingyuan 于 2019-1-10 16:48 编辑
我讲个真实的笑话,我有两个同事,都是男的。一个名字里面有个“红”字的。另一个同事名字里有个“荣”。有次两人出差,分在同一房间住。结果那个名字带“荣”的老婆后来查他老公的手机记录,刚好看到她老公和一个名字带“红“的人住一个房。他老婆兴师问罪,那人解释了半天。最后,只好打电话给那个名字带红的同事给他老婆解释。刚好那个带“红“字的同事在接电话解释的时候,他老婆也听到了。还是说什么出差搞对象的事。一查记录,她老公和一个带“荣”的人住一起。然后也兴师问罪。结果两人解释了很久,才搞清楚,还搞到全公司的人都知道了。 哈哈,以前有个客户的部门经理,男的,就叫x小红{:titter:} jiangxingyuan 发表于 2019-1-10 10:57
我讲个真实的笑话,我有两个同事,都是男的。一个名字里面有个“红”字的。另一个同事名字里有个“荣”。有 ...
然后他们就能放心的搞基了。 chun2495 发表于 2019-1-9 15:37
人工智能很牛逼嘛,就是变性了也能查出来原来是什么性别{:lol:}
页:
[1]