1. 程式人生 > >根據姓名判斷性別-人工智慧

根據姓名判斷性別-人工智慧

本帖訓練一個可以根據姓名判斷性別的CNN模型;我使用自己爬取的35萬中文姓名進行訓練。

使用同樣的資料集還可以訓練起名字模型,參看:

準備姓名資料集

我上網找了一下,並沒有找到現成的中文姓名資料集,額,看來只能自己動手了。

我寫了一個簡單的Python指令碼,爬取了上萬中文姓名,格式整理如下:

  1. 姓名,性別  
  2. 安鑲怡,女  
  3. 饒黎明,男  
  4. 段焙曦,男  
  5. 苗芯萌,男  
  6. 覃慧藐,女  
  7. 蘆玥微,女  
  8. 蘇佳琬,女  
  9. 王旎溪,女  
  10. 彭琛朗,男  
  11. 李昊,男  
  12. 利欣怡,女  
  13. # 貌似有很多名字男女通用

資料集:https://pan.baidu.com/s/1hsHTEU4。

訓練模型

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

    相關推薦

    根據姓名判斷性別-人工智慧

    本帖訓練一個可以根據姓名判斷性別的CNN模型;我使用自己爬取的35萬中文姓名進行訓練。使用同樣的資料集還可以訓練起名字模型,參看:準備姓名資料集我上網找了一下,並沒有找到現成的中文姓名資料集,額,看來只能自己動手了。我寫了一個簡單的Python指令碼,爬取了上萬中文姓名,格式整理如下:姓名,性別  安鑲怡,女

    特別收集一些身份證驗證演算法 根據身份證判斷性別和生日

    <%@ Page language="c#" Codebehind="CordBirthday.aspx.cs" AutoEventWireup="false" Inherits="CodeDatum.birthday.CordBirthday"%><!DOCTYPE HTML PUBLIC

    hive根據身份證號判斷性別

    select no_cer,case when (case when LENGTH(no_cer)=15 then substr(NO_CER,14,1) when  LENGTH(no_cer)=18 then su

    Oracle根據身份證號碼判斷性別

    Oracle內根據身份證號碼判斷性別: select  decode(mod (to_number( substr(t.idcard ,17, 1)),2 ),0, '女','男' ) as sex

    根據日期判斷星期幾

    code return var div .get pan day () class function getMyDay(date){ var week; if(date.getDay()==0) week="星期日" if(date.getDay(

    根據sessionID判斷用戶是否登陸

    sse ESS set 分享圖片 () pre alt roo 執行 login.php <?php session_start(); $user = $_GET["user"]; $session_ID = session_id(); $_SESSION[$ses

    Java 身份證判斷性別獲取年齡

    integer 系統時間 current card throws class except .com unit import com.alibaba.fastjson.JSON; import org.junit.Test; import java.text.Simple

    python實現城市和省份字典(根據城市判斷屬於哪個省份)

    lam ret pandas csv style .data 一份 輸出 以及 首先,在網上拿到一份數據,省份和城市的對應表: 第一張圖是省份以及對應的ID 第二張圖是省份和城市,以及分別對應的ID 基本的思路是:實現一個字典,省份作為鍵,省份包含的城市作為

    習題 14.3 學校的人事部門儲存了有關學生的部分資料(學號、姓名、年齡、住址),教務部門也儲存了學生的另外一些資料(學號、姓名性別、成績),兩個部門分別編寫了本部門的學生資料管理程式,其中都用。。

    C++程式設計(第三版) 譚浩強 習題14.3 個人設計 習題 14.3 學校的人事部門儲存了有關學生的部分資料(學號、姓名、年齡、住址),教務部門也儲存了學生的另外一些資料(學號、姓名、性別、成績),兩個部門分別編寫了本部門的學生資料管理程式,其中都用了Student作為類名。現在

    最全的根據號碼判斷運營商的工具類

    最全的根據傳入號碼判斷該號碼屬於哪個運營商的工具類 public class OperatorUtils { private static String CMCC = "移動"; private static String UNICOM = "聯通"; private

    貝葉斯分類演算法例項 --根據姓名推測男女

    一.從貝葉斯公式開始 貝葉斯分類其實是利用用貝葉斯公式,算出每種情況下發生的概率,再取概率較大的一個分類作為結果。我們先來看看貝葉斯公式: P(A|B) = P(B|A) P(A) / P(B) 其中P(A|B)是指在事件B發生的情況下事件A發生的概率。 在貝葉斯定理中,每個名詞都有約定俗成的名稱: P

    angular4自定義根據日期判斷星期的管道

    import  {  Pipe ,  PipeTransform  }  from   '@angular/core' ; @ Pip

    如何根據TTL判斷主機的作業系統

    一、TTL是什麼 TTL(Time To Live,生存時間)是IP協議包中的一個值,當我們使用Ping命令進行網路連通測試或者是測試網速的時候,本地計算機會向目的主機發送資料包,但是有的資料包會因為一些特殊的原因不能正常傳送到目的主機,如果沒有設定TTL值的話,資料包會一直在網路上面傳送,浪費網

    隨機生成個人資訊(姓名性別,電話,住址,身份證號碼)

    個人資訊類 package com.epoint.junit.test; public class UTPersonInfo { private String name; private String sex; private

    嘗試實現一個管理系統, 名字和電話號分別用兩個列表儲存 =======通訊錄管理系統======= 1.增加姓名和手機 2.刪除姓名 3.修改手機 4.查詢所有使用者 5.根據姓名查詢手機號 6.退出

    name = [] tel = [] while True: print('==通訊錄管理系統==') print('1.增加姓名和手機') print('2.刪除姓名') print('3.修改手機') print

    根據ip判斷,網址是否ping通

    package test.ping; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public class testPing { public

    根據身份證獲取性別生日等資訊

    (1)根據身份證獲取性別 方法1: private string sex(string identityCard) { string sex = ""; //處理18位的身份證號碼從號碼中得到生日和性別程式碼 if (identityCard.Length ==

    資料庫練習題:學生表(學號,姓名性別,系部,年齡)選課表(學號,課程號,成績)課程表(課程號,課程名,學分)

    資料庫中有如下三個表: 學生表(學號,姓名,性別,系部,年齡)選課表(學號,課程號,成績)課程表(課程號,課程名,學分) (1)、寫出建立以上三個表的sq語句 (2)、從選課表中查詢所有選課資訊,即學號、課程號、成績,並給成績加8分 (3)、從選課表中查詢選修課程號C02且該]課程考試及格的學生的學號

    根據sharedPreferences判斷第一次

    sharedPreferences = getSharedPreferences(“login”, Context.MODE_PRIVATE); SharedPreferences.Editor edit = sharedPreferences.edit();

    logstash 根據type 判斷輸出

    也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                # 更多ELK資料請訪問 http://devops.taobao.com一、配置前需要注意:1.Use chmod to modify nginx log f