chun2495 发表于 2018-7-5 14:29:41

分享一个输入姓名,利用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输入回车结束")


kstepbill84 发表于 2018-7-5 14:40:07

之前在网上看别人分享过,同姓名的夫妇,结婚证上两个相同的名字,而且更有巧合的同年同月同日生的同名夫妇;

armok 发表于 2018-7-5 14:41:48

z123 发表于 2018-7-5 14:50:49

armok 发表于 2018-7-5 14:41
同年同月同日生的同名夫妇,估计是因为太巧合了,于是顺水推舟....

这个不好描述啊~~

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

mangocity 发表于 2018-7-5 15:12:21

李靖是男的女的?

wudicgi 发表于 2018-7-5 15:12:47

哈哈,借地贴一下我以前做过的一个
《Gender Guesser v0.10.0 已发布》

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

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

chun2495 发表于 2018-7-5 15:57:29

wudicgi 发表于 2018-7-5 15:12
哈哈,借地贴一下我以前做过的一个
《Gender Guesser v0.10.0 已发布》



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

chun2495 发表于 2018-7-5 16:00:59

mangocity 发表于 2018-7-5 15:12
李靖是男的女的?



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

zyx_avr 发表于 2018-7-5 17:10:16

我输了2个人的名字都预测错了。

mangocity 发表于 2018-7-5 17:16:56

来个难题,金星是男的女的?

brentcao 发表于 2018-7-5 17:30:53

楼主对seq2seq模型了解吗?求科普一下啊

chun2495 发表于 2018-7-5 17:47:40

brentcao 发表于 2018-7-5 17:30
楼主对seq2seq模型了解吗?求科普一下啊

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

brentcao 发表于 2018-7-5 17:52:19

我刚刚看了word2vec 下面看seq2seq,看不懂了

trave_yang 发表于 2018-7-5 17:59:10

修改修改能预测股票或彩票吗?

chun2495 发表于 2018-7-5 18:05:10

trave_yang 发表于 2018-7-5 17:59
修改修改能预测股票或彩票吗?

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

chenchaoting 发表于 2018-7-5 18:34:41

楼主能把训练过程做一个教程就好了

hyz_avr 发表于 2018-7-5 18:40:00

armok 发表于 2018-7-5 14:41
同年同月同日生的同名夫妇,估计是因为太巧合了,于是顺水推舟....

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

meerlin 发表于 2018-7-9 09:16:41

看截图,楼主是在windows下跑tf?tf不是只能linux下跑?

chun2495 发表于 2018-7-9 09:19:02

meerlin 发表于 2018-7-9 09:16
看截图,楼主是在windows下跑tf?tf不是只能linux下跑?

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

meerlin 发表于 2018-7-9 09:43:39

chun2495 发表于 2018-7-9 09:19
可以的,看我博客
https://blog.csdn.net/chun307/article/details/79237889

你喜欢数学公式么{:smile:}

chun2495 发表于 2018-7-9 09:58:09

meerlin 发表于 2018-7-9 09:43
你喜欢数学公式么

..........

TonyCai 发表于 2018-7-9 09:59:12

这个是靠大数据来推算的, 错误肯定是难免的

MYQQ2018 发表于 2018-7-9 10:21:02

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

这就是传说中的日本人了

huangqi412 发表于 2018-7-9 15:16:47

名字数据库哪来的

chun2495 发表于 2018-12-13 16:21:19

huangqi412 发表于 2018-7-9 15:16
名字数据库哪来的

别人分享的

dongwang_fl 发表于 2019-1-8 20:09:13

不错,后面名字预测的也不错,好象没有看到数据库

love_zjb 发表于 2019-1-8 20:59:27

数据集有没有?我也想玩玩

zjrenyu 发表于 2019-1-9 09:12:31

楼主输下试试,金星是男是女{:titter:}

chun2495 发表于 2019-1-9 15:37:34

zjrenyu 发表于 2019-1-9 09:12
楼主输下试试,金星是男是女

chun2495 发表于 2019-1-9 15:39:36

love_zjb 发表于 2019-1-8 20:59
数据集有没有?我也想玩玩

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

love_zjb 发表于 2019-1-9 20:54:14

chun2495 发表于 2019-1-9 15:39
链接:https://pan.baidu.com/s/1G4HzODcnw0sOZOHE7sVGwQ
提取码:18nt
复制这段内容后打开百度网盘手 ...

谢啦

jiangxingyuan 发表于 2019-1-10 10:57:47

本帖最后由 jiangxingyuan 于 2019-1-10 16:48 编辑

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

shuiluo2 发表于 2019-1-10 11:09:10

哈哈,以前有个客户的部门经理,男的,就叫x小红{:titter:}

chun2495 发表于 2019-1-10 15:09:25

jiangxingyuan 发表于 2019-1-10 10:57
我讲个真实的笑话,我有两个同事,都是男的。一个名字里面有个“红”字的。另一个同事名字里有个“荣”。有 ...

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

我是谁712 发表于 2019-1-10 15:38:42

chun2495 发表于 2019-1-9 15:37


人工智能很牛逼嘛,就是变性了也能查出来原来是什么性别{:lol:}
页: [1]
查看完整版本: 分享一个输入姓名,利用TenFlow预测性别的程序