1. 程式人生 > >tensorflow練習12:利用圖片預測年齡與性別

tensorflow練習12:利用圖片預測年齡與性別

深度學習在影象分類領域已經取得長足地進展,以下以一個有趣的例子來學習影象分類演算法。
訓練資料:人臉資料集(連結: https://pan.baidu.com/s/1gf4FQD1 密碼: ddkx)
環境:tensorflow,python3.5
1)載入資料集並對資料進行處理

age_table = ['(0, 2)', '(4, 6)', '(8, 12)', '(15, 20)', '(25, 32)', '(38, 43)', '(48, 53)', '(60, 100)']
sex_table = ['f', 'm']#性別

# AGE==True 訓練年齡模型,False,訓練行性別模型
AGE = True if AGE == True: labels_size = len(age_table) # 年齡 else: labels_size = len(sex_table) # 性別 face_set_fold = 'AdienceBenchmarkOfUnfilteredFacesForGenderAndAgeClassification' #載入圖片目錄檔案 fold_0_data = os.path.join(face_set_fold, 'fold_0_data.txt') fold_1_data = os.path.join(face_set_fold, 'fold_1_data.txt'
) fold_2_data = os.path.join(face_set_fold, 'fold_2_data.txt') fold_3_data = os.path.join(face_set_fold, 'fold_3_data.txt') fold_4_data = os.path.join(face_set_fold, 'fold_4_data.txt') face_image_set = os.path.join(face_set_fold, 'aligned')#圖片資料庫 def parse_data(fold_x_data): data_set = [] with open(fold_x_data, 'r'
) as f: line_one = True for line in f: tmp = [] if line_one == True: line_one = False continue#捨棄第一行標題 tmp.append(line.split('\t')[0])#user_id tmp.append(line.split('\t')[1])#xx.jpg tmp.append(line.split('\t')[3])#年齡 tmp.append(line.split('\t')[4])#性別 file_path = os.path.join(face_image_set, tmp[0])#目錄級 if os.path.exists(file_path): #返回所有匹配的檔案路徑列表。它只有一個引數pathname,定義了檔案路徑匹配規則 filenames = glob.glob(file_path + "/*.jpg")#返回所有圖片的列表 for filename in filenames: if tmp[1] in filename: break if AGE == True: if tmp[2] in age_table: data_set.append([filename, age_table.index(tmp[2])])#檔名,年齡表 else: if tmp[3] in sex_table: data_set.append([filename, sex_table.index(tmp[3])]) return data_set#返回資料集 data_set_0 = parse_data(fold_0_data) data_set_1 = parse_data(fold_1_data) data_set_2 = parse_data(fold_2_data) data_set_3 = parse_data(fold_3_data) data_set_4 = parse_data(fold_4_data) data_set = data_set_0 + data_set_1 + data_set_2 + data_set_3 + data_set_4#資料集串聯 shuffle(data_set)#隨機排序

根據檔案中的資料,處理得到需要用到的資料;(注:解壓aligned檔案)

2)定義資料結構

# 縮放影象大小
IMAGE_WIDTH = 227
IMAGE_HEIGHT = 227
# 讀取縮放影象
jpg_data = tf.placeholder(dtype=tf.string)
docode_jpg = tf.image.decode_jpeg(jpg_data, channels=3)
#Returns:A `Tensor` of type `uint8`. 3-D with shape `[height, width, channels]`.
resize = tf.image.resize_images(docode_jpg, [IMAGE_HEIGHT, IMAGE_WIDTH])
resize = tf.cast(resize, tf.uint8) / 255
def resize_image(file_name):
    with tf.gfile.FastGFile(file_name, 'r') as f:
        image_data = f.read()
    with tf.Session() as sess:
        image = sess.run(resize, feed_dict={jpg_data: image_data})
    return image

pointer = 0#指標指示
def get_next_batch(data_set, batch_size=128):#獲取一個batch資料
    global pointer
    batch_x = []
    batch_y = []
    for i in range(batch_size):
        batch_x.append(resize_image(data_set[pointer][0]))
        batch_y.append(data_set[pointer][1])
        pointer += 1
    return batch_x, batch_y

