tensorflow练习10:判断男声女声

本节内容训练一个简单的神经网络模型,用来判断声音是男是女;这是一个简单的神经网络分类实例。
数据集字段:声音属性与标签;
具体代码如下:

#coding=utf-8
import os
import requests
import pandas as pd
import numpy as np
import random
import tensorflow as tf
from sklearn.cross_validation import train_test_split

#下载数据集
if not os.path.exists('voice.csv'):
    url = 'http://blog.topspeedsnail.com/wp-content/uploads/2016/12/voice.csv'
    data = requests.get(url).content
    with open('voice.csv','wb') as f:
        f.write(data)

voice_data = pd.read_csv('voice.csv')#读取数据
voice_data = voice_data.values

#分类特征与类别
voices = voice_data[:,:-1]
labels = voice_data[:,-1:]#male或female
#将分类转换为one-hot
labels_tmp = []
for label in labels:
    tmp=[]
    if label[0] == 'male':
        tmp = [1.0,0.0]
    else:
        tmp = [0.0,1.0]
    labels_tmp.append(tmp)
labels = np.array(labels_tmp)

#shuffle
voices_tmp = []
labels_tmp = []
index_shuf = [i for i in range(len(voices))]
random.shuffle(index_shuf)
for i in index_shuf:
    voices_tmp.append(voices[i])
    labels_tmp.append(labels[i])

voices = np.array(voices_tmp)
labels = np.array(labels_tmp)
#划分数据集:
train_x, test_x, train_y, test_y = train_test_split(voices, labels, test_size=0.1)
batch_size = 64
n_batch = len(train_x) //batch_size

X = tf.placeholder(dtype=tf.float32, shape=[None,voices.shape[-1]])
Y = tf.placeholder(dtype= tf.float32, shape=[None,2])
#3层前馈
def neural_network():
    w1 = tf.Variable(tf.random_normal([voices.shape[-1],512],stddev=0.5))
    b1 = tf.Variable(tf.random_normal([512]))
    output = tf.matmul(X,w1)+b1

    w2 = tf.Variable(tf.random_normal([512,1024],stddev=.5))
    b2 = tf.Variable(tf.random_normal([1024]))
    output = tf.nn.softmax(tf.matmul(output,w2)+ b2)

    w3 = tf.Variable(tf.random_normal([1024,2]))
    b3 = tf.Variable(tf.random_normal([2]))
    output = tf.nn.softmax(tf.matmul(output, w3)+ b3)

    return output

#训练神经网络:
def train_neural_network():
    output = neural_network()
    cost = tf.reduce_mean(tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(output,Y)))
    lr = tf.Variable(0.001, dtype=tf.float32, trainable=False)
    opt = tf.train.AdamOptimizer(learning_rate=lr)
    var_list = [t for t in tf.trainable_variables()]
    train_step = opt.minimize(cost,var_list=var_list)

    #储存模型
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        for epoch in range(300):
            sess.run(tf.assign(lr, 0.001*(0.97**epoch)))
            for batch in range(n_batch):
                voice_batch = train_x[batch*batch_size:(batch+1)*(batch_size)]
                label_batch = train_y[batch*batch_size:(batch+1)*(batch_size)]
                _, loss = sess.run([train_step,cost], feed_dict={X: voice_batch,Y: label_batch})
                print(epoch, batch, loss)

        #准确率
        prediction = tf.equal(tf.argmax(output,1),tf.argmax(Y,1))
        accuracy = tf.reduce_mean(tf.cast(prediction,dtype=tf.float32))
        accuracy = sess.run(accuracy,feed_dict={X:test_x, Y: test_y})
        print("精确率:%f" %accuracy)

train_neural_network()

这是一个三层神经网络模型,结果如下:
分类结果

猜你喜欢

转载自blog.csdn.net/a18852867035/article/details/77842584