根據姓名判斷性別-人工智慧
本帖訓練一個可以根據姓名判斷性別的CNN模型;我使用自己爬取的35萬中文姓名進行訓練。
使用同樣的資料集還可以訓練起名字模型,參看:
準備姓名資料集
我上網找了一下,並沒有找到現成的中文姓名資料集,額,看來只能自己動手了。
我寫了一個簡單的Python指令碼,爬取了上萬中文姓名,格式整理如下:
- 姓名,性別
- 安鑲怡,女
- 饒黎明,男
- 段焙曦,男
- 苗芯萌,男
- 覃慧藐,女
- 蘆玥微,女
- 蘇佳琬,女
- 王旎溪,女
- 彭琛朗,男
- 李昊,男
- 利欣怡,女
- # 貌似有很多名字男女通用
資料集:https://pan.baidu.com/s/1hsHTEU4。
訓練模型
- import tensorflow as tf
- import numpy as np
- name_dataset = 'name.csv'
- train_x = []
- train_y = []
- with open(name_dataset, 'r') as f:
- first_line = True
- for line in f:
- if first_line isTrue:
- first_line = False
- continue
- sample = line.strip().split(',')
- if len(sample) == 2
- train_x.append(sample[0])
- if sample[1] == '男':
- train_y.append([0, 1]) # 男
- else:
- train_y.append([1, 0]) # 女
- max_name_length = max([len(name) for name in train_x])
- print("最長名字的字元數: ", max_name_length)
- max_name_length = 8
- # 資料已shuffle
- #shuffle_indices = np.random.permutation(np.arange(len(train_y)))
- #train_x = train_x[shuffle_indices]
- #train_y = train_y[shuffle_indices]
- # 詞彙表(參看聊天機器人練習)
- counter = 0
- vocabulary = {}
- for name in train_x:
- counter += 1
- tokens = [word for word in name]
- for word in tokens:
- if word in vocabulary:
- vocabulary[word] += 1
- else:
- vocabulary[word] = 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, [None, input_size])
- Y = tf.placeholder(tf.float32, [None, num_classes])
- 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([vocabulary_size, embedding_size], -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 = [3,4,5]
- pooled_outputs = []
- for i, filter_size in enumerate(filter_sizes):
- with tf.name_scope("conv-maxpool-%s" % filter_size):
- filter_shape = [filter_size, embedding_size, 1, num_filters]
- W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1))
- b = tf.Variable(tf.constant(0.1, shape=[num_filters]))
- conv = tf.nn.conv2d(embedded_chars_expanded, W, strides=[1, 1, 1, 1], padding="VALID")
- h = tf.nn.relu(tf.nn.bias_add(conv, b))
- pooled = tf.nn.max_pool(h, ksize=[1, input_size - filter_size + 1, 1, 1], strides=[1, 1, 1, 1], padding='VALID')
- pooled_outputs.append(pooled)
- num_filters_total = num_filters * len(filter_sizes)
- h_pool = tf.concat(3, pooled_outputs)
- 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=[num_filters_total, num_classes], initializer=tf.contrib.layers.xavier_initializer())
- b = tf.Variable(tf.constant(0.1, shape=[num_classes]))
- 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(output, 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[i*batch_size : (i+1)*batch_size]
- batch_y = train_y[i*batch_size : (i+1)*batch_size]
- _, loss_ = sess.run([train_op, loss], feed_dict={X:batch_x, Y:batch_y, dropout_keep_prob:0.5})
- print(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:
- name_vec = []
- for word in name:
- name_vec.append(vocab.get(word))
- while len(name_vec) < max_name_length:
- name_vec.append(0)
- x.append(name_vec)
- 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 != None:
- print(ckpt.model_checkpoint_path)
- saver.restore(sess, ckpt.model_checkpoint_path)
- else:
- 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