batch_size = 128
num_batch = len(data_set) // batch_size

X = tf.placeholder(dtype=tf.float32, shape=[batch_size, IMAGE_HEIGHT, IMAGE_WIDTH, 3])
Y = tf.placeholder(dtype=tf.int32, shape=[batch_size])

3)定義網路結構,3層卷積、池化,2層卷積;

def conv_net(nlabels, images, pkeep=1.0):
    """定義卷積網路的結構"""
    weights_regularizer = tf.contrib.layers.l2_regularizer(0.0005)
    # 預設變數域為con_net
    with tf.variable_scope("conv_net", "conv_net", [images]) as scope:
        # 給卷積層和全連線層設定預設引數
        with tf.contrib.slim.arg_scope([convolution2d, fully_connected], weights_regularizer=weights_regularizer,
                                       biases_initializer=tf.constant_initializer(1.),
                                       weights_initializer=tf.random_normal_initializer(stddev=0.005), trainable=True):
            # 給卷積層權重設定預設引數
            with tf.contrib.slim.arg_scope([convolution2d],
                                           weights_initializer=tf.random_normal_initializer(stddev=0.01)):
                #卷積層1:濾波器(7*7),步長4,輸出濾波器數:96
                conv1 = convolution2d(images, 96, [7, 7], [4, 4], padding='VALID',
                                      biases_initializer=tf.constant_initializer(0.), scope='conv1')
                pool1 = max_pool2d(conv1, 3, 2, padding='VALID', scope='pool1')
                norm1 = tf.nn.local_response_normalization(pool1, 5, alpha=0.0001, beta=0.75, name='norm1')
                #卷積層2:
                conv2 = convolution2d(norm1, 256, [5, 5], [1, 1], padding='SAME', scope='conv2')
                pool2 = max_pool2d(conv2, 3, 2, padding='VALID', scope='pool2')
                norm2 = tf.nn.local_response_normalization(pool2, 5, alpha=0.0001, beta=0.75, name='norm2')
                #卷積層3:
                conv3 = convolution2d(norm2, 384, [3, 3], [1, 1], biases_initializer=tf.constant_initializer(0.),
                                      padding='SAME', scope='conv3')
                pool3 = max_pool2d(conv3, 3, 2, padding='VALID', scope='pool3')
                flat = tf.reshape(pool3, [-1, 384 * 6 * 6], name='reshape')
                #兩層全連線
                full1 = fully_connected(flat, 512, scope='full1')
                drop1 = tf.nn.dropout(full1, pkeep, name='drop1')
                full2 = fully_connected(drop1, 512, scope='full2')
                drop2 = tf.nn.dropout(full2, pkeep, name='drop2')
    #輸出域
    with tf.variable_scope('output') as scope:
        weights = tf.Variable(tf.random_normal([512, nlabels], mean=0.0, stddev=0.01), name='weights')
        biases = tf.Variable(tf.constant(0.0, shape=[nlabels], dtype=tf.float32), name='biases')
        output = tf.add(tf.matmul(drop2, weights), biases, name=scope.name)
    return output

4)訓練

def training():#訓練
    logits = conv_net(labels_size, X)#經過卷積、池化、全連線後的結果

    def optimizer(eta, loss_fn):
        global_step = tf.Variable(0, trainable=False)
        optz = lambda lr: tf.train.MomentumOptimizer(lr, 0.9)
        lr_decay_fn = lambda lr, global_step: tf.train.exponential_decay(lr, global_step, 100, 0.97, staircase=True)
        return tf.contrib.layers.optimize_loss(loss_fn, global_step, eta, optz, clip_gradients=4.,
                                               learning_rate_decay_fn=lr_decay_fn)

    def loss(logits, labels):
        cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)
        cross_entropy_mean = tf.reduce_mean(cross_entropy)
        regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
        total_loss = cross_entropy_mean + 0.01 * sum(regularization_losses)
        loss_averages = tf.train.ExponentialMovingAverage(0.9)
        loss_averages_op = loss_averages.apply([cross_entropy_mean] + [total_loss])
        with tf.control_dependencies([loss_averages_op]):
            total_loss = tf.identity(total_loss)
        return total_loss

    # loss
    total_loss = loss(logits, Y)
    # optimizer
    train_op = optimizer(0.001, total_loss)

    saver = tf.train.Saver(tf.global_variables())
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print("開始訓練:")
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        global pointer
        epoch = 0
        while epoch < 51:#50個epoch
            pointer = 0
            for batch in range(num_batch):
                batch_x, batch_y = get_next_batch(data_set, batch_size)#獲取資料

                _, loss_value = sess.run([train_op, total_loss], feed_dict={X: batch_x, Y: batch_y})
                print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
                print("%d th epoch %d th batch loss:%f "%(epoch+1, batch+1, loss_value))
            i = 1
            if epoch % 5 == 0:
                print("第%d次儲存模型" % i)
                print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
                saver.save(sess, './age.module' if AGE == True else './sex.module', global_step=epoch)
                epoch += 1
                i += 1
training()

相關推薦

tensorflow練習12利用圖片預測年齡性別

深度學習在影象分類領域已經取得長足地進展,以下以一個有趣的例子來學習影象分類演算法。 訓練資料:人臉資料集(連結: https://pan.baidu.com/s/1gf4FQD1 密碼: ddkx) 環境:tensorflow,python3.5 1)載

實測 《Tensorflow實例利用LSTM預測股票每日最高價(二)》的結果

直接 batch Language name 開盤 num 完全 tor 運行 近期股市行情牛轉熊,大盤一直下探!由3200跌到了2700,想必很多人被深套了。這時想起人工智能能否預測股市趨勢?RNN能否起作用?   這時便從網上找下教程,發現網上有個例子,

人工智慧深度學習-Tensorflow例項利用LSTM預測股票每日最高價

LSTM全稱長短期記憶人工神經網路(Long-Short Term Memory),是對RNN的變種。舉個例子,假設我們試著去預測“I grew up in France… 中間隔了好多好多字……I speak fluent __”下劃線的詞。我們拍腦瓜子想這個詞應該是French。對於迴圈神經網路

Tensorflow例項利用LSTM預測股票每日最高價(二)

根據股票歷史資料中的最低價、最高價、開盤價、收盤價、交易量、交易額、跌漲幅等因素,對下一日股票最高價進行預測。 實驗用到的資料長這個樣子: label是標籤y,也就是下一日的最高價。列C——I為輸入特徵。 本例項用前5800個數據做訓練資料。

Tensorflow例項利用LSTM預測股票每日最高價(一)

這一部分主要涉及迴圈神經網路的理論,講的可能會比較簡略。 什麼是RNN RNN全稱迴圈神經網路(Recurrent Neural Networks),是用來處理序列資料的。在傳統的神經網路模型中,從輸入層到隱含層再到輸出層,層與層之間是全連線的,每層之間

區塊鏈鼻祖比特幣之12(SPV) 節點Bloom 過濾器

   (SPV) 節點        並非所有的節點都有能力儲存完整的區塊鏈。許多比特幣客戶端被設計成運行在空間和功率受限的裝置上,如智慧電話、平板電腦、嵌入式系統等。對於這樣的裝置,通過簡化的支付驗證(SPV)的方式可以使它們在不必儲存完整區塊鏈的情況下進行工作。這種型別的

從零開始Desire HD刷機指南——第十一章利用第三方recovery備份還原系統

原文地址:http://blog.sina.com.cn/s/blog_722b43a60100q5jf.html 本教程由symen 原創,轉載請註明出處。 上一章我們介紹瞭如何把第三方recovery 刷進手機,本章來介紹如何利用它來備份與還原系統。 先來看一下

Keras之MLP利用MLP【Input(8)→(12)(relu)→O(sigmoid+二元交叉)】模型實現預測新資料(利用糖尿病資料集的八個特徵預測一個0或1)

Keras之MLP:利用MLP【Input(8)→(12)(relu)→O(sigmoid+二元交叉)】模型實現預測新資料(利用糖尿病資料集的八個特徵預測一個0或1) 輸出結果   實現程式碼 # load and prepare the dataset

Keras之MLPR利用MLPR演算法(3to1【視窗法】+【Input(3)→(12+8)(relu)→O(mse)】)實現根據歷史航空旅客數量資料集(時間序列資料)預測下月乘客數量問題

Keras之MLPR:利用MLPR演算法(3to1【視窗法】+【Input(3)→(12+8)(relu)→O(mse)】)實現根據歷史航空旅客數量資料集(時間序列資料)預測下月乘客數量問題   輸出結果   設計思路  

Keras之DNN利用DNN【Input(8)→(12+8)(relu)→O(sigmoid)】模型實現預測新資料(利用糖尿病資料集的八個特徵預測一個0或1)

Keras之DNN:利用DNN【Input(8)→(12+8)(relu)→O(sigmoid)】模型實現預測新資料(利用糖尿病資料集的八個特徵預測一個0或1) 輸出結果 [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0,

Keras之DNN利用DNN演算法【Input(8)→12+8(relu)→O(sigmoid)】利用糖尿病資料集訓練、評估模型(利用糖尿病資料集中的八個引數特徵預測一個0或1結果)

Keras之DNN:利用DNN演算法【Input(8)→12+8(relu)→O(sigmoid)】利用糖尿病資料集訓練、評估模型(利用糖尿病資料集中的八個引數特徵預測一個0或1結果) 輸出結果 設計思路   實現程式碼 1、 2、  

tensorflow 12雙隱層+softmax迴歸實現mnist圖片識別之二

概述 tensorflow的自帶例程用兩個檔案演示了“全連線層+softmax迴歸”實現mnist圖片識別的功能。一個檔案是mnist.py,在之前一篇文章《tensorflow 11:雙隱層+softmax迴歸實現mnist圖片識別》已經介紹過了。不過mnis

ML之PLiR之LARS利用LARS演算法求解ElasticNet迴歸型別(包括類別編碼+屬性重要程度排序)問題(實數值年齡預測)

ML之PLiR之LARS:利用LARS演算法求解ElasticNet迴歸型別(包括類別編碼+屬性重要程度排序)問題(實數值年齡預測)   輸出結果   設計思路   核心程式碼 xCoded = [] for row i

EL之GB(GBM)利用GB對(鮑魚物理指標)迴歸(性別屬性編碼)問題(整數值年齡預測)建模

EL之GB(GBM):利用GB對(鮑魚物理指標)迴歸(性別屬性編碼)問題(整數值年齡預測)建模 輸出結果 設計思路   核心程式碼 #T1 nEst = 2000 depth = 5 learnRate = 0.003 maxFeatures

Windows64位安裝GPU版TensorFlow 0.12,Power Shell下輸入安裝Tensorflow的全教程

unless 設置環境變量 log api err 化工 查看 aid nbsp 推薦使用powershell,只需要在cmd指令窗口輸入powershell即可 下載64位Python3.5(一定要3.5!!)可以通過Python 3.5 from python.org

Android異步載入學習筆記之四利用緩存優化網絡載入圖片及ListView載入優化

角度 thread 下午 出發 easy code cat height back 假設不做不論什麽處理。直接用網絡載入圖片在網速快的情況下可能沒什麽不好的感覺。可是假設使用移動流量或是網絡不好的時候。問題就來了,要麽用戶會抱怨流量使用太多。要麽抱怨圖

SVM利用SVM算法實現手寫圖片識別(數據集50000張圖片)—Jason niu

圖片 clas 識別 fit ati ade loader test part import mnist_loader # Third-party libraries from sklearn import svm def svm_baseline():

TF利用TF的train.Saver載入曾經訓練好的variables(W、b)以供預測新的數據

oat tor range mage true com 技術 int num import tensorflow as tf import numpy as np W = tf.Variable(np.arange(6).reshape((2, 3)), dtype=t

DL之perceptron利用perceptron感知機對股票實現預測

DL之perceptron:利用perceptron感知機對股票實現預測 import numpy as np import operator import os # create a dataset which contains 3 samples with 2 classes def

JS練習切換圖片

程式碼: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script>